aboutsummaryrefslogtreecommitdiffstats
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorPaul Eggert2015-06-23 16:29:27 -0700
committerPaul Eggert2015-06-23 16:30:58 -0700
commit1552e6737317ea2c85e06600e178114c6b0f9fb2 (patch)
tree3b68536fbd72bcaa840cc99aff6ea427120fa4bd /src/keyboard.c
parent8769d0fe79dda776652c3bf342263568bbd7623b (diff)
downloademacs-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.c151
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
291static struct input_event kbd_buffer[KBD_BUFFER_SIZE]; 291static 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]. */
297static struct input_event *kbd_fetch_ptr; 297static 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]. */
302static struct input_event * volatile kbd_store_ptr; 302static 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);
372static void save_getcjmp (sys_jmp_buf); 372static void save_getcjmp (sys_jmp_buf);
373static void restore_getcjmp (sys_jmp_buf); 373static void restore_getcjmp (sys_jmp_buf);
374static Lisp_Object apply_modifiers (int, Lisp_Object); 374static Lisp_Object apply_modifiers (int, Lisp_Object);
375static void clear_event (struct input_event *);
376static void restore_kboard_configuration (int); 375static void restore_kboard_configuration (int);
377#ifdef USABLE_SIGIO
378static void deliver_input_available_signal (int signo);
379#endif
380static void handle_interrupt (bool); 376static void handle_interrupt (bool);
381static _Noreturn void quit_throw_to_read_char (bool); 377static _Noreturn void quit_throw_to_read_char (bool);
382static void process_special_events (void);
383static void timer_start_idle (void); 378static void timer_start_idle (void);
384static void timer_stop_idle (void); 379static void timer_stop_idle (void);
385static void timer_resume_idle (void); 380static 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
3553void 3548void
3554kbd_buffer_store_event_hold (register struct input_event *event, 3549kbd_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
3687void 3684void
3688kbd_buffer_unget_event (register struct input_event *event) 3685kbd_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)
3776void 3776void
3777discard_mouse_events (void) 3777discard_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)
3806bool 3806bool
3807kbd_buffer_events_waiting (void) 3807kbd_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
3826static void 3826static void
3827clear_event (struct input_event *event) 3827clear_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 (&copy); 3973 x_handle_selection_event (&copy);
@@ -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,
4261static void 4259static void
4262process_special_events (void) 4260process_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 }