summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--data/Makefile.am1
-rw-r--r--data/org.mate.peripherals-mouse.gschema.xml.in59
-rw-r--r--data/org.mate.peripherals-touchpad.gschema.xml.in10
-rw-r--r--plugins/mouse/msd-mouse-manager.c171
-rw-r--r--po/POTFILES.in1
6 files changed, 243 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index 5140f40..ea73740 100644
--- a/configure.ac
+++ b/configure.ac
@@ -477,6 +477,7 @@ data/mate-settings-daemon.pc
data/mate-settings-daemon-uninstalled.pc
data/org.mate.applications-at.gschema.xml
data/org.mate.font-rendering.gschema.xml
+data/org.mate.peripherals-mouse.gschema.xml
data/org.mate.peripherals-smartcard.gschema.xml
data/org.mate.peripherals-touchpad.gschema.xml
data/org.mate.SettingsDaemon.plugins.a11y-keyboard.gschema.xml
diff --git a/data/Makefile.am b/data/Makefile.am
index 5f40975..33764fd 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -3,6 +3,7 @@ NULL =
msd_gschemas_in = \
org.mate.applications-at.gschema.xml.in \
org.mate.font-rendering.gschema.xml.in \
+ org.mate.peripherals-mouse.gschema.xml.in \
org.mate.peripherals-smartcard.gschema.xml.in \
org.mate.peripherals-touchpad.gschema.xml.in \
org.mate.SettingsDaemon.plugins.a11y-keyboard.gschema.xml.in \
diff --git a/data/org.mate.peripherals-mouse.gschema.xml.in b/data/org.mate.peripherals-mouse.gschema.xml.in
new file mode 100644
index 0000000..87b4bc2
--- /dev/null
+++ b/data/org.mate.peripherals-mouse.gschema.xml.in
@@ -0,0 +1,59 @@
+<schemalist gettext-domain="mate-desktop">
+ <enum id="org.mate.peripherals-mouse.AccelProfile">
+ <value nick="default" value="0"/>
+ <value nick="adaptive" value="1"/>
+ <value nick="flat" value="2"/>
+ </enum>
+ <schema id="org.mate.peripherals-mouse" path="/org/mate/desktop/peripherals/mouse/">
+ <key name="left-handed" type="b">
+ <default>false</default>
+ <summary>Mouse button orientation</summary>
+ <description>Swap left and right mouse buttons for left-handed mice.</description>
+ </key>
+ <key name="motion-acceleration" type="d">
+ <default>-1</default>
+ <summary>Motion Acceleration</summary>
+ <description>Acceleration multiplier for mouse motion. A value of -1 is the system default.</description>
+ </key>
+ <key name="motion-threshold" type="i">
+ <default>-1</default>
+ <summary>Motion Threshold</summary>
+ <description>Distance in pixels the pointer must move before accelerated mouse motion is activated. A value of -1 is the system default.</description>
+ </key>
+ <key name="accel-profile" enum="org.mate.peripherals-mouse.AccelProfile">
+ <default>'default'</default>
+ <summary>Acceleration profile</summary>
+ <description>Acceleration profile used for connected mice. The acceleration profile can be set to either default ('default') which uses the default acceleration profile for each device, flat ('flat'), which accelerates by a device specific constant factor derived from the configured pointer speed, or adaptive ('adaptive') which adapts the acceleration depending on the mouse movement. If a mouse doesn't support the configured profile, 'default' will be used.</description>
+ </key>
+ <key name="drag-threshold" type="i">
+ <default>8</default>
+ <summary>Drag Threshold</summary>
+ <description>Distance before a drag is started.</description>
+ </key>
+ <key name="double-click" type="i">
+ <default>400</default>
+ <summary>Double Click Time</summary>
+ <description>Length of a double click.</description>
+ </key>
+ <key name="middle-button-enabled" type="b">
+ <default>true</default>
+ <summary>Middle button emulation</summary>
+ <description>Enables middle mouse button emulation through simultaneous left and right button click.</description>
+ </key>
+ <key name="locate-pointer" type="b">
+ <default>false</default>
+ <summary>Locate Pointer</summary>
+ <description>Highlights the current location of the pointer when the Control key is pressed and released.</description>
+ </key>
+ <key name="cursor-theme" type="s">
+ <default>''</default>
+ <summary>Cursor theme</summary>
+ <description>Cursor theme name.</description>
+ </key>
+ <key name="cursor-size" type="i">
+ <default>24</default>
+ <summary>Cursor size</summary>
+ <description>Size of the cursor referenced by cursor_theme.</description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/data/org.mate.peripherals-touchpad.gschema.xml.in b/data/org.mate.peripherals-touchpad.gschema.xml.in
index 90b83c8..2755174 100644
--- a/data/org.mate.peripherals-touchpad.gschema.xml.in
+++ b/data/org.mate.peripherals-touchpad.gschema.xml.in
@@ -4,6 +4,11 @@
<value nick="left" value="1"/>
<value nick="mouse" value="2"/>
</enum>
+ <enum id="org.mate.peripherals-touchpad.AccelProfile">
+ <value nick="default" value="0"/>
+ <value nick="adaptive" value="1"/>
+ <value nick="flat" value="2"/>
+ </enum>
<schema id="org.mate.peripherals-touchpad" path="/org/mate/desktop/peripherals/touchpad/">
<key name="disable-while-typing" type="b">
<default>false</default>
@@ -85,5 +90,10 @@
<summary>Motion Threshold</summary>
<description>Distance in pixels the pointer must move before accelerated touchpad motion is activated. A value of -1 is the system default.</description>
</key>
+ <key name="accel-profile" enum="org.mate.peripherals-touchpad.AccelProfile">
+ <default>'default'</default>
+ <summary>Acceleration profile</summary>
+ <description>Acceleration profile used for touchpad. The acceleration profile can be set to either default ('default') which uses the default acceleration profile for each device, flat ('flat'), which accelerates by a device specific constant factor derived from the configured pointer speed, or adaptive ('adaptive') which adapts the acceleration depending on the touchpad movement. If a touchpad doesn't support the configured profile, 'default' will be used.</description>
+ </key>
</schema>
</schemalist>
diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c
index 9ce62cb..f86d492 100644
--- a/plugins/mouse/msd-mouse-manager.c
+++ b/plugins/mouse/msd-mouse-manager.c
@@ -52,6 +52,7 @@
#define KEY_LEFT_HANDED "left-handed" /* a boolean for mouse, an enum for touchpad */
#define KEY_MOTION_ACCELERATION "motion-acceleration"
#define KEY_MOTION_THRESHOLD "motion-threshold"
+#define KEY_ACCEL_PROFILE "accel-profile"
/* Mouse settings */
#define MATE_MOUSE_SCHEMA "org.mate.peripherals-mouse"
@@ -101,6 +102,12 @@ typedef enum {
TOUCHPAD_HANDEDNESS_MOUSE
} TouchpadHandedness;
+typedef enum {
+ ACCEL_PROFILE_DEFAULT,
+ ACCEL_PROFILE_ADAPTIVE,
+ ACCEL_PROFILE_FLAT
+} AccelProfile;
+
static void msd_mouse_manager_class_init (MsdMouseManagerClass *klass);
static void msd_mouse_manager_init (MsdMouseManager *mouse_manager);
static void msd_mouse_manager_finalize (GObject *object);
@@ -210,6 +217,75 @@ property_from_name (const char *property_name)
return XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), property_name, True);
}
+static void *
+get_property (XDevice *device,
+ const gchar *property,
+ Atom type,
+ int format,
+ gulong nitems)
+{
+ GdkDisplay *display;
+ gulong nitems_ret, bytes_after_ret;
+ int rc, format_ret;
+ Atom property_atom, type_ret;
+ guchar *data = NULL;
+
+ property_atom = property_from_name (property);
+ if (!property_atom)
+ return NULL;
+
+ display = gdk_display_get_default ();
+
+ gdk_x11_display_error_trap_push (display);
+
+ rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (display), device, property_atom,
+ 0, 10, False, type, &type_ret, &format_ret,
+ &nitems_ret, &bytes_after_ret, &data);
+
+ gdk_x11_display_error_trap_pop_ignored (display);
+
+ if (rc == Success && type_ret == type && format_ret == format && nitems_ret >= nitems)
+ return data;
+
+ if (data)
+ XFree (data);
+
+ return NULL;
+}
+
+static void
+change_property (XDevice *device,
+ const gchar *property,
+ Atom type,
+ int format,
+ void *data,
+ gulong nitems)
+{
+ GdkDisplay *display;
+ Atom property_atom;
+ guchar *data_ret;
+
+ property_atom = property_from_name (property);
+ if (!property_atom)
+ return;
+
+ data_ret = get_property (device, property, type, format, nitems);
+ if (!data_ret)
+ return;
+
+ display = gdk_display_get_default ();
+
+ gdk_x11_display_error_trap_push (display);
+
+ XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (display), device,
+ property_atom, type, format,
+ PropModeReplace, data, nitems);
+
+ gdk_x11_display_error_trap_pop_ignored (display);
+
+ XFree (data_ret);
+}
+
static gboolean
touchpad_has_single_button (XDevice *device)
{
@@ -915,6 +991,96 @@ set_disable_w_typing (MsdMouseManager *manager,
set_disable_w_typing_libinput (manager, state);
}
+static void
+set_accel_profile_libinput (MsdMouseManager *manager,
+ XDeviceInfo *device_info)
+{
+ XDevice *device;
+ GdkDisplay *display;
+ GSettings *settings;
+ guchar *available, *defaults, *values;
+
+ display = gdk_display_get_default ();
+
+ device = device_is_touchpad (device_info);
+
+ if (device != NULL) {
+ settings = manager->priv->settings_touchpad;
+ } else {
+ gdk_x11_display_error_trap_push (display);
+ device = XOpenDevice (GDK_DISPLAY_XDISPLAY (display), device_info->id);
+ if ((gdk_x11_display_error_trap_pop (display) != 0) || (device == NULL))
+ return;
+
+ settings = manager->priv->settings_mouse;
+ }
+
+ available = get_property (device, "libinput Accel Profiles Available", XA_INTEGER, 8, 2);
+ if (!available)
+ return;
+ XFree (available);
+
+ defaults = get_property (device, "libinput Accel Profile Enabled Default", XA_INTEGER, 8, 2);
+ if (!defaults)
+ return;
+
+ values = get_property (device, "libinput Accel Profile Enabled", XA_INTEGER, 8, 2);
+ if (!values) {
+ XFree (defaults);
+ return;
+ }
+
+ /* 2 boolean values (8 bit, 0 or 1), in order "adaptive", "flat". */
+ switch (g_settings_get_enum (settings, KEY_ACCEL_PROFILE)) {
+ case ACCEL_PROFILE_ADAPTIVE:
+ values[0] = 1; /* enable adaptive */
+ values[1] = 0; /* disable flat */
+ break;
+ case ACCEL_PROFILE_FLAT:
+ values[0] = 0; /* disable adaptive */
+ values[1] = 1; /* enable flat */
+ break;
+ case ACCEL_PROFILE_DEFAULT:
+ default:
+ values[0] = defaults[0];
+ values[1] = defaults[1];
+ break;
+ }
+
+ change_property (device, "libinput Accel Profile Enabled", XA_INTEGER, 8, values, 2);
+
+ XCloseDevice (GDK_DISPLAY_XDISPLAY (display), device);
+
+ XFree (defaults);
+ XFree (values);
+}
+
+static void
+set_accel_profile (MsdMouseManager *manager,
+ XDeviceInfo *device_info)
+{
+ if (property_exists_on_device (device_info, "libinput Accel Profile Enabled"))
+ set_accel_profile_libinput (manager, device_info);
+
+ /* TODO: Add acceleration profiles for synaptics/legacy drivers */
+}
+
+static void
+set_accel_profile_all (MsdMouseManager *manager)
+{
+ int numdevices, i;
+ XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices);
+
+ if (devicelist == NULL)
+ return;
+
+ for (i = 0; i < numdevices; i++) {
+ set_accel_profile (manager, &devicelist[i]);
+ }
+
+ XFreeDeviceList (devicelist);
+}
+
static gboolean
get_touchpad_handedness (MsdMouseManager *manager,
gboolean mouse_left_handed)
@@ -1517,6 +1683,7 @@ set_mouse_settings (MsdMouseManager *manager)
set_scrolling_all (manager->priv->settings_touchpad);
set_natural_scroll_all (manager);
set_touchpad_enabled_all (g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_ENABLED));
+ set_accel_profile_all (manager);
}
static void
@@ -1531,6 +1698,8 @@ mouse_callback (GSettings *settings,
} 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_ACCEL_PROFILE) == 0) {
+ set_accel_profile_all (manager);
} else if (g_strcmp0 (key, KEY_MIDDLE_BUTTON_EMULATION) == 0) {
set_middle_button_all (g_settings_get_boolean (settings, key));
} else if (g_strcmp0 (key, KEY_MOUSE_LOCATE_POINTER) == 0) {
@@ -1580,6 +1749,8 @@ touchpad_callback (GSettings *settings,
} 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_ACCEL_PROFILE) == 0) {
+ set_accel_profile_all (manager);
}
}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 881216c..ede4919 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,6 +3,7 @@
data/50-accessibility.xml.in
[type: gettext/gsettings]data/org.mate.applications-at.gschema.xml.in
[type: gettext/gsettings]data/org.mate.font-rendering.gschema.xml.in
+[type: gettext/gsettings]data/org.mate.peripherals-mouse.gschema.xml.in
[type: gettext/gsettings]data/org.mate.peripherals-smartcard.gschema.xml.in
[type: gettext/gsettings]data/org.mate.peripherals-touchpad.gschema.xml.in
[type: gettext/gsettings]data/org.mate.SettingsDaemon.plugins.a11y-keyboard.gschema.xml.in