From b21f1cabd833aaa370fb0572cfaac2af83856ad5 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 10 Nov 2021 14:04:24 +0800 Subject: [PATCH] Revert "Add support for event processing via XInput 2" This reverts commit 346cfc81247e6bf8e727a27b42f44f2389bd1269. --- configure.ac | 22 - src/Makefile.in | 7 +- src/gtkutil.c | 72 +--- src/gtkutil.h | 4 - src/xfns.c | 78 ---- src/xmenu.c | 4 - src/xterm.c | 1086 +---------------------------------------------- src/xterm.h | 42 -- 8 files changed, 7 insertions(+), 1308 deletions(-) diff --git a/configure.ac b/configure.ac index a243efdd43e..33e7037afe2 100644 --- a/configure.ac +++ b/configure.ac @@ -487,7 +487,6 @@ OPTION_DEFAULT_ON([modules],[don't compile with dynamic modules support]) OPTION_DEFAULT_ON([threads],[don't compile with elisp threading support]) OPTION_DEFAULT_OFF([native-compilation],[compile with Emacs Lisp native compiler support]) OPTION_DEFAULT_OFF([cygwin32-native-compilation],[use native compilation on 32-bit Cygwin]) -OPTION_DEFAULT_OFF([xinput2],[use version 2.0 the X Input Extension for input]) AC_ARG_WITH([file-notification],[AS_HELP_STRING([--with-file-notification=LIB], [use a file notification library (LIB one of: yes, inotify, kqueue, gfile, w32, no)])], @@ -4238,26 +4237,6 @@ fi AC_SUBST(XFIXES_CFLAGS) AC_SUBST(XFIXES_LIBS) -## Use XInput 2.0 if available -HAVE_XINPUT2=no -if test "${HAVE_X11}" = "yes" && test "${with_xinput2}" != "no"; then - EMACS_CHECK_MODULES([XINPUT], [xi]) - if test $HAVE_XINPUT = yes; then - # Now check for XInput2.h - AC_CHECK_HEADER(X11/extensions/XInput2.h, - [AC_CHECK_LIB(Xi, XIGrabButton, HAVE_XINPUT2=yes)]) - fi - if test $HAVE_XINPUT2 = yes; then - AC_DEFINE(HAVE_XINPUT2, 1, [Define to 1 if the X Input Extension version 2.0 is present.]) - if test "$USE_GTK_TOOLKIT" = "GTK2"; then - AC_MSG_WARN([You are building Emacs with GTK+ 2 and the X Input Extension version 2. -This might lead to problems if your version of GTK+ is not built with support for XInput 2.]) - fi - fi -fi -AC_SUBST(XINPUT_CFLAGS) -AC_SUBST(XINPUT_LIBS) - ### Use Xdbe (-lXdbe) if available HAVE_XDBE=no if test "${HAVE_X11}" = "yes"; then @@ -6015,7 +5994,6 @@ AS_ECHO([" Does Emacs use -lXaw3d? ${HAVE_XAW3D Does Emacs support legacy unexec dumping? ${with_unexec} Which dumping strategy does Emacs use? ${with_dumping} Does Emacs have native lisp compiler? ${HAVE_NATIVE_COMP} - Does Emacs use version 2 of the the X Input Extension? ${HAVE_XINPUT2} "]) if test -n "${EMACSDATA}"; then diff --git a/src/Makefile.in b/src/Makefile.in index 4795ade3eaa..4c5535f8ad9 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -258,9 +258,6 @@ XINERAMA_CFLAGS = @XINERAMA_CFLAGS@ XFIXES_LIBS = @XFIXES_LIBS@ XFIXES_CFLAGS = @XFIXES_CFLAGS@ -XINPUT_LIBS = @XINPUT_LIBS@ -XINPUT_CFLAGS = @XINPUT_CFLAGS@ - XDBE_LIBS = @XDBE_LIBS@ XDBE_CFLAGS = @XDBE_CFLAGS@ @@ -377,7 +374,7 @@ EMACS_CFLAGS=-Demacs $(MYCPPFLAGS) -I. -I$(srcdir) \ $(GNUSTEP_CFLAGS) $(CFLAGS_SOUND) $(RSVG_CFLAGS) $(IMAGEMAGICK_CFLAGS) \ $(PNG_CFLAGS) $(LIBXML2_CFLAGS) $(LIBGCCJIT_CFLAGS) $(DBUS_CFLAGS) \ $(XRANDR_CFLAGS) $(XINERAMA_CFLAGS) $(XFIXES_CFLAGS) $(XDBE_CFLAGS) \ - $(WEBKIT_CFLAGS) $(WEBP_CFLAGS) $(LCMS2_CFLAGS) $(XINPUT_CFLAGS) \ + $(WEBKIT_CFLAGS) $(WEBP_CFLAGS) $(LCMS2_CFLAGS) \ $(SETTINGS_CFLAGS) $(FREETYPE_CFLAGS) $(FONTCONFIG_CFLAGS) \ $(HARFBUZZ_CFLAGS) $(LIBOTF_CFLAGS) $(M17N_FLT_CFLAGS) $(DEPFLAGS) \ $(LIBSYSTEMD_CFLAGS) $(JSON_CFLAGS) \ @@ -527,7 +524,7 @@ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \ $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(HARFBUZZ_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \ $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(GETADDRINFO_A_LIBS) $(LCMS2_LIBS) \ $(NOTIFY_LIBS) $(LIB_MATH) $(LIBZ) $(LIBMODULES) $(LIBSYSTEMD_LIBS) \ - $(JSON_LIBS) $(LIBGMP) $(LIBGCCJIT_LIBS) $(XINPUT_LIBS) + $(JSON_LIBS) $(LIBGMP) $(LIBGCCJIT_LIBS) ## FORCE it so that admin/unidata can decide whether this file is ## up-to-date. Although since charprop depends on bootstrap-emacs, diff --git a/src/gtkutil.c b/src/gtkutil.c index 9e676cd025b..a9eabf47d8f 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -47,10 +47,6 @@ along with GNU Emacs. If not, see . */ #include -#ifdef HAVE_XINPUT2 -#include -#endif - #ifdef HAVE_XFT #include #endif @@ -843,23 +839,6 @@ my_log_handler (const gchar *log_domain, GLogLevelFlags log_level, } #endif -#if defined HAVE_GTK3 && defined HAVE_XINPUT2 -bool -xg_is_menu_window (Display *dpy, Window wdesc) -{ - GtkWidget *gwdesc = xg_win_to_widget (dpy, wdesc); - - if (GTK_IS_WINDOW (gwdesc)) - { - GtkWidget *fw = gtk_bin_get_child (GTK_BIN (gwdesc)); - if (GTK_IS_MENU (fw)) - return true; - } - - return false; -} -#endif - /* Make a geometry string and pass that to GTK. It seems this is the only way to get geometry position right if the user explicitly asked for a position when starting Emacs. @@ -3610,18 +3589,6 @@ xg_event_is_for_menubar (struct frame *f, const XEvent *event) if (! x->menubar_widget) return 0; -#ifdef HAVE_XINPUT2 - XIDeviceEvent *xev = (XIDeviceEvent *) event->xcookie.data; - if (event->type == GenericEvent) /* XI_ButtonPress or XI_ButtonRelease */ - { - if (! (xev->event_x >= 0 - && xev->event_x < FRAME_PIXEL_WIDTH (f) - && xev->event_y >= 0 - && xev->event_y < FRAME_MENUBAR_HEIGHT (f))) - return 0; - } - else -#endif if (! (event->xbutton.x >= 0 && event->xbutton.x < FRAME_PIXEL_WIDTH (f) && event->xbutton.y >= 0 @@ -3630,12 +3597,7 @@ xg_event_is_for_menubar (struct frame *f, const XEvent *event) return 0; gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f)); -#ifdef HAVE_XINPUT2 - if (event->type == GenericEvent) - gw = gdk_x11_window_lookup_for_display (gdpy, xev->event); - else -#endif - gw = gdk_x11_window_lookup_for_display (gdpy, event->xbutton.window); + gw = gdk_x11_window_lookup_for_display (gdpy, event->xbutton.window); if (! gw) return 0; gevent.any.window = gw; gevent.any.type = GDK_NOTHING; @@ -4282,20 +4244,7 @@ xg_event_is_for_scrollbar (struct frame *f, const XEvent *event) { bool retval = 0; -#ifdef HAVE_XINPUT2 - XIDeviceEvent *xev = (XIDeviceEvent *) event->xcookie.data; - if (f && ((FRAME_DISPLAY_INFO (f)->supports_xi2 - && event->type == GenericEvent - && (event->xgeneric.extension - == FRAME_DISPLAY_INFO (f)->xi2_opcode) - && ((event->xgeneric.evtype == XI_ButtonPress - && xev->detail < 4) - || (event->xgeneric.evtype == XI_Motion))) - || (event->type == ButtonPress - && event->xbutton.button < 4))) -#else if (f && event->type == ButtonPress && event->xbutton.button < 4) -#endif /* HAVE_XINPUT2 */ { /* Check if press occurred outside the edit widget. */ GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f)); @@ -4313,29 +4262,10 @@ xg_event_is_for_scrollbar (struct frame *f, const XEvent *event) gwin = gdk_display_get_window_at_pointer (gdpy, NULL, NULL); #endif retval = gwin != gtk_widget_get_window (f->output_data.x->edit_widget); -#ifdef HAVE_XINPUT2 - GtkWidget *grab = gtk_grab_get_current (); - if (event->type == GenericEvent - && event->xgeneric.evtype == XI_Motion) - retval = retval || (grab && GTK_IS_SCROLLBAR (grab)); -#endif } -#ifdef HAVE_XINPUT2 - else if (f && ((FRAME_DISPLAY_INFO (f)->supports_xi2 - && event->type == GenericEvent - && (event->xgeneric.extension - == FRAME_DISPLAY_INFO (f)->xi2_opcode) - && ((event->xgeneric.evtype == XI_ButtonRelease - && xev->detail < 4) - || (event->xgeneric.evtype == XI_Motion))) - || ((event->type == ButtonRelease - && event->xbutton.button < 4) - || event->type == MotionNotify))) -#else else if (f && ((event->type == ButtonRelease && event->xbutton.button < 4) || event->type == MotionNotify)) -#endif /* HAVE_XINPUT2 */ { /* If we are releasing or moving the scroll bar, it has the grab. */ GtkWidget *w = gtk_grab_get_current (); diff --git a/src/gtkutil.h b/src/gtkutil.h index 95dd75b7fad..31a12cd5d3c 100644 --- a/src/gtkutil.h +++ b/src/gtkutil.h @@ -192,10 +192,6 @@ extern Lisp_Object xg_get_page_setup (void); extern void xg_print_frames_dialog (Lisp_Object); #endif -#if defined HAVE_GTK3 && defined HAVE_XINPUT2 -extern bool xg_is_menu_window (Display *dpy, Window); -#endif - /* Mark all callback data that are Lisp_object:s during GC. */ extern void xg_mark_data (void); diff --git a/src/xfns.c b/src/xfns.c index c792826e6be..785ae3baca5 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -57,10 +57,6 @@ along with GNU Emacs. If not, see . */ #include #endif -#ifdef HAVE_XINPUT2 -#include -#endif - #ifdef USE_X_TOOLKIT #include @@ -3078,43 +3074,6 @@ x_window (struct frame *f, long window_prompting) class_hints.res_class = SSDATA (Vx_resource_class); XSetClassHint (FRAME_X_DISPLAY (f), XtWindow (shell_widget), &class_hints); -#ifdef HAVE_XINPUT2 - if (FRAME_DISPLAY_INFO (f)->supports_xi2) - { - XIEventMask mask; - ptrdiff_t l = XIMaskLen (XI_LASTEVENT); - unsigned char *m; - mask.mask = m = alloca (l); - memset (m, 0, l); - mask.mask_len = l; - mask.deviceid = XIAllMasterDevices; - - XISetMask (m, XI_ButtonPress); - XISetMask (m, XI_ButtonRelease); - XISetMask (m, XI_KeyPress); - XISetMask (m, XI_KeyRelease); - XISetMask (m, XI_Motion); - XISetMask (m, XI_Enter); - XISetMask (m, XI_Leave); - XISetMask (m, XI_FocusIn); - XISetMask (m, XI_FocusOut); - XISetMask (m, XI_DeviceChanged); - - XISelectEvents (FRAME_X_DISPLAY (f), - FRAME_X_WINDOW (f), - &mask, 1); - - mask.deviceid = XIAllDevices; - memset (m, 0, l); - XISetMask (m, XI_PropertyEvent); - XISetMask (m, XI_HierarchyChanged); - - XISelectEvents (FRAME_X_DISPLAY (f), - FRAME_X_WINDOW (f), - &mask, 1); - } -#endif - #ifdef HAVE_X_I18N FRAME_XIC (f) = NULL; if (use_xim) @@ -3295,43 +3254,6 @@ x_window (struct frame *f) } #endif /* HAVE_X_I18N */ -#ifdef HAVE_XINPUT2 - if (FRAME_DISPLAY_INFO (f)->supports_xi2) - { - XIEventMask mask; - ptrdiff_t l = XIMaskLen (XI_LASTEVENT); - unsigned char *m; - mask.mask = m = alloca (l); - memset (m, 0, l); - mask.mask_len = l; - mask.deviceid = XIAllMasterDevices; - - XISetMask (m, XI_ButtonPress); - XISetMask (m, XI_ButtonRelease); - XISetMask (m, XI_KeyPress); - XISetMask (m, XI_KeyRelease); - XISetMask (m, XI_Motion); - XISetMask (m, XI_Enter); - XISetMask (m, XI_Leave); - XISetMask (m, XI_FocusIn); - XISetMask (m, XI_FocusOut); - XISetMask (m, XI_DeviceChanged); - - XISelectEvents (FRAME_X_DISPLAY (f), - FRAME_X_WINDOW (f), - &mask, 1); - - mask.deviceid = XIAllDevices; - memset (m, 0, l); - XISetMask (m, XI_PropertyEvent); - XISetMask (m, XI_HierarchyChanged); - - XISelectEvents (FRAME_X_DISPLAY (f), - FRAME_X_WINDOW (f), - &mask, 1); - } -#endif - validate_x_resource_name (); class_hints.res_name = SSDATA (Vx_resource_name); diff --git a/src/xmenu.c b/src/xmenu.c index 07255911f97..ea2cbab2030 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -105,11 +105,7 @@ along with GNU Emacs. If not, see . */ /* Flag which when set indicates a dialog or menu has been posted by Xt on behalf of one of the widget sets. */ -#ifndef HAVE_XINPUT2 static int popup_activated_flag; -#else -int popup_activated_flag; -#endif #ifdef USE_X_TOOLKIT diff --git a/src/xterm.c b/src/xterm.c index d0da6ad6a6d..172abe919dd 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -42,10 +42,6 @@ along with GNU Emacs. If not, see . */ #include #endif -#ifdef HAVE_XINPUT2 -#include -#endif - /* Load sys/types.h if not already loaded. In some systems loading it twice is suicidal. */ #ifndef makedev @@ -227,15 +223,9 @@ static bool x_handle_net_wm_state (struct frame *, const XPropertyEvent *); static void x_check_fullscreen (struct frame *); static void x_check_expected_move (struct frame *, int, int); static void x_sync_with_move (struct frame *, int, int, bool); -#ifndef HAVE_XINPUT2 static int handle_one_xevent (struct x_display_info *, const XEvent *, int *, struct input_event *); -#else -static int handle_one_xevent (struct x_display_info *, - XEvent *, int *, - struct input_event *); -#endif #if ! (defined USE_X_TOOLKIT || defined USE_MOTIF) && defined USE_GTK static int x_dispatch_event (XEvent *, Display *); #endif @@ -345,156 +335,6 @@ x_extension_initialize (struct x_display_info *dpyinfo) dpyinfo->ext_codes = ext_codes; } - -#ifdef HAVE_XINPUT2 - -/* Free all XI2 devices on dpyinfo. */ -static void -x_free_xi_devices (struct x_display_info *dpyinfo) -{ - block_input (); - - if (dpyinfo->num_devices) - { - for (int i = 0; i < dpyinfo->num_devices; ++i) - xfree (dpyinfo->devices[i].valuators); - - xfree (dpyinfo->devices); - dpyinfo->devices = NULL; - dpyinfo->num_devices = 0; - } - - unblock_input (); -} - -/* Setup valuator tracking for XI2 master devices on - DPYINFO->display. */ - -static void -x_init_master_valuators (struct x_display_info *dpyinfo) -{ - int ndevices; - XIDeviceInfo *infos; - - block_input (); - x_free_xi_devices (dpyinfo); - infos = XIQueryDevice (dpyinfo->display, - XIAllMasterDevices, - &ndevices); - - if (!ndevices) - { - XIFreeDeviceInfo (infos); - unblock_input (); - return; - } - - int actual_devices = 0; - dpyinfo->devices = xmalloc (sizeof *dpyinfo->devices * ndevices); - - for (int i = 0; i < ndevices; ++i) - { - XIDeviceInfo *device = &infos[i]; - - if (device->enabled) - { - int actual_valuator_count = 0; - struct xi_device_t *xi_device = - &dpyinfo->devices[actual_devices++]; - xi_device->device_id = device->deviceid; - xi_device->valuators = - xmalloc (sizeof *xi_device->valuators * device->num_classes); - - for (int c = 0; c < device->num_classes; ++c) - { - switch (device->classes[c]->type) - { -#ifdef XIScrollClass /* XInput 2.1 */ - case XIScrollClass: - { - XIScrollClassInfo *info = - (XIScrollClassInfo *) device->classes[c]; - struct xi_scroll_valuator_t *valuator = - &xi_device->valuators[actual_valuator_count++]; - - valuator->horizontal = (info->scroll_type == XIScrollTypeHorizontal); - valuator->invalid_p = true; - valuator->emacs_value = DBL_MIN; - valuator->increment = info->increment; - valuator->number = info->number; - break; - } -#endif - default: - break; - } - } - xi_device->scroll_valuator_count = actual_valuator_count; - } - } - - dpyinfo->num_devices = actual_devices; - XIFreeDeviceInfo (infos); - unblock_input (); -} - -/* Return the delta of the scroll valuator VALUATOR_NUMBER under - DEVICE_ID in the display DPYINFO with VALUE. The valuator's - valuator will be set to VALUE afterwards. In case no scroll - valuator is found, or if device_id is not known to Emacs, DBL_MAX - is returned. Otherwise, the valuator is returned in - VALUATOR_RETURN. */ -static double -x_get_scroll_valuator_delta (struct x_display_info *dpyinfo, int device_id, - int valuator_number, double value, - struct xi_scroll_valuator_t **valuator_return) -{ - block_input (); - - for (int i = 0; i < dpyinfo->num_devices; ++i) - { - struct xi_device_t *device = &dpyinfo->devices[i]; - - if (device->device_id == device_id) - { - for (int j = 0; j < device->scroll_valuator_count; ++j) - { - struct xi_scroll_valuator_t *sv = &device->valuators[j]; - - if (sv->number == valuator_number) - { - if (sv->invalid_p) - { - sv->current_value = value; - sv->invalid_p = false; - *valuator_return = sv; - - unblock_input (); - return 0.0; - } - else - { - double delta = sv->current_value - value; - sv->current_value = value; - *valuator_return = sv; - - unblock_input (); - return delta / sv->increment; - } - } - } - - unblock_input (); - return DBL_MAX; - } - } - - unblock_input (); - return DBL_MAX; -} - -#endif - void x_cr_destroy_frame_context (struct frame *f) { @@ -4928,16 +4768,7 @@ static struct frame * x_menubar_window_to_frame (struct x_display_info *dpyinfo, const XEvent *event) { - Window wdesc; -#ifdef HAVE_XINPUT2 - if (event->type == GenericEvent - && dpyinfo->supports_xi2 - && (event->xcookie.evtype == XI_ButtonPress - || event->xcookie.evtype == XI_ButtonRelease)) - wdesc = ((XIDeviceEvent *) event->xcookie.data)->event; - else -#endif - wdesc = event->xany.window; + Window wdesc = event->xany.window; Lisp_Object tail, frame; struct frame *f; struct x_output *x; @@ -5040,29 +4871,6 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame, } break; -#ifdef HAVE_XINPUT2 - case GenericEvent: - { - XIEvent *xi_event = (XIEvent *) event; - - struct frame *focus_frame = dpyinfo->x_focus_event_frame; - int focus_state - = focus_frame ? focus_frame->output_data.x->focus_state : 0; - - if (!((xi_event->evtype == XI_Enter - || xi_event->evtype == XI_Leave) - && (focus_state & FOCUS_EXPLICIT))) - x_focus_changed ((xi_event->evtype == XI_Enter - || xi_event->evtype == XI_FocusIn - ? FocusIn : FocusOut), - (xi_event->evtype == XI_Enter - || xi_event->evtype == XI_Leave - ? FOCUS_IMPLICIT : FOCUS_EXPLICIT), - dpyinfo, frame, bufp); - break; - } -#endif - case FocusIn: case FocusOut: /* Ignore transient focus events from hotkeys, window manager @@ -8167,11 +7975,7 @@ mouse_or_wdesc_frame (struct x_display_info *dpyinfo, int wdesc) static int handle_one_xevent (struct x_display_info *dpyinfo, -#ifndef HAVE_XINPUT2 const XEvent *event, -#else - XEvent *event, -#endif int *finish, struct input_event *hold_quit) { union buffered_input_event inev; @@ -8197,14 +8001,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, inev.ie.kind = NO_EVENT; inev.ie.arg = Qnil; -#ifdef HAVE_XINPUT2 - if (event->type != GenericEvent) -#endif - any = x_any_window_to_frame (dpyinfo, event->xany.window); -#ifdef HAVE_XINPUT2 - else - any = NULL; -#endif + any = x_any_window_to_frame (dpyinfo, event->xany.window); if (any && any->wait_event_type == event->type) any->wait_event_type = 0; /* Indicates we got it. */ @@ -8683,10 +8480,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, goto OTHER; case MapNotify: -#if defined HAVE_XINPUT2 && defined HAVE_GTK3 - if (xg_is_menu_window (dpyinfo->display, event->xmap.window)) - popup_activated_flag = 1; -#endif /* We use x_top_window_to_frame because map events can come for sub-windows and they don't mean that the frame is visible. */ @@ -9725,832 +9518,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, case DestroyNotify: xft_settings_event (dpyinfo, event); break; -#ifdef HAVE_XINPUT2 - case GenericEvent: - { - if (!dpyinfo->supports_xi2) - goto OTHER; - if (event->xgeneric.extension != dpyinfo->xi2_opcode) - /* Not an XI2 event. */ - goto OTHER; - bool must_free_data = false; - XIEvent *xi_event = (XIEvent *) event->xcookie.data; - /* Sometimes the event is already claimed by GTK, which - will free its data in due course. */ - if (!xi_event && XGetEventData (dpyinfo->display, &event->xcookie)) - { - must_free_data = true; - xi_event = (XIEvent *) event->xcookie.data; - } - - XIDeviceEvent *xev = (XIDeviceEvent *) xi_event; - XILeaveEvent *leave = (XILeaveEvent *) xi_event; - XIEnterEvent *enter = (XIEnterEvent *) xi_event; - XIFocusInEvent *focusin = (XIFocusInEvent *) xi_event; - XIFocusOutEvent *focusout = (XIFocusOutEvent *) xi_event; - XIValuatorState *states; - double *values; - bool found_valuator = false; - - /* A fake XMotionEvent for x_note_mouse_movement. */ - XMotionEvent ev; - /* A fake XButtonEvent for x_construct_mouse_click. */ - XButtonEvent bv; - - if (!xi_event) - { - eassert (!must_free_data); - goto OTHER; - } - - switch (event->xcookie.evtype) - { - case XI_FocusIn: - any = x_any_window_to_frame (dpyinfo, focusin->event); -#ifndef USE_GTK - /* Some WMs (e.g. Mutter in Gnome Shell), don't unmap - minimized/iconified windows; thus, for those WMs we won't get - a MapNotify when unminimizing/deconifying. Check here if we - are deiconizing a window (Bug42655). - - But don't do that on GTK since it may cause a plain invisible - frame get reported as iconified, compare - https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. - That is fixed above but bites us here again. */ - f = any; - if (f && FRAME_ICONIFIED_P (f)) - { - SET_FRAME_VISIBLE (f, 1); - SET_FRAME_ICONIFIED (f, false); - f->output_data.x->has_been_visible = true; - inev.ie.kind = DEICONIFY_EVENT; - XSETFRAME (inev.ie.frame_or_window, f); - } -#endif /* USE_GTK */ - x_detect_focus_change (dpyinfo, any, event, &inev.ie); - goto XI_OTHER; - case XI_FocusOut: - any = x_any_window_to_frame (dpyinfo, focusout->event); - x_detect_focus_change (dpyinfo, any, event, &inev.ie); - goto XI_OTHER; - case XI_Enter: - any = x_any_window_to_frame (dpyinfo, enter->event); - ev.x = lrint (enter->event_x); - ev.y = lrint (enter->event_y); - ev.window = leave->event; - - x_display_set_last_user_time (dpyinfo, xi_event->time); - x_detect_focus_change (dpyinfo, any, event, &inev.ie); - f = any; - - if (f && x_mouse_click_focus_ignore_position) - ignore_next_mouse_click_timeout = xi_event->time + 200; - - /* EnterNotify counts as mouse movement, - so update things that depend on mouse position. */ - if (f && !f->output_data.x->hourglass_p) - x_note_mouse_movement (f, &ev); -#ifdef USE_GTK - /* We may get an EnterNotify on the buttons in the toolbar. In that - case we moved out of any highlighted area and need to note this. */ - if (!f && dpyinfo->last_mouse_glyph_frame) - x_note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &ev); -#endif - goto XI_OTHER; - case XI_Leave: - ev.x = lrint (leave->event_x); - ev.y = lrint (leave->event_y); - ev.window = leave->event; - any = x_any_window_to_frame (dpyinfo, leave->event); - - x_display_set_last_user_time (dpyinfo, xi_event->time); - x_detect_focus_change (dpyinfo, any, event, &inev.ie); - - f = x_top_window_to_frame (dpyinfo, leave->event); - if (f) - { - if (f == hlinfo->mouse_face_mouse_frame) - { - /* If we move outside the frame, then we're - certainly no longer on any text in the frame. */ - clear_mouse_face (hlinfo); - hlinfo->mouse_face_mouse_frame = 0; - } - - /* Generate a nil HELP_EVENT to cancel a help-echo. - Do it only if there's something to cancel. - Otherwise, the startup message is cleared when - the mouse leaves the frame. */ - if (any_help_event_p) - do_help = -1; - } -#ifdef USE_GTK - /* See comment in EnterNotify above */ - else if (dpyinfo->last_mouse_glyph_frame) - x_note_mouse_movement (dpyinfo->last_mouse_glyph_frame, &ev); -#endif - goto XI_OTHER; - case XI_Motion: - /* First test if there is some kind of scroll event - here! */ - states = &xev->valuators; - values = states->values; - - x_display_set_last_user_time (dpyinfo, xi_event->time); - - for (int i = 0; i < states->mask_len * 8; i++) - { - if (XIMaskIsSet (states->mask, i)) - { - block_input (); - - struct xi_scroll_valuator_t *val; - double delta = - x_get_scroll_valuator_delta (dpyinfo, xev->deviceid, - i, *values, &val); - - if (delta != DBL_MAX) - { - /* TODO: Figure out how pixelwise scrolling should work. - Until that happens, this will have to do. */ - delta *= 10; - - f = mouse_or_wdesc_frame (dpyinfo, xev->event); - found_valuator = true; - if (signbit (delta) != signbit (val->emacs_value)) - val->emacs_value = DBL_MIN; - - val->emacs_value += delta; - - if (!f) - { - f = x_any_window_to_frame (dpyinfo, xev->event); - - if (!f) - { - unblock_input (); - goto XI_OTHER; - } - } - - if ((val->horizontal - && fabs (val->emacs_value) >= FRAME_COLUMN_WIDTH (f)) - || (!val->horizontal - && fabs (val->emacs_value) >= FRAME_LINE_HEIGHT (f))) - { - Lisp_Object tab_bar_arg = Qnil; - bool tab_bar_p = false; - bool tool_bar_p = false; - bool s = signbit (val->emacs_value); - - bv.button = !val->horizontal ? (s ? 5 : 4) : (s ? 7 : 6); - bv.type = ButtonPress; - - bv.x = lrint (xev->event_x); - bv.y = lrint (xev->event_y); - bv.window = xev->event; - bv.state = xev->mods.base - | xev->mods.effective - | xev->mods.latched - | xev->mods.locked; - - /* Is this in the tab-bar? */ - if (WINDOWP (f->tab_bar_window) - && WINDOW_TOTAL_LINES (XWINDOW (f->tab_bar_window))) - { - Lisp_Object window; - int x = bv.x; - int y = bv.y; - - window = window_from_coordinates (f, x, y, 0, true, true); - tab_bar_p = EQ (window, f->tab_bar_window); - - if (tab_bar_p) - { - tab_bar_arg = handle_tab_bar_click - (f, x, y, true, x_x_to_emacs_modifiers (dpyinfo, bv.state)); - tab_bar_arg = handle_tab_bar_click - (f, x, y, false, x_x_to_emacs_modifiers (dpyinfo, bv.state)); - } - } - - if (!NILP (tab_bar_arg)) - inev.ie.arg = tab_bar_arg; - - if (!tool_bar_p && !(NILP (tab_bar_arg) && tab_bar_p)) - { - if (ignore_next_mouse_click_timeout) - { - if (xev->time > ignore_next_mouse_click_timeout) - { - /* XXX: Wouldn't it be better - to just use wheel events - instead of pretending to be - X here? */ - x_construct_mouse_click (&inev.ie, &bv, f); - if (!NILP (tab_bar_arg)) - inev.ie.arg = tab_bar_arg; - kbd_buffer_store_event (&inev.ie); - inev.ie.modifiers &= ~down_modifier; - inev.ie.modifiers |= up_modifier; - kbd_buffer_store_event (&inev.ie); - } - ignore_next_mouse_click_timeout = 0; - } - else - { - x_construct_mouse_click (&inev.ie, &bv, f); - kbd_buffer_store_event (&inev.ie); - inev.ie.modifiers &= ~down_modifier; - inev.ie.modifiers |= up_modifier; - kbd_buffer_store_event (&inev.ie); - } - } - - val->emacs_value = DBL_MIN; - } - } - unblock_input (); - values++; - } - - inev.ie.kind = NO_EVENT; - } - - if (found_valuator) - goto XI_OTHER; - - ev.x = lrint (xev->event_x); - ev.y = lrint (xev->event_y); - ev.window = xev->event; - - previous_help_echo_string = help_echo_string; - help_echo_string = Qnil; - - if (hlinfo->mouse_face_hidden) - { - hlinfo->mouse_face_hidden = false; - clear_mouse_face (hlinfo); - } - - f = mouse_or_wdesc_frame (dpyinfo, xev->event); - -#ifdef USE_GTK - if (f && xg_event_is_for_scrollbar (f, event)) - f = 0; -#endif - if (f) - { - /* Maybe generate a SELECT_WINDOW_EVENT for - `mouse-autoselect-window' but don't let popup menus - interfere with this (Bug#1261). */ - if (!NILP (Vmouse_autoselect_window) - && !popup_activated () - /* Don't switch if we're currently in the minibuffer. - This tries to work around problems where the - minibuffer gets unselected unexpectedly, and where - you then have to move your mouse all the way down to - the minibuffer to select it. */ - && !MINI_WINDOW_P (XWINDOW (selected_window)) - /* With `focus-follows-mouse' non-nil create an event - also when the target window is on another frame. */ - && (f == XFRAME (selected_frame) - || !NILP (focus_follows_mouse))) - { - static Lisp_Object last_mouse_window; - Lisp_Object window = window_from_coordinates (f, ev.x, ev.y, 0, false, false); - - /* A window will be autoselected only when it is not - selected now and the last mouse movement event was - not in it. The remainder of the code is a bit vague - wrt what a "window" is. For immediate autoselection, - the window is usually the entire window but for GTK - where the scroll bars don't count. For delayed - autoselection the window is usually the window's text - area including the margins. */ - if (WINDOWP (window) - && !EQ (window, last_mouse_window) - && !EQ (window, selected_window)) - { - inev.ie.kind = SELECT_WINDOW_EVENT; - inev.ie.frame_or_window = window; - } - - /* Remember the last window where we saw the mouse. */ - last_mouse_window = window; - } - - if (!x_note_mouse_movement (f, &ev)) - help_echo_string = previous_help_echo_string; - } - else - { -#ifndef USE_TOOLKIT_SCROLL_BARS - struct scroll_bar *bar - = x_window_to_scroll_bar (xi_event->display, xev->event, 2); - - if (bar) - x_scroll_bar_note_movement (bar, &ev); -#endif /* USE_TOOLKIT_SCROLL_BARS */ - - /* If we move outside the frame, then we're - certainly no longer on any text in the frame. */ - clear_mouse_face (hlinfo); - } - - /* If the contents of the global variable help_echo_string - has changed, generate a HELP_EVENT. */ - if (!NILP (help_echo_string) - || !NILP (previous_help_echo_string)) - do_help = 1; - goto XI_OTHER; - case XI_ButtonRelease: - case XI_ButtonPress: - { - /* If we decide we want to generate an event to be seen - by the rest of Emacs, we put it here. */ - Lisp_Object tab_bar_arg = Qnil; - bool tab_bar_p = false; - bool tool_bar_p = false; - - /* Ignore emulated scroll events when XI2 native - scroll events are present. */ - if (dpyinfo->xi2_version >= 1 && xev->detail >= 4 - && xev->detail <= 8) - goto XI_OTHER; - - bv.button = xev->detail; - bv.type = xev->evtype == XI_ButtonPress ? ButtonPress : ButtonRelease; - bv.x = lrint (xev->event_x); - bv.y = lrint (xev->event_y); - bv.window = xev->event; - bv.state = xev->mods.base - | xev->mods.effective - | xev->mods.latched - | xev->mods.locked; - - memset (&compose_status, 0, sizeof (compose_status)); - dpyinfo->last_mouse_glyph_frame = NULL; - x_display_set_last_user_time (dpyinfo, xev->time); - - f = mouse_or_wdesc_frame (dpyinfo, xev->event); - - if (f && xev->evtype == XI_ButtonPress - && !popup_activated () - && !x_window_to_scroll_bar (xev->display, xev->event, 2) - && !FRAME_NO_ACCEPT_FOCUS (f)) - { - /* When clicking into a child frame or when clicking - into a parent frame with the child frame selected and - `no-accept-focus' is not set, select the clicked - frame. */ - struct frame *hf = dpyinfo->highlight_frame; - - if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) - { - block_input (); - XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), - RevertToParent, CurrentTime); - if (FRAME_PARENT_FRAME (f)) - XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); - unblock_input (); - } - } - -#ifdef USE_GTK - if (f && xg_event_is_for_scrollbar (f, event)) - f = 0; -#endif - - if (f) - { - /* Is this in the tab-bar? */ - if (WINDOWP (f->tab_bar_window) - && WINDOW_TOTAL_LINES (XWINDOW (f->tab_bar_window))) - { - Lisp_Object window; - int x = bv.x; - int y = bv.y; - - window = window_from_coordinates (f, x, y, 0, true, true); - tab_bar_p = EQ (window, f->tab_bar_window); - - if (tab_bar_p) - tab_bar_arg = handle_tab_bar_click - (f, x, y, xev->evtype == XI_ButtonPress, - x_x_to_emacs_modifiers (dpyinfo, bv.state)); - } - -#if ! defined (USE_GTK) - /* Is this in the tool-bar? */ - if (WINDOWP (f->tool_bar_window) - && WINDOW_TOTAL_LINES (XWINDOW (f->tool_bar_window))) - { - Lisp_Object window; - int x = bv.x; - int y = bv.y; - - window = window_from_coordinates (f, x, y, 0, true, true); - tool_bar_p = EQ (window, f->tool_bar_window); - - if (tool_bar_p && xev->detail < 4) - handle_tool_bar_click - (f, x, y, xev->evtype == XI_ButtonPress, - x_x_to_emacs_modifiers (dpyinfo, bv.state)); - } -#endif /* !USE_GTK */ - - if (!(tab_bar_p && NILP (tab_bar_arg)) && !tool_bar_p) -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) - if (! popup_activated ()) -#endif - { - if (ignore_next_mouse_click_timeout) - { - if (xev->evtype == XI_ButtonPress - && xev->time > ignore_next_mouse_click_timeout) - { - ignore_next_mouse_click_timeout = 0; - x_construct_mouse_click (&inev.ie, &bv, f); - } - if (xev->evtype == XI_ButtonRelease) - ignore_next_mouse_click_timeout = 0; - } - else - x_construct_mouse_click (&inev.ie, &bv, f); - - if (!NILP (tab_bar_arg)) - inev.ie.arg = tab_bar_arg; - } - if (FRAME_X_EMBEDDED_P (f)) - xembed_send_message (f, xev->time, - XEMBED_REQUEST_FOCUS, 0, 0, 0); - } - - if (xev->evtype == XI_ButtonPress) - { - dpyinfo->grabbed |= (1 << xev->detail); - dpyinfo->last_mouse_frame = f; - if (f && !tab_bar_p) - f->last_tab_bar_item = -1; -#if ! defined (USE_GTK) - if (f && !tool_bar_p) - f->last_tool_bar_item = -1; -#endif /* not USE_GTK */ - - } - else - dpyinfo->grabbed &= ~(1 << xev->detail); - - if (f) - f->mouse_moved = false; - -#if defined (USE_GTK) - /* No Xt toolkit currently available has support for XI2. - So the code here assumes use of GTK. */ - f = x_menubar_window_to_frame (dpyinfo, event); - if (f /* Gtk+ menus only react to the first three buttons. */ - && xev->detail < 3) - { - /* What is done with Core Input ButtonPressed is not - possible here, because GenericEvents cannot be saved. */ - bool was_waiting_for_input = waiting_for_input; - /* This hack was adopted from the NS port. Whether - or not it is actually safe is a different story - altogether. */ - if (waiting_for_input) - waiting_for_input = 0; - set_frame_menubar (f, true); - waiting_for_input = was_waiting_for_input; - } -#endif - goto XI_OTHER; - } - case XI_KeyPress: - { - int state = xev->mods.base - | xev->mods.effective - | xev->mods.latched - | xev->mods.locked; - Lisp_Object c; -#ifdef HAVE_XKB - unsigned int mods_rtrn; -#endif - int keycode = xev->detail; - KeySym keysym; - char copy_buffer[81]; - char *copy_bufptr = copy_buffer; - unsigned char *copy_ubufptr; -#ifdef HAVE_XKB - int copy_bufsiz = sizeof (copy_buffer); -#endif - ptrdiff_t i; - int nchars, len; - -#ifdef HAVE_XKB - if (dpyinfo->xkb_desc) - { - if (!XkbTranslateKeyCode (dpyinfo->xkb_desc, keycode, - state, &mods_rtrn, &keysym)) - goto XI_OTHER; - } - else - { -#endif - int keysyms_per_keycode_return; - KeySym *ksms = XGetKeyboardMapping (dpyinfo->display, keycode, 1, - &keysyms_per_keycode_return); - if (!(keysym = ksms[0])) - { - XFree (ksms); - goto XI_OTHER; - } - XFree (ksms); -#ifdef HAVE_XKB - } -#endif - - if (keysym == NoSymbol) - goto XI_OTHER; - - x_display_set_last_user_time (dpyinfo, xev->time); - ignore_next_mouse_click_timeout = 0; - -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) - /* Dispatch XI_KeyPress events when in menu. */ - if (popup_activated ()) - goto XI_OTHER; -#endif - - f = x_any_window_to_frame (dpyinfo, xev->event); - - /* If mouse-highlight is an integer, input clears out - mouse highlighting. */ - if (!hlinfo->mouse_face_hidden && FIXNUMP (Vmouse_highlight) - && (f == 0 -#if ! defined (USE_GTK) - || !EQ (f->tool_bar_window, hlinfo->mouse_face_window) -#endif - || !EQ (f->tab_bar_window, hlinfo->mouse_face_window)) - ) - { - clear_mouse_face (hlinfo); - hlinfo->mouse_face_hidden = true; - } - - if (f != 0) - { -#ifdef USE_GTK - /* Don't pass keys to GTK. A Tab will shift focus to the - tool bar in GTK 2.4. Keys will still go to menus and - dialogs because in that case popup_activated is nonzero - (see above). */ - *finish = X_EVENT_DROP; -#endif - /* If not using XIM/XIC, and a compose sequence is in progress, - we break here. Otherwise, chars_matched is always 0. */ - if (compose_status.chars_matched > 0 && nbytes == 0) - goto XI_OTHER; - - memset (&compose_status, 0, sizeof (compose_status)); - - XSETFRAME (inev.ie.frame_or_window, f); - inev.ie.modifiers - = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), state); - inev.ie.timestamp = xev->time; - - /* First deal with keysyms which have defined - translations to characters. */ - if (keysym >= 32 && keysym < 128) - /* Avoid explicitly decoding each ASCII character. */ - { - inev.ie.kind = ASCII_KEYSTROKE_EVENT; - inev.ie.code = keysym; - - goto xi_done_keysym; - } - - /* Keysyms directly mapped to Unicode characters. */ - if (keysym >= 0x01000000 && keysym <= 0x0110FFFF) - { - if (keysym < 0x01000080) - inev.ie.kind = ASCII_KEYSTROKE_EVENT; - else - inev.ie.kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; - inev.ie.code = keysym & 0xFFFFFF; - goto xi_done_keysym; - } - - /* Now non-ASCII. */ - if (HASH_TABLE_P (Vx_keysym_table) - && (c = Fgethash (make_fixnum (keysym), - Vx_keysym_table, - Qnil), - FIXNATP (c))) - { - inev.ie.kind = (SINGLE_BYTE_CHAR_P (XFIXNAT (c)) - ? ASCII_KEYSTROKE_EVENT - : MULTIBYTE_CHAR_KEYSTROKE_EVENT); - inev.ie.code = XFIXNAT (c); - goto xi_done_keysym; - } - - /* Random non-modifier sorts of keysyms. */ - if (((keysym >= XK_BackSpace && keysym <= XK_Escape) - || keysym == XK_Delete -#ifdef XK_ISO_Left_Tab - || (keysym >= XK_ISO_Left_Tab - && keysym <= XK_ISO_Enter) -#endif - || IsCursorKey (keysym) /* 0xff50 <= x < 0xff60 */ - || IsMiscFunctionKey (keysym) /* 0xff60 <= x < VARIES */ -#ifdef HPUX - /* This recognizes the "extended function - keys". It seems there's no cleaner way. - Test IsModifierKey to avoid handling - mode_switch incorrectly. */ - || (XK_Select <= keysym && keysym < XK_KP_Space) -#endif -#ifdef XK_dead_circumflex - || keysym == XK_dead_circumflex -#endif -#ifdef XK_dead_grave - || keysym == XK_dead_grave -#endif -#ifdef XK_dead_tilde - || keysym == XK_dead_tilde -#endif -#ifdef XK_dead_diaeresis - || keysym == XK_dead_diaeresis -#endif -#ifdef XK_dead_macron - || keysym == XK_dead_macron -#endif -#ifdef XK_dead_degree - || keysym == XK_dead_degree -#endif -#ifdef XK_dead_acute - || keysym == XK_dead_acute -#endif -#ifdef XK_dead_cedilla - || keysym == XK_dead_cedilla -#endif -#ifdef XK_dead_breve - || keysym == XK_dead_breve -#endif -#ifdef XK_dead_ogonek - || keysym == XK_dead_ogonek -#endif -#ifdef XK_dead_caron - || keysym == XK_dead_caron -#endif -#ifdef XK_dead_doubleacute - || keysym == XK_dead_doubleacute -#endif -#ifdef XK_dead_abovedot - || keysym == XK_dead_abovedot -#endif - || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ - || IsFunctionKey (keysym) /* 0xffbe <= x < 0xffe1 */ - /* Any "vendor-specific" key is ok. */ - || (keysym & (1 << 28)) - || (keysym != NoSymbol && nbytes == 0)) - && ! (IsModifierKey (keysym) - /* The symbols from XK_ISO_Lock - to XK_ISO_Last_Group_Lock - don't have real modifiers but - should be treated similarly to - Mode_switch by Emacs. */ -#if defined XK_ISO_Lock && defined XK_ISO_Last_Group_Lock - || (XK_ISO_Lock <= keysym - && keysym <= XK_ISO_Last_Group_Lock) -#endif - )) - { - STORE_KEYSYM_FOR_DEBUG (keysym); - /* make_lispy_event will convert this to a symbolic - key. */ - inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT; - inev.ie.code = keysym; - goto xi_done_keysym; - } - -#ifdef HAVE_XKB - int overflow = 0; - KeySym sym = keysym; - - if (dpyinfo->xkb_desc) - { - if (!(nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, - state & ~mods_rtrn, copy_bufptr, - copy_bufsiz, &overflow))) - goto XI_OTHER; - } - else -#else - { - block_input (); - char *str = XKeysymToString (keysym); - if (!str) - { - unblock_input (); - goto XI_OTHER; - } - nbytes = strlen (str) + 1; - copy_bufptr = alloca (nbytes); - strcpy (copy_bufptr, str); - unblock_input (); - } -#endif -#ifdef HAVE_XKB - if (overflow) - { - overflow = 0; - copy_bufptr = alloca (copy_bufsiz + overflow); - keysym = sym; - if (!(nbytes = XkbTranslateKeySym (dpyinfo->display, &sym, - state & ~mods_rtrn, copy_bufptr, - copy_bufsiz + overflow, &overflow))) - goto XI_OTHER; - - if (overflow) - goto XI_OTHER; - } -#endif - - for (i = 0, nchars = 0; i < nbytes; i++) - { - if (ASCII_CHAR_P (copy_bufptr[i])) - nchars++; - STORE_KEYSYM_FOR_DEBUG (copy_bufptr[i]); - } - - if (nchars < nbytes) - { - /* Decode the input data. */ - - setup_coding_system (Vlocale_coding_system, &coding); - coding.src_multibyte = false; - coding.dst_multibyte = true; - /* The input is converted to events, thus we can't - handle composition. Anyway, there's no XIM that - gives us composition information. */ - coding.common_flags &= ~CODING_ANNOTATION_MASK; - - SAFE_NALLOCA (coding.destination, MAX_MULTIBYTE_LENGTH, - nbytes); - coding.dst_bytes = MAX_MULTIBYTE_LENGTH * nbytes; - coding.mode |= CODING_MODE_LAST_BLOCK; - decode_coding_c_string (&coding, (unsigned char *) copy_bufptr, nbytes, Qnil); - nbytes = coding.produced; - nchars = coding.produced_char; - copy_bufptr = (char *) coding.destination; - } - - copy_ubufptr = (unsigned char *) copy_bufptr; - - /* Convert the input data to a sequence of - character events. */ - for (i = 0; i < nbytes; i += len) - { - int ch; - if (nchars == nbytes) - ch = copy_ubufptr[i], len = 1; - else - ch = string_char_and_length (copy_ubufptr + i, &len); - inev.ie.kind = (SINGLE_BYTE_CHAR_P (ch) - ? ASCII_KEYSTROKE_EVENT - : MULTIBYTE_CHAR_KEYSTROKE_EVENT); - inev.ie.code = ch; - kbd_buffer_store_buffered_event (&inev, hold_quit); - } - - inev.ie.kind = NO_EVENT; - goto xi_done_keysym; - } - goto XI_OTHER; - } - case XI_KeyRelease: - x_display_set_last_user_time (dpyinfo, xev->time); - goto XI_OTHER; - case XI_PropertyEvent: - case XI_HierarchyChanged: - case XI_DeviceChanged: - x_init_master_valuators (dpyinfo); - goto XI_OTHER; - default: - goto XI_OTHER; - } - xi_done_keysym: - if (must_free_data) - XFreeEventData (dpyinfo->display, &event->xcookie); - goto done_keysym; - XI_OTHER: - if (must_free_data) - XFreeEventData (dpyinfo->display, &event->xcookie); - goto OTHER; - } -#endif default: OTHER: @@ -14225,40 +13192,6 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) dpyinfo->supports_xdbe = true; #endif -#ifdef HAVE_XINPUT2 - dpyinfo->supports_xi2 = false; - int rc; - int major = 2; -#ifdef XI_BarrierHit /* XInput 2.3 */ - int minor = 3; -#elif defined XI_TouchBegin /* XInput 2.2 */ - int minor = 2; -#elif defined XIScrollClass /* XInput 1.1 */ - int minor = 1; -#else /* Some old version of XI2 we're not interested in. */ - int minor = 0; -#endif - int fer, fee; - - if (XQueryExtension (dpyinfo->display, "XInputExtension", - &dpyinfo->xi2_opcode, &fer, &fee)) - { - rc = XIQueryVersion (dpyinfo->display, &major, &minor); - if (rc == Success) - { - dpyinfo->supports_xi2 = true; - x_init_master_valuators (dpyinfo); - } - } - dpyinfo->xi2_version = minor; -#endif - -#ifdef HAVE_XKB - dpyinfo->xkb_desc = XkbGetMap (dpyinfo->display, - XkbAllComponentsMask, - XkbUseCoreKbd); -#endif - #if defined USE_CAIRO || defined HAVE_XFT { /* If we are using Xft, the following precautions should be made: @@ -14691,14 +13624,6 @@ x_delete_terminal (struct terminal *terminal) XrmDestroyDatabase (dpyinfo->rdb); #endif -#ifdef HAVE_XKB - if (dpyinfo->xkb_desc) - XkbFreeKeyboard (dpyinfo->xkb_desc, XkbAllComponentsMask, True); -#endif -#ifdef HAVE_XINPUT2 - if (dpyinfo->supports_xi2) - x_free_xi_devices (dpyinfo); -#endif #ifdef USE_GTK xg_display_close (dpyinfo->display); #else @@ -14858,12 +13783,9 @@ x_initialize (void) void init_xterm (void) { -#ifndef HAVE_XINPUT2 - /* Emacs can handle only core input events when built without XI2 - support, so make sure Gtk doesn't use Xinput or Xinput2 - extensions. */ + /* Emacs can handle only core input events, so make sure + Gtk doesn't use Xinput or Xinput2 extensions. */ xputenv ("GDK_CORE_DEVICE_EVENTS=1"); -#endif } #endif diff --git a/src/xterm.h b/src/xterm.h index 25eddf8bf28..9d9534dd629 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -88,10 +88,6 @@ typedef GtkWidget *xt_or_gtk_widget; #include #endif -#ifdef HAVE_XKB -#include -#endif - #include "dispextern.h" #include "termhooks.h" @@ -167,26 +163,6 @@ struct color_name_cache_entry char *name; }; -#ifdef HAVE_XINPUT2 -struct xi_scroll_valuator_t -{ - bool invalid_p; - double current_value; - double emacs_value; - double increment; - - int number; - int horizontal; -}; - -struct xi_device_t -{ - int device_id; - int scroll_valuator_count; - struct xi_scroll_valuator_t *valuators; -}; -#endif - Status x_parse_color (struct frame *f, const char *color_name, XColor *color); @@ -498,19 +474,6 @@ struct x_display_info #ifdef HAVE_XDBE bool supports_xdbe; #endif - -#ifdef HAVE_XINPUT2 - bool supports_xi2; - int xi2_version; - int xi2_opcode; - - int num_devices; - struct xi_device_t *devices; -#endif - -#ifdef HAVE_XKB - XkbDescPtr xkb_desc; -#endif }; #ifdef HAVE_X_I18N @@ -518,11 +481,6 @@ struct x_display_info extern bool use_xim; #endif -#ifdef HAVE_XINPUT2 -/* Defined in xmenu.c. */ -extern int popup_activated_flag; -#endif - /* This is a chain of structures for all the X displays currently in use. */ extern struct x_display_info *x_display_list; -- 2.39.5