summaryrefslogtreecommitdiff
path: root/plugins/mouse
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mouse')
-rw-r--r--plugins/mouse/msd-mouse-manager.c91
1 files changed, 53 insertions, 38 deletions
diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c
index f1c209a..a490397 100644
--- a/plugins/mouse/msd-mouse-manager.c
+++ b/plugins/mouse/msd-mouse-manager.c
@@ -100,7 +100,6 @@ static void msd_mouse_manager_finalize (GObject *object);
static void set_mouse_settings (MsdMouseManager *manager);
static void set_tap_to_click (MsdMouseManager * manager);
static void set_click_actions (MsdMouseManager * manager);
-static void set_natural_scroll (MsdMouseManager * manager);
G_DEFINE_TYPE (MsdMouseManager, msd_mouse_manager, G_TYPE_OBJECT)
@@ -623,56 +622,72 @@ set_click_actions (MsdMouseManager * manager)
}
static void
-set_natural_scroll (MsdMouseManager * manager)
+set_natural_scroll (MsdMouseManager *manager,
+ XDeviceInfo *device_info,
+ gboolean natural_scroll)
{
- int numdevices, i, format, rc;
+ XDevice *device;
+ int format, rc;
unsigned long nitems, bytes_after;
- XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices);
- XDevice * device;
unsigned char* data;
glong *ptr;
Atom prop, type;
- if (devicelist == NULL)
- return;
-
prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "Synaptics Scrolling Distance", False);
if (!prop)
return;
- gboolean natural_scroll = g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_NATURAL_SCROLL);
+ device = device_is_touchpad (device_info);
+ if (device == NULL) {
+ return;
+ }
- for (i = 0; i < numdevices; i++) {
- if ((device = device_is_touchpad (&devicelist[i]))) {
- g_debug ("Trying to set %s for \"%s\"", natural_scroll ? "natural (reverse) scroll" : "normal scroll", devicelist[i].name);
- gdk_error_trap_push ();
- rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop, 0, 2,
- False, XA_INTEGER, &type, &format, &nitems,
- &bytes_after, &data);
+ g_debug ("Trying to set %s for \"%s\"", natural_scroll ? "natural (reverse) scroll" : "normal scroll", device_info->name);
- if (rc == Success && type == XA_INTEGER && format == 32 && nitems >= 2) {
- ptr = (glong *) data;
- if (natural_scroll) {
- ptr[0] = -abs(ptr[0]);
- ptr[1] = -abs(ptr[1]);
- } else {
- ptr[0] = abs(ptr[0]);
- ptr[1] = abs(ptr[1]);
- }
-
- XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop,
- XA_INTEGER, 32, PropModeReplace, data, nitems);
- }
+ gdk_error_trap_push ();
+ rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop, 0, 2,
+ False, XA_INTEGER, &type, &format, &nitems,
+ &bytes_after, &data);
- if (rc == Success)
- XFree (data);
- XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
- if (gdk_error_trap_pop ()) {
- g_warning ("Error in setting natural scroll on \"%s\"", devicelist[i].name);
- continue;
- }
+ if (rc == Success && type == XA_INTEGER && format == 32 && nitems >= 2) {
+ ptr = (glong *) data;
+ if (natural_scroll) {
+ ptr[0] = -abs(ptr[0]);
+ ptr[1] = -abs(ptr[1]);
+ } else {
+ ptr[0] = abs(ptr[0]);
+ ptr[1] = abs(ptr[1]);
}
+
+ XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop,
+ XA_INTEGER, 32, PropModeReplace, data, nitems);
}
+
+ if (rc == Success)
+ XFree (data);
+
+ XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+ if (gdk_error_trap_pop ()) {
+ g_warning ("Error in setting natural scroll on \"%s\"", device_info->name);
+ }
+}
+
+
+static void
+set_natural_scroll_all (MsdMouseManager *manager)
+{
+ int numdevices, i;
+ XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices);
+
+ if (devicelist == NULL)
+ return;
+
+ gboolean natural_scroll = g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_NATURAL_SCROLL);
+
+ for (i = 0; i < numdevices; i++) {
+ set_natural_scroll (manager, &devicelist[i], natural_scroll);
+ }
+
XFreeDeviceList (devicelist);
}
@@ -879,7 +894,7 @@ set_mouse_settings (MsdMouseManager *manager)
set_tap_to_click (manager);
set_click_actions (manager);
set_scrolling (manager->priv->settings_touchpad);
- set_natural_scroll (manager);
+ set_natural_scroll_all (manager);
set_touchpad_enabled (g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_ENABLED));
}
@@ -911,7 +926,7 @@ mouse_callback (GSettings *settings,
} else if (g_strcmp0 (key, KEY_VERT_EDGE_SCROLL) == 0 || g_strcmp0 (key, KEY_HORIZ_EDGE_SCROLL) == 0 || g_strcmp0 (key, KEY_VERT_TWO_FINGER_SCROLL) == 0 || g_strcmp0 (key, KEY_HORIZ_TWO_FINGER_SCROLL) == 0) {
set_scrolling (manager->priv->settings_touchpad);
} else if (g_str_equal (key, KEY_TOUCHPAD_NATURAL_SCROLL)) {
- set_natural_scroll (manager);
+ set_natural_scroll_all (manager);
} else if (g_strcmp0 (key, KEY_MOUSE_LOCATE_POINTER) == 0) {
set_locate_pointer (manager, g_settings_get_boolean (settings, key));
} else if (g_strcmp0 (key, KEY_TOUCHPAD_ENABLED) == 0) {