[mutter] backends: Re-add support for edge scrolling with some touchpads



commit 36cd7177fd40432cb4ae7db10e2571dbbd9604b9
Author: Bastien Nocera <hadess hadess net>
Date:   Thu Jun 30 14:27:23 2016 +0200

    backends: Re-add support for edge scrolling with some touchpads
    
    Add support for setting edge-scrolling separately from two-finger
    scrolling. We now have 2 separate boolean settings for those, with the
    Mouse panel in gnome-control-center allowing to set only one of those at
    a time, but nothing precludes both being set in the configuration.
    
    We need to handle:
    - two-finger-scrolling-enabled and edge-scrolling-enabled settings both
      being set.
    - those 2 settings being change out-of-order
    - two-finger-scrolling being set on a device that doesn't support it
    - edge-scrolling-enabled on a device that doesn't support it
    
    And the combinations of one touchpad supporting just one of edge
    scrolling and two-finger scrolling and another vice-versa.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768245

 src/backends/meta-input-settings-private.h       |    3 +
 src/backends/meta-input-settings.c               |   33 ++++++++++
 src/backends/native/meta-input-settings-native.c |   47 +++++++++++++--
 src/backends/x11/meta-input-settings-x11.c       |   70 ++++++++++++++++++----
 4 files changed, 136 insertions(+), 17 deletions(-)
---
diff --git a/src/backends/meta-input-settings-private.h b/src/backends/meta-input-settings-private.h
index 1824beb..c814d69 100644
--- a/src/backends/meta-input-settings-private.h
+++ b/src/backends/meta-input-settings-private.h
@@ -71,6 +71,9 @@ struct _MetaInputSettingsClass
   void (* set_edge_scroll)   (MetaInputSettings  *settings,
                               ClutterInputDevice *device,
                               gboolean            enabled);
+  void (* set_two_finger_scroll) (MetaInputSettings  *settings,
+                                  ClutterInputDevice *device,
+                                  gboolean            enabled);
   void (* set_scroll_button) (MetaInputSettings  *settings,
                               ClutterInputDevice *device,
                               guint               button);
diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c
index cc1bf55..c718ae3 100644
--- a/src/backends/meta-input-settings.c
+++ b/src/backends/meta-input-settings.c
@@ -450,6 +450,36 @@ update_touchpad_edge_scroll (MetaInputSettings *input_settings,
 }
 
 static void
