summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormonsta <[email protected]>2016-11-01 14:19:46 +0300
committermonsta <[email protected]>2016-11-01 15:08:58 +0300
commit39371db7192bb09033149c521fd6902073a1af91 (patch)
treef7d5f091a4663a4597079163e5167c3d89e44e38
parent77b1956a67bdc09fef7c76a459ca431008fde8f6 (diff)
downloadmate-settings-daemon-39371db7192bb09033149c521fd6902073a1af91.tar.bz2
mate-settings-daemon-39371db7192bb09033149c521fd6902073a1af91.tar.xz
mouse: implement separate mouse/touchpad motion settings using XInput
adapted from: https://git.gnome.org/browse/gnome-settings-daemon/commit/?id=e4bd073dc6b6c37db3408a7a9baa0dd98d81bd16 https://git.gnome.org/browse/gnome-settings-daemon/commit/?id=f06775d9b415dd6bd7ae2efcc7e4164e0b355c4a https://git.gnome.org/browse/gnome-settings-daemon/commit/?id=04679f89ef410d6b5d05ad36228e9b2d171e79b8
-rw-r--r--plugins/mouse/msd-mouse-manager.c94
1 files changed, 79 insertions, 15 deletions
diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c
index 929096d..d986b4f 100644
--- a/plugins/mouse/msd-mouse-manager.c
+++ b/plugins/mouse/msd-mouse-manager.c
@@ -382,11 +382,32 @@ set_devicepresence_handler (MsdMouseManager *manager)
}
static void
-set_motion_acceleration (MsdMouseManager *manager,
- gfloat motion_acceleration)
+set_motion (MsdMouseManager *manager,
+ XDeviceInfo *device_info)
{
+ XDevice *device;
+ XPtrFeedbackControl feedback;
+ XFeedbackState *states, *state;
+ gint num_feedbacks, i;
+ GSettings *settings;
+ gdouble motion_acceleration;
+ gint motion_threshold;
gint numerator, denominator;
+ device = device_is_touchpad (device_info);
+ if (device != NULL) {
+ settings = manager->priv->settings_touchpad;
+ } else {
+ gdk_error_trap_push ();
+ device = XOpenDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device_info->id);
+ if ((gdk_error_trap_pop () != 0) || (device == NULL))
+ return;
+
+ settings = manager->priv->settings_mouse;
+ }
+
+ /* Calculate acceleration */
+ motion_acceleration = g_settings_get_double (settings, KEY_MOTION_ACCELERATION);
if (motion_acceleration >= 1.0) {
/* we want to get the acceleration, with a resolution of 0.5
*/
@@ -412,17 +433,59 @@ set_motion_acceleration (MsdMouseManager *manager,
denominator = -1;
}
- XChangePointerControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), True, False,
- numerator, denominator,
- 0);
+ /* And threshold */
+ motion_threshold = g_settings_get_int (settings, KEY_MOTION_THRESHOLD);
+
+ /* Get the list of feedbacks for the device */
+ states = XGetFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, &num_feedbacks);
+ if (states == NULL) {
+ XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+ return;
+ }
+
+ state = (XFeedbackState *) states;
+ for (i = 0; i < num_feedbacks; i++) {
+ if (state->class == PtrFeedbackClass) {
+ /* And tell the device */
+ feedback.class = PtrFeedbackClass;
+ feedback.length = sizeof (XPtrFeedbackControl);
+ feedback.id = state->id;
+ feedback.threshold = motion_threshold;
+ feedback.accelNum = numerator;
+ feedback.accelDenom = denominator;
+
+ g_debug ("Setting accel %d/%d, threshold %d for device '%s'",
+ numerator, denominator, motion_threshold, device_info->name);
+
+ XChangeFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+ device,
+ DvAccelNum | DvAccelDenom | DvThreshold,
+ (XFeedbackControl *) &feedback);
+ break;
+ }
+
+ state = (XFeedbackState *) ((char *) state + state->length);
+ }
+
+ XFreeFeedbackList (states);
+ XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
}
static void
-set_motion_threshold (MsdMouseManager *manager,
- int motion_threshold)
+set_motion_all (MsdMouseManager *manager)
{
- XChangePointerControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), False, True,
- 0, 0, motion_threshold);
+ XDeviceInfo *device_info;
+ gint n_devices;
+ gint i;
+
+ device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices);
+
+ for (i = 0; i < n_devices; i++) {
+ set_motion (manager, &device_info[i]);
+ }
+
+ if (device_info != NULL)
+ XFreeDeviceList (device_info);
}
static void
@@ -983,8 +1046,7 @@ set_mouse_settings (MsdMouseManager *manager)
gboolean touchpad_left_handed = get_touchpad_handedness (manager, mouse_left_handed);
set_left_handed_all (manager, mouse_left_handed, touchpad_left_handed);
- set_motion_acceleration (manager, g_settings_get_double (manager->priv->settings_mouse, KEY_MOTION_ACCELERATION));
- set_motion_threshold (manager, g_settings_get_int (manager->priv->settings_mouse, KEY_MOTION_THRESHOLD));
+ set_motion_all (manager);
set_middle_button_all (manager, g_settings_get_boolean (manager->priv->settings_mouse, KEY_MIDDLE_BUTTON_EMULATION));
set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_DISABLE_W_TYPING));
@@ -1005,10 +1067,9 @@ mouse_callback (GSettings *settings,
gboolean mouse_left_handed = g_settings_get_boolean (settings, key);
gboolean touchpad_left_handed = get_touchpad_handedness (manager, mouse_left_handed);
set_left_handed_all (manager, mouse_left_handed, touchpad_left_handed);
- } else if (g_strcmp0 (key, KEY_MOTION_ACCELERATION) == 0) {
- set_motion_acceleration (manager, g_settings_get_double (settings, key));
- } else if (g_strcmp0 (key, KEY_MOTION_THRESHOLD) == 0) {
- set_motion_threshold (manager, g_settings_get_int (settings, key));
+ } else if ((g_strcmp0 (key, KEY_MOTION_ACCELERATION) == 0)
+ || (g_strcmp0 (key, KEY_MOTION_THRESHOLD) == 0)) {
+ set_motion_all (manager);
} else if (g_strcmp0 (key, KEY_MIDDLE_BUTTON_EMULATION) == 0) {
set_middle_button_all (manager, g_settings_get_boolean (settings, key));
} else if (g_strcmp0 (key, KEY_MOUSE_LOCATE_POINTER) == 0) {
@@ -1055,6 +1116,9 @@ touchpad_callback (GSettings *settings,
set_natural_scroll_all (manager);
} else if (g_strcmp0 (key, KEY_TOUCHPAD_ENABLED) == 0) {
set_touchpad_enabled_all (g_settings_get_boolean (settings, key));
+ } else if ((g_strcmp0 (key, KEY_MOTION_ACCELERATION) == 0)
+ || (g_strcmp0 (key, KEY_MOTION_THRESHOLD) == 0)) {
+ set_motion_all (manager);
}
}