From: Chong Yidong Date: Wed, 13 Sep 2006 22:39:23 +0000 (+0000) Subject: * xterm.c (x_initialize): Don't install Xt event timer here. X-Git-Tag: emacs-pretest-22.0.90~579 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=98a20c65dfeee04bb7d25e081c5b863de8fa9f33;p=emacs.git * xterm.c (x_initialize): Don't install Xt event timer here. (x_timeout_atimer_activated_flag): New var. (x_activate_timeout_atimer): New function to install Xt timer. (x_send_scroll_bar_event, x_process_timeouts): Use it. * xmenu.c (x_menu_set_in_use, popup_activate_callback) (create_and_show_popup_menu, create_and_show_dialog): Use it. * xterm.h (x_activate_timeout_atimer): prototype. --- diff --git a/src/ChangeLog b/src/ChangeLog index f2125895c2c..4f026bac9b9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2006-09-13 YAMAMOTO Mitsuharu + + * xterm.c (x_initialize): Don't install Xt event timer here. + (x_timeout_atimer_activated_flag): New var. + (x_activate_timeout_atimer): New function to install Xt timer. + (x_send_scroll_bar_event, x_process_timeouts): Use it. + + * xmenu.c (x_menu_set_in_use, popup_activate_callback) + (create_and_show_popup_menu, create_and_show_dialog): Use it. + + * xterm.h (x_activate_timeout_atimer): prototype. + 2006-09-13 Richard Stallman * print.c (print_string): When printcharfun is t, diff --git a/src/xmenu.c b/src/xmenu.c index 574240a4560..63dfb5102bd 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1182,6 +1182,10 @@ x_menu_set_in_use (in_use) { menu_items_inuse = in_use ? Qt : Qnil; popup_activated_flag = in_use; +#ifdef USE_X_TOOLKIT + if (popup_activated_flag) + x_activate_timeout_atimer (); +#endif } /* Wait for an X event to arrive or for a timer to expire. */ @@ -1498,6 +1502,9 @@ popup_activate_callback (widget, id, client_data) XtPointer client_data; { popup_activated_flag = 1; +#ifdef USE_X_TOOLKIT + x_activate_timeout_atimer (); +#endif } #endif @@ -2798,6 +2805,7 @@ create_and_show_popup_menu (f, first_wv, x, y, for_click) /* Display the menu. */ lw_popup_menu (menu, (XEvent *) &dummy); popup_activated_flag = 1; + x_activate_timeout_atimer (); { int fact = 4 * sizeof (LWLIB_ID); @@ -3175,6 +3183,7 @@ create_and_show_dialog (f, first_wv) /* Display the dialog box. */ lw_pop_up_all_widgets (dialog_id); popup_activated_flag = 1; + x_activate_timeout_atimer (); /* Process events that apply to the dialog box. Also handle timers. */ diff --git a/src/xterm.c b/src/xterm.c index e7a462aef58..9858d55f4d5 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -4091,6 +4091,9 @@ x_send_scroll_bar_event (window, part, portion, whole) /* Make Xt timeouts work while the scroll bar is active. */ toolkit_scroll_bar_interaction = 1; +#ifdef USE_X_TOOLKIT + x_activate_timeout_atimer (); +#endif /* Setting the event mask to zero means that the message will be sent to the client that created the window, and if that @@ -10134,6 +10137,11 @@ static XrmOptionDescRec emacs_options[] = { {"-mc", "*pointerColor", XrmoptionSepArg, (XtPointer) NULL}, {"-cr", "*cursorColor", XrmoptionSepArg, (XtPointer) NULL} }; + +/* Whether atimer for Xt timeouts is activated or not. */ + +static int x_timeout_atimer_activated_flag; + #endif /* USE_X_TOOLKIT */ static int x_initialized; @@ -10815,13 +10823,39 @@ static void x_process_timeouts (timer) struct atimer *timer; { + BLOCK_INPUT; + x_timeout_atimer_activated_flag = 0; if (toolkit_scroll_bar_interaction || popup_activated ()) { - BLOCK_INPUT; while (XtAppPending (Xt_app_con) & XtIMTimer) XtAppProcessEvent (Xt_app_con, XtIMTimer); - UNBLOCK_INPUT; + /* Reactivate the atimer for next time. */ + x_activate_timeout_atimer (); + } + UNBLOCK_INPUT; +} + +/* Install an asynchronous timer that processes Xt timeout events + every 0.1s as long as either `toolkit_scroll_bar_interaction' or + `popup_activated_flag' (in xmenu.c) is set. Make sure to call this + function whenever these variables are set. This is necessary + because some widget sets use timeouts internally, for example the + LessTif menu bar, or the Xaw3d scroll bar. When Xt timeouts aren't + processed, these widgets don't behave normally. */ + +void +x_activate_timeout_atimer () +{ + BLOCK_INPUT; + if (!x_timeout_atimer_activated_flag) + { + EMACS_TIME interval; + + EMACS_SET_SECS_USECS (interval, 0, 100000); + start_atimer (ATIMER_RELATIVE, interval, x_process_timeouts, 0); + x_timeout_atimer_activated_flag = 1; } + UNBLOCK_INPUT; } #endif /* USE_X_TOOLKIT */ @@ -10927,17 +10961,6 @@ x_initialize () XtCacheByDisplay, cvt_pixel_dtor); XtAppSetFallbackResources (Xt_app_con, Xt_default_resources); - - /* Install an asynchronous timer that processes Xt timeout events - every 0.1s. This is necessary because some widget sets use - timeouts internally, for example the LessTif menu bar, or the - Xaw3d scroll bar. When Xt timouts aren't processed, these - widgets don't behave normally. */ - { - EMACS_TIME interval; - EMACS_SET_SECS_USECS (interval, 0, 100000); - start_atimer (ATIMER_CONTINUOUS, interval, x_process_timeouts, 0); - } #endif #ifdef USE_TOOLKIT_SCROLL_BARS diff --git a/src/xterm.h b/src/xterm.h index 9aa1d8fcacb..94ae9472200 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -1001,6 +1001,7 @@ extern XtAppContext Xt_app_con; extern int x_alloc_lighter_color_for_widget __P ((Widget, Display*, Colormap, unsigned long *, double, int)); +extern void x_activate_timeout_atimer P_ ((void)); #endif extern void x_query_colors P_ ((struct frame *f, XColor *, int)); extern void x_query_color P_ ((struct frame *f, XColor *));