+update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
+                                   ClutterInputDevice *device)
+{
+  MetaInputSettingsClass *input_settings_class;
+  gboolean two_finger_scroll_enabled;
+  MetaInputSettingsPrivate *priv;
+
+  if (device &&
+      clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
+    return;
+
+  priv = meta_input_settings_get_instance_private (input_settings);
+  input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
+  two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, 
"two-finger-scrolling-enabled");
+
+  if (device)
+    {
+      settings_device_set_bool_setting (input_settings, device,
+                                        input_settings_class->set_two_finger_scroll,
+                                        two_finger_scroll_enabled);
+    }
+  else
+    {
+      settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
+                                 (ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
+                                 two_finger_scroll_enabled);
+    }
+}
+
+static void
 update_touchpad_click_method (MetaInputSettings *input_settings,
                               ClutterInputDevice *device)
 {
@@ -837,6 +867,8 @@ meta_input_settings_changed_cb (GSettings  *settings,
         update_touchpad_send_events (input_settings, NULL);
       else if (strcmp (key, "edge-scrolling-enabled") == 0)
         update_touchpad_edge_scroll (input_settings, NULL);
+      else if (strcmp (key, "two-finger-scrolling-enabled") == 0)
+        update_touchpad_two_finger_scroll (input_settings, NULL);
       else if (strcmp (key, "click-method") == 0)
         update_touchpad_click_method (input_settings, NULL);
     }
@@ -1150,6 +1182,7 @@ apply_device_settings (MetaInputSettings  *input_settings,
   update_touchpad_tap_enabled (input_settings, device);
   update_touchpad_send_events (input_settings, device);
   update_touchpad_edge_scroll (input_settings, device);
+  update_touchpad_two_finger_scroll (input_settings, device);
   update_touchpad_click_method (input_settings, device);
 
   update_trackball_scroll_button (input_settings, device);
diff --git a/src/backends/native/meta-input-settings-native.c 
b/src/backends/native/meta-input-settings-native.c
index 2479c5f..b762941 100644
--- a/src/backends/native/meta-input-settings-native.c
+++ b/src/backends/native/meta-input-settings-native.c
@@ -161,16 +161,18 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings            *settin
   enum libinput_config_scroll_method scroll_method = 0;
   struct libinput_device *libinput_device;
   enum libinput_config_scroll_method supported;
+  enum libinput_config_scroll_method current;
 
   libinput_device = clutter_evdev_input_device_get_libinput_device (device);
   supported = libinput_device_config_scroll_get_methods (libinput_device);
+  current = libinput_device_config_scroll_get_method (libinput_device);
 
-  if (supported & LIBINPUT_CONFIG_SCROLL_2FG)
-    {
-      scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
-    }
-  else if (supported & LIBINPUT_CONFIG_SCROLL_EDGE &&
-           edge_scrolling_enabled)
+  /* Don't set edge scrolling if two-finger scrolling is enabled and available */
+  if (current == LIBINPUT_CONFIG_SCROLL_2FG)
+    return;
+
+  if (supported & LIBINPUT_CONFIG_SCROLL_EDGE &&
+      edge_scrolling_enabled)
     {
       scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE;
     }
@@ -183,6 +185,38 @@ meta_input_settings_native_set_edge_scroll (MetaInputSettings            *settin
 }
 
 static void
+meta_input_settings_native_set_two_finger_scroll (MetaInputSettings            *settings,
+                                                  ClutterInputDevice           *device,
+                                                  gboolean                      two_finger_scroll_enabled)
+{
+  enum libinput_config_scroll_method scroll_method = 0;
+  struct libinput_device *libinput_device;
+  enum libinput_config_scroll_method supported;
+  enum libinput_config_scroll_method current;
+
+  libinput_device = clutter_evdev_input_device_get_libinput_device (device);
+  supported = libinput_device_config_scroll_get_methods (libinput_device);
+  current = libinput_device_config_scroll_get_method (libinput_device);
+
+  if (two_finger_scroll_enabled &&
+      !(supported & LIBINPUT_CONFIG_SCROLL_2FG))
+    return;
+
+  if (two_finger_scroll_enabled)
+    {
+      scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
+    }
+  else if (current != LIBINPUT_CONFIG_SCROLL_EDGE)
+    {
+      scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
+    }
+  else
+    return;
+
+  device_set_scroll_method (libinput_device, scroll_method);
+}
+
+static void
 meta_input_settings_native_set_scroll_button (MetaInputSettings  *settings,
                                               ClutterInputDevice *device,
                                               guint               button)
@@ -290,6 +324,7 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
   input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
   input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
   input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll;
+  input_settings_class->set_two_finger_scroll = meta_input_settings_native_set_two_finger_scroll;
   input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
   input_settings_class->set_click_method = meta_input_settings_native_set_click_method;
   input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
index e159fb6..f81d087 100644
--- a/src/backends/x11/meta-input-settings-x11.c
+++ b/src/backends/x11/meta-input-settings-x11.c
@@ -204,30 +204,77 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings            *settings,
                                          gboolean                      edge_scroll_enabled)
 {
   guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
+  guchar *defaults;
   guchar *available;
 
   available = get_property (device, "libinput Scroll Methods Available",
                             XA_INTEGER, 8, 3);
-  if (!available)
-    return;
+  defaults = get_property (device, "libinput Scroll Method Enabled",
+                           XA_INTEGER, 8, 3);
+  if (!available || !defaults)
+    goto out;
 
-  if (available[0])
+  memcpy (values, defaults, 3);
+
+  /* Don't set edge scrolling if two-finger scrolling is enabled and available */
+  if (available[1] && !(available[0] && values[0]))
     {
-      values[0] = 1;
+      values[1] = !!edge_scroll_enabled;
+      change_property (device, "libinput Scroll Method Enabled",
+                       XA_INTEGER, 8, &values, 3);
     }
-  else if (available[1] && edge_scroll_enabled)
+
+out:
+  if (available)
+    meta_XFree (available);
+  if (defaults)
+    meta_XFree (defaults);
+}
+
+static void
+meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings            *settings,
+                                               ClutterInputDevice           *device,
+                                               gboolean                      two_finger_scroll_enabled)
+{
+  guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
+  guchar *defaults;
+  guchar *available;
+  gboolean changed;
+
+  available = get_property (device, "libinput Scroll Methods Available",
+                            XA_INTEGER, 8, 3);
+  defaults = get_property (device, "libinput Scroll Method Enabled",
+                           XA_INTEGER, 8, 3);
+  if (!available || !defaults)
+    goto out;
+
+  memcpy (values, defaults, 3);
+  changed = FALSE;
+
+  if (available[0])
     {
-      values[1] = 1;
+      values[0] = !!two_finger_scroll_enabled;
+      changed = TRUE;
     }
-  else
+
+  /* Disable edge scrolling when two-finger scrolling is enabled */
+  if (values[0] && values[1])
     {
-      /* Disabled */
+      values[1] = 0;
+      changed = TRUE;
     }
 
-  change_property (device, "libinput Scroll Method Enabled",
-                   XA_INTEGER, 8, &values, 3);
+  if (changed)
+    {
+      change_property (device, "libinput Scroll Method Enabled",
+                       XA_INTEGER, 8, &values, 3);
+    }
 
-  meta_XFree (available);
+out:
+  if (available)
+    meta_XFree (available);
+  if (defaults)
+    meta_XFree (defaults);
 }
 
 static void
@@ -342,6 +389,7 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
   input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
   input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
   input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll;
+  input_settings_class->set_two_finger_scroll = meta_input_settings_x11_set_two_finger_scroll;
   input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button;
   input_settings_class->set_click_method = meta_input_settings_x11_set_click_method;
   input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]