diff options
| -rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 91 | 
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) { | 
