diff options
| author | Paul Eggert | 2012-02-24 22:41:40 -0800 |
|---|---|---|
| committer | Paul Eggert | 2012-02-24 22:41:40 -0800 |
| commit | a89654f8f34114db543cb91363e8fded6d73e986 (patch) | |
| tree | 5ac508597ef2aa460308b4b26c244779e48cdb40 /src/keyboard.c | |
| parent | 6e6c82a4e687708d5a7a3887f92db45bd74da276 (diff) | |
| parent | 67b0de11479247cb8bd8491e10e0b464046f18be (diff) | |
| download | emacs-a89654f8f34114db543cb91363e8fded6d73e986.tar.gz emacs-a89654f8f34114db543cb91363e8fded6d73e986.zip | |
Merge from trunk.
Diffstat (limited to 'src/keyboard.c')
| -rw-r--r-- | src/keyboard.c | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 09743be6c3c..eb9152f2c6c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -4154,29 +4154,55 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4154 | static void | 4154 | static void |
| 4155 | process_special_events (void) | 4155 | process_special_events (void) |
| 4156 | { | 4156 | { |
| 4157 | while (kbd_fetch_ptr != kbd_store_ptr) | 4157 | struct input_event *event; |
| 4158 | { | ||
| 4159 | struct input_event *event; | ||
| 4160 | 4158 | ||
| 4161 | event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE) | 4159 | for (event = kbd_fetch_ptr; event != kbd_store_ptr; ++event) |
| 4162 | ? kbd_fetch_ptr | 4160 | { |
| 4163 | : kbd_buffer); | 4161 | if (event == kbd_buffer + KBD_BUFFER_SIZE) |
| 4164 | 4162 | { | |
| 4165 | last_event_timestamp = event->timestamp; | 4163 | event = kbd_buffer; |
| 4164 | if (event == kbd_store_ptr) | ||
| 4165 | break; | ||
| 4166 | } | ||
| 4166 | 4167 | ||
| 4167 | /* These two kinds of events get special handling | 4168 | /* If we find a stored X selection request, handle it now. */ |
| 4168 | and don't actually appear to the command loop. */ | ||
| 4169 | if (event->kind == SELECTION_REQUEST_EVENT | 4169 | if (event->kind == SELECTION_REQUEST_EVENT |
| 4170 | || event->kind == SELECTION_CLEAR_EVENT) | 4170 | || event->kind == SELECTION_CLEAR_EVENT) |
| 4171 | { | 4171 | { |
| 4172 | #ifdef HAVE_X11 | 4172 | #ifdef HAVE_X11 |
| 4173 | struct input_event copy; | ||
| 4174 | 4173 | ||
| 4175 | /* Remove it from the buffer before processing it, | 4174 | /* Remove the event from the fifo buffer before processing; |
| 4176 | since otherwise swallow_events called recursively could see it | 4175 | otherwise swallow_events called recursively could see it |
| 4177 | and process it again. */ | 4176 | and process it again. To do this, we move the events |
| 4178 | copy = *event; | 4177 | between kbd_fetch_ptr and EVENT one slot to the right, |
| 4179 | kbd_fetch_ptr = event + 1; | 4178 | cyclically. */ |
| 4179 | |||
| 4180 | struct input_event copy = *event; | ||
| 4181 | struct input_event *beg | ||
| 4182 | = (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | ||
| 4183 | ? kbd_buffer : kbd_fetch_ptr; | ||
| 4184 | |||
| 4185 | if (event > beg) | ||
| 4186 | memmove (beg + 1, beg, (event - beg) * sizeof (struct input_event)); | ||
| 4187 | else if (event < beg) | ||
| 4188 | { | ||
| 4189 | if (event > kbd_buffer) | ||
| 4190 | memmove (kbd_buffer + 1, kbd_buffer, | ||
| 4191 | (event - kbd_buffer) * sizeof (struct input_event)); | ||
| 4192 | *kbd_buffer = *(kbd_buffer + KBD_BUFFER_SIZE - 1); | ||
| 4193 | if (beg < kbd_buffer + KBD_BUFFER_SIZE - 1) | ||
| 4194 | memmove (beg + 1, beg, | ||
| 4195 | (kbd_buffer + KBD_BUFFER_SIZE - 1 - beg) | ||
| 4196 | * sizeof (struct input_event)); | ||
| 4197 | } | ||
| 4198 | |||
| 4199 | if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | ||
| 4200 | kbd_fetch_ptr = kbd_buffer + 1; | ||
| 4201 | else | ||
| 4202 | kbd_fetch_ptr++; | ||
| 4203 | |||
| 4204 | /* X wants last_event_timestamp for selection ownership. */ | ||
| 4205 | last_event_timestamp = copy.timestamp; | ||
| 4180 | input_pending = readable_events (0); | 4206 | input_pending = readable_events (0); |
| 4181 | x_handle_selection_event (©); | 4207 | x_handle_selection_event (©); |
| 4182 | #else | 4208 | #else |
| @@ -4185,8 +4211,6 @@ process_special_events (void) | |||
| 4185 | abort (); | 4211 | abort (); |
| 4186 | #endif | 4212 | #endif |
| 4187 | } | 4213 | } |
| 4188 | else | ||
| 4189 | break; | ||
| 4190 | } | 4214 | } |
| 4191 | } | 4215 | } |
| 4192 | 4216 | ||