aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2018-01-12 23:37:06 -0500
committerStefan Monnier2018-01-12 23:40:47 -0500
commit815d3827f9f44384afac3eb2084e84be7083ea68 (patch)
tree23762e5f04c8fb24640b1c71199b5edf5b1104ec /src
parent70e4bb394f36940c4b72cd87d298d9cdabff5998 (diff)
downloademacs-815d3827f9f44384afac3eb2084e84be7083ea68.tar.gz
emacs-815d3827f9f44384afac3eb2084e84be7083ea68.zip
* src/keyboard.c: Consolidate code into make_lispy_event
(clear_event): Change arg type. Adjust callers. (kbd_buffer_get_event): Move most special event handling to make_lispy_event. (make_lispy_event): Add missing cases, taken from kbd_buffer_get_event. <SAVE_SESSION_EVENT>: Change return value to match what used to be built in kbd_buffer_get_event.
Diffstat (limited to 'src')
-rw-r--r--src/keyboard.c342
1 files changed, 145 insertions, 197 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index 8e3f0e18c01..64ad8b2c8fa 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -3736,7 +3736,7 @@ kbd_buffer_events_waiting (void)
3736/* Clear input event EVENT. */ 3736/* Clear input event EVENT. */
3737 3737
3738static void 3738static void
3739clear_event (union buffered_input_event *event) 3739clear_event (struct input_event *event)
3740{ 3740{
3741 event->kind = NO_EVENT; 3741 event->kind = NO_EVENT;
3742} 3742}
@@ -3894,65 +3894,6 @@ kbd_buffer_get_event (KBOARD **kbp,
3894 } 3894 }
3895 break; 3895 break;
3896 3896
3897#if defined (HAVE_NS)
3898 case NS_TEXT_EVENT:
3899 {
3900 if (event->ie.code == KEY_NS_PUT_WORKING_TEXT)
3901 obj = list1 (intern ("ns-put-working-text"));
3902 else
3903 obj = list1 (intern ("ns-unput-working-text"));
3904 kbd_fetch_ptr = event + 1;
3905 if (used_mouse_menu)
3906 *used_mouse_menu = true;
3907 }
3908 break;
3909#endif
3910
3911#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
3912 || defined (HAVE_NS)
3913 case DELETE_WINDOW_EVENT:
3914 {
3915 /* Make an event (delete-frame (FRAME)). */
3916 obj = list2 (Qdelete_frame, list1 (event->ie.frame_or_window));
3917 kbd_fetch_ptr = event + 1;
3918 }
3919 break;
3920#endif
3921
3922#ifdef HAVE_NTGUI
3923 case END_SESSION_EVENT:
3924 {
3925 /* Make an event (end-session). */
3926 obj = list1 (Qend_session);
3927 kbd_fetch_ptr = event + 1;
3928 }
3929 break;
3930#endif
3931
3932#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
3933 || defined (HAVE_NS)
3934 case ICONIFY_EVENT:
3935 {
3936 /* Make an event (iconify-frame (FRAME)). */
3937 obj = list2 (Qiconify_frame, list1 (event->ie.frame_or_window));
3938 kbd_fetch_ptr = event + 1;
3939 }
3940 break;
3941 case DEICONIFY_EVENT:
3942 {
3943 /* Make an event (make-frame-visible (FRAME)). */
3944 obj = list2 (Qmake_frame_visible, list1 (event->ie.frame_or_window));
3945 kbd_fetch_ptr = event + 1;
3946 }
3947 break;
3948#endif
3949 case BUFFER_SWITCH_EVENT:
3950 {
3951 /* The value doesn't matter here; only the type is tested. */
3952 XSETBUFFER (obj, current_buffer);
3953 kbd_fetch_ptr = event + 1;
3954 }
3955 break;
3956#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \ 3897#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
3957 || defined (HAVE_NS) || defined (USE_GTK) 3898 || defined (HAVE_NS) || defined (USE_GTK)
3958 case MENU_BAR_ACTIVATE_EVENT: 3899 case MENU_BAR_ACTIVATE_EVENT:
@@ -3964,148 +3905,40 @@ kbd_buffer_get_event (KBOARD **kbp,
3964 } 3905 }
3965 break; 3906 break;
3966#endif 3907#endif
3908#if defined (HAVE_NS)
3909 case NS_TEXT_EVENT:
3910#endif
3967#ifdef HAVE_NTGUI 3911#ifdef HAVE_NTGUI
3912 case END_SESSION_EVENT:
3968 case LANGUAGE_CHANGE_EVENT: 3913 case LANGUAGE_CHANGE_EVENT:
3969 { 3914#endif
3970 /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID). */ 3915#if defined (HAVE_X11) || defined (HAVE_NTGUI) || defined (HAVE_NS)
3971 obj = list4 (Qlanguage_change, 3916 case DELETE_WINDOW_EVENT:
3972 event->ie.frame_or_window, 3917 case ICONIFY_EVENT:
3973 make_number (event->ie.code), 3918 case DEICONIFY_EVENT:
3974 make_number (event->ie.modifiers)); 3919 case MOVE_FRAME_EVENT:
3975 kbd_fetch_ptr = event + 1;
3976 }
3977 break;
3978#endif 3920#endif
3979#ifdef USE_FILE_NOTIFY 3921#ifdef USE_FILE_NOTIFY
3980 case FILE_NOTIFY_EVENT: 3922 case FILE_NOTIFY_EVENT:
3981 {
3982#ifdef HAVE_W32NOTIFY
3983 /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK). */
3984 obj = list3 (Qfile_notify, event->ie.arg, event->ie.frame_or_window);
3985#else
3986 obj = make_lispy_event (&event->ie);
3987#endif
3988 kbd_fetch_ptr = event + 1;
3989 }
3990 break;
3991#endif /* USE_FILE_NOTIFY */
3992 case SAVE_SESSION_EVENT:
3993 {
3994 obj = list2 (Qsave_session, event->ie.arg);
3995 kbd_fetch_ptr = event + 1;
3996 }
3997 break;
3998 /* Just discard these, by returning nil.
3999 With MULTI_KBOARD, these events are used as placeholders
4000 when we need to randomly delete events from the queue.
4001 (They shouldn't otherwise be found in the buffer,
4002 but on some machines it appears they do show up
4003 even without MULTI_KBOARD.) */
4004 /* On Windows NT/9X, NO_EVENT is used to delete extraneous
4005 mouse events during a popup-menu call. */
4006 case NO_EVENT:
4007 kbd_fetch_ptr = event + 1;
4008 break;
4009 case HELP_EVENT:
4010 {
4011 Lisp_Object object, position, help, frame, window;
4012
4013 frame = event->ie.frame_or_window;
4014 object = event->ie.arg;
4015 position = make_number (Time_to_position (event->ie.timestamp));
4016 window = event->ie.x;
4017 help = event->ie.y;
4018 clear_event (event);
4019
4020 kbd_fetch_ptr = event + 1;
4021 if (!WINDOWP (window))
4022 window = Qnil;
4023 obj = Fcons (Qhelp_echo,
4024 list5 (frame, help, window, object, position));
4025 }
4026 break;
4027 case FOCUS_IN_EVENT:
4028 {
4029 /* Notification of a FocusIn event. The frame receiving the
4030 focus is in event->frame_or_window. Generate a
4031 switch-frame event if necessary. */
4032 Lisp_Object frame, focus;
4033
4034 frame = event->ie.frame_or_window;
4035 focus = FRAME_FOCUS_FRAME (XFRAME (frame));
4036 if (FRAMEP (focus))
4037 frame = focus;
4038
4039 if (
4040#ifdef HAVE_X11
4041 ! NILP (event->ie.arg)
4042 &&
4043#endif 3923#endif
4044 !EQ (frame, internal_last_event_frame)
4045 && !EQ (frame, selected_frame))
4046 obj = make_lispy_switch_frame (frame);
4047 else
4048 obj = make_lispy_focus_in (frame);
4049
4050 internal_last_event_frame = frame;
4051 kbd_fetch_ptr = event + 1;
4052 }
4053 break;
4054 case FOCUS_OUT_EVENT:
4055 {
4056#ifdef HAVE_WINDOW_SYSTEM
4057
4058 Display_Info *di;
4059 Lisp_Object frame = event->ie.frame_or_window;
4060 bool focused = false;
4061
4062 for (di = x_display_list; di && ! focused; di = di->next)
4063 focused = di->x_highlight_frame != 0;
4064
4065 if (!focused)
4066 obj = make_lispy_focus_out (frame);
4067
4068#endif /* HAVE_WINDOW_SYSTEM */
4069
4070 kbd_fetch_ptr = event + 1;
4071 }
4072 break;
4073#ifdef HAVE_DBUS 3924#ifdef HAVE_DBUS
4074 case DBUS_EVENT: 3925 case DBUS_EVENT:
4075 {
4076 obj = make_lispy_event (&event->ie);
4077 kbd_fetch_ptr = event + 1;
4078 }
4079 break;
4080#endif
4081#if defined (HAVE_X11) || defined (HAVE_NTGUI) || defined (HAVE_NS)
4082 case MOVE_FRAME_EVENT:
4083 {
4084 /* Make an event (move-frame (FRAME)). */
4085 obj = list2 (Qmove_frame, list1 (event->ie.frame_or_window));
4086 kbd_fetch_ptr = event + 1;
4087 }
4088 break;
4089#endif 3926#endif
4090#ifdef HAVE_XWIDGETS 3927#ifdef HAVE_XWIDGETS
4091 case XWIDGET_EVENT: 3928 case XWIDGET_EVENT:
4092 {
4093 obj = make_lispy_event (&event->ie);
4094 kbd_fetch_ptr = event + 1;
4095 }
4096 break;
4097#endif 3929#endif
3930 case BUFFER_SWITCH_EVENT:
3931 case SAVE_SESSION_EVENT:
3932 case NO_EVENT:
3933 case HELP_EVENT:
3934 case FOCUS_IN_EVENT:
4098 case CONFIG_CHANGED_EVENT: 3935 case CONFIG_CHANGED_EVENT:
4099 { 3936 case FOCUS_OUT_EVENT:
4100 obj = make_lispy_event (&event->ie);
4101 kbd_fetch_ptr = event + 1;
4102 }
4103 break;
4104 case SELECT_WINDOW_EVENT: 3937 case SELECT_WINDOW_EVENT:
4105 { 3938 {
4106 obj = list2 (Qselect_window, list1 (event->ie.frame_or_window)); 3939 obj = make_lispy_event (&event->ie);
4107 kbd_fetch_ptr = event + 1; 3940 kbd_fetch_ptr = event + 1;
4108 } 3941 }
4109 break; 3942 break;
4110 default: 3943 default:
4111 { 3944 {
@@ -4157,7 +3990,7 @@ kbd_buffer_get_event (KBOARD **kbp,
4157#endif 3990#endif
4158 3991
4159 /* Wipe out this event, to catch bugs. */ 3992 /* Wipe out this event, to catch bugs. */
4160 clear_event (event); 3993 clear_event (&event->ie);
4161 kbd_fetch_ptr = event + 1; 3994 kbd_fetch_ptr = event + 1;
4162 } 3995 }
4163 } 3996 }
@@ -5471,7 +5304,101 @@ make_lispy_event (struct input_event *event)
5471 5304
5472 switch (event->kind) 5305 switch (event->kind)
5473 { 5306 {
5474 /* A simple keystroke. */ 5307#if defined (HAVE_X11) || defined (HAVE_NTGUI) || defined (HAVE_NS)
5308 case DELETE_WINDOW_EVENT:
5309 /* Make an event (delete-frame (FRAME)). */
5310 return list2 (Qdelete_frame, list1 (event->frame_or_window));
5311
5312 case ICONIFY_EVENT:
5313 /* Make an event (iconify-frame (FRAME)). */
5314 return list2 (Qiconify_frame, list1 (event->frame_or_window));
5315
5316 case DEICONIFY_EVENT:
5317 /* Make an event (make-frame-visible (FRAME)). */
5318 return list2 (Qmake_frame_visible, list1 (event->frame_or_window));
5319
5320 case MOVE_FRAME_EVENT:
5321 /* Make an event (move-frame (FRAME)). */
5322 return list2 (Qmove_frame, list1 (event->frame_or_window));
5323#endif
5324
5325 case BUFFER_SWITCH_EVENT:
5326 {
5327 /* The value doesn't matter here; only the type is tested. */
5328 Lisp_Object obj;
5329 XSETBUFFER (obj, current_buffer);
5330 return obj;
5331 }
5332
5333 /* Just discard these, by returning nil.
5334 With MULTI_KBOARD, these events are used as placeholders
5335 when we need to randomly delete events from the queue.
5336 (They shouldn't otherwise be found in the buffer,
5337 but on some machines it appears they do show up
5338 even without MULTI_KBOARD.) */
5339 /* On Windows NT/9X, NO_EVENT is used to delete extraneous
5340 mouse events during a popup-menu call. */
5341 case NO_EVENT:
5342 return Qnil;
5343
5344 case HELP_EVENT:
5345 {
5346 Lisp_Object frame = event->frame_or_window;
5347 Lisp_Object object = event->arg;
5348 Lisp_Object position
5349 = make_number (Time_to_position (event->timestamp));
5350 Lisp_Object window = event->x;
5351 Lisp_Object help = event->y;
5352 clear_event (event);
5353
5354 if (!WINDOWP (window))
5355 window = Qnil;
5356 return Fcons (Qhelp_echo,
5357 list5 (frame, help, window, object, position));
5358 }
5359
5360 case FOCUS_IN_EVENT:
5361 {
5362 /* Notification of a FocusIn event. The frame receiving the
5363 focus is in event->frame_or_window. Generate a
5364 switch-frame event if necessary. */
5365
5366 Lisp_Object frame = event->frame_or_window;
5367 Lisp_Object focus = FRAME_FOCUS_FRAME (XFRAME (frame));
5368 if (FRAMEP (focus))
5369 frame = focus;
5370 bool switching
5371 = (
5372#ifdef HAVE_X11
5373 ! NILP (event->arg)
5374 &&
5375#endif
5376 !EQ (frame, internal_last_event_frame)
5377 && !EQ (frame, selected_frame));
5378 internal_last_event_frame = frame;
5379
5380 return (switching ? make_lispy_switch_frame (frame)
5381 : make_lispy_focus_in (frame));
5382 }
5383
5384 case FOCUS_OUT_EVENT:
5385 {
5386#ifdef HAVE_WINDOW_SYSTEM
5387
5388 Display_Info *di;
5389 Lisp_Object frame = event->frame_or_window;
5390 bool focused = false;
5391
5392 for (di = x_display_list; di && ! focused; di = di->next)
5393 focused = di->x_highlight_frame != 0;
5394
5395 return focused ? Qnil
5396 : make_lispy_focus_out (frame);
5397
5398#endif /* HAVE_WINDOW_SYSTEM */
5399 }
5400
5401 /* A simple keystroke. */
5475 case ASCII_KEYSTROKE_EVENT: 5402 case ASCII_KEYSTROKE_EVENT:
5476 case MULTIBYTE_CHAR_KEYSTROKE_EVENT: 5403 case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
5477 { 5404 {
@@ -5535,6 +5462,13 @@ make_lispy_event (struct input_event *event)
5535 } 5462 }
5536 5463
5537#ifdef HAVE_NS 5464#ifdef HAVE_NS
5465 case NS_TEXT_EVENT:
5466 if (used_mouse_menu)
5467 *used_mouse_menu = true;
5468 return list1 (intern (event->code == KEY_NS_PUT_WORKING_TEXT
5469 ? "ns-put-working-text"
5470 : "ns-unput-working-text"));
5471
5538 /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs, 5472 /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs,
5539 except that they are non-key events (last-nonmenu-event is nil). */ 5473 except that they are non-key events (last-nonmenu-event is nil). */
5540 case NS_NONKEY_EVENT: 5474 case NS_NONKEY_EVENT:
@@ -5597,6 +5531,17 @@ make_lispy_event (struct input_event *event)
5597 PTRDIFF_MAX); 5531 PTRDIFF_MAX);
5598 5532
5599#ifdef HAVE_NTGUI 5533#ifdef HAVE_NTGUI
5534 case END_SESSION_EVENT:
5535 /* Make an event (end-session). */
5536 return list1 (Qend_session);
5537
5538 case LANGUAGE_CHANGE_EVENT:
5539 /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID). */
5540 return list4 (Qlanguage_change,
5541 event->frame_or_window,
5542 make_number (event->code),
5543 make_number (event->modifiers));
5544
5600 case MULTIMEDIA_KEY_EVENT: 5545 case MULTIMEDIA_KEY_EVENT:
5601 if (event->code < ARRAYELTS (lispy_multimedia_keys) 5546 if (event->code < ARRAYELTS (lispy_multimedia_keys)
5602 && event->code > 0 && lispy_multimedia_keys[event->code]) 5547 && event->code > 0 && lispy_multimedia_keys[event->code])
@@ -6090,7 +6035,7 @@ make_lispy_event (struct input_event *event)
6090 } 6035 }
6091 6036
6092 case SAVE_SESSION_EVENT: 6037 case SAVE_SESSION_EVENT:
6093 return Qsave_session; 6038 return list2 (Qsave_session, event->arg);
6094 6039
6095#ifdef HAVE_DBUS 6040#ifdef HAVE_DBUS
6096 case DBUS_EVENT: 6041 case DBUS_EVENT:
@@ -6106,12 +6051,15 @@ make_lispy_event (struct input_event *event)
6106 } 6051 }
6107#endif 6052#endif
6108 6053
6109#if defined HAVE_INOTIFY || defined HAVE_KQUEUE || defined HAVE_GFILENOTIFY 6054#ifdef USE_FILE_NOTIFY
6110 case FILE_NOTIFY_EVENT: 6055 case FILE_NOTIFY_EVENT:
6111 { 6056#ifdef HAVE_W32NOTIFY
6112 return Fcons (Qfile_notify, event->arg); 6057 /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK). */
6113 } 6058 return list3 (Qfile_notify, event->arg, event->frame_or_window);
6114#endif /* HAVE_INOTIFY || HAVE_KQUEUE || HAVE_GFILENOTIFY */ 6059#else
6060 return Fcons (Qfile_notify, event->arg);
6061#endif
6062#endif /* USE_FILE_NOTIFY */
6115 6063
6116 case CONFIG_CHANGED_EVENT: 6064 case CONFIG_CHANGED_EVENT:
6117 return list3 (Qconfig_changed_event, 6065 return list3 (Qconfig_changed_event,
@@ -10337,7 +10285,7 @@ stuff_buffered_input (Lisp_Object stuffstring)
10337 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT) 10285 if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
10338 stuff_char (kbd_fetch_ptr->ie.code); 10286 stuff_char (kbd_fetch_ptr->ie.code);
10339 10287
10340 clear_event (kbd_fetch_ptr); 10288 clear_event (&kbd_fetch_ptr->ie);
10341 } 10289 }
10342 10290
10343 input_pending = false; 10291 input_pending = false;