From 031d2e84df58ed54948671931544c41cf32da1ca Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 24 Jun 1999 04:24:09 +0000 Subject: 990624 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/tcltklib/tcltklib.c | 59 +++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 22 deletions(-) (limited to 'ext/tcltklib/tcltklib.c') diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c index 6652b9409a..352b0778db 100644 --- a/ext/tcltklib/tcltklib.c +++ b/ext/tcltklib/tcltklib.c @@ -44,8 +44,6 @@ int *tclDummyMathPtr = (int *) matherr; /*---- module TclTkLib ----*/ -static VALUE main_thread; - struct invoke_queue { int argc; VALUE *argv; @@ -55,35 +53,52 @@ struct invoke_queue { VALUE thread; struct invoke_queue *next; }; - + static struct invoke_queue *iqueue; +static VALUE main_thread; -/* execute Tk_MainLoop */ -static VALUE -lib_mainloop(self) - VALUE self; +/* Tk_ThreadTimer */ +static Tcl_TimerToken timer_token; + +/* timer callback */ +static void +_timer_for_tcl(clientData) + ClientData clientData; { struct invoke_queue *q, *tmp; VALUE thread; - DUMP1("start Tk_Mainloop"); - while (Tk_GetNumMainWindows() > 0) { - Tcl_DoOneEvent(TCL_DONT_WAIT); - CHECK_INTS; - q = iqueue; - while (q) { - tmp = q; - q = q->next; - if (!tmp->done) { - tmp->done = 1; - tmp->result = ip_invoke_real(tmp->argc, tmp->argv, tmp->obj); - thread = tmp->thread; - tmp = tmp->next; - rb_thread_run(thread); - } + Tk_DeleteTimerHandler(timer_token); + timer_token = Tk_CreateTimerHandler(100, _timer_for_tcl, + (ClientData)0); + + CHECK_INTS; + q = iqueue; + while (q) { + tmp = q; + q = q->next; + if (!tmp->done) { + tmp->done = 1; + tmp->result = ip_invoke_real(tmp->argc, tmp->argv, tmp->obj); + thread = tmp->thread; + tmp = tmp->next; + rb_thread_run(thread); } } + rb_thread_schedule(); +} + +/* execute Tk_MainLoop */ +static VALUE +lib_mainloop(self) + VALUE self; +{ + timer_token = Tk_CreateTimerHandler(100, _timer_for_tcl, + (ClientData)0); + DUMP1("start Tk_Mainloop"); + Tk_MainLoop(); DUMP1("stop Tk_Mainloop"); + Tk_DeleteTimerHandler(timer_token); return Qnil; } -- cgit v1.2.3