aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarl Heuer1995-03-14 04:25:37 +0000
committerKarl Heuer1995-03-14 04:25:37 +0000
commit5798cf155e7e928a7e3d8813e26598b6f762718a (patch)
tree0d5ce51f75d17a0eb354fb40d6c325062e30847c /src
parente41ae6f1279501f08e1031005e7c8666dd8231ae (diff)
downloademacs-5798cf155e7e928a7e3d8813e26598b6f762718a.tar.gz
emacs-5798cf155e7e928a7e3d8813e26598b6f762718a.zip
(event_to_perdisplay): New function.
(kbd_buffer_get_event): Use event_to_perdisplay. (kbd_buffer_store_event): If C-g arrives while we're in the run state on behalf of another display, just clear the queue and deposit the C-g to be read later. (read_key_sequence): After a throw, unwind delayed_switch_frame as well as keybuf. Don't insert an extra switch-frame if empty.
Diffstat (limited to 'src')
-rw-r--r--src/keyboard.c97
1 files changed, 74 insertions, 23 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index ef958592aff..df18f352d3f 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2155,6 +2155,27 @@ readable_events ()
2155/* Set this for debugging, to have a way to get out */ 2155/* Set this for debugging, to have a way to get out */
2156int stop_character; 2156int stop_character;
2157 2157
2158#ifdef MULTI_PERDISPLAY
2159static PERDISPLAY *
2160event_to_perdisplay (event)
2161 struct input_event *event;
2162{
2163 Lisp_Object frame;
2164 frame = event->frame_or_window;
2165 if (CONSP (frame))
2166 frame = XCONS (frame)->car;
2167 else if (WINDOWP (frame))
2168 frame = WINDOW_FRAME (XWINDOW (frame));
2169
2170 /* There are still some events that don't set this field.
2171 For now, just ignore the problem. */
2172 if (!FRAMEP (frame))
2173 return 0;
2174 else
2175 return get_perdisplay (XFRAME (frame));
2176}
2177#endif
2178
2158/* Store an event obtained at interrupt level into kbd_buffer, fifo */ 2179/* Store an event obtained at interrupt level into kbd_buffer, fifo */
2159 2180
2160void 2181void
@@ -2178,6 +2199,32 @@ kbd_buffer_store_event (event)
2178 if (c == quit_char) 2199 if (c == quit_char)
2179 { 2200 {
2180 extern SIGTYPE interrupt_signal (); 2201 extern SIGTYPE interrupt_signal ();
2202#ifdef MULTI_PERDISPLAY
2203 PERDISPLAY *perd;
2204 struct input_event *sp;
2205
2206 if (display_locked
2207 && (perd = get_perdisplay (XFRAME (event->frame_or_window)),
2208 perd != current_perdisplay))
2209 {
2210 perd->kbd_queue
2211 = Fcons (make_lispy_switch_frame (event->frame_or_window),
2212 Fcons (make_number (c), Qnil));
2213 perd->kbd_queue_has_data = 1;
2214 for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
2215 {
2216 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
2217 sp = kbd_buffer;
2218
2219 if (event_to_perdisplay (sp) == perd)
2220 {
2221 sp->kind = no_event;
2222 sp->frame_or_window = Qnil;
2223 }
2224 }
2225 return;
2226 }
2227#endif
2181 2228
2182#ifdef MULTI_FRAME 2229#ifdef MULTI_FRAME
2183 /* If this results in a quit_char being returned to Emacs as 2230 /* If this results in a quit_char being returned to Emacs as
@@ -2320,20 +2367,13 @@ kbd_buffer_get_event (PERDISPLAY **perdp)
2320 2367
2321 last_event_timestamp = event->timestamp; 2368 last_event_timestamp = event->timestamp;
2322 2369
2323 { 2370#ifdef MULTI_PERDISPLAY
2324 Lisp_Object frame; 2371 *perdp = event_to_perdisplay (event);
2325 frame = event->frame_or_window; 2372 if (*perdp == 0)
2326 if (CONSP (frame)) 2373 *perdp = all_perdisplays; /* Better than returning null ptr? */
2327 frame = XCONS (frame)->car; 2374#else
2328 else if (WINDOWP (frame)) 2375 *perdp = &the_only_perdisplay;
2329 frame = WINDOW_FRAME (XWINDOW (frame)); 2376#endif
2330 /* There are still some events that don't set this field.
2331 For now, just ignore the problem. */
2332 if (!FRAMEP (frame))
2333 *perdp = all_perdisplays;
2334 else
2335 *perdp = get_perdisplay (XFRAME (frame));
2336 }
2337 2377
2338 obj = Qnil; 2378 obj = Qnil;
2339 2379
@@ -2405,8 +2445,11 @@ kbd_buffer_get_event (PERDISPLAY **perdp)
2405 kbd_fetch_ptr = event + 1; 2445 kbd_fetch_ptr = event + 1;
2406 } 2446 }
2407 /* Just discard these, by returning nil. 2447 /* Just discard these, by returning nil.
2408 (They shouldn't be found in the buffer, 2448 With MULTI_PERDISPLAY, these events are used as placeholders
2409 but on some machines it appears they do show up.) */ 2449 when we need to randomly delete events from the queue.
2450 (They shouldn't otherwise be found in the buffer,
2451 but on some machines it appears they do show up
2452 even without MULTI_PERDISPLAY.) */
2410 else if (event->kind == no_event) 2453 else if (event->kind == no_event)
2411 kbd_fetch_ptr = event + 1; 2454 kbd_fetch_ptr = event + 1;
2412 2455
@@ -5059,16 +5102,24 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
5059 struct frame *interrupted_frame = selected_frame; 5102 struct frame *interrupted_frame = selected_frame;
5060 if (setjmp (wrong_display_jmpbuf)) 5103 if (setjmp (wrong_display_jmpbuf))
5061 { 5104 {
5105 if (!NILP (delayed_switch_frame))
5106 {
5107 interrupted_perdisplay->kbd_queue
5108 = Fcons (delayed_switch_frame,
5109 interrupted_perdisplay->kbd_queue);
5110 delayed_switch_frame = Qnil;
5111 }
5062 while (t > 0) 5112 while (t > 0)
5063 interrupted_perdisplay->kbd_queue 5113 interrupted_perdisplay->kbd_queue
5064 = Fcons (keybuf[--t], interrupted_perdisplay->kbd_queue); 5114 = Fcons (keybuf[--t], interrupted_perdisplay->kbd_queue);
5065 /* Ensure that the side queue begins with a switch-frame, so 5115
5066 we'll be in the right context when we replay it later. */ 5116 /* If the side queue is non-empty, ensure it begins with a
5067 if (!(CONSP (interrupted_perdisplay->kbd_queue) 5117 switch-frame, so we'll replay it in the right context. */
5068 && (key = XCONS (interrupted_perdisplay->kbd_queue)->car, 5118 if (CONSP (interrupted_perdisplay->kbd_queue)
5069 EVENT_HAS_PARAMETERS (key)) 5119 && (key = XCONS (interrupted_perdisplay->kbd_queue)->car,
5070 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), 5120 !(EVENT_HAS_PARAMETERS (key)
5071 Qswitch_frame))) 5121 && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
5122 Qswitch_frame))))
5072 { 5123 {
5073 Lisp_Object frame; 5124 Lisp_Object frame;
5074 XSETFRAME (frame, interrupted_frame); 5125 XSETFRAME (frame, interrupted_frame);