Condition out things specific to some versions of the input extension

* src/xterm.c (x_free_xi_devices, x_init_master_valuators)
(handle_one_xevent): Condition out code that isn't supposed to
be run on the current input extension version.
* src/xterm.h (struct xi_scroll_valuator_t): Make conditional on
HAVE_XINPUT2_1.
(struct xi_touch_point_t): Make conditional on HAVE_XINPUT2_2.
(struct xi_device_t): Make individual fields conditional on the
appropriate client-side input extension version.
This commit is contained in:
Po Lu 2022-02-24 09:11:53 +08:00
parent 7b0e8cf347
commit d132bfe6cd
2 changed files with 75 additions and 17 deletions

View file

@ -780,7 +780,9 @@ x_extension_initialize (struct x_display_info *dpyinfo)
static void
x_free_xi_devices (struct x_display_info *dpyinfo)
{
#ifdef HAVE_XINPUT2_2
struct xi_touch_point_t *tem, *last;
#endif
block_input ();
@ -788,8 +790,11 @@ x_free_xi_devices (struct x_display_info *dpyinfo)
{
for (int i = 0; i < dpyinfo->num_devices; ++i)
{
#ifdef HAVE_XINPUT2_1
xfree (dpyinfo->devices[i].valuators);
#endif
#ifdef HAVE_XINPUT2_2
tem = dpyinfo->devices[i].touchpoints;
while (tem)
{
@ -797,6 +802,7 @@ x_free_xi_devices (struct x_display_info *dpyinfo)
tem = tem->next;
xfree (last);
}
#endif
}
xfree (dpyinfo->devices);
@ -866,16 +872,27 @@ x_init_master_valuators (struct x_display_info *dpyinfo)
if (device->enabled)
{
#ifdef HAVE_XINPUT2_1
int actual_valuator_count = 0;
#endif
struct xi_device_t *xi_device = &dpyinfo->devices[actual_devices++];
xi_device->device_id = device->deviceid;
xi_device->grab = 0;
#ifdef HAVE_XINPUT2_1
xi_device->valuators =
xmalloc (sizeof *xi_device->valuators * device->num_classes);
#endif
#ifdef HAVE_XINPUT2_2
xi_device->touchpoints = NULL;
#endif
xi_device->master_p = (device->use == XIMasterKeyboard
|| device->use == XIMasterPointer);
#ifdef HAVE_XINPUT2_2
xi_device->direct_p = false;
#endif
for (int c = 0; c < device->num_classes; ++c)
{
@ -914,7 +931,9 @@ x_init_master_valuators (struct x_display_info *dpyinfo)
}
}
#ifdef HAVE_XINPUT2_1
xi_device->scroll_valuator_count = actual_valuator_count;
#endif
}
}
@ -923,6 +942,7 @@ x_init_master_valuators (struct x_display_info *dpyinfo)
unblock_input ();
}
#ifdef HAVE_XINPUT2_1
/* 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
@ -979,6 +999,8 @@ x_get_scroll_valuator_delta (struct x_display_info *dpyinfo, int device_id,
return DBL_MAX;
}
#endif
struct xi_device_t *
xi_device_from_id (struct x_display_info *dpyinfo, int deviceid)
{
@ -1046,7 +1068,9 @@ xi_find_touch_point (struct xi_device_t *device, int detail)
return NULL;
}
#endif /* XI_TouchBegin */
#endif /* HAVE_XINPUT2_2 */
#ifdef HAVE_XINPUT2_1
static void
xi_reset_scroll_valuators_for_device_id (struct x_display_info *dpyinfo, int id,
@ -1076,6 +1100,8 @@ xi_reset_scroll_valuators_for_device_id (struct x_display_info *dpyinfo, int id,
return;
}
#endif /* HAVE_XINPUT2_1 */
#endif
#ifdef USE_CAIRO
@ -11092,9 +11118,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
XIFocusInEvent *focusin = (XIFocusInEvent *) xi_event;
XIFocusOutEvent *focusout = (XIFocusOutEvent *) xi_event;
XIDeviceChangedEvent *device_changed = (XIDeviceChangedEvent *) xi_event;
#ifdef HAVE_XINPUT2_1
XIValuatorState *states;
double *values;
bool found_valuator = false;
#endif
/* A fake XMotionEvent for x_note_mouse_movement. */
XMotionEvent ev;
@ -11164,8 +11192,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!any)
any = x_any_window_to_frame (dpyinfo, enter->event);
#ifdef HAVE_XINPUT2_1
xi_reset_scroll_valuators_for_device_id (dpyinfo, enter->deviceid,
true);
#endif
{
#ifdef HAVE_XWIDGETS
@ -11229,9 +11259,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
records of each valuator's value whenever the pointer
moves out of a frame (and not into one of its
children, which we know about). */
#ifdef HAVE_XINPUT2_1
if (leave->detail != XINotifyInferior && any)
xi_reset_scroll_valuators_for_device_id (dpyinfo,
enter->deviceid, false);
#endif
#ifdef HAVE_XWIDGETS
{
@ -11291,8 +11323,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
struct xi_device_t *device;
#ifdef HAVE_XINPUT2_1
states = &xev->valuators;
values = states->values;
#endif
device = xi_device_from_id (dpyinfo, xev->deviceid);
if (!device)
@ -11303,6 +11338,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
goto XI_OTHER;
#endif
#ifdef HAVE_XINPUT2_1
#ifdef HAVE_XWIDGETS
struct xwidget_view *xv = xwidget_view_from_window (xev->event);
double xv_total_x = 0.0;
@ -11464,6 +11500,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#ifdef HAVE_XWIDGETS
}
#endif
#endif /* HAVE_XINPUT2_1 */
ev.x = lrint (xev->event_x);
ev.y = lrint (xev->event_y);
@ -11565,7 +11602,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
struct xwidget_view *xvw;
#endif
#ifdef XIPointerEmulated
#ifdef HAVE_XINPUT2_1
/* Ignore emulated scroll events when XI2 native
scroll events are present. */
if (xev->flags & XIPointerEmulated)
@ -12180,7 +12217,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
case XI_DeviceChanged:
{
struct xi_device_t *device;
#ifdef HAVE_XINPUT2_2
struct xi_touch_point_t *tem, *last;
#endif
int c;
#ifdef HAVE_XINPUT2_1
int i;
@ -12204,11 +12243,15 @@ handle_one_xevent (struct x_display_info *dpyinfo,
/* Free data that we will regenerate from new
information. */
#ifdef HAVE_XINPUT2_1
device->valuators = xrealloc (device->valuators,
(device_changed->num_classes
* sizeof *device->valuators));
device->scroll_valuator_count = 0;
#endif
#ifdef HAVE_XINPUT2_2
device->direct_p = false;
#endif
for (c = 0; c < device_changed->num_classes; ++c)
{
@ -12278,6 +12321,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
#endif
#ifdef HAVE_XINPUT2_2
/* The device is no longer a DirectTouch device, so
remove any touchpoints that we might have
recorded. */
@ -12294,6 +12338,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
device->touchpoints = NULL;
}
#endif
goto XI_OTHER;
}

View file

@ -143,6 +143,21 @@ struct xim_inst_t
};
#endif /* HAVE_X11R6_XIM */
#ifdef HAVE_XINPUT2
#if HAVE_XISCROLLCLASSINFO_TYPE && defined XIScrollClass
#define HAVE_XINPUT2_1
#endif
#if HAVE_XITOUCHCLASSINFO_TYPE && defined XITouchClass
#define HAVE_XINPUT2_2
#endif
#if HAVE_XIBARRIERRELEASEPOINTERINFO_DEVICEID && defined XIBarrierPointerReleased
#define HAVE_XINPUT2_3
#endif
#if HAVE_XIGESTURECLASSINFO_TYPE && defined XIGestureClass
#define HAVE_XINPUT2_4
#endif
#endif
/* Structure recording X pixmap and reference count.
If REFCOUNT is 0 then this record is free to be reused. */
@ -185,6 +200,8 @@ struct color_name_cache_entry
};
#ifdef HAVE_XINPUT2
#ifdef HAVE_XINPUT2_1
struct xi_scroll_valuator_t
{
bool invalid_p;
@ -196,7 +213,9 @@ struct xi_scroll_valuator_t
int number;
int horizontal;
};
#endif
#ifdef HAVE_XINPUT2_2
struct xi_touch_point_t
{
struct xi_touch_point_t *next;
@ -204,17 +223,26 @@ struct xi_touch_point_t
int number;
double x, y;
};
#endif
struct xi_device_t
{
int device_id;
#ifdef HAVE_XINPUT2_1
int scroll_valuator_count;
#endif
int grab;
bool master_p;
#ifdef HAVE_XINPUT2_2
bool direct_p;
#endif
#ifdef HAVE_XINPUT2_1
struct xi_scroll_valuator_t *valuators;
#endif
#ifdef HAVE_XINPUT2_2
struct xi_touch_point_t *touchpoints;
#endif
};
#endif
@ -1469,21 +1497,6 @@ struct xi_device_t *xi_device_from_id (struct x_display_info *, int);
(nr).width = (rwidth), \
(nr).height = (rheight))
#ifdef HAVE_XINPUT2
#if HAVE_XISCROLLCLASSINFO_TYPE && defined XIScrollClass
#define HAVE_XINPUT2_1
#endif
#if HAVE_XITOUCHCLASSINFO_TYPE && defined XITouchClass
#define HAVE_XINPUT2_2
#endif
#if HAVE_XIBARRIERRELEASEPOINTERINFO_DEVICEID && defined XIBarrierPointerReleased
#define HAVE_XINPUT2_3
#endif
#if HAVE_XIGESTURECLASSINFO_TYPE && defined XIGestureClass
#define HAVE_XINPUT2_4
#endif
#endif
INLINE_HEADER_END
#endif /* XTERM_H */