comparison src/events.h @ 1268:fffe735e63ee

[xemacs-hg @ 2003-02-07 11:50:50 by ben] fixes for menu crashes + better preemption behavior This contains two related changes: (1) Fix problems with reentrant calling of lwlib and associated crashes when selecting menu items. (2) Improve redisplay handling of preemption. Turn on lazy lock and hold down page-down or page-up and you'll see what I mean. They are related because they both touch on the code that retrieves events and handles the internal queues. console-msw.h, event-msw.c, event-stream.c, events.h, menubar-msw.c, menubar-x.c, menubar.h: mswindows_protect_modal_loop() has been generalized to event_stream_protect_modal_loop(), and moved to event-stream.c. mswindows_in_modal_loop ->in_modal_loop likewise. Changes in event-msw.c and menubar-msw.c for the new names and calling format (use structures instead of static variables in menubar-msw.c). Delete former in_menu_callback and use in_modal_loop in its place. Remove emacs_mswindows_quit_check_disallowed_p(), superseded by in_modal_loop. Use event_stream_protect_modal_loop() in pre_activate_callback() so that we get no lwlib reentrancy. Rearrange some of the code in event-msw.c to be grouped better. Make mswindows_drain_windows_queue() respect in_modal_loop and do nothing if so. cmdloop.c, event-stream.c: Don't conditionalize on LWLIB_MENUBARS_LUCID when giving error when in_modal_loop, and give better error. event-Xt.c, event-gtk.c: If in_modal_loop, only retrieve process and timeout events. Don't retrieve any X events because processing them can lead to reentrancy in lwlib -> death. event-stream.c: Remove unused parameter to check_event_stream_ok() and change all callers. lisp.h, event-stream.c: Rearrange some functions for increased clarity -- in particular, group all the input-pending/QUIT-related stuff together, and put right next to next-event stuff, to which it's related. Add the concept of "HOW_MANY" -- when asking whether user input is pending, you can ask if at least HOW_MANY events are pending, not just if any are. Add parameter to detect_input_pending() for this. Change recursive_sit_for from a Lisp_Object (which could only be Qt or Qnil) to an int, like it should be. event-Xt.c, event-gtk.c, event-xlike-inc.c: New file. Abstract out similar code in event_{Xt/gtk}_pending_p() and write only once, using include-file tricks. Rewrite this function to implement HOW_MANY and only process events when not in_modal_loop. event-msw.c: Implement HOW_MANY and only process events when not in_modal_loop. event-tty.c: Implement HOW_MANY. redisplay.c: Add var `max-preempts' to control maximum number of preempts. (#### perhaps not useful) Rewrite preemption check so that, rather than preempting when any user events are available, only preempt when a certain number (currently 4) of them are backed up. This effectively allows redisplay to proceed to completion in the presence of a fast auto-repeat (usually the auto-repeating is generated dynamically as necessary), and you get much better display behavior with lazy-lock active. event-unixoid.c: Comment changes. event-stream.c: Rewrite discard-input much more simply and safely using the drain-queue functions. I think the old version might loop forever if called when in_modal_loop. SEMI-UNRELATED CHANGES: ----------------------- event-stream.c: Turn QUIT-checking back on when running the pre-idle hook so it can be quit out of. indent.c: Document exact functioning of `vertical-motion' better, and its differences from GNU Emacs.
author ben
date Fri, 07 Feb 2003 11:50:54 +0000
parents 416490619c01
children ecf1ebac70d8
comparison
equal deleted inserted replaced
1267:c57f32e44416 1268:fffe735e63ee
63 can end up with an infinite loop in Fdiscard_input(). 63 can end up with an infinite loop in Fdiscard_input().
64 64
65 event_pending_cb A function which says whether there are events to be 65 event_pending_cb A function which says whether there are events to be
66 read. If called with an argument of 0, then this 66 read. If called with an argument of 0, then this
67 should say whether calling the next_event_cb will 67 should say whether calling the next_event_cb will
68 block. If called with an argument of 1, then this 68 block. If called with a non-zero argument, then this
69 should say whether there are user-generated events 69 should say whether there are that many user-generated
70 pending (that is, keypresses or mouse-clicks). This 70 events pending (that is, keypresses, mouse-clicks,
71 is used for redisplay optimization, among other 71 dialog-box selection events, etc.). (This is used for
72 things. On dumb ttys, these two results are the 72 redisplay optimization, among other things.) The
73 same, but under a window system, they are not. 73 difference is that the former includes process events
74 and timer events, but the latter doesn't.
74 75
75 If this function is not sure whether there are events 76 If this function is not sure whether there are events
76 to be read, it *must* return 0. Otherwise various 77 to be read, it *must* return 0. Otherwise various
77 undesirable effects will occur, such as redisplay 78 undesirable effects will occur, such as redisplay
78 not occurring until the next event occurs. 79 not occurring until the next event occurs.
203 void (*remove_timeout_cb) (int); 204 void (*remove_timeout_cb) (int);
204 void (*select_console_cb) (struct console *); 205 void (*select_console_cb) (struct console *);
205 void (*unselect_console_cb) (struct console *); 206 void (*unselect_console_cb) (struct console *);
206 void (*select_process_cb) (Lisp_Process *, int doin, int doerr); 207 void (*select_process_cb) (Lisp_Process *, int doin, int doerr);
207 void (*unselect_process_cb) (Lisp_Process *, int doin, int doerr); 208 void (*unselect_process_cb) (Lisp_Process *, int doin, int doerr);
208 int (*quit_check_disallowed_p_cb)(void);
209 void (*drain_queue_cb) (void); 209 void (*drain_queue_cb) (void);
210 void (*force_event_pending_cb)(struct frame* f); 210 void (*force_event_pending_cb)(struct frame* f);
211 void (*create_io_streams_cb) (void* /* inhandle*/, void* /*outhandle*/ , 211 void (*create_io_streams_cb) (void* /* inhandle*/, void* /*outhandle*/ ,
212 void * /* errhandle*/, 212 void * /* errhandle*/,
213 Lisp_Object* /* instream */, 213 Lisp_Object* /* instream */,
1029 EXFUN (Fevent_over_toolbar_p, 1); 1029 EXFUN (Fevent_over_toolbar_p, 1);
1030 EXFUN (Fevent_over_vertical_divider_p, 1); 1030 EXFUN (Fevent_over_vertical_divider_p, 1);
1031 EXFUN (Fevent_point, 1); 1031 EXFUN (Fevent_point, 1);
1032 EXFUN (Fevent_window, 1); 1032 EXFUN (Fevent_window, 1);
1033 EXFUN (Fmake_event, 2); 1033 EXFUN (Fmake_event, 2);
1034 EXFUN (Fnext_command_event, 2);
1034 1035
1035 extern Lisp_Object QKbackspace, QKdelete, QKescape, QKlinefeed, QKreturn; 1036 extern Lisp_Object QKbackspace, QKdelete, QKescape, QKlinefeed, QKreturn;
1036 extern Lisp_Object QKspace, QKtab, Qmouse_event_p, Vcharacter_set_property; 1037 extern Lisp_Object QKspace, QKtab, Qmouse_event_p, Vcharacter_set_property;
1037 extern Lisp_Object Qcancel_mode_internal; 1038 extern Lisp_Object Qcancel_mode_internal;
1038 extern Lisp_Object Vmodifier_keys_sticky_time; 1039 extern Lisp_Object Vmodifier_keys_sticky_time;
1125 void event_stream_delete_io_streams (Lisp_Object instream, 1126 void event_stream_delete_io_streams (Lisp_Object instream,
1126 Lisp_Object outstream, 1127 Lisp_Object outstream,
1127 Lisp_Object errstream, 1128 Lisp_Object errstream,
1128 USID* in_usid, 1129 USID* in_usid,
1129 USID* err_usid); 1130 USID* err_usid);
1131 Lisp_Object event_stream_protect_modal_loop (const char *error_string,
1132 Lisp_Object (*bfun) (void *barg),
1133 void *barg, int flags);
1134 void event_stream_drain_queue (void);
1130 void event_stream_quit_p (void); 1135 void event_stream_quit_p (void);
1131 void run_pre_idle_hook (void); 1136 void run_pre_idle_hook (void);
1132 1137
1133 struct low_level_timeout 1138 struct low_level_timeout
1134 { 1139 {
1171 void single_console_state (void); 1176 void single_console_state (void);
1172 void any_console_state (void); 1177 void any_console_state (void);
1173 int in_single_console_state (void); 1178 int in_single_console_state (void);
1174 1179
1175 extern int emacs_is_blocking; 1180 extern int emacs_is_blocking;
1176 1181 extern int in_modal_loop;
1177 extern volatile int sigint_happened; 1182 extern volatile int sigint_happened;
1178 1183
1179 #ifdef HAVE_UNIXOID_EVENT_LOOP 1184 #ifdef HAVE_UNIXOID_EVENT_LOOP
1180 /* from event-unixoid.c */ 1185 /* from event-unixoid.c */
1181 1186