diff options
| author | Karl Heuer | 1995-03-14 04:25:37 +0000 |
|---|---|---|
| committer | Karl Heuer | 1995-03-14 04:25:37 +0000 |
| commit | 5798cf155e7e928a7e3d8813e26598b6f762718a (patch) | |
| tree | 0d5ce51f75d17a0eb354fb40d6c325062e30847c /src | |
| parent | e41ae6f1279501f08e1031005e7c8666dd8231ae (diff) | |
| download | emacs-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.c | 97 |
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 */ |
| 2156 | int stop_character; | 2156 | int stop_character; |
| 2157 | 2157 | ||
| 2158 | #ifdef MULTI_PERDISPLAY | ||
| 2159 | static PERDISPLAY * | ||
| 2160 | event_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 | ||
| 2160 | void | 2181 | void |
| @@ -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); |