Merge lp:~darkxst/unity-settings-daemon/gsettings3.16 into lp:unity-settings-daemon
- gsettings3.16
- Merge into trunk
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 | ||||
Related bugs: |
|
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
Description of the change
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
1 | === modified file 'debian/control' |
2 | --- debian/control 2015-03-18 16:31:59 +0000 |
3 | +++ debian/control 2015-07-19 03:33:39 +0000 |
4 | @@ -19,7 +19,7 @@ |
5 | libxext-dev, |
6 | libx11-dev, |
7 | libxtst-dev, |
8 | - gsettings-desktop-schemas-dev (>= 3.7.2.1), |
9 | + gsettings-desktop-schemas-dev (>= 3.15.4), |
10 | libgnome-desktop-3-dev (>= 3.7.90), |
11 | libpulse-dev (>= 1:2.0), |
12 | libasound2-dev, |
13 | @@ -54,9 +54,9 @@ |
14 | Depends: ${shlibs:Depends}, |
15 | ${misc:Depends}, |
16 | accountsservice (>= 0.6.34), |
17 | - gsettings-desktop-schemas (>= 3.7.2.1), |
18 | + gsettings-desktop-schemas (>= 3.15.4), |
19 | nautilus-data (>= 2.91.3-1), |
20 | - gnome-settings-daemon-schemas (>= 3.8), |
21 | + gnome-settings-daemon-schemas (>= 3.16), |
22 | gsettings-ubuntu-schemas (>= 0.0.1+14.04.20140224), |
23 | Recommends: ibus (>= 1.5.0), |
24 | pulseaudio, |
25 | |
26 | === modified file 'plugins/common/Makefile.am' |
27 | --- plugins/common/Makefile.am 2014-06-26 02:32:12 +0000 |
28 | +++ plugins/common/Makefile.am 2015-07-19 03:33:39 +0000 |
29 | @@ -6,7 +6,9 @@ |
30 | gsd-keygrab.c \ |
31 | gsd-keygrab.h \ |
32 | gsd-input-helper.c \ |
33 | - gsd-input-helper.h |
34 | + gsd-input-helper.h \ |
35 | + gsd-settings-migrate.c \ |
36 | + gsd-settings-migrate.h |
37 | |
38 | libcommon_la_CPPFLAGS = \ |
39 | $(AM_CPPFLAGS) |
40 | |
41 | === added file 'plugins/common/gsd-settings-migrate.c' |
42 | --- plugins/common/gsd-settings-migrate.c 1970-01-01 00:00:00 +0000 |
43 | +++ plugins/common/gsd-settings-migrate.c 2015-07-19 03:33:39 +0000 |
44 | @@ -0,0 +1,67 @@ |
45 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
46 | + * |
47 | + * Copyright (C) 2015 Red Hat |
48 | + * |
49 | + * This program is free software; you can redistribute it and/or modify |
50 | + * it under the terms of the GNU General Public License as published by |
51 | + * the Free Software Foundation; either version 2 of the License, or |
52 | + * (at your option) any later version. |
53 | + * |
54 | + * This program is distributed in the hope that it will be useful, |
55 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
56 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
57 | + * GNU General Public License for more details. |
58 | + * |
59 | + * You should have received a copy of the GNU General Public License |
60 | + * along with this program; if not, write to the Free Software |
61 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
62 | + * |
63 | + * Author: Carlos Garnacho <carlosg@gnome.org> |
64 | + */ |
65 | + |
66 | +#include "config.h" |
67 | + |
68 | +#include <gio/gio.h> |
69 | + |
70 | +#include "gsd-settings-migrate.h" |
71 | + |
72 | +void |
73 | +gsd_settings_migrate_check (const gchar *origin_schema, |
74 | + const gchar *origin_path, |
75 | + const gchar *dest_schema, |
76 | + const gchar *dest_path, |
77 | + GsdSettingsMigrateEntry entries[], |
78 | + guint n_entries) |
79 | +{ |
80 | + GSettings *origin_settings, *dest_settings; |
81 | + GVariant *variant; |
82 | + guint i; |
83 | + |
84 | + origin_settings = g_settings_new_with_path (origin_schema, origin_path); |
85 | + dest_settings = g_settings_new_with_path (dest_schema, dest_path); |
86 | + |
87 | + for (i = 0; i < n_entries; i++) { |
88 | + variant = g_settings_get_user_value (origin_settings, entries[i].origin_key); |
89 | + |
90 | + if (!variant) |
91 | + continue; |
92 | + |
93 | + if (entries[i].dest_key) { |
94 | + if (entries[i].func) { |
95 | + GVariant *modified; |
96 | + |
97 | + modified = entries[i].func (variant); |
98 | + g_variant_unref (variant); |
99 | + variant = g_variant_ref_sink (modified); |
100 | + } |
101 | + |
102 | + g_settings_set_value (dest_settings, entries[i].dest_key, variant); |
103 | + } |
104 | + |
105 | + g_settings_reset (origin_settings, entries[i].origin_key); |
106 | + g_variant_unref (variant); |
107 | + } |
108 | + |
109 | + g_object_unref (origin_settings); |
110 | + g_object_unref (dest_settings); |
111 | +} |
112 | |
113 | === added file 'plugins/common/gsd-settings-migrate.h' |
114 | --- plugins/common/gsd-settings-migrate.h 1970-01-01 00:00:00 +0000 |
115 | +++ plugins/common/gsd-settings-migrate.h 2015-07-19 03:33:39 +0000 |
116 | @@ -0,0 +1,43 @@ |
117 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
118 | + * |
119 | + * Copyright (C) 2015 Red Hat |
120 | + * |
121 | + * This program is free software; you can redistribute it and/or modify |
122 | + * it under the terms of the GNU General Public License as published by |
123 | + * the Free Software Foundation; either version 2 of the License, or |
124 | + * (at your option) any later version. |
125 | + * |
126 | + * This program is distributed in the hope that it will be useful, |
127 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
128 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
129 | + * GNU General Public License for more details. |
130 | + * |
131 | + * You should have received a copy of the GNU General Public License |
132 | + * along with this program; if not, write to the Free Software |
133 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
134 | + * |
135 | + * Author: Carlos Garnacho <carlosg@gnome.org> |
136 | + */ |
137 | + |
138 | +#ifndef __GSD_SETTINGS_MIGRATE_H__ |
139 | +#define __GSD_SETTINGS_MIGRATE_H__ |
140 | + |
141 | +typedef struct _GsdSettingsMigrateEntry GsdSettingsMigrateEntry; |
142 | + |
143 | +typedef GVariant * (* GsdSettingsMigrateFunc) (GVariant *variant); |
144 | + |
145 | +struct _GsdSettingsMigrateEntry |
146 | +{ |
147 | + const gchar *origin_key; |
148 | + const gchar *dest_key; |
149 | + GsdSettingsMigrateFunc func; |
150 | +}; |
151 | + |
152 | +void gsd_settings_migrate_check (const gchar *origin_schema, |
153 | + const gchar *origin_path, |
154 | + const gchar *dest_schema, |
155 | + const gchar *dest_path, |
156 | + GsdSettingsMigrateEntry entries[], |
157 | + guint n_entries); |
158 | + |
159 | +#endif /* __GSD_SETTINGS_MIGRATE_H__ */ |
160 | |
161 | === modified file 'plugins/keyboard/gsd-keyboard-manager.c' |
162 | --- plugins/keyboard/gsd-keyboard-manager.c 2015-03-12 21:34:36 +0000 |
163 | +++ plugins/keyboard/gsd-keyboard-manager.c 2015-07-19 03:33:39 +0000 |
164 | @@ -60,6 +60,7 @@ |
165 | #include "gsd-keyboard-manager.h" |
166 | #include "gsd-input-helper.h" |
167 | #include "gsd-enums.h" |
168 | +#include "gsd-settings-migrate.h" |
169 | #include "gsd-xkb-utils.h" |
170 | |
171 | #ifdef HAVE_FCITX |
172 | @@ -69,6 +70,7 @@ |
173 | #define GSD_KEYBOARD_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_KEYBOARD_MANAGER, GsdKeyboardManagerPrivate)) |
174 | |
175 | #define GSD_KEYBOARD_DIR "org.gnome.settings-daemon.peripherals.keyboard" |
176 | +#define GSETTINGS_KEYBOARD_SCHEMA "org.gnome.desktop.peripherals.keyboard" |
177 | |
178 | #define KEY_REPEAT "repeat" |
179 | #define KEY_CLICK "click" |
180 | @@ -113,6 +115,7 @@ |
181 | { |
182 | guint start_idle_id; |
183 | GSettings *settings; |
184 | + GSettings *gsettings; |
185 | GSettings *input_sources_settings; |
186 | GSettings *interface_settings; |
187 | GnomeXkbInfo *xkb_info; |
188 | @@ -1783,7 +1786,7 @@ |
189 | guint delay; |
190 | |
191 | g_debug ("Applying the repeat settings"); |
192 | - settings = manager->priv->settings; |
193 | + settings = manager->priv->gsettings; |
194 | repeat = g_settings_get_boolean (settings, KEY_REPEAT); |
195 | interval = g_settings_get_uint (settings, KEY_INTERVAL); |
196 | delay = g_settings_get_uint (settings, KEY_DELAY); |
197 | @@ -1832,7 +1835,18 @@ |
198 | apply_numlock (manager); |
199 | } else if (g_strcmp0 (key, KEY_NUMLOCK_STATE) == 0) { |
200 | g_debug ("Num-Lock state '%s' changed, will apply at next startup", key); |
201 | - } else if (g_strcmp0 (key, KEY_REPEAT) == 0 || |
202 | + } else { |
203 | + g_warning ("Unhandled settings change, key '%s'", key); |
204 | + } |
205 | + |
206 | +} |
207 | + |
208 | +static void |
209 | +gsettings_changed (GSettings *settings, |
210 | + const char *key, |
211 | + GsdKeyboardManager *manager) |
212 | +{ |
213 | + if (g_strcmp0 (key, KEY_REPEAT) == 0 || |
214 | g_strcmp0 (key, KEY_INTERVAL) == 0 || |
215 | g_strcmp0 (key, KEY_DELAY) == 0) { |
216 | g_debug ("Key repeat setting '%s' changed, applying key repeat settings", key); |
217 | @@ -2390,6 +2404,7 @@ |
218 | #endif |
219 | |
220 | manager->priv->settings = g_settings_new (GSD_KEYBOARD_DIR); |
221 | + manager->priv->gsettings = g_settings_new (GSETTINGS_KEYBOARD_SCHEMA); |
222 | |
223 | xkb_init (manager); |
224 | |
225 | @@ -2449,6 +2464,9 @@ |
226 | |
227 | g_signal_connect (G_OBJECT (manager->priv->settings), "changed", |
228 | G_CALLBACK (settings_changed), manager); |
229 | + g_signal_connect (G_OBJECT (manager->priv->gsettings), "changed", |
230 | + G_CALLBACK (gsettings_changed), manager); |
231 | + |
232 | g_signal_connect (G_OBJECT (manager->priv->input_sources_settings), "change-event", |
233 | G_CALLBACK (apply_input_sources_settings), manager); |
234 | |
235 | @@ -2572,12 +2590,29 @@ |
236 | G_OBJECT_CLASS (gsd_keyboard_manager_parent_class)->finalize (object); |
237 | } |
238 | |
239 | +static void |
240 | +migrate_keyboard_settings (void) |
241 | +{ |
242 | + GsdSettingsMigrateEntry entries[] = { |
243 | + { "repeat", "repeat", NULL }, |
244 | + { "repeat-interval", "repeat-interval", NULL }, |
245 | + { "delay", "delay", NULL } |
246 | + }; |
247 | + |
248 | + gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.keyboard.deprecated", |
249 | + "/org/gnome/settings-daemon/peripherals/keyboard/", |
250 | + "org.gnome.desktop.peripherals.keyboard", |
251 | + "/org/gnome/desktop/peripherals/keyboard/", |
252 | + entries, G_N_ELEMENTS (entries)); |
253 | +} |
254 | + |
255 | GsdKeyboardManager * |
256 | gsd_keyboard_manager_new (void) |
257 | { |
258 | if (manager_object != NULL) { |
259 | g_object_ref (manager_object); |
260 | } else { |
261 | + migrate_keyboard_settings (); |
262 | manager_object = g_object_new (GSD_TYPE_KEYBOARD_MANAGER, NULL); |
263 | g_object_add_weak_pointer (manager_object, |
264 | (gpointer *) &manager_object); |
265 | |
266 | === modified file 'plugins/mouse/gsd-mouse-manager.c' |
267 | --- plugins/mouse/gsd-mouse-manager.c 2013-12-04 23:55:26 +0000 |
268 | +++ plugins/mouse/gsd-mouse-manager.c 2015-07-19 03:33:39 +0000 |
269 | @@ -44,6 +44,8 @@ |
270 | #include <X11/keysym.h> |
271 | #include <X11/Xatom.h> |
272 | |
273 | +#include <gdesktop-enums.h> |
274 | + |
275 | #include <X11/extensions/XInput.h> |
276 | #include <X11/extensions/XIproto.h> |
277 | |
278 | @@ -51,30 +53,28 @@ |
279 | #include "gsd-mouse-manager.h" |
280 | #include "gsd-input-helper.h" |
281 | #include "gsd-enums.h" |
282 | +#include "gsd-settings-migrate.h" |
283 | |
284 | #define GSD_MOUSE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_MOUSE_MANAGER, GsdMouseManagerPrivate)) |
285 | |
286 | -#define SETTINGS_MOUSE_DIR "org.gnome.settings-daemon.peripherals.mouse" |
287 | -#define SETTINGS_TOUCHPAD_DIR "org.gnome.settings-daemon.peripherals.touchpad" |
288 | +#define GSD_SETTINGS_MOUSE_SCHEMA "org.gnome.settings-daemon.peripherals.mouse" |
289 | +#define GSETTINGS_MOUSE_SCHEMA "org.gnome.desktop.peripherals.mouse" |
290 | +#define GSETTINGS_TOUCHPAD_SCHEMA "org.gnome.desktop.peripherals.touchpad" |
291 | |
292 | /* Keys for both touchpad and mouse */ |
293 | #define KEY_LEFT_HANDED "left-handed" /* a boolean for mouse, an enum for touchpad */ |
294 | -#define KEY_MOTION_ACCELERATION "motion-acceleration" |
295 | -#define KEY_MOTION_THRESHOLD "motion-threshold" |
296 | +#define KEY_SPEED "speed" |
297 | |
298 | /* Touchpad settings */ |
299 | -#define KEY_TOUCHPAD_DISABLE_W_TYPING "disable-while-typing" |
300 | -#define KEY_PAD_HORIZ_SCROLL "horiz-scroll-enabled" |
301 | #define KEY_SCROLL_METHOD "scroll-method" |
302 | #define KEY_TAP_TO_CLICK "tap-to-click" |
303 | -#define KEY_TOUCHPAD_ENABLED "touchpad-enabled" |
304 | +#define KEY_SEND_EVENTS "send-events" |
305 | #define KEY_NATURAL_SCROLL_ENABLED "natural-scroll" |
306 | |
307 | /* Mouse settings */ |
308 | #define KEY_LOCATE_POINTER "locate-pointer" |
309 | #define KEY_DWELL_CLICK_ENABLED "dwell-click-enabled" |
310 | #define KEY_SECONDARY_CLICK_ENABLED "secondary-click-enabled" |
311 | -#define KEY_MIDDLE_BUTTON_EMULATION "middle-button-enabled" |
312 | |
313 | struct GsdMouseManagerPrivate |
314 | { |
315 | @@ -82,6 +82,7 @@ |
316 | GSettings *touchpad_settings; |
317 | GSettings *mouse_settings; |
318 | GSettings *mouse_a11y_settings; |
319 | + GSettings *gsd_mouse_settings; |
320 | GdkDeviceManager *device_manager; |
321 | guint device_added_id; |
322 | guint device_removed_id; |
323 | @@ -408,6 +409,7 @@ |
324 | gfloat motion_acceleration; |
325 | int motion_threshold; |
326 | GSettings *settings; |
327 | + gdouble speed; |
328 | guint i; |
329 | |
330 | xdevice = open_gdk_device (device); |
331 | @@ -421,8 +423,11 @@ |
332 | else |
333 | settings = manager->priv->mouse_settings; |
334 | |
335 | - /* Calculate acceleration */ |
336 | - motion_acceleration = g_settings_get_double (settings, KEY_MOTION_ACCELERATION); |
337 | + speed = g_settings_get_double (settings, KEY_SPEED); |
338 | + |
339 | + /* Calculate acceleration and threshold */ |
340 | + motion_acceleration = (speed + 1) * 5; /* speed is [-1..1], map to [0..10] */ |
341 | + motion_threshold = CLAMP (10 - floor (motion_acceleration), 1, 10); |
342 | |
343 | if (motion_acceleration >= 1.0) { |
344 | /* we want to get the acceleration, with a resolution of 0.5 |
345 | @@ -449,8 +454,6 @@ |
346 | denominator = -1; |
347 | } |
348 | |
349 | - /* And threshold */ |
350 | - motion_threshold = g_settings_get_int (settings, KEY_MOTION_THRESHOLD); |
351 | |
352 | /* Get the list of feedbacks for the device */ |
353 | states = XGetFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice, &num_feedbacks); |
354 | @@ -487,52 +490,6 @@ |
355 | XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice); |
356 | } |
357 | |
358 | -static void |
359 | -set_middle_button (GsdMouseManager *manager, |
360 | - GdkDevice *device, |
361 | - gboolean middle_button) |
362 | -{ |
363 | - Atom prop; |
364 | - XDevice *xdevice; |
365 | - Atom type; |
366 | - int format; |
367 | - unsigned long nitems, bytes_after; |
368 | - unsigned char *data; |
369 | - int rc; |
370 | - |
371 | - prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), |
372 | - "Evdev Middle Button Emulation", True); |
373 | - |
374 | - if (!prop) /* no evdev devices */ |
375 | - return; |
376 | - |
377 | - xdevice = open_gdk_device (device); |
378 | - if (xdevice == NULL) |
379 | - return; |
380 | - |
381 | - g_debug ("setting middle button on %s", gdk_device_get_name (device)); |
382 | - |
383 | - gdk_error_trap_push (); |
384 | - |
385 | - rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), |
386 | - xdevice, prop, 0, 1, False, XA_INTEGER, &type, &format, |
387 | - &nitems, &bytes_after, &data); |
388 | - |
389 | - if (rc == Success && format == 8 && type == XA_INTEGER && nitems == 1) { |
390 | - data[0] = middle_button ? 1 : 0; |
391 | - |
392 | - XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), |
393 | - xdevice, prop, type, format, PropModeReplace, data, nitems); |
394 | - } |
395 | - |
396 | - if (gdk_error_trap_pop ()) |
397 | - g_warning ("Error in setting middle button emulation on \"%s\"", gdk_device_get_name (device)); |
398 | - |
399 | - if (rc == Success) |
400 | - XFree (data); |
401 | - |
402 | - XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice); |
403 | -} |
404 | |
405 | /* Ensure that syndaemon dies together with us, to avoid running several of |
406 | * them */ |
407 | @@ -602,7 +559,6 @@ |
408 | |
409 | if (error) { |
410 | g_warning ("Failed to launch syndaemon: %s", error->message); |
411 | - g_settings_set_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING, FALSE); |
412 | g_error_free (error); |
413 | } else { |
414 | g_child_watch_add (manager->priv->syndaemon_pid, syndaemon_died, manager); |
415 | @@ -889,7 +845,7 @@ |
416 | manager->priv->locate_pointer_spawned = (error == NULL); |
417 | |
418 | if (error) { |
419 | - g_settings_set_boolean (manager->priv->mouse_settings, KEY_LOCATE_POINTER, FALSE); |
420 | + g_settings_set_boolean (manager->priv->gsd_mouse_settings, KEY_LOCATE_POINTER, FALSE); |
421 | g_error_free (error); |
422 | } |
423 | |
424 | @@ -963,6 +919,22 @@ |
425 | } |
426 | } |
427 | |
428 | +static gboolean |
429 | +get_touchpad_enabled (GsdMouseManager *manager) |
430 | +{ |
431 | + GDesktopDeviceSendEvents send_events; |
432 | + |
433 | + send_events = g_settings_get_enum (manager->priv->touchpad_settings, KEY_SEND_EVENTS); |
434 | + |
435 | + if (send_events == G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE) { |
436 | + /* FIXME: mouse_is_present() also finds internal ones... */ |
437 | + return (!mouse_is_present () && !trackball_is_present ()); |
438 | + |
439 | + } |
440 | + |
441 | + return send_events == G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED ? TRUE : FALSE; |
442 | +} |
443 | + |
444 | static void |
445 | set_mouse_settings (GsdMouseManager *manager, |
446 | GdkDevice *device) |
447 | @@ -974,13 +946,12 @@ |
448 | set_left_handed (manager, device, mouse_left_handed, touchpad_left_handed); |
449 | |
450 | set_motion (manager, device); |
451 | - set_middle_button (manager, device, g_settings_get_boolean (manager->priv->mouse_settings, KEY_MIDDLE_BUTTON_EMULATION)); |
452 | |
453 | set_tap_to_click (device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TAP_TO_CLICK), touchpad_left_handed); |
454 | set_scroll_method (manager, device, g_settings_get_enum (manager->priv->touchpad_settings, KEY_SCROLL_METHOD)); |
455 | - set_horiz_scroll (device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_PAD_HORIZ_SCROLL)); |
456 | + set_horiz_scroll (device, TRUE); |
457 | set_natural_scroll (manager, device, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_NATURAL_SCROLL_ENABLED)); |
458 | - if (g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED) == FALSE) |
459 | + if (!get_touchpad_enabled (manager)) |
460 | set_touchpad_disabled (device); |
461 | } |
462 | |
463 | @@ -1075,11 +1046,8 @@ |
464 | gboolean mouse_left_handed; |
465 | mouse_left_handed = g_settings_get_boolean (settings, KEY_LEFT_HANDED); |
466 | set_left_handed (manager, device, mouse_left_handed, get_touchpad_handedness (manager, mouse_left_handed)); |
467 | - } else if (g_str_equal (key, KEY_MOTION_ACCELERATION) || |
468 | - g_str_equal (key, KEY_MOTION_THRESHOLD)) { |
469 | + } else if (g_str_equal (key, KEY_SPEED)) { |
470 | set_motion (manager, device); |
471 | - } else if (g_str_equal (key, KEY_MIDDLE_BUTTON_EMULATION)) { |
472 | - set_middle_button (manager, device, g_settings_get_boolean (settings, KEY_MIDDLE_BUTTON_EMULATION)); |
473 | } |
474 | } |
475 | g_list_free (devices); |
476 | @@ -1092,11 +1060,6 @@ |
477 | { |
478 | GList *devices, *l; |
479 | |
480 | - if (g_str_equal (key, KEY_TOUCHPAD_DISABLE_W_TYPING)) { |
481 | - set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, key)); |
482 | - return; |
483 | - } |
484 | - |
485 | devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE); |
486 | |
487 | for (l = devices; l != NULL; l = l->next) { |
488 | @@ -1112,16 +1075,13 @@ |
489 | get_touchpad_handedness (manager, mouse_left_handed)); |
490 | } else if (g_str_equal (key, KEY_SCROLL_METHOD)) { |
491 | set_scroll_method (manager, device, g_settings_get_enum (settings, key)); |
492 | - set_horiz_scroll (device, g_settings_get_boolean (settings, KEY_PAD_HORIZ_SCROLL)); |
493 | - } else if (g_str_equal (key, KEY_PAD_HORIZ_SCROLL)) { |
494 | - set_horiz_scroll (device, g_settings_get_boolean (settings, key)); |
495 | - } else if (g_str_equal (key, KEY_TOUCHPAD_ENABLED)) { |
496 | - if (g_settings_get_boolean (settings, key) == FALSE) |
497 | + set_horiz_scroll (device, TRUE); |
498 | + } else if (g_str_equal (key, KEY_SEND_EVENTS)) { |
499 | + if (!get_touchpad_enabled (manager)) |
500 | set_touchpad_disabled (device); |
501 | else |
502 | set_touchpad_enabled (gdk_x11_device_get_id (device)); |
503 | - } else if (g_str_equal (key, KEY_MOTION_ACCELERATION) || |
504 | - g_str_equal (key, KEY_MOTION_THRESHOLD)) { |
505 | + } else if (g_str_equal (key, KEY_SPEED)) { |
506 | set_motion (manager, device); |
507 | } else if (g_str_equal (key, KEY_LEFT_HANDED)) { |
508 | gboolean mouse_left_handed; |
509 | @@ -1133,8 +1093,8 @@ |
510 | } |
511 | g_list_free (devices); |
512 | |
513 | - if (g_str_equal (key, KEY_TOUCHPAD_ENABLED) && |
514 | - g_settings_get_boolean (settings, key)) { |
515 | + if (g_str_equal (key, KEY_SEND_EVENTS) && |
516 | + get_touchpad_enabled (manager)) { |
517 | devices = get_disabled_devices (manager->priv->device_manager); |
518 | for (l = devices; l != NULL; l = l->next) { |
519 | int device_id; |
520 | @@ -1150,8 +1110,34 @@ |
521 | static void |
522 | ensure_touchpad_active (GsdMouseManager *manager) |
523 | { |
524 | - if (mouse_is_present () == FALSE && touchscreen_is_present () == FALSE && trackball_is_present () == FALSE && touchpad_is_present ()) |
525 | - g_settings_set_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED, TRUE); |
526 | + GList *devices, *l; |
527 | + |
528 | + if (get_touchpad_enabled (manager)) { |
529 | + devices = get_disabled_devices (manager->priv->device_manager); |
530 | + for (l = devices; l != NULL; l = l->next) { |
531 | + int device_id; |
532 | + |
533 | + device_id = GPOINTER_TO_INT (l->data); |
534 | + set_touchpad_enabled (device_id); |
535 | + } |
536 | + g_list_free (devices); |
537 | + } else { |
538 | + devices = gdk_device_manager_list_devices (manager->priv->device_manager, |
539 | + GDK_DEVICE_TYPE_SLAVE); |
540 | + |
541 | + for (l = devices; l != NULL; l = l->next) { |
542 | + GdkDevice *device = l->data; |
543 | + |
544 | + if (device_is_ignored (manager, device)) |
545 | + continue; |
546 | + if (gdk_device_get_source (device) != GDK_SOURCE_TOUCHPAD) |
547 | + continue; |
548 | + |
549 | + set_touchpad_disabled (device); |
550 | + } |
551 | + |
552 | + g_list_free (devices); |
553 | + } |
554 | } |
555 | |
556 | static void |
557 | @@ -1170,7 +1156,10 @@ |
558 | } |
559 | |
560 | /* If a touchpad was to appear... */ |
561 | - set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING)); |
562 | + set_disable_w_typing (manager, TRUE); |
563 | + |
564 | + /* If a mouse was to appear... */ |
565 | + ensure_touchpad_active (manager); |
566 | } |
567 | } |
568 | |
569 | @@ -1191,7 +1180,7 @@ |
570 | run_custom_command (device, COMMAND_DEVICE_REMOVED); |
571 | |
572 | /* If a touchpad was to disappear... */ |
573 | - set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING)); |
574 | + set_disable_w_typing (manager, TRUE); |
575 | |
576 | ensure_touchpad_active (manager); |
577 | } |
578 | @@ -1227,25 +1216,29 @@ |
579 | |
580 | set_devicepresence_handler (manager); |
581 | |
582 | - manager->priv->mouse_settings = g_settings_new (SETTINGS_MOUSE_DIR); |
583 | - g_signal_connect (manager->priv->mouse_settings, "changed", |
584 | - G_CALLBACK (mouse_callback), manager); |
585 | + manager->priv->gsd_mouse_settings = g_settings_new (GSD_SETTINGS_MOUSE_SCHEMA); |
586 | + g_signal_connect (manager->priv->gsd_mouse_settings, "changed", |
587 | + G_CALLBACK (mouse_callback), manager); |
588 | |
589 | manager->priv->mouse_a11y_settings = g_settings_new ("org.gnome.desktop.a11y.mouse"); |
590 | g_signal_connect (manager->priv->mouse_a11y_settings, "changed", |
591 | G_CALLBACK (mouse_callback), manager); |
592 | |
593 | - manager->priv->touchpad_settings = g_settings_new (SETTINGS_TOUCHPAD_DIR); |
594 | + manager->priv->mouse_settings = g_settings_new (GSETTINGS_MOUSE_SCHEMA); |
595 | + g_signal_connect (manager->priv->mouse_settings, "changed", |
596 | + G_CALLBACK (mouse_callback), manager); |
597 | + |
598 | + manager->priv->touchpad_settings = g_settings_new (GSETTINGS_TOUCHPAD_SCHEMA); |
599 | g_signal_connect (manager->priv->touchpad_settings, "changed", |
600 | G_CALLBACK (touchpad_callback), manager); |
601 | |
602 | manager->priv->syndaemon_spawned = FALSE; |
603 | |
604 | - set_locate_pointer (manager, g_settings_get_boolean (manager->priv->mouse_settings, KEY_LOCATE_POINTER)); |
605 | + set_locate_pointer (manager, g_settings_get_boolean (manager->priv->gsd_mouse_settings, KEY_LOCATE_POINTER)); |
606 | set_mousetweaks_daemon (manager, |
607 | g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_DWELL_CLICK_ENABLED), |
608 | g_settings_get_boolean (manager->priv->mouse_a11y_settings, KEY_SECONDARY_CLICK_ENABLED)); |
609 | - set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING)); |
610 | + set_disable_w_typing (manager, TRUE); |
611 | |
612 | devices = gdk_device_manager_list_devices (manager->priv->device_manager, GDK_DEVICE_TYPE_SLAVE); |
613 | for (l = devices; l != NULL; l = l->next) { |
614 | @@ -1267,7 +1260,7 @@ |
615 | |
616 | ensure_touchpad_active (manager); |
617 | |
618 | - if (g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED)) { |
619 | + if (get_touchpad_enabled (manager)) { |
620 | devices = get_disabled_devices (manager->priv->device_manager); |
621 | for (l = devices; l != NULL; l = l->next) { |
622 | int device_id; |
623 | @@ -1348,12 +1341,81 @@ |
624 | G_OBJECT_CLASS (gsd_mouse_manager_parent_class)->finalize (object); |
625 | } |
626 | |
627 | +static GVariant * |
628 | +map_speed (GVariant *variant) |
629 | +{ |
630 | + gdouble value; |
631 | + |
632 | + value = g_variant_get_double (variant); |
633 | + |
634 | + /* Remap from [0..10] to [-1..1] */ |
635 | + value = (value / 5) - 1; |
636 | + |
637 | + return g_variant_new_double (value); |
638 | +} |
639 | + |
640 | +static GVariant * |
641 | +map_send_events (GVariant *variant) |
642 | +{ |
643 | + gboolean enabled; |
644 | + |
645 | + enabled = g_variant_get_boolean (variant); |
646 | + |
647 | + if (enabled) { |
648 | + return g_variant_new_string ("enabled"); |
649 | + } else { |
650 | + return g_variant_new_string ("disabled"); |
651 | + } |
652 | +} |
653 | + |
654 | +static void |
655 | +migrate_mouse_settings (void) |
656 | +{ |
657 | + GsdSettingsMigrateEntry trackball_entries[] = { |
658 | + { "scroll-wheel-emulation-button", "scroll-wheel-emulation-button", NULL } |
659 | + }; |
660 | + GsdSettingsMigrateEntry mouse_entries[] = { |
661 | + { "left-handed", "left-handed", NULL }, |
662 | + { "motion-acceleration", "speed", map_speed }, |
663 | + { "motion-threshold", NULL, NULL }, |
664 | + { "middle-button-enabled", NULL, NULL }, |
665 | + }; |
666 | + GsdSettingsMigrateEntry touchpad_entries[] = { |
667 | + { "disable-while-typing", NULL, NULL }, |
668 | + { "horiz-scroll-enabled", NULL, NULL }, |
669 | + { "scroll-method", "scroll-method", NULL }, |
670 | + { "tap-to-click", "tap-to-click", NULL }, |
671 | + { "touchpad-enabled", "send-events", map_send_events }, |
672 | + { "left-handed", "left-handed", NULL }, |
673 | + { "motion-acceleration", "speed", map_speed }, |
674 | + { "motion-threshold", NULL, NULL }, |
675 | + { "natural-scroll", "natural-scroll", NULL } |
676 | + }; |
677 | + |
678 | + gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.trackball.deprecated", |
679 | + "/org/gnome/settings-daemon/peripherals/trackball/", |
680 | + "org.gnome.desktop.peripherals.trackball", |
681 | + "/org/gnome/desktop/peripherals/trackball/", |
682 | + trackball_entries, G_N_ELEMENTS (trackball_entries)); |
683 | + gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.mouse.deprecated", |
684 | + "/org/gnome/settings-daemon/peripherals/mouse/", |
685 | + "org.gnome.desktop.peripherals.mouse", |
686 | + "/org/gnome/desktop/peripherals/mouse/", |
687 | + mouse_entries, G_N_ELEMENTS (mouse_entries)); |
688 | + gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.touchpad.deprecated", |
689 | + "/org/gnome/settings-daemon/peripherals/touchpad/", |
690 | + "org.gnome.desktop.peripherals.touchpad", |
691 | + "/org/gnome/desktop/peripherals/touchpad/", |
692 | + touchpad_entries, G_N_ELEMENTS (touchpad_entries)); |
693 | +} |
694 | + |
695 | GsdMouseManager * |
696 | gsd_mouse_manager_new (void) |
697 | { |
698 | if (manager_object != NULL) { |
699 | g_object_ref (manager_object); |
700 | } else { |
701 | + migrate_mouse_settings (); |
702 | manager_object = g_object_new (GSD_TYPE_MOUSE_MANAGER, NULL); |
703 | g_object_add_weak_pointer (manager_object, |
704 | (gpointer *) &manager_object); |