summaryrefslogtreecommitdiff
path: root/gdk/x11
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11')
-rw-r--r--gdk/x11/gdkdevice-xi2.c28
-rw-r--r--gdk/x11/gdkdevicemanager-xi2.c10
-rw-r--r--gdk/x11/gdkprivate-x11.h6
3 files changed, 42 insertions, 2 deletions
diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c
index b3289c0e92..fad8671120 100644
--- a/gdk/x11/gdkdevice-xi2.c
+++ b/gdk/x11/gdkdevice-xi2.c
@@ -51,6 +51,7 @@ struct _GdkX11DeviceXI2
gint device_id;
GArray *scroll_valuators;
+ gdouble *last_axes;
};
struct _GdkX11DeviceXI2Class
@@ -157,6 +158,7 @@ gdk_x11_device_xi2_finalize (GObject *object)
GdkX11DeviceXI2 *device = GDK_X11_DEVICE_XI2 (object);
g_array_free (device->scroll_valuators, TRUE);
+ g_free (device->last_axes);
G_OBJECT_CLASS (gdk_x11_device_xi2_parent_class)->finalize (object);
}
@@ -891,3 +893,29 @@ _gdk_x11_device_xi2_get_id (GdkX11DeviceXI2 *device)
return device->device_id;
}
+
+gdouble
+gdk_x11_device_xi2_get_last_axis_value (GdkX11DeviceXI2 *device,
+ gint n_axis)
+{
+ if (n_axis >= gdk_device_get_n_axes (GDK_DEVICE (device)))
+ return 0;
+
+ if (!device->last_axes)
+ return 0;
+
+ return device->last_axes[n_axis];
+}
+
+void
+gdk_x11_device_xi2_store_axes (GdkX11DeviceXI2 *device,
+ gdouble *axes,
+ gint n_axes)
+{
+ g_free (device->last_axes);
+
+ if (axes && n_axes)
+ device->last_axes = g_memdup (axes, sizeof (gdouble) * n_axes);
+ else
+ device->last_axes = NULL;
+}
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 50c1a00711..a57ecaf885 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -837,6 +837,7 @@ handle_device_changed (GdkX11DeviceManagerXI2 *device_manager,
{
_gdk_device_reset_axes (device);
_gdk_device_xi2_unset_scroll_valuators ((GdkX11DeviceXI2 *) device);
+ gdk_x11_device_xi2_store_axes (GDK_X11_DEVICE_XI2 (device), NULL, 0);
translate_device_classes (display, device, ev->classes, ev->num_classes);
g_signal_emit_by_name (G_OBJECT (device), "changed");
@@ -939,13 +940,16 @@ translate_axes (GdkDevice *device,
axes = g_new0 (gdouble, n_axes);
vals = valuators->values;
- for (i = 0; i < valuators->mask_len * 8; i++)
+ for (i = 0; i < MIN (valuators->mask_len * 8, n_axes); i++)
{
GdkAxisUse use;
gdouble val;
if (!XIMaskIsSet (valuators->mask, i))
- continue;
+ {
+ axes[i] = gdk_x11_device_xi2_get_last_axis_value (GDK_X11_DEVICE_XI2 (device), i);
+ continue;
+ }
use = gdk_device_get_axis_use (device, i);
val = *vals++;
@@ -970,6 +974,8 @@ translate_axes (GdkDevice *device,
}
}
+ gdk_x11_device_xi2_store_axes (GDK_X11_DEVICE_XI2 (device), axes, n_axes);
+
return axes;
}
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index d5f3e1d74f..c2afecf46d 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -247,6 +247,12 @@ gboolean _gdk_x11_device_xi2_get_scroll_delta (GdkX11DeviceXI2 *device,
gdouble *delta_ret);
void _gdk_device_xi2_reset_scroll_valuators (GdkX11DeviceXI2 *device);
+gdouble gdk_x11_device_xi2_get_last_axis_value (GdkX11DeviceXI2 *device,
+ gint n_axis);
+
+void gdk_x11_device_xi2_store_axes (GdkX11DeviceXI2 *device,
+ gdouble *axes,
+ gint n_axes);
#endif
void _gdk_x11_event_translate_keyboard_string (GdkEventKey *event);