Merge lp:~darkxst/unity-settings-daemon/gsettings3.16 into lp:unity-settings-daemon

Proposed by Tim Lunn
Status: Merged
Approved by: Tim Lunn
Approved revision: 4090
Merged at revision: 4090
Proposed branch: lp:~darkxst/unity-settings-daemon/gsettings3.16
Merge into: lp:unity-settings-daemon
Diff against target: 704 lines (+307/-98)
6 files modified
debian/control (+3/-3)
plugins/common/Makefile.am (+3/-1)
plugins/common/gsd-settings-migrate.c (+67/-0)
plugins/common/gsd-settings-migrate.h (+43/-0)
plugins/keyboard/gsd-keyboard-manager.c (+37/-2)
plugins/mouse/gsd-mouse-manager.c (+154/-92)
To merge this branch: bzr merge lp:~darkxst/unity-settings-daemon/gsettings3.16
Reviewer Review Type Date Requested Status
Unity Settings Daemon Development Team Pending
Review via email: mp+265203@code.launchpad.net

Commit message

Cherry-pick upstream changes for relocated peripheral settings

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2015-03-18 16:31:59 +0000
+++ debian/control 2015-07-19 03:33:39 +0000
@@ -19,7 +19,7 @@
19 libxext-dev,19 libxext-dev,
20 libx11-dev,20 libx11-dev,
21 libxtst-dev,21 libxtst-dev,
22 gsettings-desktop-schemas-dev (>= 3.7.2.1),22 gsettings-desktop-schemas-dev (>= 3.15.4),
23 libgnome-desktop-3-dev (>= 3.7.90),23 libgnome-desktop-3-dev (>= 3.7.90),
24 libpulse-dev (>= 1:2.0),24 libpulse-dev (>= 1:2.0),
25 libasound2-dev,25 libasound2-dev,
@@ -54,9 +54,9 @@
54Depends: ${shlibs:Depends},54Depends: ${shlibs:Depends},
55 ${misc:Depends},55 ${misc:Depends},
56 accountsservice (>= 0.6.34),56 accountsservice (>= 0.6.34),
57 gsettings-desktop-schemas (>= 3.7.2.1),57 gsettings-desktop-schemas (>= 3.15.4),
58 nautilus-data (>= 2.91.3-1),58 nautilus-data (>= 2.91.3-1),
59 gnome-settings-daemon-schemas (>= 3.8), 59 gnome-settings-daemon-schemas (>= 3.16),
60 gsettings-ubuntu-schemas (>= 0.0.1+14.04.20140224),60 gsettings-ubuntu-schemas (>= 0.0.1+14.04.20140224),
61Recommends: ibus (>= 1.5.0),61Recommends: ibus (>= 1.5.0),
62 pulseaudio,62 pulseaudio,
6363
=== modified file 'plugins/common/Makefile.am'
--- plugins/common/Makefile.am 2014-06-26 02:32:12 +0000
+++ plugins/common/Makefile.am 2015-07-19 03:33:39 +0000
@@ -6,7 +6,9 @@
6 gsd-keygrab.c \6 gsd-keygrab.c \
7 gsd-keygrab.h \7 gsd-keygrab.h \
8 gsd-input-helper.c \8 gsd-input-helper.c \
9 gsd-input-helper.h9 gsd-input-helper.h \
10 gsd-settings-migrate.c \
11 gsd-settings-migrate.h
1012
11libcommon_la_CPPFLAGS = \13libcommon_la_CPPFLAGS = \
12 $(AM_CPPFLAGS)14 $(AM_CPPFLAGS)
1315
=== added file 'plugins/common/gsd-settings-migrate.c'
--- plugins/common/gsd-settings-migrate.c 1970-01-01 00:00:00 +0000
+++ plugins/common/gsd-settings-migrate.c 2015-07-19 03:33:39 +0000
@@ -0,0 +1,67 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2015 Red Hat
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Author: Carlos Garnacho <carlosg@gnome.org>
20 */
21
22#include "config.h"
23
24#include <gio/gio.h>
25
26#include "gsd-settings-migrate.h"
27
28void
29gsd_settings_migrate_check (const gchar *origin_schema,
30 const gchar *origin_path,
31 const gchar *dest_schema,
32 const gchar *dest_path,
33 GsdSettingsMigrateEntry entries[],
34 guint n_entries)
35{
36 GSettings *origin_settings, *dest_settings;
37 GVariant *variant;
38 guint i;
39
40 origin_settings = g_settings_new_with_path (origin_schema, origin_path);
41 dest_settings = g_settings_new_with_path (dest_schema, dest_path);
42
43 for (i = 0; i < n_entries; i++) {
44 variant = g_settings_get_user_value (origin_settings, entries[i].origin_key);
45
46 if (!variant)
47 continue;
48
49 if (entries[i].dest_key) {
50 if (entries[i].func) {
51 GVariant *modified;
52
53 modified = entries[i].func (variant);
54 g_variant_unref (variant);
55 variant = g_variant_ref_sink (modified);
56 }
57
58 g_settings_set_value (dest_settings, entries[i].dest_key, variant);
59 }
60
61 g_settings_reset (origin_settings, entries[i].origin_key);
62 g_variant_unref (variant);
63 }
64
65 g_object_unref (origin_settings);
66 g_object_unref (dest_settings);
67}
068
=== added file 'plugins/common/gsd-settings-migrate.h'
--- plugins/common/gsd-settings-migrate.h 1970-01-01 00:00:00 +0000
+++ plugins/common/gsd-settings-migrate.h 2015-07-19 03:33:39 +0000
@@ -0,0 +1,43 @@
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2015 Red Hat
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Author: Carlos Garnacho <carlosg@gnome.org>
20 */
21
22#ifndef __GSD_SETTINGS_MIGRATE_H__
23#define __GSD_SETTINGS_MIGRATE_H__
24
25typedef struct _GsdSettingsMigrateEntry GsdSettingsMigrateEntry;
26
27typedef GVariant * (* GsdSettingsMigrateFunc) (GVariant *variant);
28
29struct _GsdSettingsMigrateEntry
30{
31 const gchar *origin_key;
32 const gchar *dest_key;
33 GsdSettingsMigrateFunc func;
34};
35
36void gsd_settings_migrate_check (const gchar *origin_schema,
37 const gchar *origin_path,
38 const gchar *dest_schema,
39 const gchar *dest_path,
40 GsdSettingsMigrateEntry entries[],
41 guint n_entries);
42
43#endif /* __GSD_SETTINGS_MIGRATE_H__ */
044
=== modified file 'plugins/keyboard/gsd-keyboard-manager.c'
--- plugins/keyboard/gsd-keyboard-manager.c 2015-03-12 21:34:36 +0000
+++ plugins/keyboard/gsd-keyboard-manager.c 2015-07-19 03:33:39 +0000
@@ -60,6 +60,7 @@
60#include "gsd-keyboard-manager.h"60#include "gsd-keyboard-manager.h"
61#include "gsd-input-helper.h"61#include "gsd-input-helper.h"
62#include "gsd-enums.h"62#include "gsd-enums.h"
63#include "gsd-settings-migrate.h"
63#include "gsd-xkb-utils.h"64#include "gsd-xkb-utils.h"
6465
65#ifdef HAVE_FCITX66#ifdef HAVE_FCITX
@@ -69,6 +70,7 @@
69#define GSD_KEYBOARD_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_KEYBOARD_MANAGER, GsdKeyboardManagerPrivate))70#define GSD_KEYBOARD_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_KEYBOARD_MANAGER, GsdKeyboardManagerPrivate))
7071
71#define GSD_KEYBOARD_DIR "org.gnome.settings-daemon.peripherals.keyboard"72#define GSD_KEYBOARD_DIR "org.gnome.settings-daemon.peripherals.keyboard"
73#define GSETTINGS_KEYBOARD_SCHEMA "org.gnome.desktop.peripherals.keyboard"
7274
73#define KEY_REPEAT "repeat"75#define KEY_REPEAT "repeat"
74#define KEY_CLICK "click"76#define KEY_CLICK "click"
@@ -113,6 +115,7 @@
113{115{
114 guint start_idle_id;116 guint start_idle_id;
115 GSettings *settings;117 GSettings *settings;
118 GSettings *gsettings;
116 GSettings *input_sources_settings;119 GSettings *input_sources_settings;
117 GSettings *interface_settings;120 GSettings *interface_settings;
118 GnomeXkbInfo *xkb_info;121 GnomeXkbInfo *xkb_info;
@@ -1783,7 +1786,7 @@
1783 guint delay;1786 guint delay;
17841787
1785 g_debug ("Applying the repeat settings");1788 g_debug ("Applying the repeat settings");
1786 settings = manager->priv->settings;1789 settings = manager->priv->gsettings;
1787 repeat = g_settings_get_boolean (settings, KEY_REPEAT);1790 repeat = g_settings_get_boolean (settings, KEY_REPEAT);
1788 interval = g_settings_get_uint (settings, KEY_INTERVAL);1791 interval = g_settings_get_uint (settings, KEY_INTERVAL);
1789 delay = g_settings_get_uint (settings, KEY_DELAY);1792 delay = g_settings_get_uint (settings, KEY_DELAY);
@@ -1832,7 +1835,18 @@
1832 apply_numlock (manager);1835 apply_numlock (manager);
1833 } else if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) {1836 } else if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) {
1834 g_debug ("Num-Lock state '%s' changed, will apply at next startup", key);1837 g_debug ("Num-Lock state '%s' changed, will apply at next startup", key);
1835 } else if (g_strcmp0 (key, KEY_REPEAT) == 0 ||1838 } else {
1839 g_warning ("Unhandled settings change, key '%s'", key);
1840 }
1841
1842}
1843
1844static void
1845gsettings_changed (GSettings *settings,
1846 const char *key,
1847 GsdKeyboardManager *manager)
1848{
1849 if (g_strcmp0 (key, KEY_REPEAT) == 0 ||
1836 g_strcmp0 (key, KEY_INTERVAL) == 0 ||1850 g_strcmp0 (key, KEY_INTERVAL) == 0 ||
1837 g_strcmp0 (key, KEY_DELAY) == 0) {1851 g_strcmp0 (key, KEY_DELAY) == 0) {
1838 g_debug ("Key repeat setting '%s' changed, applying key repeat settings", key);1852 g_debug ("Key repeat setting '%s' changed, applying key repeat settings", key);
@@ -2390,6 +2404,7 @@
2390#endif2404#endif
23912405
2392 manager->priv->settings = g_settings_new (GSD_KEYBOARD_DIR);2406 manager->priv->settings = g_settings_new (GSD_KEYBOARD_DIR);
2407 manager->priv->gsettings = g_settings_new (GSETTINGS_KEYBOARD_SCHEMA);
23932408
2394 xkb_init (manager);2409 xkb_init (manager);
23952410
@@ -2449,6 +2464,9 @@
24492464
2450 g_signal_connect (G_OBJECT (manager->priv->settings), "changed",2465 g_signal_connect (G_OBJECT (manager->priv->settings), "changed",
2451 G_CALLBACK (settings_changed), manager);2466 G_CALLBACK (settings_changed), manager);
2467 g_signal_connect (G_OBJECT (manager->priv->gsettings), "changed",
2468 G_CALLBACK (gsettings_changed), manager);
2469
2452 g_signal_connect (G_OBJECT (manager->priv->input_sources_settings), "change-event",2470 g_signal_connect (G_OBJECT (manager->priv->input_sources_settings), "change-event",
2453 G_CALLBACK (apply_input_sources_settings), manager);2471 G_CALLBACK (apply_input_sources_settings), manager);
24542472
@@ -2572,12 +2590,29 @@
2572 G_OBJECT_CLASS (gsd_keyboard_manager_parent_class)->finalize (object);2590 G_OBJECT_CLASS (gsd_keyboard_manager_parent_class)->finalize (object);
2573}2591}
25742592
2593static void
2594migrate_keyboard_settings (void)
2595{
2596 GsdSettingsMigrateEntry entries[] = {
2597 { "repeat", "repeat", NULL },
2598 { "repeat-interval", "repeat-interval", NULL },
2599 { "delay", "delay", NULL }
2600 };
2601
2602 gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.keyboard.deprecated",
2603 "/org/gnome/settings-daemon/peripherals/keyboard/",
2604 "org.gnome.desktop.peripherals.keyboard",
2605 "/org/gnome/desktop/peripherals/keyboard/",
2606 entries, G_N_ELEMENTS (entries));
2607}
2608
2575GsdKeyboardManager *2609GsdKeyboardManager *
2576gsd_keyboard_manager_new (void)2610gsd_keyboard_manager_new (void)
2577{2611{
2578 if (manager_object != NULL) {2612 if (manager_object != NULL) {
2579 g_object_ref (manager_object);2613 g_object_ref (manager_object);
2580 } else {2614 } else {
2615 migrate_keyboard_settings ();
2581 manager_object = g_object_new (GSD_TYPE_KEYBOARD_MANAGER, NULL);2616 manager_object = g_object_new (GSD_TYPE_KEYBOARD_MANAGER, NULL);
2582 g_object_add_weak_pointer (manager_object,2617 g_object_add_weak_pointer (manager_object,
2583 (gpointer *) &manager_object);2618 (gpointer *) &manager_object);
25842619
=== modified file 'plugins/mouse/gsd-mouse-manager.c'
--- plugins/mouse/gsd-mouse-manager.c 2013-12-04 23:55:26 +0000
+++ plugins/mouse/gsd-mouse-manager.c 2015-07-19 03:33:39 +0000
@@ -44,6 +44,8 @@
44#include <X11/keysym.h>44#include <X11/keysym.h>
45#include <X11/Xatom.h>45#include <X11/Xatom.h>
4646
47#include <gdesktop-enums.h>
48
47#include <X11/extensions/XInput.h>49#include <X11/extensions/XInput.h>
48#include <X11/extensions/XIproto.h>50#include <X11/extensions/XIproto.h>
4951
@@ -51,30 +53,28 @@
51#include "gsd-mouse-manager.h"53#include "gsd-mouse-manager.h"
52#include "gsd-input-helper.h"54#include "gsd-input-helper.h"
53#include "gsd-enums.h"55#include "gsd-enums.h"
56#include "gsd-settings-migrate.h"
5457
55#define GSD_MOUSE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_MOUSE_MANAGER, GsdMouseManagerPrivate))58#define GSD_MOUSE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_MOUSE_MANAGER, GsdMouseManagerPrivate))
5659
57#define SETTINGS_MOUSE_DIR "org.gnome.settings-daemon.peripherals.mouse"60#define GSD_SETTINGS_MOUSE_SCHEMA "org.gnome.settings-daemon.peripherals.mouse"
58#define SETTINGS_TOUCHPAD_DIR "org.gnome.settings-daemon.peripherals.touchpad"61#define GSETTINGS_MOUSE_SCHEMA "org.gnome.desktop.peripherals.mouse"
62#define GSETTINGS_TOUCHPAD_SCHEMA "org.gnome.desktop.peripherals.touchpad"
5963
60/* Keys for both touchpad and mouse */64/* Keys for both touchpad and mouse */
61#define KEY_LEFT_HANDED "left-handed" /* a boolean for mouse, an enum for touchpad */65#define KEY_LEFT_HANDED "left-handed" /* a boolean for mouse, an enum for touchpad */
62#define KEY_MOTION_ACCELERATION "motion-acceleration"66#define KEY_SPEED "speed"
63#define KEY_MOTION_THRESHOLD "motion-threshold"
6467
65/* Touchpad settings */68/* Touchpad settings */
66#define KEY_TOUCHPAD_DISABLE_W_TYPING "disable-while-typing"
67#define KEY_PAD_HORIZ_SCROLL "horiz-scroll-enabled"
68#define KEY_SCROLL_METHOD "scroll-method"69#define KEY_SCROLL_METHOD "scroll-method"
69#define KEY_TAP_TO_CLICK "tap-to-click"70#define KEY_TAP_TO_CLICK "tap-to-click"
70#define KEY_TOUCHPAD_ENABLED "touchpad-enabled"71#define KEY_SEND_EVENTS "send-events"
71#define KEY_NATURAL_SCROLL_ENABLED "natural-scroll"72#define KEY_NATURAL_SCROLL_ENABLED "natural-scroll"
7273
73/* Mouse settings */74/* Mouse settings */
74#define KEY_LOCATE_POINTER "locate-pointer"75#define KEY_LOCATE_POINTER "locate-pointer"
75#define KEY_DWELL_CLICK_ENABLED "dwell-click-enabled"76#define KEY_DWELL_CLICK_ENABLED "dwell-click-enabled"
76#define KEY_SECONDARY_CLICK_ENABLED "secondary-click-enabled"77#define KEY_SECONDARY_CLICK_ENABLED "secondary-click-enabled"
77#define KEY_MIDDLE_BUTTON_EMULATION "middle-button-enabled"
7878
79struct GsdMouseManagerPrivate79struct GsdMouseManagerPrivate
80{80{
@@ -82,6 +82,7 @@
82 GSettings *touchpad_settings;82 GSettings *touchpad_settings;
83 GSettings *mouse_settings;83 GSettings *mouse_settings;
84 GSettings *mouse_a11y_settings;84 GSettings *mouse_a11y_settings;
85 GSettings *gsd_mouse_settings;
85 GdkDeviceManager *device_manager;86 GdkDeviceManager *device_manager;
86 guint device_added_id;87 guint device_added_id;
87 guint device_removed_id;88 guint device_removed_id;
@@ -408,6 +409,7 @@
408 gfloat motion_acceleration;409 gfloat motion_acceleration;
409 int motion_threshold;410 int motion_threshold;
410 GSettings *settings;411 GSettings *settings;
412 gdouble speed;
411 guint i;413 guint i;
412414
413 xdevice = open_gdk_device (device);415 xdevice = open_gdk_device (device);
@@ -421,8 +423,11 @@
421 else423 else
422 settings = manager->priv->mouse_settings;424 settings = manager->priv->mouse_settings;
423425
424 /* Calculate acceleration */426 speed = g_settings_get_double (settings, KEY_SPEED);
425 motion_acceleration = g_settings_get_double (settings, KEY_MOTION_ACCELERATION);427
428 /* Calculate acceleration and threshold */
429 motion_acceleration = (speed + 1) * 5; /* speed is [-1..1], map to [0..10] */
430 motion_threshold = CLAMP (10 - floor (motion_acceleration), 1, 10);
426431
427 if (motion_acceleration >= 1.0) {432 if (motion_acceleration >= 1.0) {
428 /* we want to get the acceleration, with a resolution of 0.5433 /* we want to get the acceleration, with a resolution of 0.5
@@ -449,8 +454,6 @@
449 denominator = -1;454 denominator = -1;
450 }455 }
451456
452 /* And threshold */
453 motion_threshold = g_settings_get_int (settings, KEY_MOTION_THRESHOLD);
454457
455 /* Get the list of feedbacks for the device */458 /* Get the list of feedbacks for the device */
456 states = XGetFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice, &num_feedbacks);459 states = XGetFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice, &num_feedbacks);
@@ -487,52 +490,6 @@
487 XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice);490 XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice);
488}491}
489492
490static void
491set_middle_button (GsdMouseManager *manager,
492 GdkDevice *device,
493 gboolean middle_button)
494{
495 Atom prop;
496 XDevice *xdevice;
497 Atom type;
498 int format;
499 unsigned long nitems, bytes_after;
500 unsigned char *data;
501 int rc;
502
503 prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
504 "Evdev Middle Button Emulation", True);
505
506 if (!prop) /* no evdev devices */
507 return;
508
509 xdevice = open_gdk_device (device);
510 if (xdevice == NULL)
511 return;
512
513 g_debug ("setting middle button on %s", gdk_device_get_name (device));
514
515 gdk_error_trap_push ();
516
517 rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
518 xdevice, prop, 0, 1, False, XA_INTEGER, &type, &format,
519 &nitems, &bytes_after, &data);
520
521 if (rc == Success && format == 8 && type == XA_INTEGER && nitems == 1) {
522 data[0] = middle_button ? 1 : 0;
523
524 XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
525 xdevice, prop, type, format, PropModeReplace, data, nitems);
526 }
527
528 if (gdk_error_trap_pop ())
529 g_warning ("Error in setting middle button emulation on \"%s\"", gdk_device_get_name (device));
530
531 if (rc == Success)
532 XFree (data);
533
534 XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice);
535}
536493
537/* Ensure that syndaemon dies together with us, to avoid running several of494/* Ensure that syndaemon dies together with us, to avoid running several of
538 * them */495 * them */
@@ -602,7 +559,6 @@
602559
603 if (error) {560 if (error) {
604 g_warning ("Failed to launch syndaemon: %s", error->message);561 g_warning ("Failed to launch syndaemon: %s", error->message);
605 g_settings_set_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING, FALSE);
606 g_error_free (error);562 g_error_free (error);
607 } else {563 } else {
608 g_child_watch_add (manager->priv->syndaemon_pid, syndaemon_died, manager);564 g_child_watch_add (manager->priv->syndaemon_pid, syndaemon_died, manager);
@@ -889,7 +845,7 @@
889 manager->priv->locate_pointer_spawned = (error == NULL);845 manager->priv->locate_pointer_spawned = (error == NULL);
890846
891 if (error) {847 if (error) {
892 g_settings_set_boolean (manager->priv->mouse_settings, KEY_LOCATE_POINTER, FALSE);848 g_settings_set_boolean (manager->priv->gsd_mouse_settings, KEY_LOCATE_POINTER, FALSE);
893 g_error_free (error);849 g_error_free (error);
894 }850 }
895851
@@ -963,6 +919,22 @@
963 }919 }
964}920}
965921
922static gboolean
923get_touchpad_enabled (GsdMouseManager *manager)
924{
925 GDesktopDeviceSendEvents send_events;
926
927 send_events = g_settings_get_enum (manager->priv->touchpad_settings, KEY_SEND_EVENTS);
928
929 if (send_events == G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE) {
930 /* FIXME: mouse_is_present() also finds internal ones... */
931 return (!mouse_is_present () && !trackball_is_present ());
932
933 }
934
935 return send_events == G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED ? TRUE : FALSE;
936}
937
966static void938static void
967set_mouse_settings (GsdMouseManager *manager,939set_mouse_settings (GsdMouseManager *manager,
968 GdkDevice *device)940 GdkDevice *device)
@@ -974,13 +946,12 @@
974 set_left_handed (manager, device, mouse_left_handed, touchpad_left_handed);946 set_left_handed (manager, device, mouse_left_handed, touchpad_left_handed);
975947
976 set_motion (manager, device);948 set_motion (manager, device);
977 set_middle_button (manager, device, g_settings_get_boolean (manager->priv->mouse_settings, KEY_MIDDLE_BUTTON_EMULATION));
978949
979 set_tap_to_click (device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TAP_TO_CLICK), touchpad_left_handed);950 set_tap_to_click (device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TAP_TO_CLICK), touchpad_left_handed);
980 set_scroll_method (manager, device, g_settings_get_enum (manager->priv->touchpad_settings, KEY_SCROLL_METHOD));951 set_scroll_method (manager, device, g_settings_get_enum (manager->priv->touchpad_settings, KEY_SCROLL_METHOD));
981 set_horiz_scroll (device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_PAD_HORIZ_SCROLL));952 set_horiz_scroll (device, TRUE);
982 set_natural_scroll (manager, device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_NATURAL_SCROLL_ENABLED));953 set_natural_scroll (manager, device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_NATURAL_SCROLL_ENABLED));
983 if (g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED) == FALSE)954 if (!get_touchpad_enabled (manager))
984 set_touchpad_disabled (device);955 set_touchpad_disabled (device);
985}956}
986957
@@ -1075,11 +1046,8 @@
1075 gboolean mouse_left_handed;1046 gboolean mouse_left_handed;
1076 mouse_left_handed = g_settings_get_boolean (settings, KEY_LEFT_HANDED);1047 mouse_left_handed = g_settings_get_boolean (settings, KEY_LEFT_HANDED);
1077 set_left_handed (manager, device, mouse_left_handed, get_touchpad_handedness (manager, mouse_left_handed));1048 set_left_handed (manager, device, mouse_left_handed, get_touchpad_handedness (manager, mouse_left_handed));
1078 } else if (g_str_equal (key, KEY_MOTION_ACCELERATION) ||1049 } else if (g_str_equal (key, KEY_SPEED)) {
1079 g_str_equal (key, KEY_MOTION_THRESHOLD)) {
1080 set_motion (manager, device);1050 set_motion (manager, device);
1081 } else if (g_str_equal (key, KEY_MIDDLE_BUTTON_EMULATION)) {
1082 set_middle_button (manager, device, g_settings_get_boolean (settings, KEY_MIDDLE_BUTTON_EMULATION));
1083 }1051 }
1084 }1052 }
1085 g_list_free (devices);1053 g_list_free (devices);
@@ -1092,11 +1060,6 @@
1092{1060{
1093 GList *devices, *l;1061 GList *devices, *l;
10941062
1095 if (g_str_equal (key, KEY_TOUCHPAD_DISABLE_W_TYPING)) {
1096 set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, key));
1097 return;
1098 }
1099
1100 devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE);1063 devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE);
11011064
1102 for (l = devices; l != NULL; l = l->next) {1065 for (l = devices; l != NULL; l = l->next) {
@@ -1112,16 +1075,13 @@
1112 get_touchpad_handedness (manager, mouse_left_handed));1075 get_touchpad_handedness (manager, mouse_left_handed));
1113 } else if (g_str_equal (key, KEY_SCROLL_METHOD)) {1076 } else if (g_str_equal (key, KEY_SCROLL_METHOD)) {
1114 set_scroll_method (manager, device, g_settings_get_enum (settings, key));1077 set_scroll_method (manager, device, g_settings_get_enum (settings, key));
1115 set_horiz_scroll (device, g_settings_get_boolean (settings, KEY_PAD_HORIZ_SCROLL));1078 set_horiz_scroll (device, TRUE);
1116 } else if (g_str_equal (key, KEY_PAD_HORIZ_SCROLL)) {1079 } else if (g_str_equal (key, KEY_SEND_EVENTS)) {
1117 set_horiz_scroll (device, g_settings_get_boolean (settings, key));1080 if (!get_touchpad_enabled (manager))
1118 } else if (g_str_equal (key, KEY_TOUCHPAD_ENABLED)) {
1119 if (g_settings_get_boolean (settings, key) == FALSE)
1120 set_touchpad_disabled (device);1081 set_touchpad_disabled (device);
1121 else1082 else
1122 set_touchpad_enabled (gdk_x11_device_get_id (device));1083 set_touchpad_enabled (gdk_x11_device_get_id (device));
1123 } else if (g_str_equal (key, KEY_MOTION_ACCELERATION) ||1084 } else if (g_str_equal (key, KEY_SPEED)) {
1124 g_str_equal (key, KEY_MOTION_THRESHOLD)) {
1125 set_motion (manager, device);1085 set_motion (manager, device);
1126 } else if (g_str_equal (key, KEY_LEFT_HANDED)) {1086 } else if (g_str_equal (key, KEY_LEFT_HANDED)) {
1127 gboolean mouse_left_handed;1087 gboolean mouse_left_handed;
@@ -1133,8 +1093,8 @@
1133 }1093 }
1134 g_list_free (devices);1094 g_list_free (devices);
11351095
1136 if (g_str_equal (key, KEY_TOUCHPAD_ENABLED) &&1096 if (g_str_equal (key, KEY_SEND_EVENTS) &&
1137 g_settings_get_boolean (settings, key)) {1097 get_touchpad_enabled (manager)) {
1138 devices = get_disabled_devices (manager->priv->device_manager);1098 devices = get_disabled_devices (manager->priv->device_manager);
1139 for (l = devices; l != NULL; l = l->next) {1099 for (l = devices; l != NULL; l = l->next) {
1140 int device_id;1100 int device_id;
@@ -1150,8 +1110,34 @@
1150static void1110static void
1151ensure_touchpad_active (GsdMouseManager *manager)1111ensure_touchpad_active (GsdMouseManager *manager)
1152{1112{
1153 if (mouse_is_present () == FALSE && touchscreen_is_present () == FALSE && trackball_is_present () == FALSE && touchpad_is_present ())1113 GList *devices, *l;
1154 g_settings_set_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED, TRUE);1114
1115 if (get_touchpad_enabled (manager)) {
1116 devices = get_disabled_devices (manager->priv->device_manager);
1117 for (l = devices; l != NULL; l = l->next) {
1118 int device_id;
1119
1120 device_id = GPOINTER_TO_INT (l->data);
1121 set_touchpad_enabled (device_id);
1122 }
1123 g_list_free (devices);
1124 } else {
1125 devices = gdk_device_manager_list_devices (manager->priv->device_manager,
1126 GDK_DEVICE_TYPE_SLAVE);
1127
1128 for (l = devices; l != NULL; l = l->next) {
1129 GdkDevice *device = l->data;
1130
1131 if (device_is_ignored (manager, device))
1132 continue;
1133 if (gdk_device_get_source (device) != GDK_SOURCE_TOUCHPAD)
1134 continue;
1135
1136 set_touchpad_disabled (device);
1137 }
1138
1139 g_list_free (devices);
1140 }
1155}1141}
11561142
1157static void1143static void
@@ -1170,7 +1156,10 @@
1170 }1156 }
11711157
1172 /* If a touchpad was to appear... */1158 /* If a touchpad was to appear... */
1173 set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING));1159 set_disable_w_typing (manager, TRUE);
1160
1161 /* If a mouse was to appear... */
1162 ensure_touchpad_active (manager);
1174 }1163 }
1175}1164}
11761165
@@ -1191,7 +1180,7 @@
1191 run_custom_command (device, COMMAND_DEVICE_REMOVED);1180 run_custom_command (device, COMMAND_DEVICE_REMOVED);
11921181
1193 /* If a touchpad was to disappear... */1182 /* If a touchpad was to disappear... */
1194 set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING));1183 set_disable_w_typing (manager, TRUE);
11951184
1196 ensure_touchpad_active (manager);1185 ensure_touchpad_active (manager);
1197 }1186 }
@@ -1227,25 +1216,29 @@
12271216
1228 set_devicepresence_handler (manager);1217 set_devicepresence_handler (manager);
12291218
1230 manager->priv->mouse_settings = g_settings_new (SETTINGS_MOUSE_DIR);1219 manager->priv->gsd_mouse_settings = g_settings_new (GSD_SETTINGS_MOUSE_SCHEMA);
1231 g_signal_connect (manager->priv->mouse_settings, "changed",1220 g_signal_connect (manager->priv->gsd_mouse_settings, "changed",
1232 G_CALLBACK (mouse_callback), manager);1221 G_CALLBACK (mouse_callback), manager);
12331222
1234 manager->priv->mouse_a11y_settings = g_settings_new ("org.gnome.desktop.a11y.mouse");1223 manager->priv->mouse_a11y_settings = g_settings_new ("org.gnome.desktop.a11y.mouse");
1235 g_signal_connect (manager->priv->mouse_a11y_settings, "changed",1224 g_signal_connect (manager->priv->mouse_a11y_settings, "changed",
1236 G_CALLBACK (mouse_callback), manager);1225 G_CALLBACK (mouse_callback), manager);
12371226
1238 manager->priv->touchpad_settings = g_settings_new (SETTINGS_TOUCHPAD_DIR);1227 manager->priv->mouse_settings = g_settings_new (GSETTINGS_MOUSE_SCHEMA);
1228 g_signal_connect (manager->priv->mouse_settings, "changed",
1229 G_CALLBACK (mouse_callback), manager);
1230
1231 manager->priv->touchpad_settings = g_settings_new (GSETTINGS_TOUCHPAD_SCHEMA);
1239 g_signal_connect (manager->priv->touchpad_settings, "changed",1232 g_signal_connect (manager->priv->touchpad_settings, "changed",
1240 G_CALLBACK (touchpad_callback), manager);1233 G_CALLBACK (touchpad_callback), manager);
12411234
1242 manager->priv->syndaemon_spawned = FALSE;1235 manager->priv->syndaemon_spawned = FALSE;
12431236
1244 set_locate_pointer (manager, g_settings_get_boolean (manager->priv->mouse_settings, KEY_LOCATE_POINTER));1237 set_locate_pointer (manager, g_settings_get_boolean (manager->priv->gsd_mouse_settings, KEY_LOCATE_POINTER));
1245 set_mousetweaks_daemon (manager,1238 set_mousetweaks_daemon (manager,
1246 g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_DWELL_CLICK_ENABLED),1239 g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_DWELL_CLICK_ENABLED),
1247 g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_SECONDARY_CLICK_ENABLED));1240 g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_SECONDARY_CLICK_ENABLED));
1248 set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING));1241 set_disable_w_typing (manager, TRUE);
12491242
1250 devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE);1243 devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE);
1251 for (l = devices; l != NULL; l = l->next) {1244 for (l = devices; l != NULL; l = l->next) {
@@ -1267,7 +1260,7 @@
12671260
1268 ensure_touchpad_active (manager);1261 ensure_touchpad_active (manager);
12691262
1270 if (g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED)) {1263 if (get_touchpad_enabled (manager)) {
1271 devices = get_disabled_devices (manager->priv->device_manager);1264 devices = get_disabled_devices (manager->priv->device_manager);
1272 for (l = devices; l != NULL; l = l->next) {1265 for (l = devices; l != NULL; l = l->next) {
1273 int device_id;1266 int device_id;
@@ -1348,12 +1341,81 @@
1348 G_OBJECT_CLASS (gsd_mouse_manager_parent_class)->finalize (object);1341 G_OBJECT_CLASS (gsd_mouse_manager_parent_class)->finalize (object);
1349}1342}
13501343
1344static GVariant *
1345map_speed (GVariant *variant)
1346{
1347 gdouble value;
1348
1349 value = g_variant_get_double (variant);
1350
1351 /* Remap from [0..10] to [-1..1] */
1352 value = (value / 5) - 1;
1353
1354 return g_variant_new_double (value);
1355}
1356
1357static GVariant *
1358map_send_events (GVariant *variant)
1359{
1360 gboolean enabled;
1361
1362 enabled = g_variant_get_boolean (variant);
1363
1364 if (enabled) {
1365 return g_variant_new_string ("enabled");
1366 } else {
1367 return g_variant_new_string ("disabled");
1368 }
1369}
1370
1371static void
1372migrate_mouse_settings (void)
1373{
1374 GsdSettingsMigrateEntry trackball_entries[] = {
1375 { "scroll-wheel-emulation-button", "scroll-wheel-emulation-button", NULL }
1376 };
1377 GsdSettingsMigrateEntry mouse_entries[] = {
1378 { "left-handed", "left-handed", NULL },
1379 { "motion-acceleration", "speed", map_speed },
1380 { "motion-threshold", NULL, NULL },
1381 { "middle-button-enabled", NULL, NULL },
1382 };
1383 GsdSettingsMigrateEntry touchpad_entries[] = {
1384 { "disable-while-typing", NULL, NULL },
1385 { "horiz-scroll-enabled", NULL, NULL },
1386 { "scroll-method", "scroll-method", NULL },
1387 { "tap-to-click", "tap-to-click", NULL },
1388 { "touchpad-enabled", "send-events", map_send_events },
1389 { "left-handed", "left-handed", NULL },
1390 { "motion-acceleration", "speed", map_speed },
1391 { "motion-threshold", NULL, NULL },
1392 { "natural-scroll", "natural-scroll", NULL }
1393 };
1394
1395 gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.trackball.deprecated",
1396 "/org/gnome/settings-daemon/peripherals/trackball/",
1397 "org.gnome.desktop.peripherals.trackball",
1398 "/org/gnome/desktop/peripherals/trackball/",
1399 trackball_entries, G_N_ELEMENTS (trackball_entries));
1400 gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.mouse.deprecated",
1401 "/org/gnome/settings-daemon/peripherals/mouse/",
1402 "org.gnome.desktop.peripherals.mouse",
1403 "/org/gnome/desktop/peripherals/mouse/",
1404 mouse_entries, G_N_ELEMENTS (mouse_entries));
1405 gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.touchpad.deprecated",
1406 "/org/gnome/settings-daemon/peripherals/touchpad/",
1407 "org.gnome.desktop.peripherals.touchpad",
1408 "/org/gnome/desktop/peripherals/touchpad/",
1409 touchpad_entries, G_N_ELEMENTS (touchpad_entries));
1410}
1411
1351GsdMouseManager *1412GsdMouseManager *
1352gsd_mouse_manager_new (void)1413gsd_mouse_manager_new (void)
1353{1414{
1354 if (manager_object != NULL) {1415 if (manager_object != NULL) {
1355 g_object_ref (manager_object);1416 g_object_ref (manager_object);
1356 } else {1417 } else {
1418 migrate_mouse_settings ();
1357 manager_object = g_object_new (GSD_TYPE_MOUSE_MANAGER, NULL);1419 manager_object = g_object_new (GSD_TYPE_MOUSE_MANAGER, NULL);
1358 g_object_add_weak_pointer (manager_object,1420 g_object_add_weak_pointer (manager_object,
1359 (gpointer *) &manager_object);1421 (gpointer *) &manager_object);

Subscribers

People subscribed via source and target branches