diff options
| author | Paul Eggert | 2015-06-23 16:29:27 -0700 |
|---|---|---|
| committer | Paul Eggert | 2015-06-23 16:30:58 -0700 |
| commit | 1552e6737317ea2c85e06600e178114c6b0f9fb2 (patch) | |
| tree | 3b68536fbd72bcaa840cc99aff6ea427120fa4bd /src/keyboard.c | |
| parent | 8769d0fe79dda776652c3bf342263568bbd7623b (diff) | |
| download | emacs-1552e6737317ea2c85e06600e178114c6b0f9fb2.tar.gz emacs-1552e6737317ea2c85e06600e178114c6b0f9fb2.zip | |
Fix bug that munged selection info
On some optimizing C compilers, copying a structure did not
copy the padding bytes between elements, and the type punning
between struct input_data and struct selection_input_data did
not work. Change the C code to use a proper union type instead.
Problem reported by YAMAMOTO Mitsuharu (Bug#20756).
* src/keyboard.c (kbd_buffer, kbd_fetch_ptr, kbd_store_ptr)
(readable_events, discard_mouse_events, kbd_buffer_events_waiting)
(kbd_buffer_get_event, process_special_events, stuff_buffered_input)
(mark_kboards):
Use union buffered_input_event, not struct input_event.
(clear_event, deliver_input_available_signal, process_special_events):
Remove unnecessary forward decls.
(kbd_buffer_store_buffered_event): New function, mostly just the
old kbd_buffer_store_event_hold, except its argument is of type
union buffered_input_event, not struct input_event.
(kbd_buffer_unget_event): Define only if HAVE_X11, since it's
not needed otherwise. Argument is now of type
struct selection_input_event *, not struct input_event *.
All callers changed.
(clear_event): Arg is now of type union buffered_input_event *,
not struct input_event *. All callers changed.
* src/keyboard.h [HAVE_X11]: Include "xterm.h".
(union buffered_input_event): New type.
(kbd_buffer_store_event_hold): Now an inline function,
defined here.
* src/termhooks.h (EVENT_KIND_WIDTH): New constant.
(struct input_event): Use it.
* src/xselect.c (struct selection_event_queue):
Make elements be of type struct selection_input_event,
not struct input_event.
(selection_input_event_equal): New static function.
(x_queue_event): Use it.
(x_queue_event, x_decline_selection_request)
(x_selection_current_request, x_reply_selection_request)
(x_handle_selection_request, x_handle_selection_clear)
(x_handle_selection_event): Use struct selection_input_event,
not struct input_event. All callers changed.
(x_convert_selection): Omit unused first arg. All callers changed.
(Fx_disown_selection_internal): Omit unnecessary union.
* src/xterm.c (handle_one_xevent): Use new union buffered_input_event
rather than rolling our own equivalent. Prefer sie.kind when
setting up that kind of structure.
Call kbd_buffer_store_buffered_event, not kbd_buffer_store_event_hold.
* src/xterm.h (struct selection_input_event: Use EVENT_KIND_WIDTH.
(SELECTION_EVENT_DISPLAY, SELECTION_EVENT_DPYINFO)
(SELECTION_EVENT_REQUESTOR, SELECTION_EVENT_SELECTION)
(SELECTION_EVENT_TARGET, SELECTION_EVENT_PROPERTY)
(SELECTION_EVENT_TIME, x_handle_selection_event):
Arg is now of type struct selection_input_event *)
not struct input_event *. All callers changed.
Diffstat (limited to 'src/keyboard.c')
| -rw-r--r-- | src/keyboard.c | 151 |
1 files changed, 74 insertions, 77 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 7bfc3f35220..8ea7b53a784 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -288,18 +288,18 @@ static bool input_was_pending; | |||
| 288 | 288 | ||
| 289 | /* Circular buffer for pre-read keyboard input. */ | 289 | /* Circular buffer for pre-read keyboard input. */ |
| 290 | 290 | ||
| 291 | static struct input_event kbd_buffer[KBD_BUFFER_SIZE]; | 291 | static union buffered_input_event kbd_buffer[KBD_BUFFER_SIZE]; |
| 292 | 292 | ||
| 293 | /* Pointer to next available character in kbd_buffer. | 293 | /* Pointer to next available character in kbd_buffer. |
| 294 | If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty. | 294 | If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty. |
| 295 | This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the | 295 | This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the |
| 296 | next available char is in kbd_buffer[0]. */ | 296 | next available char is in kbd_buffer[0]. */ |
| 297 | static struct input_event *kbd_fetch_ptr; | 297 | static union buffered_input_event *kbd_fetch_ptr; |
| 298 | 298 | ||
| 299 | /* Pointer to next place to store character in kbd_buffer. This | 299 | /* Pointer to next place to store character in kbd_buffer. This |
| 300 | may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next | 300 | may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next |
| 301 | character should go in kbd_buffer[0]. */ | 301 | character should go in kbd_buffer[0]. */ |
| 302 | static struct input_event * volatile kbd_store_ptr; | 302 | static union buffered_input_event *volatile kbd_store_ptr; |
| 303 | 303 | ||
| 304 | /* The above pair of variables forms a "queue empty" flag. When we | 304 | /* The above pair of variables forms a "queue empty" flag. When we |
| 305 | enqueue a non-hook event, we increment kbd_store_ptr. When we | 305 | enqueue a non-hook event, we increment kbd_store_ptr. When we |
| @@ -372,14 +372,9 @@ static bool help_char_p (Lisp_Object); | |||
| 372 | static void save_getcjmp (sys_jmp_buf); | 372 | static void save_getcjmp (sys_jmp_buf); |
| 373 | static void restore_getcjmp (sys_jmp_buf); | 373 | static void restore_getcjmp (sys_jmp_buf); |
| 374 | static Lisp_Object apply_modifiers (int, Lisp_Object); | 374 | static Lisp_Object apply_modifiers (int, Lisp_Object); |
| 375 | static void clear_event (struct input_event *); | ||
| 376 | static void restore_kboard_configuration (int); | 375 | static void restore_kboard_configuration (int); |
| 377 | #ifdef USABLE_SIGIO | ||
| 378 | static void deliver_input_available_signal (int signo); | ||
| 379 | #endif | ||
| 380 | static void handle_interrupt (bool); | 376 | static void handle_interrupt (bool); |
| 381 | static _Noreturn void quit_throw_to_read_char (bool); | 377 | static _Noreturn void quit_throw_to_read_char (bool); |
| 382 | static void process_special_events (void); | ||
| 383 | static void timer_start_idle (void); | 378 | static void timer_start_idle (void); |
| 384 | static void timer_stop_idle (void); | 379 | static void timer_stop_idle (void); |
| 385 | static void timer_resume_idle (void); | 380 | static void timer_resume_idle (void); |
| @@ -3446,7 +3441,7 @@ readable_events (int flags) | |||
| 3446 | #endif | 3441 | #endif |
| 3447 | )) | 3442 | )) |
| 3448 | { | 3443 | { |
| 3449 | struct input_event *event; | 3444 | union buffered_input_event *event; |
| 3450 | 3445 | ||
| 3451 | event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE) | 3446 | event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE) |
| 3452 | ? kbd_fetch_ptr | 3447 | ? kbd_fetch_ptr |
| @@ -3463,8 +3458,8 @@ readable_events (int flags) | |||
| 3463 | && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES) | 3458 | && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES) |
| 3464 | && (event->kind == SCROLL_BAR_CLICK_EVENT | 3459 | && (event->kind == SCROLL_BAR_CLICK_EVENT |
| 3465 | || event->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT) | 3460 | || event->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT) |
| 3466 | && event->part == scroll_bar_handle | 3461 | && event->ie.part == scroll_bar_handle |
| 3467 | && event->modifiers == 0) | 3462 | && event->ie.modifiers == 0) |
| 3468 | #endif | 3463 | #endif |
| 3469 | && !((flags & READABLE_EVENTS_FILTER_EVENTS) | 3464 | && !((flags & READABLE_EVENTS_FILTER_EVENTS) |
| 3470 | && event->kind == BUFFER_SWITCH_EVENT)) | 3465 | && event->kind == BUFFER_SWITCH_EVENT)) |
| @@ -3551,8 +3546,8 @@ kbd_buffer_store_event (register struct input_event *event) | |||
| 3551 | subsequent input events have been parsed (and discarded). */ | 3546 | subsequent input events have been parsed (and discarded). */ |
| 3552 | 3547 | ||
| 3553 | void | 3548 | void |
| 3554 | kbd_buffer_store_event_hold (register struct input_event *event, | 3549 | kbd_buffer_store_buffered_event (union buffered_input_event *event, |
| 3555 | struct input_event *hold_quit) | 3550 | struct input_event *hold_quit) |
| 3556 | { | 3551 | { |
| 3557 | if (event->kind == NO_EVENT) | 3552 | if (event->kind == NO_EVENT) |
| 3558 | emacs_abort (); | 3553 | emacs_abort (); |
| @@ -3562,36 +3557,36 @@ kbd_buffer_store_event_hold (register struct input_event *event, | |||
| 3562 | 3557 | ||
| 3563 | if (event->kind == ASCII_KEYSTROKE_EVENT) | 3558 | if (event->kind == ASCII_KEYSTROKE_EVENT) |
| 3564 | { | 3559 | { |
| 3565 | register int c = event->code & 0377; | 3560 | int c = event->ie.code & 0377; |
| 3566 | 3561 | ||
| 3567 | if (event->modifiers & ctrl_modifier) | 3562 | if (event->ie.modifiers & ctrl_modifier) |
| 3568 | c = make_ctrl_char (c); | 3563 | c = make_ctrl_char (c); |
| 3569 | 3564 | ||
| 3570 | c |= (event->modifiers | 3565 | c |= (event->ie.modifiers |
| 3571 | & (meta_modifier | alt_modifier | 3566 | & (meta_modifier | alt_modifier |
| 3572 | | hyper_modifier | super_modifier)); | 3567 | | hyper_modifier | super_modifier)); |
| 3573 | 3568 | ||
| 3574 | if (c == quit_char) | 3569 | if (c == quit_char) |
| 3575 | { | 3570 | { |
| 3576 | KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window)); | 3571 | KBOARD *kb = FRAME_KBOARD (XFRAME (event->ie.frame_or_window)); |
| 3577 | struct input_event *sp; | ||
| 3578 | 3572 | ||
| 3579 | if (single_kboard && kb != current_kboard) | 3573 | if (single_kboard && kb != current_kboard) |
| 3580 | { | 3574 | { |
| 3581 | kset_kbd_queue | 3575 | kset_kbd_queue |
| 3582 | (kb, list2 (make_lispy_switch_frame (event->frame_or_window), | 3576 | (kb, list2 (make_lispy_switch_frame (event->ie.frame_or_window), |
| 3583 | make_number (c))); | 3577 | make_number (c))); |
| 3584 | kb->kbd_queue_has_data = 1; | 3578 | kb->kbd_queue_has_data = 1; |
| 3579 | union buffered_input_event *sp; | ||
| 3585 | for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++) | 3580 | for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++) |
| 3586 | { | 3581 | { |
| 3587 | if (sp == kbd_buffer + KBD_BUFFER_SIZE) | 3582 | if (sp == kbd_buffer + KBD_BUFFER_SIZE) |
| 3588 | sp = kbd_buffer; | 3583 | sp = kbd_buffer; |
| 3589 | 3584 | ||
| 3590 | if (event_to_kboard (sp) == kb) | 3585 | if (event_to_kboard (&sp->ie) == kb) |
| 3591 | { | 3586 | { |
| 3592 | sp->kind = NO_EVENT; | 3587 | sp->ie.kind = NO_EVENT; |
| 3593 | sp->frame_or_window = Qnil; | 3588 | sp->ie.frame_or_window = Qnil; |
| 3594 | sp->arg = Qnil; | 3589 | sp->ie.arg = Qnil; |
| 3595 | } | 3590 | } |
| 3596 | } | 3591 | } |
| 3597 | return; | 3592 | return; |
| @@ -3599,7 +3594,7 @@ kbd_buffer_store_event_hold (register struct input_event *event, | |||
| 3599 | 3594 | ||
| 3600 | if (hold_quit) | 3595 | if (hold_quit) |
| 3601 | { | 3596 | { |
| 3602 | *hold_quit = *event; | 3597 | *hold_quit = event->ie; |
| 3603 | return; | 3598 | return; |
| 3604 | } | 3599 | } |
| 3605 | 3600 | ||
| @@ -3610,9 +3605,9 @@ kbd_buffer_store_event_hold (register struct input_event *event, | |||
| 3610 | { | 3605 | { |
| 3611 | Lisp_Object focus; | 3606 | Lisp_Object focus; |
| 3612 | 3607 | ||
| 3613 | focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window)); | 3608 | focus = FRAME_FOCUS_FRAME (XFRAME (event->ie.frame_or_window)); |
| 3614 | if (NILP (focus)) | 3609 | if (NILP (focus)) |
| 3615 | focus = event->frame_or_window; | 3610 | focus = event->ie.frame_or_window; |
| 3616 | internal_last_event_frame = focus; | 3611 | internal_last_event_frame = focus; |
| 3617 | Vlast_event_frame = focus; | 3612 | Vlast_event_frame = focus; |
| 3618 | } | 3613 | } |
| @@ -3682,22 +3677,27 @@ kbd_buffer_store_event_hold (register struct input_event *event, | |||
| 3682 | } | 3677 | } |
| 3683 | 3678 | ||
| 3684 | 3679 | ||
| 3685 | /* Put an input event back in the head of the event queue. */ | 3680 | #ifdef HAVE_X11 |
| 3681 | |||
| 3682 | /* Put a selection input event back in the head of the event queue. */ | ||
| 3686 | 3683 | ||
| 3687 | void | 3684 | void |
| 3688 | kbd_buffer_unget_event (register struct input_event *event) | 3685 | kbd_buffer_unget_event (struct selection_input_event *event) |
| 3689 | { | 3686 | { |
| 3690 | if (kbd_fetch_ptr == kbd_buffer) | 3687 | if (kbd_fetch_ptr == kbd_buffer) |
| 3691 | kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE; | 3688 | kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE; |
| 3692 | 3689 | ||
| 3693 | /* Don't let the very last slot in the buffer become full, */ | 3690 | /* Don't let the very last slot in the buffer become full, */ |
| 3694 | if (kbd_fetch_ptr - 1 != kbd_store_ptr) | 3691 | union buffered_input_event *kp = kbd_fetch_ptr - 1; |
| 3692 | if (kp != kbd_store_ptr) | ||
| 3695 | { | 3693 | { |
| 3696 | --kbd_fetch_ptr; | 3694 | kp->sie = *event; |
| 3697 | *kbd_fetch_ptr = *event; | 3695 | kbd_fetch_ptr = kp; |
| 3698 | } | 3696 | } |
| 3699 | } | 3697 | } |
| 3700 | 3698 | ||
| 3699 | #endif | ||
| 3700 | |||
| 3701 | /* Limit help event positions to this range, to avoid overflow problems. */ | 3701 | /* Limit help event positions to this range, to avoid overflow problems. */ |
| 3702 | #define INPUT_EVENT_POS_MAX \ | 3702 | #define INPUT_EVENT_POS_MAX \ |
| 3703 | ((ptrdiff_t) min (PTRDIFF_MAX, min (TYPE_MAXIMUM (Time) / 2, \ | 3703 | ((ptrdiff_t) min (PTRDIFF_MAX, min (TYPE_MAXIMUM (Time) / 2, \ |
| @@ -3776,7 +3776,7 @@ kbd_buffer_store_help_event (Lisp_Object frame, Lisp_Object help) | |||
| 3776 | void | 3776 | void |
| 3777 | discard_mouse_events (void) | 3777 | discard_mouse_events (void) |
| 3778 | { | 3778 | { |
| 3779 | struct input_event *sp; | 3779 | union buffered_input_event *sp; |
| 3780 | for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++) | 3780 | for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++) |
| 3781 | { | 3781 | { |
| 3782 | if (sp == kbd_buffer + KBD_BUFFER_SIZE) | 3782 | if (sp == kbd_buffer + KBD_BUFFER_SIZE) |
| @@ -3806,7 +3806,7 @@ discard_mouse_events (void) | |||
| 3806 | bool | 3806 | bool |
| 3807 | kbd_buffer_events_waiting (void) | 3807 | kbd_buffer_events_waiting (void) |
| 3808 | { | 3808 | { |
| 3809 | struct input_event *sp; | 3809 | union buffered_input_event *sp; |
| 3810 | 3810 | ||
| 3811 | for (sp = kbd_fetch_ptr; | 3811 | for (sp = kbd_fetch_ptr; |
| 3812 | sp != kbd_store_ptr && sp->kind == NO_EVENT; | 3812 | sp != kbd_store_ptr && sp->kind == NO_EVENT; |
| @@ -3824,7 +3824,7 @@ kbd_buffer_events_waiting (void) | |||
| 3824 | /* Clear input event EVENT. */ | 3824 | /* Clear input event EVENT. */ |
| 3825 | 3825 | ||
| 3826 | static void | 3826 | static void |
| 3827 | clear_event (struct input_event *event) | 3827 | clear_event (union buffered_input_event *event) |
| 3828 | { | 3828 | { |
| 3829 | event->kind = NO_EVENT; | 3829 | event->kind = NO_EVENT; |
| 3830 | } | 3830 | } |
| @@ -3945,13 +3945,13 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 3945 | mouse movement enabled and available. */ | 3945 | mouse movement enabled and available. */ |
| 3946 | if (kbd_fetch_ptr != kbd_store_ptr) | 3946 | if (kbd_fetch_ptr != kbd_store_ptr) |
| 3947 | { | 3947 | { |
| 3948 | struct input_event *event; | 3948 | union buffered_input_event *event; |
| 3949 | 3949 | ||
| 3950 | event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE) | 3950 | event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE) |
| 3951 | ? kbd_fetch_ptr | 3951 | ? kbd_fetch_ptr |
| 3952 | : kbd_buffer); | 3952 | : kbd_buffer); |
| 3953 | 3953 | ||
| 3954 | *kbp = event_to_kboard (event); | 3954 | *kbp = event_to_kboard (&event->ie); |
| 3955 | if (*kbp == 0) | 3955 | if (*kbp == 0) |
| 3956 | *kbp = current_kboard; /* Better than returning null ptr? */ | 3956 | *kbp = current_kboard; /* Better than returning null ptr? */ |
| 3957 | 3957 | ||
| @@ -3964,12 +3964,10 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 3964 | || event->kind == SELECTION_CLEAR_EVENT) | 3964 | || event->kind == SELECTION_CLEAR_EVENT) |
| 3965 | { | 3965 | { |
| 3966 | #ifdef HAVE_X11 | 3966 | #ifdef HAVE_X11 |
| 3967 | struct input_event copy; | ||
| 3968 | |||
| 3969 | /* Remove it from the buffer before processing it, | 3967 | /* Remove it from the buffer before processing it, |
| 3970 | since otherwise swallow_events will see it | 3968 | since otherwise swallow_events will see it |
| 3971 | and process it again. */ | 3969 | and process it again. */ |
| 3972 | copy = *event; | 3970 | struct selection_input_event copy = event->sie; |
| 3973 | kbd_fetch_ptr = event + 1; | 3971 | kbd_fetch_ptr = event + 1; |
| 3974 | input_pending = readable_events (0); | 3972 | input_pending = readable_events (0); |
| 3975 | x_handle_selection_event (©); | 3973 | x_handle_selection_event (©); |
| @@ -3983,7 +3981,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 3983 | #if defined (HAVE_NS) | 3981 | #if defined (HAVE_NS) |
| 3984 | else if (event->kind == NS_TEXT_EVENT) | 3982 | else if (event->kind == NS_TEXT_EVENT) |
| 3985 | { | 3983 | { |
| 3986 | if (event->code == KEY_NS_PUT_WORKING_TEXT) | 3984 | if (event->ie.code == KEY_NS_PUT_WORKING_TEXT) |
| 3987 | obj = list1 (intern ("ns-put-working-text")); | 3985 | obj = list1 (intern ("ns-put-working-text")); |
| 3988 | else | 3986 | else |
| 3989 | obj = list1 (intern ("ns-unput-working-text")); | 3987 | obj = list1 (intern ("ns-unput-working-text")); |
| @@ -3998,7 +3996,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 3998 | else if (event->kind == DELETE_WINDOW_EVENT) | 3996 | else if (event->kind == DELETE_WINDOW_EVENT) |
| 3999 | { | 3997 | { |
| 4000 | /* Make an event (delete-frame (FRAME)). */ | 3998 | /* Make an event (delete-frame (FRAME)). */ |
| 4001 | obj = list2 (Qdelete_frame, list1 (event->frame_or_window)); | 3999 | obj = list2 (Qdelete_frame, list1 (event->ie.frame_or_window)); |
| 4002 | kbd_fetch_ptr = event + 1; | 4000 | kbd_fetch_ptr = event + 1; |
| 4003 | } | 4001 | } |
| 4004 | #endif | 4002 | #endif |
| @@ -4007,13 +4005,13 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4007 | else if (event->kind == ICONIFY_EVENT) | 4005 | else if (event->kind == ICONIFY_EVENT) |
| 4008 | { | 4006 | { |
| 4009 | /* Make an event (iconify-frame (FRAME)). */ | 4007 | /* Make an event (iconify-frame (FRAME)). */ |
| 4010 | obj = list2 (Qiconify_frame, list1 (event->frame_or_window)); | 4008 | obj = list2 (Qiconify_frame, list1 (event->ie.frame_or_window)); |
| 4011 | kbd_fetch_ptr = event + 1; | 4009 | kbd_fetch_ptr = event + 1; |
| 4012 | } | 4010 | } |
| 4013 | else if (event->kind == DEICONIFY_EVENT) | 4011 | else if (event->kind == DEICONIFY_EVENT) |
| 4014 | { | 4012 | { |
| 4015 | /* Make an event (make-frame-visible (FRAME)). */ | 4013 | /* Make an event (make-frame-visible (FRAME)). */ |
| 4016 | obj = list2 (Qmake_frame_visible, list1 (event->frame_or_window)); | 4014 | obj = list2 (Qmake_frame_visible, list1 (event->ie.frame_or_window)); |
| 4017 | kbd_fetch_ptr = event + 1; | 4015 | kbd_fetch_ptr = event + 1; |
| 4018 | } | 4016 | } |
| 4019 | #endif | 4017 | #endif |
| @@ -4029,8 +4027,8 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4029 | { | 4027 | { |
| 4030 | kbd_fetch_ptr = event + 1; | 4028 | kbd_fetch_ptr = event + 1; |
| 4031 | input_pending = readable_events (0); | 4029 | input_pending = readable_events (0); |
| 4032 | if (FRAME_LIVE_P (XFRAME (event->frame_or_window))) | 4030 | if (FRAME_LIVE_P (XFRAME (event->ie.frame_or_window))) |
| 4033 | x_activate_menubar (XFRAME (event->frame_or_window)); | 4031 | x_activate_menubar (XFRAME (event->ie.frame_or_window)); |
| 4034 | } | 4032 | } |
| 4035 | #endif | 4033 | #endif |
| 4036 | #ifdef HAVE_NTGUI | 4034 | #ifdef HAVE_NTGUI |
| @@ -4038,9 +4036,9 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4038 | { | 4036 | { |
| 4039 | /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID). */ | 4037 | /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID). */ |
| 4040 | obj = list4 (Qlanguage_change, | 4038 | obj = list4 (Qlanguage_change, |
| 4041 | event->frame_or_window, | 4039 | event->ie.frame_or_window, |
| 4042 | make_number (event->code), | 4040 | make_number (event->ie.code), |
| 4043 | make_number (event->modifiers)); | 4041 | make_number (event->ie.modifiers)); |
| 4044 | kbd_fetch_ptr = event + 1; | 4042 | kbd_fetch_ptr = event + 1; |
| 4045 | } | 4043 | } |
| 4046 | #endif | 4044 | #endif |
| @@ -4049,16 +4047,16 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4049 | { | 4047 | { |
| 4050 | #ifdef HAVE_W32NOTIFY | 4048 | #ifdef HAVE_W32NOTIFY |
| 4051 | /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK). */ | 4049 | /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK). */ |
| 4052 | obj = list3 (Qfile_notify, event->arg, event->frame_or_window); | 4050 | obj = list3 (Qfile_notify, event->ie.arg, event->ie.frame_or_window); |
| 4053 | #else | 4051 | #else |
| 4054 | obj = make_lispy_event (event); | 4052 | obj = make_lispy_event (&event->ie); |
| 4055 | #endif | 4053 | #endif |
| 4056 | kbd_fetch_ptr = event + 1; | 4054 | kbd_fetch_ptr = event + 1; |
| 4057 | } | 4055 | } |
| 4058 | #endif /* USE_FILE_NOTIFY */ | 4056 | #endif /* USE_FILE_NOTIFY */ |
| 4059 | else if (event->kind == SAVE_SESSION_EVENT) | 4057 | else if (event->kind == SAVE_SESSION_EVENT) |
| 4060 | { | 4058 | { |
| 4061 | obj = list2 (Qsave_session, event->arg); | 4059 | obj = list2 (Qsave_session, event->ie.arg); |
| 4062 | kbd_fetch_ptr = event + 1; | 4060 | kbd_fetch_ptr = event + 1; |
| 4063 | } | 4061 | } |
| 4064 | /* Just discard these, by returning nil. | 4062 | /* Just discard these, by returning nil. |
| @@ -4075,11 +4073,11 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4075 | { | 4073 | { |
| 4076 | Lisp_Object object, position, help, frame, window; | 4074 | Lisp_Object object, position, help, frame, window; |
| 4077 | 4075 | ||
| 4078 | frame = event->frame_or_window; | 4076 | frame = event->ie.frame_or_window; |
| 4079 | object = event->arg; | 4077 | object = event->ie.arg; |
| 4080 | position = make_number (Time_to_position (event->timestamp)); | 4078 | position = make_number (Time_to_position (event->ie.timestamp)); |
| 4081 | window = event->x; | 4079 | window = event->ie.x; |
| 4082 | help = event->y; | 4080 | help = event->ie.y; |
| 4083 | clear_event (event); | 4081 | clear_event (event); |
| 4084 | 4082 | ||
| 4085 | kbd_fetch_ptr = event + 1; | 4083 | kbd_fetch_ptr = event + 1; |
| @@ -4095,14 +4093,14 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4095 | switch-frame event if necessary. */ | 4093 | switch-frame event if necessary. */ |
| 4096 | Lisp_Object frame, focus; | 4094 | Lisp_Object frame, focus; |
| 4097 | 4095 | ||
| 4098 | frame = event->frame_or_window; | 4096 | frame = event->ie.frame_or_window; |
| 4099 | focus = FRAME_FOCUS_FRAME (XFRAME (frame)); | 4097 | focus = FRAME_FOCUS_FRAME (XFRAME (frame)); |
| 4100 | if (FRAMEP (focus)) | 4098 | if (FRAMEP (focus)) |
| 4101 | frame = focus; | 4099 | frame = focus; |
| 4102 | 4100 | ||
| 4103 | if ( | 4101 | if ( |
| 4104 | #ifdef HAVE_X11 | 4102 | #ifdef HAVE_X11 |
| 4105 | ! NILP (event->arg) | 4103 | ! NILP (event->ie.arg) |
| 4106 | && | 4104 | && |
| 4107 | #endif | 4105 | #endif |
| 4108 | !EQ (frame, internal_last_event_frame) | 4106 | !EQ (frame, internal_last_event_frame) |
| @@ -4119,7 +4117,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4119 | #ifdef HAVE_WINDOW_SYSTEM | 4117 | #ifdef HAVE_WINDOW_SYSTEM |
| 4120 | 4118 | ||
| 4121 | Display_Info *di; | 4119 | Display_Info *di; |
| 4122 | Lisp_Object frame = event->frame_or_window; | 4120 | Lisp_Object frame = event->ie.frame_or_window; |
| 4123 | bool focused = false; | 4121 | bool focused = false; |
| 4124 | 4122 | ||
| 4125 | for (di = x_display_list; di && ! focused; di = di->next) | 4123 | for (di = x_display_list; di && ! focused; di = di->next) |
| @@ -4135,13 +4133,13 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4135 | #ifdef HAVE_DBUS | 4133 | #ifdef HAVE_DBUS |
| 4136 | else if (event->kind == DBUS_EVENT) | 4134 | else if (event->kind == DBUS_EVENT) |
| 4137 | { | 4135 | { |
| 4138 | obj = make_lispy_event (event); | 4136 | obj = make_lispy_event (&event->ie); |
| 4139 | kbd_fetch_ptr = event + 1; | 4137 | kbd_fetch_ptr = event + 1; |
| 4140 | } | 4138 | } |
| 4141 | #endif | 4139 | #endif |
| 4142 | else if (event->kind == CONFIG_CHANGED_EVENT) | 4140 | else if (event->kind == CONFIG_CHANGED_EVENT) |
| 4143 | { | 4141 | { |
| 4144 | obj = make_lispy_event (event); | 4142 | obj = make_lispy_event (&event->ie); |
| 4145 | kbd_fetch_ptr = event + 1; | 4143 | kbd_fetch_ptr = event + 1; |
| 4146 | } | 4144 | } |
| 4147 | else | 4145 | else |
| @@ -4151,7 +4149,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4151 | Lisp_Object frame; | 4149 | Lisp_Object frame; |
| 4152 | Lisp_Object focus; | 4150 | Lisp_Object focus; |
| 4153 | 4151 | ||
| 4154 | frame = event->frame_or_window; | 4152 | frame = event->ie.frame_or_window; |
| 4155 | if (CONSP (frame)) | 4153 | if (CONSP (frame)) |
| 4156 | frame = XCAR (frame); | 4154 | frame = XCAR (frame); |
| 4157 | else if (WINDOWP (frame)) | 4155 | else if (WINDOWP (frame)) |
| @@ -4171,7 +4169,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4171 | 4169 | ||
| 4172 | if (NILP (obj)) | 4170 | if (NILP (obj)) |
| 4173 | { | 4171 | { |
| 4174 | obj = make_lispy_event (event); | 4172 | obj = make_lispy_event (&event->ie); |
| 4175 | 4173 | ||
| 4176 | #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \ | 4174 | #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \ |
| 4177 | || defined (HAVE_NS) || defined (USE_GTK) | 4175 | || defined (HAVE_NS) || defined (USE_GTK) |
| @@ -4181,7 +4179,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4181 | beginning of the menu sequence, and we might as well leave | 4179 | beginning of the menu sequence, and we might as well leave |
| 4182 | that as the `event with parameters' for this selection. */ | 4180 | that as the `event with parameters' for this selection. */ |
| 4183 | if (used_mouse_menu | 4181 | if (used_mouse_menu |
| 4184 | && !EQ (event->frame_or_window, event->arg) | 4182 | && !EQ (event->ie.frame_or_window, event->ie.arg) |
| 4185 | && (event->kind == MENU_BAR_EVENT | 4183 | && (event->kind == MENU_BAR_EVENT |
| 4186 | || event->kind == TOOL_BAR_EVENT)) | 4184 | || event->kind == TOOL_BAR_EVENT)) |
| 4187 | *used_mouse_menu = 1; | 4185 | *used_mouse_menu = 1; |
| @@ -4261,7 +4259,7 @@ kbd_buffer_get_event (KBOARD **kbp, | |||
| 4261 | static void | 4259 | static void |
| 4262 | process_special_events (void) | 4260 | process_special_events (void) |
| 4263 | { | 4261 | { |
| 4264 | struct input_event *event; | 4262 | union buffered_input_event *event; |
| 4265 | 4263 | ||
| 4266 | for (event = kbd_fetch_ptr; event != kbd_store_ptr; ++event) | 4264 | for (event = kbd_fetch_ptr; event != kbd_store_ptr; ++event) |
| 4267 | { | 4265 | { |
| @@ -4284,23 +4282,22 @@ process_special_events (void) | |||
| 4284 | between kbd_fetch_ptr and EVENT one slot to the right, | 4282 | between kbd_fetch_ptr and EVENT one slot to the right, |
| 4285 | cyclically. */ | 4283 | cyclically. */ |
| 4286 | 4284 | ||
| 4287 | struct input_event copy = *event; | 4285 | struct selection_input_event copy = event->sie; |
| 4288 | struct input_event *beg | 4286 | union buffered_input_event *beg |
| 4289 | = (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | 4287 | = (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) |
| 4290 | ? kbd_buffer : kbd_fetch_ptr; | 4288 | ? kbd_buffer : kbd_fetch_ptr; |
| 4291 | 4289 | ||
| 4292 | if (event > beg) | 4290 | if (event > beg) |
| 4293 | memmove (beg + 1, beg, (event - beg) * sizeof (struct input_event)); | 4291 | memmove (beg + 1, beg, (event - beg) * sizeof *beg); |
| 4294 | else if (event < beg) | 4292 | else if (event < beg) |
| 4295 | { | 4293 | { |
| 4296 | if (event > kbd_buffer) | 4294 | if (event > kbd_buffer) |
| 4297 | memmove (kbd_buffer + 1, kbd_buffer, | 4295 | memmove (kbd_buffer + 1, kbd_buffer, |
| 4298 | (event - kbd_buffer) * sizeof (struct input_event)); | 4296 | (event - kbd_buffer) * sizeof *kbd_buffer); |
| 4299 | *kbd_buffer = *(kbd_buffer + KBD_BUFFER_SIZE - 1); | 4297 | *kbd_buffer = *(kbd_buffer + KBD_BUFFER_SIZE - 1); |
| 4300 | if (beg < kbd_buffer + KBD_BUFFER_SIZE - 1) | 4298 | if (beg < kbd_buffer + KBD_BUFFER_SIZE - 1) |
| 4301 | memmove (beg + 1, beg, | 4299 | memmove (beg + 1, beg, |
| 4302 | (kbd_buffer + KBD_BUFFER_SIZE - 1 - beg) | 4300 | (kbd_buffer + KBD_BUFFER_SIZE - 1 - beg) * sizeof *beg); |
| 4303 | * sizeof (struct input_event)); | ||
| 4304 | } | 4301 | } |
| 4305 | 4302 | ||
| 4306 | if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | 4303 | if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) |
| @@ -10311,7 +10308,7 @@ stuff_buffered_input (Lisp_Object stuffstring) | |||
| 10311 | if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | 10308 | if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) |
| 10312 | kbd_fetch_ptr = kbd_buffer; | 10309 | kbd_fetch_ptr = kbd_buffer; |
| 10313 | if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT) | 10310 | if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT) |
| 10314 | stuff_char (kbd_fetch_ptr->code); | 10311 | stuff_char (kbd_fetch_ptr->ie.code); |
| 10315 | 10312 | ||
| 10316 | clear_event (kbd_fetch_ptr); | 10313 | clear_event (kbd_fetch_ptr); |
| 10317 | } | 10314 | } |
| @@ -11937,7 +11934,7 @@ mark_kboards (void) | |||
| 11937 | mark_object (KVAR (kb, echo_string)); | 11934 | mark_object (KVAR (kb, echo_string)); |
| 11938 | } | 11935 | } |
| 11939 | { | 11936 | { |
| 11940 | struct input_event *event; | 11937 | union buffered_input_event *event; |
| 11941 | for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++) | 11938 | for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++) |
| 11942 | { | 11939 | { |
| 11943 | if (event == kbd_buffer + KBD_BUFFER_SIZE) | 11940 | if (event == kbd_buffer + KBD_BUFFER_SIZE) |
| @@ -11946,10 +11943,10 @@ mark_kboards (void) | |||
| 11946 | if (event->kind != SELECTION_REQUEST_EVENT | 11943 | if (event->kind != SELECTION_REQUEST_EVENT |
| 11947 | && event->kind != SELECTION_CLEAR_EVENT) | 11944 | && event->kind != SELECTION_CLEAR_EVENT) |
| 11948 | { | 11945 | { |
| 11949 | mark_object (event->x); | 11946 | mark_object (event->ie.x); |
| 11950 | mark_object (event->y); | 11947 | mark_object (event->ie.y); |
| 11951 | mark_object (event->frame_or_window); | 11948 | mark_object (event->ie.frame_or_window); |
| 11952 | mark_object (event->arg); | 11949 | mark_object (event->ie.arg); |
| 11953 | } | 11950 | } |
| 11954 | } | 11951 | } |
| 11955 | } | 11952 | } |