Tcl_CreateEventSource(Tcl_EventSetupProc , Tcl_EventCheckProc, ClientData) http://www.tcl.tk/man/tcl8.4/TclLib/Notifier.htm This function is called to create a new source of events that will be checked by the Tcl event loop. It registers two functions that will be called when [Tcl_DoOneEvent] is called to process events. The SetupProc is called to check for the maximum amount of time to block if there are no events. CheckProc is called to test for a signalled state. The manual page has a good deal to say about the Tcl notifier in general so here is a sample that gets Tcl to process Glib or Gtk+ events. #include /* When there are Gtk+ events to process we raise a Tcl event * When this event is processed here it flushes the Gtk queue */ static int EventProc(Tcl_Event *evPtr, int flags) { if (!(flags & TCL_WINDOW_EVENTS)) { return 0; } while (gtk_events_pending()) { gtk_main_iteration(); } return 1; } /* If there are gtk events in the queue, set the block time to zero * otherwise make it short - 10ms */ static void SetupProc(ClientData clientData, int flags) { Tcl_Time block_time = {0, 0}; if (!(flags & TCL_WINDOW_EVENTS)) { return; } if (!gtk_events_pending()) { block_time.usec = 10000; } Tcl_SetMaxBlockTime(&block_time); return; } /* If there are events to process, raise a Tk event to indicate this */ static void CheckProc(ClientData clientData, int flags) { if (!(flags & TCL_WINDOW_EVENTS)) { return; } if (gtk_events_pending()) { Tcl_Event *event = (Tcl_Event *)ckalloc(sizeof(Tcl_Event)); event->proc = EventProc; Tcl_QueueEvent(event, TCL_QUEUE_TAIL); } return; } Given the above functions we just have to register the new event source when we initialize our package or our interpreter: Tcl_CreateEventSource(SetupProc, CheckProc, NULL); ---- [[[Category Tcl Library]]]