2 * IR toolkit for tcl/tk
4 * See the file LICENSE for details.
5 * Sebastian Hammer, Adam Dickmeiss
8 * Revision 1.2 1996-09-13 10:51:48 adam
9 * Bug fix: ir_tcl_select_set called Tcl_GetFile at disconnect.
11 * Revision 1.1 1996/08/20 09:33:23 adam
12 * Tcl7.5 Generic file handling.
20 #if TCL_MAJOR_VERSION > 7 || (TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION > 4)
22 #define IRTCL_USE_TIMER 0
25 void (*f)(ClientData clientData, int r, int w, int e);
26 ClientData clientData;
30 Tcl_TimerToken timer_token;
34 struct sel_proc *next;
37 static struct sel_proc *sel_proc_list = NULL;
40 static void ir_tcl_timer_proc (ClientData clientData)
42 struct sel_proc *sp = (struct sel_proc *) clientData;
47 Tcl_CreateTimerHandler (250, ir_tcl_timer_proc, clientData);
48 (*sp->f)(sp->clientData, sp->mask & TCL_READABLE, sp->mask & TCL_WRITABLE,
49 sp->mask & TCL_EXCEPTION);
53 void ir_tcl_select_set (void (*f)(ClientData clientData, int r, int w, int e),
54 int fd, ClientData clientData, int r, int w, int e)
57 struct sel_proc **sp = &sel_proc_list;
64 mask |= TCL_EXCEPTION;
75 *sp = ir_tcl_malloc (sizeof(**sp));
79 Tcl_CreateTimerHandler (250, ir_tcl_timer_proc, *sp);
81 (*sp)->mask = TCL_READABLE|TCL_WRITABLE;
83 (*sp)->clientData = clientData;
86 struct sel_proc *sp_tmp = *sp;
87 Tcl_DeleteTimerHandler ((*sp)->timer_token);
94 static void ir_tcl_tk_select_proc (ClientData clientData, int mask)
96 struct sel_proc *sp = (struct sel_proc *) clientData;
100 (*sp->f)(sp->clientData, mask & TCL_READABLE, mask & TCL_WRITABLE,
101 mask & TCL_EXCEPTION);
104 void ir_tcl_select_set (void (*f)(ClientData clientData, int r, int w, int e),
105 int fd, ClientData clientData, int r, int w, int e)
108 struct sel_proc *sp = sel_proc_list;
111 mask |= TCL_READABLE;
113 mask |= TCL_WRITABLE;
115 mask |= TCL_EXCEPTION;
126 sp = ir_tcl_malloc (sizeof(*sp));
127 sp->next = sel_proc_list;
131 sp->tcl_File = Tcl_GetFile ((ClientData) fd, TCL_WIN_SOCKET);
133 sp->tcl_File = Tcl_GetFile ((ClientData) fd, TCL_UNIX_FD);
137 sp->clientData = clientData;
139 Tcl_CreateFileHandler (sp->tcl_File, mask, ir_tcl_tk_select_proc, sp);
141 Tcl_DeleteFileHandler (sp->tcl_File);