/* * The Unix Channel * * by Michel Beaudouin-Lafon and Stephane Chatty * * Copyright 1990-1993 * Laboratoire de Recherche en Informatique (LRI) * Centre d'Etudes de la Navigation Aerienne * * Tk-based multiplexers * * $Id$ * $CurLog$ * Made consistent with Tcl7.0 and Tk3.3 */ #include "TkMultiplexer.h" /* these files are included by tk.h, I include them here to avoid them being enclosed in extern "C" */ #include #include #include extern "C" { #include "tk.h" } #include static void ioHandler (ClientData client_data, int mask) { IvlChannel* ch = (IvlChannel*) client_data; if (mask & TK_WRITABLE) ch->HandleWrite (); if (mask & TK_READABLE) ch->HandleRead (); } IvlTkMultiplexer :: IvlTkMultiplexer () : IvlBaseMultiplexer () { memset (Active, 0, NFILE * sizeof (bool)); } IvlTkMultiplexer :: ~IvlTkMultiplexer () { } void IvlTkMultiplexer :: SetMasks (int fd, IOMODE mode) { IvlChannel* ch = Channels [fd]; if (!ch) return; /* remove if already there */ if (Active [fd]) { Tk_DeleteFileHandler (fd); ReadCount--; } /* add channel */ int mask = 0; if (mode & IORead) mask |= TK_READABLE; if (mode & IOWrite) mask |= TK_WRITABLE; if (mode & IOSelect) Error (ErrWarn, "AddChannel", "select condition ignored"); if (mask) { Tk_CreateFileHandler (fd, mask, ioHandler, (ClientData) ch); ReadCount++; Active [fd] = true; } } void IvlTkMultiplexer :: FireTimers (ClientData mpx) { IvlCoreTimer::Fire (((IvlTkMultiplexer*) mpx)->GetTimerSet ()); } void IvlTkMultiplexer :: SetTimeOut (Millisecond delay) { TimeOut = Tk_CreateTimerHandler (int (delay), &IvlTkMultiplexer::FireTimers, (ClientData) this); } void IvlTkMultiplexer :: SuppressTimeOut () { Tk_DeleteTimerHandler (TimeOut); TimeOut = 0; } void IvlTkMultiplexer :: FireSignals (ClientData mpx) { ((IvlTkMultiplexer*) mpx)->HandleDeferredSignals (); } void IvlTkMultiplexer :: AddSignalHook () { Tk_DoWhenIdle (&IvlTkMultiplexer::FireSignals, (ClientData) this); } MPX_RES IvlTkMultiplexer :: Loop () { Looping = true; Tk_MainLoop (); if (Looping) { Looping = false; return isMpxEmpty; } return isMpxTerminated; }