2 * IR toolkit for tcl/tk
4 * See the file LICENSE for details.
5 * Sebastian Hammer, Adam Dickmeiss
8 * Revision 1.3 1997-04-13 18:57:28 adam
9 * Better error reporting and aligned with Tcl/Tk style.
10 * Rework of notifier code with Tcl_File handles.
12 * Revision 1.2 1996/09/13 10:51:48 adam
13 * Bug fix: ir_tcl_select_set called Tcl_GetFile at disconnect.
15 * Revision 1.1 1996/08/20 09:33:23 adam
16 * Tcl7.5 Generic file handling.
24 #if TCL_MAJOR_VERSION > 7 || (TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION > 4)
26 #define IRTCL_USE_TIMER 0
29 void (*f)(ClientData clientData, int r, int w, int e);
30 ClientData clientData;
34 Tcl_TimerToken timer_token;
38 struct sel_proc *next;
41 static struct sel_proc *sel_proc_list = NULL;
44 static void ir_tcl_timer_proc (ClientData clientData)
46 struct sel_proc *sp = (struct sel_proc *) clientData;
51 Tcl_CreateTimerHandler (250, ir_tcl_timer_proc, clientData);
52 (*sp->f)(sp->clientData, sp->mask & TCL_READABLE, sp->mask & TCL_WRITABLE,
53 sp->mask & TCL_EXCEPTION);
57 void ir_tcl_select_set (void (*f)(ClientData clientData, int r, int w, int e),
58 int fd, ClientData clientData, int r, int w, int e)
61 struct sel_proc **sp = &sel_proc_list;
68 mask |= TCL_EXCEPTION;
79 *sp = ir_tcl_malloc (sizeof(**sp));
83 Tcl_CreateTimerHandler (250, ir_tcl_timer_proc, *sp);
85 (*sp)->mask = TCL_READABLE|TCL_WRITABLE;
87 (*sp)->clientData = clientData;
90 struct sel_proc *sp_tmp = *sp;
91 Tcl_DeleteTimerHandler ((*sp)->timer_token);
98 static void ir_tcl_tk_select_proc (ClientData clientData, int mask)
100 struct sel_proc *sp = (struct sel_proc *) clientData;
104 (*sp->f)(sp->clientData, mask & TCL_READABLE, mask & TCL_WRITABLE,
105 mask & TCL_EXCEPTION);
108 void ir_tcl_select_set (void (*f)(ClientData clientData, int r, int w, int e),
109 int fd, ClientData clientData, int r, int w, int e)
112 struct sel_proc **sp = &sel_proc_list;
115 mask |= TCL_READABLE;
117 mask |= TCL_WRITABLE;
119 mask |= TCL_EXCEPTION;
126 logf (LOG_DEBUG, "r=%d w=%d e=%d sp=%p", r, w, e, *sp);
131 Tcl_DeleteFileHandler ((*sp)->tcl_File);
132 Tcl_FreeFile ((*sp)->tcl_File);
139 *sp = ir_tcl_malloc (sizeof(**sp));
143 (*sp)->tcl_File = Tcl_GetFile ((ClientData) fd, TCL_WIN_SOCKET);
145 (*sp)->tcl_File = Tcl_GetFile ((ClientData) fd, TCL_UNIX_FD);
149 (*sp)->clientData = clientData;
150 Tcl_CreateFileHandler ((*sp)->tcl_File, mask, ir_tcl_tk_select_proc, *sp);