~ubuntu-branches/ubuntu/trusty/xfce4-settings/trusty-proposed

« back to all changes in this revision

Viewing changes to debian/patches/xubuntu_improved-mouse-touchpad-dialog.patch

  • Committer: Package Import Robot
  • Author(s): Lionel Le Folgoc
  • Date: 2012-01-23 21:10:18 UTC
  • Revision ID: package-import@ubuntu.com-20120123211018-g3wszngv4plljt2p
Tags: 4.8.3-1ubuntu1
* debian/control: add xfce4-dev-tools, autoconf, automake and libtool
  to build-depends, needed for xdt-autogen, and exo-utils, needed for
  exo-csource.
* debian/rules: run xdt-autogen before configure, and clean up autogenerated
  files after build.
* debian/patches:
  - xubuntu_improved-mouse-touchpad-dialog.patch: added, backport the new
    pointing device dialog from master. lp: #818131
  - xubuntu_refreshed-translations.patch: added, new translations taken
    from master.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Description: backport improved xfce4-mouse-settings from xfce4-settings 4.9
 
2
 Based on the following upstream commits:
 
3
  * 228f13c1e9e61823a431f71535c71bc0d26f3707
 
4
  * 95ee98c7055528a040cd71423389f98b4796d663
 
5
  * 3ec7f9549d13db43eb0b31f93393bae16e5be516
 
6
  * 6fd444dd84dba1144007ee400833ca4f22ce2325
 
7
  * ad3c6becb24551b84c2187f456fa83dd03784b37
 
8
  * 137bdd61bd1a9627555b5f3419cc103765851db6
 
9
  * 0f090871581038cd5251c8e29fa0067d9a89f4e0
 
10
  * 0745b21da4211d0b3fc784f4fce2dc1049ba0777
 
11
  * 9b46d93374bc6af5095be54c36053946584da1f7
 
12
  * db91dbda5fbbe21206f68fc09b3956982e907a48
 
13
  * 5a5a2fcc4c5e76322925fbab0f6a0e8f73f79648
 
14
  * 171bf0e20b75ae4578e55c5540459cfdeaef14d8
 
15
 
 
16
Author: Lionel Le Folgoc <mrpouit@ubuntu.com>
 
17
Forwarded: not-needed
 
18
Last-Update: 2012-01-23
 
19
 
 
20
--- xfce4-settings-4.8.3.orig/configure.ac
 
21
+++ xfce4-settings-4.8.3/configure.ac
 
22
@@ -68,7 +68,7 @@ AC_PROG_LIBTOOL()
 
23
 dnl **********************************
 
24
 dnl *** Check for standard headers ***
 
25
 dnl **********************************
 
26
-AC_CHECK_HEADERS([errno.h memory.h math.h stdlib.h string.h unistd.h signal.h])
 
27
+AC_CHECK_HEADERS([errno.h memory.h math.h stdlib.h string.h unistd.h signal.h sys/types.h])
 
28
 
 
29
 dnl ******************************
 
30
 dnl *** Check for i18n support ***
 
31
@@ -79,8 +79,8 @@ dnl ***********************************
 
32
 dnl *** Check for required packages ***
 
33
 dnl ***********************************
 
34
 XDT_CHECK_PACKAGE([EXO], [exo-1], [0.6.0])
 
35
-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
 
36
-XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0])
 
37
+XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.20.0])
 
38
+XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0])
 
39
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.8.0])
 
40
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.8.0])
 
41
 XDT_CHECK_PACKAGE([LIBXFCE4KBD_PRIVATE], [libxfce4kbd-private-2], [4.8.0])
 
42
--- xfce4-settings-4.8.3.orig/xfce4-settings-helper/pointers.c
 
43
+++ xfce4-settings-4.8.3/xfce4-settings-helper/pointers.c
 
44
@@ -1,6 +1,5 @@
 
45
-/* $Id$ */
 
46
 /*
 
47
- *  Copyright (c) 2008 Nick Schermer <nick@xfce.org>
 
48
+ *  Copyright (c) 2008-2011 Nick Schermer <nick@xfce.org>
 
49
  *
 
50
  *  This program is free software; you can redistribute it and/or modify
 
51
  *  it under the terms of the GNU General Public License as published by
 
52
@@ -21,11 +20,19 @@
 
53
 #include <config.h>
 
54
 #endif
 
55
 
 
56
+#ifdef HAVE_SYS_TYPES_H
 
57
+#include <sys/types.h>
 
58
+#endif
 
59
+#ifdef HAVE_SIGNAL_H
 
60
+#include <signal.h>
 
61
+#endif
 
62
 #ifdef HAVE_STRING_H
 
63
 #include <string.h>
 
64
 #endif
 
65
 
 
66
+
 
67
 #include <X11/Xlib.h>
 
68
+#include <X11/Xatom.h>
 
69
 #include <X11/extensions/XI.h>
 
70
 #include <X11/extensions/XInput.h>
 
71
 #include <X11/extensions/XIproto.h>
 
72
@@ -36,12 +43,16 @@
 
73
 #include <xfconf/xfconf.h>
 
74
 #include <libxfce4util/libxfce4util.h>
 
75
 
 
76
+#include <dbus/dbus-glib.h>
 
77
+
 
78
 #include "pointers.h"
 
79
 
 
80
 
 
81
 
 
82
 #define MAX_DENOMINATOR (100.00)
 
83
 
 
84
+#define XFCONF_TYPE_G_VALUE_ARRAY (dbus_g_type_get_collection ("GPtrArray", G_TYPE_VALUE))
 
85
+
 
86
 /* Xi 1.4 is required */
 
87
 #define MIN_XI_VERS_MAJOR 1
 
88
 #define MIN_XI_VERS_MINOR 4
 
89
@@ -58,32 +69,19 @@
 
90
 
 
91
 
 
92
 
 
93
-static void             xfce_pointers_helper_change_button_mapping_swap     (guchar                  *buttonmap,
 
94
-                                                                             gshort                   num_buttons,
 
95
-                                                                             gint                     id_1,
 
96
-                                                                             gint                     id_2,
 
97
-                                                                             gboolean                 reverse);
 
98
-static void             xfce_pointers_helper_change_button_mapping          (XDeviceInfo             *device_info,
 
99
-                                                                             XDevice                 *device,
 
100
-                                                                             Display                 *xdisplay,
 
101
-                                                                             gint                     right_handed,
 
102
-                                                                             gint                     reverse_scrolling);
 
103
-static gint             xfce_pointers_helper_gcd                            (gint                     num,
 
104
-                                                                             gint                     denom);
 
105
-static void             xfce_pointers_helper_change_feedback                (XDevice                 *device,
 
106
-                                                                             Display                 *xdisplay,
 
107
-                                                                             gint                     threshold,
 
108
-                                                                             gdouble                  acceleration);
 
109
-static gchar           *xfce_pointers_helper_device_xfconf_name             (const gchar             *name);
 
110
-static void             xfce_pointers_helper_restore_devices                (XfcePointersHelper      *helper,
 
111
-                                                                             XID                     *xid);
 
112
-static void             xfce_pointers_helper_channel_property_changed       (XfconfChannel           *channel,
 
113
-                                                                             const gchar             *property_name,
 
114
-                                                                             const GValue            *value);
 
115
+static void             xfce_pointers_helper_finalize                 (GObject            *object);
 
116
+static void             xfce_pointers_helper_syndaemon_stop           (XfcePointersHelper *helper);
 
117
+static void             xfce_pointers_helper_syndaemon_check          (XfcePointersHelper *helper);
 
118
+static void             xfce_pointers_helper_restore_devices          (XfcePointersHelper *helper,
 
119
+                                                                       XID                *xid);
 
120
+static void             xfce_pointers_helper_channel_property_changed (XfconfChannel      *channel,
 
121
+                                                                       const gchar        *property_name,
 
122
+                                                                       const GValue       *value,
 
123
+                                                                       XfcePointersHelper *helper);
 
124
 #ifdef HAS_DEVICE_HOTPLUGGING
 
125
-static GdkFilterReturn  xfce_pointers_helper_event_filter                   (GdkXEvent               *xevent,
 
126
-                                                                             GdkEvent                *gdk_event,
 
127
-                                                                             gpointer                 user_data);
 
128
+static GdkFilterReturn  xfce_pointers_helper_event_filter             (GdkXEvent          *xevent,
 
129
+                                                                       GdkEvent           *gdk_event,
 
130
+                                                                       gpointer            user_data);
 
131
 #endif
 
132
 
 
133
 
 
134
@@ -100,12 +98,23 @@ struct _XfcePointersHelper
 
135
     /* xfconf channel */
 
136
     XfconfChannel *channel;
 
137
 
 
138
+    GPid           syndaemon_pid;
 
139
+
 
140
 #ifdef HAS_DEVICE_HOTPLUGGING
 
141
     /* device presence event type */
 
142
     gint           device_presence_event_type;
 
143
 #endif
 
144
 };
 
145
 
 
146
+typedef struct
 
147
+{
 
148
+    Display     *xdisplay;
 
149
+    XDevice     *device;
 
150
+    XDeviceInfo *device_info;
 
151
+    gsize        prop_name_len;
 
152
+}
 
153
+XfcePointerData;
 
154
+
 
155
 
 
156
 
 
157
 G_DEFINE_TYPE (XfcePointersHelper, xfce_pointers_helper, G_TYPE_OBJECT);
 
158
@@ -115,7 +124,9 @@ G_DEFINE_TYPE (XfcePointersHelper, xfce_
 
159
 static void
 
160
 xfce_pointers_helper_class_init (XfcePointersHelperClass *klass)
 
161
 {
 
162
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
163
 
 
164
+    gobject_class->finalize = xfce_pointers_helper_finalize;
 
165
 }
 
166
 
 
167
 
 
168
@@ -129,6 +140,8 @@ xfce_pointers_helper_init (XfcePointersH
 
169
     XEventClass        event_class;
 
170
 #endif
 
171
 
 
172
+    helper->syndaemon_pid = 0;
 
173
+
 
174
     /* get the default display */
 
175
     xdisplay = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
 
176
 
 
177
@@ -157,27 +170,26 @@ xfce_pointers_helper_init (XfcePointersH
 
178
         xfce_pointers_helper_restore_devices (helper, NULL);
 
179
 
 
180
         /* monitor the channel */
 
181
-        g_signal_connect (G_OBJECT (helper->channel), "property-changed", G_CALLBACK (xfce_pointers_helper_channel_property_changed), NULL);
 
182
-
 
183
-#ifdef HAS_DEVICE_HOTPLUGGING
 
184
-        /* flush x and trap errors */
 
185
-        gdk_flush ();
 
186
-        gdk_error_trap_push ();
 
187
+        g_signal_connect (G_OBJECT (helper->channel), "property-changed",
 
188
+             G_CALLBACK (xfce_pointers_helper_channel_property_changed), helper);
 
189
 
 
190
+        /* launch syndaemon if required */
 
191
+        xfce_pointers_helper_syndaemon_check (helper);
 
192
 
 
193
-        if (G_LIKELY (xdisplay))
 
194
+#ifdef HAS_DEVICE_HOTPLUGGING
 
195
+        if (G_LIKELY (xdisplay != NULL))
 
196
         {
 
197
             /* monitor device changes */
 
198
+            gdk_error_trap_push ();
 
199
             DevicePresence (xdisplay, helper->device_presence_event_type, event_class);
 
200
             XSelectExtensionEvent (xdisplay, RootWindow (xdisplay, DefaultScreen (xdisplay)), &event_class, 1);
 
201
 
 
202
             /* add an event filter */
 
203
-            gdk_window_add_filter (NULL, xfce_pointers_helper_event_filter, helper);
 
204
+            if (gdk_error_trap_pop () == 0)
 
205
+                gdk_window_add_filter (NULL, xfce_pointers_helper_event_filter, helper);
 
206
+            else
 
207
+                g_warning ("Failed to create device filter");
 
208
         }
 
209
-
 
210
-        /* flush and remove the x error trap */
 
211
-        gdk_flush ();
 
212
-        gdk_error_trap_pop ();
 
213
 #endif
 
214
     }
 
215
 }
 
216
@@ -185,18 +197,125 @@ xfce_pointers_helper_init (XfcePointersH
 
217
 
 
218
 
 
219
 static void
 
220
+xfce_pointers_helper_finalize (GObject *object)
 
221
+{
 
222
+    xfce_pointers_helper_syndaemon_stop (XFCE_POINTERS_HELPER (object));
 
223
+
 
224
+    (*G_OBJECT_CLASS (xfce_pointers_helper_parent_class)->finalize) (object);
 
225
+}
 
226
+
 
227
+
 
228
+
 
229
+static void
 
230
+xfce_pointers_helper_syndaemon_stop (XfcePointersHelper *helper)
 
231
+{
 
232
+    if (helper->syndaemon_pid != 0)
 
233
+    {
 
234
+        kill (helper->syndaemon_pid, SIGHUP);
 
235
+        g_spawn_close_pid (helper->syndaemon_pid);
 
236
+        helper->syndaemon_pid = 0;
 
237
+    }
 
238
+}
 
239
+
 
240
+
 
241
+
 
242
+static void
 
243
+xfce_pointers_helper_syndaemon_check (XfcePointersHelper *helper)
 
244
+{
 
245
+    Display     *xdisplay = GDK_DISPLAY ();
 
246
+    XDeviceInfo *device_list;
 
247
+    XDevice     *device;
 
248
+    gint         n, ndevices;
 
249
+    Atom         touchpad_type;
 
250
+    Atom         touchpad_off_prop;
 
251
+    Atom        *props;
 
252
+    gint         i, nprops;
 
253
+    gboolean     have_synaptics = FALSE;
 
254
+    gchar       *args[] = { "syndaemon", "-i", "2.0", "-K", "-R", NULL };
 
255
+    GError      *error = NULL;
 
256
+
 
257
+    /* only stop a running daemon */
 
258
+    if (!xfconf_channel_get_bool (helper->channel, "/DisableTouchpadWhileTyping", FALSE))
 
259
+        goto start_stop_daemon;
 
260
+
 
261
+    gdk_error_trap_push ();
 
262
+    device_list = XListInputDevices (xdisplay, &ndevices);
 
263
+    if (gdk_error_trap_pop () != 0 || device_list == NULL)
 
264
+        goto start_stop_daemon;
 
265
+
 
266
+    touchpad_type = XInternAtom (xdisplay, XI_TOUCHPAD, True);
 
267
+    touchpad_off_prop = XInternAtom (xdisplay, "Synaptics Off", True);
 
268
+
 
269
+    for (n = 0; n < ndevices; n++)
 
270
+    {
 
271
+        /* search for a touchpad */
 
272
+        if (device_list[n].type != touchpad_type)
 
273
+            continue;
 
274
+
 
275
+        gdk_error_trap_push ();
 
276
+        device = XOpenDevice (xdisplay, device_list[n].id);
 
277
+        if (gdk_error_trap_pop () != 0 || device == NULL)
 
278
+        {
 
279
+            g_critical ("Unable to open device %s", device_list[n].name);
 
280
+            break;
 
281
+        }
 
282
+
 
283
+        /* look for the Synaptics Off property */
 
284
+        gdk_error_trap_push ();
 
285
+        props = XListDeviceProperties (xdisplay, device, &nprops);
 
286
+        if (gdk_error_trap_pop () == 0
 
287
+            && props != NULL)
 
288
+        {
 
289
+            for (i = 0; !have_synaptics && i < nprops; i++)
 
290
+                have_synaptics = props[i] == touchpad_off_prop;
 
291
+
 
292
+            XFree (props);
 
293
+        }
 
294
+
 
295
+        XCloseDevice (xdisplay, device);
 
296
+
 
297
+        if (have_synaptics)
 
298
+            break;
 
299
+    }
 
300
+
 
301
+    XFreeDeviceList (device_list);
 
302
+
 
303
+    start_stop_daemon:
 
304
+
 
305
+    if (have_synaptics)
 
306
+    {
 
307
+        if (helper->syndaemon_pid == 0)
 
308
+        {
 
309
+            if (!g_spawn_async (NULL, args, NULL, G_SPAWN_SEARCH_PATH,
 
310
+                                NULL, NULL, &helper->syndaemon_pid, &error))
 
311
+            {
 
312
+                g_critical ("Spawning syndaemon failed: %s", error->message);
 
313
+                g_error_free (error);
 
314
+            }
 
315
+        }
 
316
+    }
 
317
+    else
 
318
+    {
 
319
+        /* stop the daemon */
 
320
+        xfce_pointers_helper_syndaemon_stop (helper);
 
321
+    }
 
322
+}
 
323
+
 
324
+
 
325
+
 
326
+static gboolean
 
327
 xfce_pointers_helper_change_button_mapping_swap (guchar   *buttonmap,
 
328
                                                  gshort    num_buttons,
 
329
                                                  gint      id_1,
 
330
                                                  gint      id_2,
 
331
                                                  gboolean  reverse)
 
332
 {
 
333
-    gint n;
 
334
-    gint id_a;
 
335
-    gint id_b;
 
336
+    gshort n;
 
337
+    gint   id_a = -1;
 
338
+    gint   id_b = -1;
 
339
 
 
340
     /* figure out the position of the id_1 and id_2 buttons in the map */
 
341
-    for (n = 0, id_a = id_b = -1; n < num_buttons; n++)
 
342
+    for (n = 0; n < num_buttons; n++)
 
343
     {
 
344
         if (buttonmap[n] == id_1)
 
345
             id_a = n;
 
346
@@ -208,13 +327,18 @@ xfce_pointers_helper_change_button_mappi
 
347
     if (G_LIKELY (id_a != -1 && id_b != -1))
 
348
     {
 
349
         /* check if we need to change the buttonmap */
 
350
-        if ((!reverse && (id_a < id_b)) || (reverse && (id_a > id_b)))
 
351
+        if ((!reverse && (id_a < id_b))
 
352
+            || (reverse && (id_a > id_b)))
 
353
         {
 
354
             /* swap the buttons in the button map */
 
355
             buttonmap[id_a] = id_2;
 
356
             buttonmap[id_b] = id_1;
 
357
+
 
358
+            return TRUE;
 
359
         }
 
360
     }
 
361
+
 
362
+    return FALSE;
 
363
 }
 
364
 
 
365
 
 
366
@@ -227,24 +351,18 @@ xfce_pointers_helper_change_button_mappi
 
367
                                             gint         reverse_scrolling)
 
368
 {
 
369
     XAnyClassPtr  ptr;
 
370
-    gshort        num_buttons;
 
371
+    gshort        num_buttons = 0;
 
372
     guchar       *buttonmap;
 
373
+    gboolean      map_changed = FALSE;
 
374
     gint          n;
 
375
     gint          right_button;
 
376
 
 
377
-    /* get the device classes */
 
378
-    ptr = device_info->inputclassinfo;
 
379
-
 
380
-    /* search the classes for the number of buttons */
 
381
-    for (n = 0, num_buttons = 0; n < device_info->num_classes; n++)
 
382
+    /* search the number of buttons */
 
383
+    for (n = 0, ptr = device_info->inputclassinfo; n < device_info->num_classes; n++)
 
384
     {
 
385
-        /* find the button class */
 
386
         if (ptr->class == ButtonClass)
 
387
         {
 
388
-            /* get the number of buttons */
 
389
             num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
 
390
-
 
391
-            /* done */
 
392
             break;
 
393
         }
 
394
 
 
395
@@ -252,44 +370,60 @@ xfce_pointers_helper_change_button_mappi
 
396
         ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
 
397
     }
 
398
 
 
399
-    if (G_LIKELY (num_buttons > 0))
 
400
+    if (num_buttons == 0)
 
401
     {
 
402
-        /* allocate the button map */
 
403
-        buttonmap = g_new0 (guchar, num_buttons);
 
404
+        g_critical ("Device %s has no buttons", device_info->name);
 
405
+        return;
 
406
+    }
 
407
 
 
408
-        /* get the button mapping */
 
409
-        gdk_error_trap_push ();
 
410
-        XGetDeviceButtonMapping (xdisplay, device, buttonmap, num_buttons);
 
411
-        if (gdk_error_trap_pop ())
 
412
-        {
 
413
-            g_warning ("Failed to get button mapping");
 
414
-            goto out;
 
415
-        }
 
416
+    /* allocate the button map */
 
417
+    buttonmap = g_new0 (guchar, num_buttons);
 
418
 
 
419
-        if (right_handed != -1)
 
420
-        {
 
421
-            /* get the right button number */
 
422
-            right_button = MIN (num_buttons, 3);
 
423
+    gdk_error_trap_push ();
 
424
+    XGetDeviceButtonMapping (xdisplay, device, buttonmap, num_buttons);
 
425
+    if (gdk_error_trap_pop () != 0)
 
426
+    {
 
427
+        g_warning ("Failed to get button mapping");
 
428
+        goto leave;
 
429
+    }
 
430
 
 
431
-            /* check the buttons and swap them if needed */
 
432
-            xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons, 1, right_button, right_handed);
 
433
-        }
 
434
+    /* -1 means we don't change this in the mapping */
 
435
+    if (right_handed != -1)
 
436
+    {
 
437
+        /* get the right button number */
 
438
+        right_button = MIN (num_buttons, 3);
 
439
 
 
440
-        if (reverse_scrolling != -1 && num_buttons >= 5)
 
441
-        {
 
442
-            /* check the buttons and swap them if needed */
 
443
-            xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons, 4, 5, !reverse_scrolling);
 
444
-        }
 
445
+        /* check the buttons and swap them if needed */
 
446
+        if (xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons,
 
447
+                                                             1 /* left button */,
 
448
+                                                             right_button,
 
449
+                                                             right_handed))
 
450
+            map_changed = TRUE;
 
451
+    }
 
452
+
 
453
+    /* -1 means we don't change this in the mapping */
 
454
+    if (reverse_scrolling != -1 && num_buttons >= 5)
 
455
+    {
 
456
+        /* check the buttons and swap them if needed */
 
457
+        if (xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons,
 
458
+                                                             4 /* scroll up */,
 
459
+                                                             5 /* scroll down */,
 
460
+                                                             !reverse_scrolling))
 
461
+            map_changed = TRUE;
 
462
+    }
 
463
 
 
464
-        /* set the new button mapping */
 
465
+    /* only set on changes */
 
466
+    if (map_changed)
 
467
+    {
 
468
         gdk_error_trap_push ();
 
469
         XSetDeviceButtonMapping (xdisplay, device, buttonmap, num_buttons);
 
470
-        if (gdk_error_trap_pop ())
 
471
-          g_warning ("Failed to set button mapping");
 
472
-
 
473
-        /* cleanup */
 
474
-out:    g_free (buttonmap);
 
475
+        if (gdk_error_trap_pop () != 0)
 
476
+            g_warning ("Failed to set button mapping");
 
477
     }
 
478
+
 
479
+    leave:
 
480
+
 
481
+    g_free (buttonmap);
 
482
 }
 
483
 
 
484
 
 
485
@@ -305,71 +439,128 @@ xfce_pointers_helper_gcd (gint num,
 
486
 
 
487
 
 
488
 static void
 
489
-xfce_pointers_helper_change_feedback (XDevice *device,
 
490
-                                      Display *xdisplay,
 
491
-                                      gint     threshold,
 
492
-                                      gdouble  acceleration)
 
493
+xfce_pointers_helper_change_feedback (XDeviceInfo *device_info,
 
494
+                                      XDevice     *device,
 
495
+                                      Display     *xdisplay,
 
496
+                                      gint         threshold,
 
497
+                                      gdouble      acceleration)
 
498
 {
 
499
     XFeedbackState      *states, *pt;
 
500
     gint                 num_feedbacks;
 
501
     XPtrFeedbackControl  feedback;
 
502
     gint                 n;
 
503
     gulong               mask = 0;
 
504
-    gint                 num = -1, denom = -1, gcd;
 
505
+    gint                 num, denom, gcd;
 
506
+    gboolean             found = FALSE;
 
507
 
 
508
     /* get the feedback states for this device */
 
509
+    gdk_error_trap_push ();
 
510
     states = XGetFeedbackControl (xdisplay, device, &num_feedbacks);
 
511
+    if (gdk_error_trap_pop() != 0 || states == NULL)
 
512
+    {
 
513
+        g_critical ("Failed to get the feedback states of device %s",
 
514
+                    device_info->name);
 
515
+        return;
 
516
+    }
 
517
 
 
518
-    if (G_LIKELY (states))
 
519
+    for (pt = states, n = 0; n < num_feedbacks; n++)
 
520
     {
 
521
-        /* get the pointer feedback class */
 
522
-        for (pt = states, n = 0; n < num_feedbacks; n++)
 
523
+        /* find the pointer feedback class */
 
524
+        if (pt->class != PtrFeedbackClass)
 
525
         {
 
526
-            /* find the pointer feedback class */
 
527
-            if (pt->class == PtrFeedbackClass)
 
528
-            {
 
529
-                if (acceleration > 0 || acceleration == -1)
 
530
-                {
 
531
-                    if (acceleration > 0)
 
532
-                    {
 
533
-                        /* calculate the faction of the acceleration */
 
534
-                        num = acceleration * MAX_DENOMINATOR;
 
535
-                        denom = MAX_DENOMINATOR;
 
536
-                        gcd = xfce_pointers_helper_gcd (num, denom);
 
537
-                        num /= gcd;
 
538
-                        denom /= gcd;
 
539
-                    }
 
540
+            /* advance the offset */
 
541
+            pt = (XFeedbackState *) ((gchar *) pt + pt->length);
 
542
+            continue;
 
543
+        }
 
544
 
 
545
-                    /* set the mask */
 
546
-                    mask |= DvAccelNum | DvAccelDenom;
 
547
-                }
 
548
+        /* initialize the feedback, -1 for reset if the
 
549
+         * mask matches in XChangeFeedbackControl */
 
550
+        feedback.class = PtrFeedbackClass;
 
551
+        feedback.length = sizeof (XPtrFeedbackControl);
 
552
+        feedback.id = pt->id;
 
553
+        feedback.threshold = -1;
 
554
+        feedback.accelNum = -1;
 
555
+        feedback.accelDenom = -1;
 
556
+
 
557
+        found = TRUE;
 
558
+
 
559
+        /* above 0 is a valid value, -1 is reset, -2.00
 
560
+         * is passed if no change is required */
 
561
+        if (acceleration > 0 || acceleration == -1)
 
562
+        {
 
563
+            if (acceleration > 0)
 
564
+            {
 
565
+                /* calculate the faction of the acceleration */
 
566
+                num = acceleration * MAX_DENOMINATOR;
 
567
+                denom = MAX_DENOMINATOR;
 
568
+                gcd = xfce_pointers_helper_gcd (num, denom);
 
569
+                num /= gcd;
 
570
+                denom /= gcd;
 
571
 
 
572
-                /* setup the mask for the threshold */
 
573
-                if (threshold > 0 || threshold == -1)
 
574
-                    mask |= DvThreshold;
 
575
-
 
576
-                /* create a new feedback */
 
577
-                feedback.class      = PtrFeedbackClass;
 
578
-                feedback.length     = sizeof (XPtrFeedbackControl);
 
579
-                feedback.id         = pt->id;
 
580
-                feedback.threshold  = threshold;
 
581
-                feedback.accelNum   = num;
 
582
+                feedback.accelNum = num;
 
583
                 feedback.accelDenom = denom;
 
584
+            }
 
585
 
 
586
-                /* change feedback for this device */
 
587
-                XChangeFeedbackControl (xdisplay, device, mask, (XFeedbackControl *)(void *)&feedback);
 
588
+            /* include acceleration in the mask */
 
589
+            mask |= DvAccelNum | DvAccelDenom;
 
590
+        }
 
591
 
 
592
-                /* done */
 
593
-                break;
 
594
-            }
 
595
+        /* above 0 is a valid value, -1 is reset, -2 is
 
596
+         * passed if no change is required */
 
597
+        if (threshold > 0 || threshold == -1)
 
598
+        {
 
599
+            if (threshold > 0)
 
600
+                feedback.threshold = threshold;
 
601
 
 
602
-            /* advance the offset */
 
603
-            pt = (XFeedbackState *) ((gchar *) pt + pt->length);
 
604
+            mask |= DvThreshold;
 
605
         }
 
606
 
 
607
-        /* cleanup */
 
608
-        XFreeFeedbackList (states);
 
609
+        /* update the feedback of the device */
 
610
+        gdk_error_trap_push ();
 
611
+        XChangeFeedbackControl (xdisplay, device, mask,
 
612
+                                (XFeedbackControl *) &feedback);
 
613
+        if (gdk_error_trap_pop() != 0)
 
614
+        {
 
615
+            g_warning ("Failed to set feedback states for device %s",
 
616
+                       device_info->name);
 
617
+        }
 
618
+
 
619
+        break;
 
620
+    }
 
621
+
 
622
+    if (!found)
 
623
+    {
 
624
+        g_critical ("Unable to find PtrFeedbackClass for %s",
 
625
+                    device_info->name);
 
626
+    }
 
627
+
 
628
+    XFreeFeedbackList (states);
 
629
+}
 
630
+
 
631
+
 
632
+
 
633
+static void
 
634
+xfce_pointers_helper_change_mode (XDeviceInfo  *device_info,
 
635
+                                  XDevice      *device,
 
636
+                                  Display      *xdisplay,
 
637
+                                  const gchar  *mode_name)
 
638
+{
 
639
+    gint mode;
 
640
+
 
641
+    if (strcmp (mode_name, "RELATIVE") == 0)
 
642
+        mode = Relative;
 
643
+    else if (strcmp (mode_name, "ABSOLUTE") == 0)
 
644
+        mode = Absolute;
 
645
+    else
 
646
+    {
 
647
+        g_warning ("Unknown device mode %s, only RELATIVE and ABSOLUTE are valid", mode_name);
 
648
+        return;
 
649
     }
 
650
+
 
651
+    gdk_error_trap_push ();
 
652
+    XSetDeviceMode (xdisplay, device, mode);
 
653
+    if (gdk_error_trap_pop () != 0)
 
654
+        g_critical ("Failed to change the device mode");
 
655
 }
 
656
 
 
657
 
 
658
@@ -393,9 +584,13 @@ xfce_pointers_helper_device_xfconf_name
 
659
             || (*p >= 'a' && *p <= 'z')
 
660
             || (*p >= '0' && *p <= '9')
 
661
             || *p == '_' || *p == '-')
 
662
-          g_string_append_c (string, *p);
 
663
+        {
 
664
+            g_string_append_c (string, *p);
 
665
+        }
 
666
         else if (*p == ' ')
 
667
+        {
 
668
             string = g_string_append_c (string, '_');
 
669
+        }
 
670
     }
 
671
 
 
672
     /* return the new string */
 
673
@@ -405,96 +600,284 @@ xfce_pointers_helper_device_xfconf_name
 
674
 
 
675
 
 
676
 static void
 
677
+xfce_pointers_helper_change_property (XDeviceInfo  *device_info,
 
678
+                                      XDevice      *device,
 
679
+                                      Display      *xdisplay,
 
680
+                                      const gchar  *prop_name,
 
681
+                                      const GValue *value)
 
682
+{
 
683
+    Atom         *props;
 
684
+    gint          n, n_props;
 
685
+    Atom          prop;
 
686
+    gchar        *atom_name;
 
687
+    Atom          type;
 
688
+    gint          format;
 
689
+    gulong        n_items, bytes_after, i;
 
690
+    gulong        n_succeeds;
 
691
+    Atom          float_atom;
 
692
+    GPtrArray    *array = NULL;
 
693
+    const GValue *val;
 
694
+    union {
 
695
+        guchar *c;
 
696
+        gshort *s;
 
697
+        glong  *l;
 
698
+        Atom   *a;
 
699
+    } data;
 
700
+
 
701
+    /* assuming the device property never contained underscores... */
 
702
+    atom_name = g_strdup (prop_name);
 
703
+    g_strdelimit (atom_name, "_", ' ');
 
704
+    prop = XInternAtom (xdisplay, atom_name, True);
 
705
+    g_free (atom_name);
 
706
+
 
707
+    /* because of the True in XInternAtom we quit here if the property
 
708
+     * does not exists on any of the devices */
 
709
+    if (prop == None)
 
710
+        return;
 
711
+
 
712
+    gdk_error_trap_push ();
 
713
+    props = XListDeviceProperties (xdisplay, device, &n_props);
 
714
+    if (gdk_error_trap_pop () != 0 || props == NULL)
 
715
+        return;
 
716
+
 
717
+    float_atom = XInternAtom (xdisplay, "FLOAT", False);
 
718
+
 
719
+    for (n = 0; n < n_props; n++)
 
720
+    {
 
721
+        /* find the matching property */
 
722
+        if (props[n] != prop)
 
723
+            continue;
 
724
+
 
725
+        if (XGetDeviceProperty (xdisplay, device, prop, 0, 1000, False,
 
726
+                                AnyPropertyType, &type, &format,
 
727
+                                &n_items, &bytes_after, &data.c) == Success)
 
728
+        {
 
729
+            if (n_items == 1
 
730
+                && (G_VALUE_HOLDS_INT (value)
 
731
+                    || G_VALUE_HOLDS_STRING (value)
 
732
+                    || G_VALUE_HOLDS_DOUBLE (value)))
 
733
+            {
 
734
+                /* only 1 items to set */
 
735
+                val = value;
 
736
+            }
 
737
+            else if (G_VALUE_TYPE (value) == XFCONF_TYPE_G_VALUE_ARRAY)
 
738
+            {
 
739
+                array = g_value_get_boxed (value);
 
740
+                if (array->len != n_items)
 
741
+                {
 
742
+                    g_critical ("Nr device property items (%ld) and xfconf value (%d) differ",
 
743
+                                n_items, array->len);
 
744
+                    break;
 
745
+                }
 
746
+            }
 
747
+            else
 
748
+            {
 
749
+                g_critical ("Invalid device property combination");
 
750
+                break;
 
751
+            }
 
752
+
 
753
+            /* reset check counter */
 
754
+            n_succeeds = 0;
 
755
+
 
756
+            for (i = 0; i < n_items; i++)
 
757
+            {
 
758
+                /* get value from pointer array */
 
759
+                if (array != NULL)
 
760
+                    val = g_ptr_array_index (array, i);
 
761
+                else
 
762
+                    val = value;
 
763
+
 
764
+                if (G_VALUE_HOLDS_INT (val)
 
765
+                    && type == XA_INTEGER)
 
766
+                {
 
767
+                    if (format == 8)
 
768
+                        data.c[i] = g_value_get_int (val);
 
769
+                    else if (format == 16)
 
770
+                        data.s[i] = g_value_get_int (val);
 
771
+                    else if (format == 32)
 
772
+                        data.l[i] = g_value_get_int (val);
 
773
+                    else
 
774
+                    {
 
775
+                        g_critical ("Unknown format %d for integer", format);
 
776
+                        break;
 
777
+                    }
 
778
+                }
 
779
+                else if (G_VALUE_HOLDS_STRING (val)
 
780
+                         && type == XA_ATOM
 
781
+                         && format == 32)
 
782
+                {
 
783
+                    /* set atom (reference to a string) */
 
784
+                    data.a[i] = XInternAtom (xdisplay, g_value_get_string (val), False);
 
785
+                }
 
786
+                else if (G_VALUE_HOLDS_DOUBLE (val) /* xfconf doesn't support floats */
 
787
+                         && type == float_atom
 
788
+                         && format == 32)
 
789
+                {
 
790
+                    data.l[i] = g_value_get_double (val);
 
791
+                }
 
792
+                else
 
793
+                {
 
794
+                    g_critical ("Unknown property type %s: target = %s, format = %d",
 
795
+                                G_VALUE_TYPE_NAME (val), XGetAtomName (xdisplay, type), format);
 
796
+                    break;
 
797
+                }
 
798
+
 
799
+                /* the item was successfully updated */
 
800
+                n_succeeds++;
 
801
+            }
 
802
+
 
803
+            if (n_succeeds == n_items)
 
804
+            {
 
805
+                gdk_error_trap_push ();
 
806
+                XChangeDeviceProperty (xdisplay, device, prop, type, format,
 
807
+                                       PropModeReplace, data.c, n_items);
 
808
+                if (gdk_error_trap_pop () != 0)
 
809
+                {
 
810
+                    g_critical ("Failed to set device property %s for %s",
 
811
+                                prop_name, device_info->name);
 
812
+                }
 
813
+            }
 
814
+
 
815
+            XFree (data.c);
 
816
+        }
 
817
+
 
818
+        break;
 
819
+    }
 
820
+
 
821
+    XFree (props);
 
822
+}
 
823
+
 
824
+
 
825
+
 
826
+static void
 
827
+xfce_pointers_helper_change_properties (gpointer key,
 
828
+                                        gpointer value,
 
829
+                                        gpointer user_data)
 
830
+{
 
831
+    XfcePointerData *pointer_data = user_data;
 
832
+    const gchar     *prop_name = ((gchar *) key) + pointer_data->prop_name_len;
 
833
+
 
834
+    xfce_pointers_helper_change_property (pointer_data->device_info,
 
835
+                                          pointer_data->device,
 
836
+                                          pointer_data->xdisplay,
 
837
+                                          prop_name, value);
 
838
+}
 
839
+
 
840
+
 
841
+
 
842
+static void
 
843
 xfce_pointers_helper_restore_devices (XfcePointersHelper *helper,
 
844
                                       XID                *xid)
 
845
 {
 
846
-    Display     *xdisplay = GDK_DISPLAY ();
 
847
-    XDeviceInfo *device_list, *device_info;
 
848
-    XDevice     *device;
 
849
-    gint         n, ndevices;
 
850
-    gchar       *righthanded_str;
 
851
-    gchar       *threshold_str;
 
852
-    gchar       *acceleration_str;
 
853
-    gchar       *device_name;
 
854
-    gchar       *reverse_scrolling_str;
 
855
+    Display         *xdisplay = GDK_DISPLAY ();
 
856
+    XDeviceInfo     *device_list, *device_info;
 
857
+    gint             n, ndevices;
 
858
+    XDevice         *device;
 
859
+    gchar           *device_name;
 
860
+    gchar            prop[256];
 
861
+    gboolean         right_handed;
 
862
+    gboolean         reverse_scrolling;
 
863
+    gint             threshold;
 
864
+    gdouble          acceleration;
 
865
+    GHashTable      *props;
 
866
+    XfcePointerData  pointer_data;
 
867
+    const gchar     *mode;
 
868
 
 
869
-    /* flush x and trap errors */
 
870
-    gdk_flush ();
 
871
     gdk_error_trap_push ();
 
872
-
 
873
-    /* get all the registered devices */
 
874
     device_list = XListInputDevices (xdisplay, &ndevices);
 
875
+    if (gdk_error_trap_pop () != 0 || device_list == NULL)
 
876
+    {
 
877
+        g_message ("No input devices found");
 
878
+        return;
 
879
+    }
 
880
 
 
881
     for (n = 0; n < ndevices; n++)
 
882
     {
 
883
-        /* get the device info */
 
884
+        /* filter the pointer devices */
 
885
         device_info = &device_list[n];
 
886
+        if (device_info->use != IsXExtensionPointer
 
887
+            || device_info->name == NULL)
 
888
+            continue;
 
889
+
 
890
+        /* filter out the device if one is set */
 
891
+        if (xid != NULL && device_info->id != *xid)
 
892
+            continue;
 
893
 
 
894
-        /* filter out the pointer devices */
 
895
-        if (device_info->use == IsXExtensionPointer)
 
896
+        /* open the device */
 
897
+        gdk_error_trap_push ();
 
898
+        device = XOpenDevice (xdisplay, device_info->id);
 
899
+        if (gdk_error_trap_pop () != 0 || device == NULL)
 
900
         {
 
901
-            /* filter devices */
 
902
-            if (xid && device_info->id != *xid)
 
903
-                continue;
 
904
+            g_critical ("Unable to open device %s", device_info->name);
 
905
+            continue;
 
906
+        }
 
907
 
 
908
-            /* open the device */
 
909
-            device = XOpenDevice (xdisplay, device_info->id);
 
910
-            if (G_LIKELY (device))
 
911
-            {
 
912
-                /* get a clean device name */
 
913
-                device_name = xfce_pointers_helper_device_xfconf_name (device_info->name);
 
914
+        /* create a valid xfconf property name for the device */
 
915
+        device_name = xfce_pointers_helper_device_xfconf_name (device_info->name);
 
916
 
 
917
-                /* create righthanded property string */
 
918
-                righthanded_str = g_strdup_printf ("/%s/RightHanded", device_name);
 
919
+        /* read buttonmap properties */
 
920
+        g_snprintf (prop, sizeof (prop), "/%s/RightHanded", device_name);
 
921
+        right_handed = xfconf_channel_get_bool (helper->channel, prop, -1);
 
922
 
 
923
-                /* check if we have a property for this device, else continue */
 
924
-                if (xfconf_channel_has_property (helper->channel, righthanded_str))
 
925
-                {
 
926
-                    /* create property names */
 
927
-                    reverse_scrolling_str = g_strdup_printf ("/%s/ReverseScrolling", device_name);
 
928
-                    threshold_str = g_strdup_printf ("/%s/Threshold", device_name);
 
929
-                    acceleration_str = g_strdup_printf ("/%s/Acceleration", device_name);
 
930
+        g_snprintf (prop, sizeof (prop), "/%s/ReverseScrolling", device_name);
 
931
+        reverse_scrolling = xfconf_channel_get_bool (helper->channel, prop, -1);
 
932
 
 
933
-                    /* restore the button mapping */
 
934
-                    xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
 
935
-                                                                xfconf_channel_get_bool (helper->channel, righthanded_str, TRUE) ? 1 : 0,
 
936
-                                                                xfconf_channel_get_bool (helper->channel, reverse_scrolling_str, FALSE) ? 1 : 0);
 
937
+        if (right_handed != -1 || reverse_scrolling != -1)
 
938
+        {
 
939
+            xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
 
940
+                                                        right_handed, reverse_scrolling);
 
941
+        }
 
942
 
 
943
-                    /* restore the pointer feedback */
 
944
-                    xfce_pointers_helper_change_feedback (device, xdisplay,
 
945
-                                                          xfconf_channel_get_int (helper->channel, threshold_str, -1),
 
946
-                                                          xfconf_channel_get_double (helper->channel, acceleration_str, -1.00));
 
947
+        /* read feedback settings */
 
948
+        g_snprintf (prop, sizeof (prop), "/%s/Threshold", device_name);
 
949
+        threshold = xfconf_channel_get_int (helper->channel, prop, -1);
 
950
 
 
951
-                    /* cleanup */
 
952
-                    g_free (reverse_scrolling_str);
 
953
-                    g_free (threshold_str);
 
954
-                    g_free (acceleration_str);
 
955
-                }
 
956
+        g_snprintf (prop, sizeof (prop), "/%s/Acceleration", device_name);
 
957
+        acceleration = xfconf_channel_get_double (helper->channel, prop, -1.00);
 
958
 
 
959
-                /* cleanup */
 
960
-                g_free (righthanded_str);
 
961
-                g_free (device_name);
 
962
+        if (threshold != -1 || acceleration != -1.00)
 
963
+        {
 
964
+            xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
 
965
+                                                  threshold, acceleration);
 
966
+        }
 
967
 
 
968
-                /* close the device */
 
969
-                XCloseDevice (xdisplay, device);
 
970
-            }
 
971
+        /* read mode settings */
 
972
+        g_snprintf (prop, sizeof (prop), "/%s/Mode", device_name);
 
973
+        mode =  xfconf_channel_get_string  (helper->channel, prop, NULL);
 
974
+
 
975
+        if (mode != NULL)
 
976
+            xfce_pointers_helper_change_mode (device_info, device, xdisplay, mode);
 
977
+
 
978
+        /* set device properties */
 
979
+        g_snprintf (prop, sizeof (prop), "/%s/Properties", device_name);
 
980
+        props = xfconf_channel_get_properties (helper->channel, prop);
 
981
+
 
982
+        if (props != NULL)
 
983
+        {
 
984
+            pointer_data.xdisplay = xdisplay;
 
985
+            pointer_data.device = device;
 
986
+            pointer_data.device_info = device_info;
 
987
+            pointer_data.prop_name_len = strlen (prop) + 1;
 
988
+
 
989
+            g_hash_table_foreach (props, xfce_pointers_helper_change_properties, &pointer_data);
 
990
+
 
991
+            g_hash_table_destroy (props);
 
992
         }
 
993
+
 
994
+        g_free (device_name);
 
995
+        XCloseDevice (xdisplay, device);
 
996
     }
 
997
 
 
998
-    /* cleanup */
 
999
     XFreeDeviceList (device_list);
 
1000
-
 
1001
-    /* flush and remove the x error trap */
 
1002
-    gdk_flush ();
 
1003
-    gdk_error_trap_pop ();
 
1004
 }
 
1005
 
 
1006
 
 
1007
 
 
1008
 static void
 
1009
-xfce_pointers_helper_channel_property_changed (XfconfChannel *channel,
 
1010
-                                               const gchar   *property_name,
 
1011
-                                               const GValue  *value)
 
1012
+xfce_pointers_helper_channel_property_changed (XfconfChannel      *channel,
 
1013
+                                               const gchar        *property_name,
 
1014
+                                               const GValue       *value,
 
1015
+                                               XfcePointersHelper *helper)
 
1016
 {
 
1017
     Display      *xdisplay = GDK_DISPLAY ();
 
1018
     XDeviceInfo  *device_list, *device_info;
 
1019
@@ -503,73 +886,104 @@ xfce_pointers_helper_channel_property_ch
 
1020
     gchar       **names;
 
1021
     gchar        *device_name;
 
1022
 
 
1023
-    /* flush x and trap errors */
 
1024
-    gdk_flush ();
 
1025
-    gdk_error_trap_push ();
 
1026
+    if (G_UNLIKELY (property_name == NULL))
 
1027
+         return;
 
1028
+
 
1029
+    /* check the daemon status */
 
1030
+    if (strcmp (property_name, "/DisableTouchpadWhileTyping") == 0)
 
1031
+    {
 
1032
+        xfce_pointers_helper_syndaemon_check (helper);
 
1033
+        return;
 
1034
+    }
 
1035
 
 
1036
     /* split the property name (+1 so skip the first slash in the name) */
 
1037
     names = g_strsplit (property_name + 1, "/", -1);
 
1038
 
 
1039
-    /* check if splitting worked */
 
1040
-    if (names && g_strv_length (names) == 2)
 
1041
+    if (names != NULL && g_strv_length (names) >= 2)
 
1042
     {
 
1043
-        /* get all the registered devices */
 
1044
+        gdk_error_trap_push ();
 
1045
         device_list = XListInputDevices (xdisplay, &ndevices);
 
1046
+        if (gdk_error_trap_pop () != 0 || device_list == NULL)
 
1047
+        {
 
1048
+            g_message ("No input devices found");
 
1049
+            return;
 
1050
+        }
 
1051
 
 
1052
         for (n = 0; n < ndevices; n++)
 
1053
         {
 
1054
-            /* get the device info */
 
1055
+            /* filter the pointer devices */
 
1056
             device_info = &device_list[n];
 
1057
+            if (device_info->use != IsXExtensionPointer
 
1058
+                || device_info->name == NULL)
 
1059
+                continue;
 
1060
 
 
1061
-            /* find the pointer device */
 
1062
-            if (device_info->use == IsXExtensionPointer)
 
1063
+            /* search the device name */
 
1064
+            device_name = xfce_pointers_helper_device_xfconf_name (device_info->name);
 
1065
+            if (strcmp (names[0], device_name) == 0)
 
1066
             {
 
1067
-                /* create a valid xfconf device name */
 
1068
-                device_name = xfce_pointers_helper_device_xfconf_name (device_info->name);
 
1069
-
 
1070
-                /* check if this is the device that's been changed */
 
1071
-                if (strcmp (names[0], device_name) == 0)
 
1072
+                /* open the device */
 
1073
+                gdk_error_trap_push ();
 
1074
+                device = XOpenDevice (xdisplay, device_info->id);
 
1075
+                if (gdk_error_trap_pop () != 0 || device == NULL)
 
1076
                 {
 
1077
-                    /* open the device */
 
1078
-                    device = XOpenDevice (xdisplay, device_info->id);
 
1079
-                    if (G_LIKELY (device))
 
1080
-                    {
 
1081
-                        /* update the right property */
 
1082
-                        if (strcmp (names[1], "RightHanded") == 0)
 
1083
-                            xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay, !!g_value_get_boolean (value), -1);
 
1084
-                        else if (strcmp (names[1], "ReverseScrolling") == 0)
 
1085
-                            xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay, -1, !!g_value_get_boolean (value));
 
1086
-                        else if (strcmp (names[1], "Threshold") == 0)
 
1087
-                            xfce_pointers_helper_change_feedback (device, xdisplay, g_value_get_int (value), -2.00);
 
1088
-                        else if (strcmp (names[1], "Acceleration") == 0)
 
1089
-                            xfce_pointers_helper_change_feedback (device, xdisplay, -2, g_value_get_double (value));
 
1090
-
 
1091
-                        /* close the device */
 
1092
-                        XCloseDevice (xdisplay, device);
 
1093
-                    }
 
1094
+                    g_critical ("Unable to open device %s", device_info->name);
 
1095
+                    continue;
 
1096
+                }
 
1097
 
 
1098
-                    /* stop searching */
 
1099
-                    n = ndevices;
 
1100
+                /* check the property that requires updating */
 
1101
+                if (strcmp (names[1], "RightHanded") == 0)
 
1102
+                {
 
1103
+                    xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
 
1104
+                                                                g_value_get_boolean (value), -1);
 
1105
+                }
 
1106
+                else if (strcmp (names[1], "ReverseScrolling") == 0)
 
1107
+                {
 
1108
+                    xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
 
1109
+                                                                -1, g_value_get_boolean (value));
 
1110
+                }
 
1111
+                else if (strcmp (names[1], "Threshold") == 0)
 
1112
+                {
 
1113
+                    xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
 
1114
+                                                          g_value_get_int (value), -2.00);
 
1115
+                }
 
1116
+                else if (strcmp (names[1], "Acceleration") == 0)
 
1117
+                {
 
1118
+                    xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
 
1119
+                                                          -2, g_value_get_double (value));
 
1120
+                }
 
1121
+                else if (strcmp (names[1], "Properties") == 0)
 
1122
+                {
 
1123
+                    xfce_pointers_helper_change_property (device_info, device, xdisplay,
 
1124
+                                                          names[2], value);
 
1125
+                }
 
1126
+                else if (strcmp (names[1], "Mode") == 0)
 
1127
+                {
 
1128
+                    xfce_pointers_helper_change_mode (device_info, device, xdisplay,
 
1129
+                                                      g_value_get_string (value));
 
1130
+                }
 
1131
+                else
 
1132
+                {
 
1133
+                    g_warning ("Unknown property %s set for device %s",
 
1134
+                               property_name, device_info->name);
 
1135
                 }
 
1136
 
 
1137
-                /* cleanup */
 
1138
-                g_free (device_name);
 
1139
+                XCloseDevice (xdisplay, device);
 
1140
+
 
1141
+                /* stop searching */
 
1142
+                n = ndevices;
 
1143
             }
 
1144
+
 
1145
+            g_free (device_name);
 
1146
         }
 
1147
 
 
1148
-        /* cleanup */
 
1149
         XFreeDeviceList (device_list);
 
1150
     }
 
1151
 
 
1152
-    /* cleanup */
 
1153
     g_strfreev (names);
 
1154
-
 
1155
-    /* flush and remove the x error trap */
 
1156
-    gdk_flush ();
 
1157
-    gdk_error_trap_pop ();
 
1158
 }
 
1159
 
 
1160
 
 
1161
+
 
1162
 #ifdef HAS_DEVICE_HOTPLUGGING
 
1163
 static GdkFilterReturn
 
1164
 xfce_pointers_helper_event_filter (GdkXEvent *xevent,
 
1165
@@ -580,10 +994,15 @@ xfce_pointers_helper_event_filter (GdkXE
 
1166
     XDevicePresenceNotifyEvent *dpn_event = xevent;
 
1167
     XfcePointersHelper         *helper = XFCE_POINTERS_HELPER (user_data);
 
1168
 
 
1169
-    /* update on device changes */
 
1170
-    if (event->type == helper->device_presence_event_type
 
1171
-        && dpn_event->devchange == DeviceAdded)
 
1172
-        xfce_pointers_helper_restore_devices (helper, &dpn_event->deviceid);
 
1173
+    if (event->type == helper->device_presence_event_type)
 
1174
+    {
 
1175
+        /* restore device settings */
 
1176
+        if (dpn_event->devchange == DeviceAdded)
 
1177
+            xfce_pointers_helper_restore_devices (helper, &dpn_event->deviceid);
 
1178
+
 
1179
+        /* check if we need to launch syndaemon */
 
1180
+        xfce_pointers_helper_syndaemon_check (helper);
 
1181
+    }
 
1182
 
 
1183
     return GDK_FILTER_CONTINUE;
 
1184
 }
 
1185
--- xfce4-settings-4.8.3.orig/dialogs/mouse-settings/Makefile.am
 
1186
+++ xfce4-settings-4.8.3/dialogs/mouse-settings/Makefile.am
 
1187
@@ -22,6 +22,7 @@ xfce4_mouse_settings_CFLAGS = \
 
1188
        $(XFCONF_CFLAGS) \
 
1189
        $(XI_CFLAGS) \
 
1190
        $(XFCONF_CFLAGS) \
 
1191
+       $(LIBX11_CFLAGS) \
 
1192
        $(PLATFORM_CFLAGS)
 
1193
 
 
1194
 xfce4_mouse_settings_LDFLAGS = \
 
1195
@@ -34,6 +35,7 @@ xfce4_mouse_settings_LDADD = \
 
1196
        $(LIBXFCE4UI_LIBS) \
 
1197
        $(XFCONF_LIBS) \
 
1198
        $(XI_LIBS) \
 
1199
+       $(LIBX11_LIBS) \
 
1200
        -lm
 
1201
 
 
1202
 if HAVE_XCURSOR
 
1203
--- xfce4-settings-4.8.3.orig/dialogs/mouse-settings/xfce-mouse-settings.desktop.in
 
1204
+++ xfce4-settings-4.8.3/dialogs/mouse-settings/xfce-mouse-settings.desktop.in
 
1205
@@ -1,6 +1,6 @@
 
1206
 [Desktop Entry]
 
1207
 Version=1.0
 
1208
-_Name=Mouse
 
1209
+_Name=Mouse and Touchpad
 
1210
 _Comment=Configure pointer device behavior and appearance
 
1211
 Exec=xfce4-mouse-settings
 
1212
 Icon=preferences-desktop-peripherals
 
1213
--- xfce4-settings-4.8.3.orig/dialogs/mouse-settings/mouse-dialog.glade
 
1214
+++ xfce4-settings-4.8.3/dialogs/mouse-settings/mouse-dialog.glade
 
1215
@@ -1,284 +1,752 @@
 
1216
-<?xml version="1.0"?>
 
1217
+<?xml version="1.0" encoding="UTF-8"?>
 
1218
 <interface>
 
1219
-  <requires lib="gtk+" version="2.14"/>
 
1220
+  <requires lib="gtk+" version="2.20"/>
 
1221
   <!-- interface-requires libxfce4ui 4.5 -->
 
1222
-  <!-- interface-naming-policy toplevel-contextual -->
 
1223
-  <object class="GtkAdjustment" id="mouse-acceleration">
 
1224
-    <property name="lower">0.1</property>
 
1225
+  <!-- interface-naming-policy project-wide -->
 
1226
+  <object class="GtkAdjustment" id="dclick-distance">
 
1227
+    <property name="upper">20</property>
 
1228
+    <property name="value">4</property>
 
1229
+    <property name="step_increment">1</property>
 
1230
+    <property name="page_increment">5</property>
 
1231
+  </object>
 
1232
+  <object class="GtkAdjustment" id="dclick-time">
 
1233
+    <property name="lower">100</property>
 
1234
+    <property name="upper">2000</property>
 
1235
+    <property name="value">250</property>
 
1236
+    <property name="step_increment">1</property>
 
1237
+    <property name="page_increment">100</property>
 
1238
+  </object>
 
1239
+  <object class="GtkAdjustment" id="device-acceleration">
 
1240
+    <property name="lower">0.10000000000000001</property>
 
1241
     <property name="upper">10</property>
 
1242
     <property name="value">2</property>
 
1243
-    <property name="step_increment">0.1</property>
 
1244
+    <property name="step_increment">0.10000000000000001</property>
 
1245
     <property name="page_increment">1</property>
 
1246
   </object>
 
1247
-  <object class="GtkAdjustment" id="mouse-threshold">
 
1248
+  <object class="GtkAdjustment" id="device-threshold">
 
1249
     <property name="lower">1</property>
 
1250
     <property name="upper">30</property>
 
1251
     <property name="value">4</property>
 
1252
     <property name="step_increment">1</property>
 
1253
     <property name="page_increment">5</property>
 
1254
   </object>
 
1255
-  <object class="GtkAdjustment" id="mouse-dnd-threshold">
 
1256
+  <object class="GtkAdjustment" id="dnd-threshold">
 
1257
     <property name="lower">1</property>
 
1258
     <property name="upper">50</property>
 
1259
     <property name="value">8</property>
 
1260
     <property name="step_increment">1</property>
 
1261
     <property name="page_increment">10</property>
 
1262
   </object>
 
1263
-  <object class="GtkAdjustment" id="mouse-double-click-time">
 
1264
-    <property name="lower">100</property>
 
1265
-    <property name="upper">2000</property>
 
1266
-    <property name="value">250</property>
 
1267
-    <property name="step_increment">1</property>
 
1268
-    <property name="page_increment">100</property>
 
1269
-  </object>
 
1270
-  <object class="GtkAdjustment" id="mouse-double-click-distance">
 
1271
-    <property name="lower">0</property>
 
1272
-    <property name="upper">20</property>
 
1273
-    <property name="value">4</property>
 
1274
-    <property name="step_increment">1</property>
 
1275
-    <property name="page_increment">5</property>
 
1276
-  </object>
 
1277
-  <object class="GtkAdjustment" id="adjustment6">
 
1278
-    <property name="lower">16</property>
 
1279
-    <property name="upper">48</property>
 
1280
-    <property name="value">24</property>
 
1281
-    <property name="step_increment">1</property>
 
1282
-    <property name="page_increment">11</property>
 
1283
+  <object class="GtkImage" id="image5">
 
1284
+    <property name="visible">True</property>
 
1285
+    <property name="can_focus">False</property>
 
1286
+    <property name="stock">gtk-revert-to-saved</property>
 
1287
   </object>
 
1288
   <object class="XfceTitledDialog" id="mouse-dialog">
 
1289
-    <property name="title" translatable="yes">Mouse</property>
 
1290
+    <property name="can_focus">False</property>
 
1291
+    <property name="title" translatable="yes">Mouse and Touchpad</property>
 
1292
     <property name="window_position">center-on-parent</property>
 
1293
     <property name="icon_name">preferences-desktop-peripherals</property>
 
1294
     <property name="type_hint">dialog</property>
 
1295
-    <property name="has_separator">False</property>
 
1296
     <property name="subtitle" translatable="yes">Configure pointer device behavior and appearance</property>
 
1297
     <child internal-child="vbox">
 
1298
       <object class="GtkVBox" id="dialog-vbox1">
 
1299
         <property name="visible">True</property>
 
1300
-        <property name="orientation">vertical</property>
 
1301
+        <property name="can_focus">False</property>
 
1302
         <property name="spacing">2</property>
 
1303
+        <child internal-child="action_area">
 
1304
+          <object class="GtkHButtonBox" id="dialog-action_area1">
 
1305
+            <property name="visible">True</property>
 
1306
+            <property name="can_focus">False</property>
 
1307
+            <property name="layout_style">end</property>
 
1308
+            <child>
 
1309
+              <object class="GtkButton" id="button1">
 
1310
+                <property name="label">gtk-close</property>
 
1311
+                <property name="visible">True</property>
 
1312
+                <property name="can_focus">True</property>
 
1313
+                <property name="receives_default">True</property>
 
1314
+                <property name="use_action_appearance">False</property>
 
1315
+                <property name="use_stock">True</property>
 
1316
+              </object>
 
1317
+              <packing>
 
1318
+                <property name="expand">False</property>
 
1319
+                <property name="fill">False</property>
 
1320
+                <property name="position">0</property>
 
1321
+              </packing>
 
1322
+            </child>
 
1323
+          </object>
 
1324
+          <packing>
 
1325
+            <property name="expand">False</property>
 
1326
+            <property name="fill">True</property>
 
1327
+            <property name="pack_type">end</property>
 
1328
+            <property name="position">0</property>
 
1329
+          </packing>
 
1330
+        </child>
 
1331
         <child>
 
1332
           <object class="GtkNotebook" id="plug-child">
 
1333
             <property name="visible">True</property>
 
1334
             <property name="can_focus">True</property>
 
1335
             <property name="border_width">6</property>
 
1336
             <child>
 
1337
-              <object class="GtkHBox" id="hbox1">
 
1338
+              <object class="GtkVBox" id="vbox1">
 
1339
                 <property name="visible">True</property>
 
1340
+                <property name="can_focus">False</property>
 
1341
                 <property name="border_width">12</property>
 
1342
-                <property name="spacing">12</property>
 
1343
+                <property name="spacing">6</property>
 
1344
                 <child>
 
1345
-                  <object class="GtkScrolledWindow" id="scrolledwindow1">
 
1346
+                  <object class="GtkHBox" id="hbox1">
 
1347
                     <property name="visible">True</property>
 
1348
-                    <property name="can_focus">True</property>
 
1349
-                    <property name="hscrollbar_policy">automatic</property>
 
1350
-                    <property name="vscrollbar_policy">automatic</property>
 
1351
-                    <property name="shadow_type">in</property>
 
1352
+                    <property name="can_focus">False</property>
 
1353
+                    <property name="spacing">12</property>
 
1354
                     <child>
 
1355
-                      <object class="GtkTreeView" id="mouse-devices-treeview">
 
1356
+                      <object class="GtkLabel" id="label7">
 
1357
                         <property name="visible">True</property>
 
1358
-                        <property name="can_focus">True</property>
 
1359
-                        <property name="headers_visible">False</property>
 
1360
+                        <property name="can_focus">False</property>
 
1361
+                        <property name="label" translatable="yes">De_vice:</property>
 
1362
+                        <property name="use_underline">True</property>
 
1363
+                        <property name="mnemonic_widget">device-combobox</property>
 
1364
+                        <property name="angle">0.050000000000000003</property>
 
1365
                       </object>
 
1366
+                      <packing>
 
1367
+                        <property name="expand">False</property>
 
1368
+                        <property name="fill">True</property>
 
1369
+                        <property name="position">0</property>
 
1370
+                      </packing>
 
1371
+                    </child>
 
1372
+                    <child>
 
1373
+                      <object class="GtkComboBox" id="device-combobox">
 
1374
+                        <property name="visible">True</property>
 
1375
+                        <property name="can_focus">False</property>
 
1376
+                      </object>
 
1377
+                      <packing>
 
1378
+                        <property name="expand">True</property>
 
1379
+                        <property name="fill">True</property>
 
1380
+                        <property name="position">1</property>
 
1381
+                      </packing>
 
1382
                     </child>
 
1383
                   </object>
 
1384
                   <packing>
 
1385
+                    <property name="expand">False</property>
 
1386
+                    <property name="fill">True</property>
 
1387
                     <property name="position">0</property>
 
1388
                   </packing>
 
1389
                 </child>
 
1390
                 <child>
 
1391
-                  <object class="GtkVBox" id="vbox1">
 
1392
+                  <object class="GtkCheckButton" id="device-enabled">
 
1393
+                    <property name="label" translatable="yes">_Enable this device</property>
 
1394
                     <property name="visible">True</property>
 
1395
-                    <property name="orientation">vertical</property>
 
1396
-                    <property name="spacing">6</property>
 
1397
+                    <property name="can_focus">True</property>
 
1398
+                    <property name="receives_default">False</property>
 
1399
+                    <property name="use_action_appearance">False</property>
 
1400
+                    <property name="use_underline">True</property>
 
1401
+                    <property name="draw_indicator">True</property>
 
1402
+                  </object>
 
1403
+                  <packing>
 
1404
+                    <property name="expand">False</property>
 
1405
+                    <property name="fill">True</property>
 
1406
+                    <property name="position">1</property>
 
1407
+                  </packing>
 
1408
+                </child>
 
1409
+                <child>
 
1410
+                  <object class="GtkNotebook" id="device-notebook">
 
1411
+                    <property name="visible">True</property>
 
1412
+                    <property name="can_focus">True</property>
 
1413
                     <child>
 
1414
-                      <object class="GtkFrame" id="frame1">
 
1415
+                      <object class="GtkVBox" id="device-box">
 
1416
                         <property name="visible">True</property>
 
1417
-                        <property name="label_xalign">0</property>
 
1418
-                        <property name="shadow_type">none</property>
 
1419
+                        <property name="can_focus">False</property>
 
1420
+                        <property name="border_width">6</property>
 
1421
+                        <property name="spacing">6</property>
 
1422
                         <child>
 
1423
-                          <object class="GtkAlignment" id="alignment1">
 
1424
+                          <object class="GtkFrame" id="frame1">
 
1425
                             <property name="visible">True</property>
 
1426
-                            <property name="bottom_padding">6</property>
 
1427
-                            <property name="left_padding">12</property>
 
1428
+                            <property name="can_focus">False</property>
 
1429
+                            <property name="label_xalign">0</property>
 
1430
+                            <property name="shadow_type">none</property>
 
1431
                             <child>
 
1432
-                              <object class="GtkVBox" id="vbox12">
 
1433
+                              <object class="GtkAlignment" id="alignment1">
 
1434
                                 <property name="visible">True</property>
 
1435
-                                <property name="border_width">6</property>
 
1436
-                                <property name="orientation">vertical</property>
 
1437
-                                <property name="spacing">6</property>
 
1438
+                                <property name="can_focus">False</property>
 
1439
+                                <property name="left_padding">12</property>
 
1440
                                 <child>
 
1441
-                                  <object class="GtkRadioButton" id="mouse-right-handed">
 
1442
-                                    <property name="label" translatable="yes">_Right handed</property>
 
1443
+                                  <object class="GtkVBox" id="vbox12">
 
1444
                                     <property name="visible">True</property>
 
1445
-                                    <property name="can_focus">True</property>
 
1446
-                                    <property name="receives_default">False</property>
 
1447
-                                    <property name="use_underline">True</property>
 
1448
-                                    <property name="active">True</property>
 
1449
-                                    <property name="draw_indicator">True</property>
 
1450
-                                  </object>
 
1451
-                                  <packing>
 
1452
-                                    <property name="position">0</property>
 
1453
-                                  </packing>
 
1454
-                                </child>
 
1455
-                                <child>
 
1456
-                                  <object class="GtkRadioButton" id="mouse-left-handed">
 
1457
-                                    <property name="label" translatable="yes">_Left handed</property>
 
1458
-                                    <property name="visible">True</property>
 
1459
-                                    <property name="can_focus">True</property>
 
1460
-                                    <property name="receives_default">False</property>
 
1461
-                                    <property name="use_underline">True</property>
 
1462
-                                    <property name="active">True</property>
 
1463
-                                    <property name="draw_indicator">True</property>
 
1464
-                                    <property name="group">mouse-right-handed</property>
 
1465
+                                    <property name="can_focus">False</property>
 
1466
+                                    <property name="border_width">6</property>
 
1467
+                                    <property name="spacing">6</property>
 
1468
+                                    <child>
 
1469
+                                      <object class="GtkHBox" id="hbox3">
 
1470
+                                        <property name="visible">True</property>
 
1471
+                                        <property name="can_focus">False</property>
 
1472
+                                        <property name="spacing">12</property>
 
1473
+                                        <child>
 
1474
+                                          <object class="GtkRadioButton" id="device-right-handed">
 
1475
+                                            <property name="label" translatable="yes">_Right-handed</property>
 
1476
+                                            <property name="visible">True</property>
 
1477
+                                            <property name="can_focus">True</property>
 
1478
+                                            <property name="receives_default">False</property>
 
1479
+                                            <property name="use_action_appearance">False</property>
 
1480
+                                            <property name="use_underline">True</property>
 
1481
+                                            <property name="active">True</property>
 
1482
+                                            <property name="draw_indicator">True</property>
 
1483
+                                          </object>
 
1484
+                                          <packing>
 
1485
+                                            <property name="expand">False</property>
 
1486
+                                            <property name="fill">True</property>
 
1487
+                                            <property name="position">0</property>
 
1488
+                                          </packing>
 
1489
+                                        </child>
 
1490
+                                        <child>
 
1491
+                                          <object class="GtkRadioButton" id="device-left-handed">
 
1492
+                                            <property name="label" translatable="yes">_Left-handed</property>
 
1493
+                                            <property name="visible">True</property>
 
1494
+                                            <property name="can_focus">True</property>
 
1495
+                                            <property name="receives_default">False</property>
 
1496
+                                            <property name="use_action_appearance">False</property>
 
1497
+                                            <property name="use_underline">True</property>
 
1498
+                                            <property name="draw_indicator">True</property>
 
1499
+                                            <property name="group">device-right-handed</property>
 
1500
+                                          </object>
 
1501
+                                          <packing>
 
1502
+                                            <property name="expand">False</property>
 
1503
+                                            <property name="fill">True</property>
 
1504
+                                            <property name="position">1</property>
 
1505
+                                          </packing>
 
1506
+                                        </child>
 
1507
+                                      </object>
 
1508
+                                      <packing>
 
1509
+                                        <property name="expand">True</property>
 
1510
+                                        <property name="fill">True</property>
 
1511
+                                        <property name="position">0</property>
 
1512
+                                      </packing>
 
1513
+                                    </child>
 
1514
+                                    <child>
 
1515
+                                      <object class="GtkCheckButton" id="device-reverse-scrolling">
 
1516
+                                        <property name="label" translatable="yes">Reverse scroll d_irection</property>
 
1517
+                                        <property name="visible">True</property>
 
1518
+                                        <property name="can_focus">True</property>
 
1519
+                                        <property name="receives_default">False</property>
 
1520
+                                        <property name="tooltip_text" translatable="yes">When selected, the scroll wheel will work in the opposite direction</property>
 
1521
+                                        <property name="use_action_appearance">False</property>
 
1522
+                                        <property name="use_underline">True</property>
 
1523
+                                        <property name="draw_indicator">True</property>
 
1524
+                                      </object>
 
1525
+                                      <packing>
 
1526
+                                        <property name="expand">True</property>
 
1527
+                                        <property name="fill">True</property>
 
1528
+                                        <property name="position">1</property>
 
1529
+                                      </packing>
 
1530
+                                    </child>
 
1531
                                   </object>
 
1532
-                                  <packing>
 
1533
-                                    <property name="position">1</property>
 
1534
-                                  </packing>
 
1535
                                 </child>
 
1536
+                              </object>
 
1537
+                            </child>
 
1538
+                            <child type="label">
 
1539
+                              <object class="GtkLabel" id="label14">
 
1540
+                                <property name="visible">True</property>
 
1541
+                                <property name="can_focus">False</property>
 
1542
+                                <property name="label" translatable="yes">Buttons</property>
 
1543
+                                <attributes>
 
1544
+                                  <attribute name="weight" value="bold"/>
 
1545
+                                </attributes>
 
1546
+                              </object>
 
1547
+                            </child>
 
1548
+                          </object>
 
1549
+                          <packing>
 
1550
+                            <property name="expand">False</property>
 
1551
+                            <property name="fill">True</property>
 
1552
+                            <property name="position">0</property>
 
1553
+                          </packing>
 
1554
+                        </child>
 
1555
+                        <child>
 
1556
+                          <object class="GtkFrame" id="frame2">
 
1557
+                            <property name="visible">True</property>
 
1558
+                            <property name="can_focus">False</property>
 
1559
+                            <property name="label_xalign">0</property>
 
1560
+                            <property name="shadow_type">none</property>
 
1561
+                            <child>
 
1562
+                              <object class="GtkAlignment" id="alignment2">
 
1563
+                                <property name="visible">True</property>
 
1564
+                                <property name="can_focus">False</property>
 
1565
+                                <property name="left_padding">12</property>
 
1566
                                 <child>
 
1567
-                                  <object class="GtkCheckButton" id="mouse-reverse-scrolling">
 
1568
-                                    <property name="label" translatable="yes">Re_verse scroll direction</property>
 
1569
+                                  <object class="GtkTable" id="table1">
 
1570
                                     <property name="visible">True</property>
 
1571
-                                    <property name="can_focus">True</property>
 
1572
-                                    <property name="receives_default">False</property>
 
1573
-                                    <property name="tooltip_text" translatable="yes">When selected, the scroll wheel will work in the opposite direction</property>
 
1574
-                                    <property name="use_underline">True</property>
 
1575
-                                    <property name="draw_indicator">True</property>
 
1576
+                                    <property name="can_focus">False</property>
 
1577
+                                    <property name="border_width">6</property>
 
1578
+                                    <property name="n_rows">3</property>
 
1579
+                                    <property name="n_columns">2</property>
 
1580
+                                    <property name="column_spacing">12</property>
 
1581
+                                    <property name="row_spacing">6</property>
 
1582
+                                    <child>
 
1583
+                                      <object class="GtkLabel" id="device-acceleration-label">
 
1584
+                                        <property name="visible">True</property>
 
1585
+                                        <property name="can_focus">False</property>
 
1586
+                                        <property name="xalign">0</property>
 
1587
+                                        <property name="label" translatable="yes">_Acceleration:</property>
 
1588
+                                        <property name="use_underline">True</property>
 
1589
+                                        <property name="mnemonic_widget">device-acceleration-scale</property>
 
1590
+                                      </object>
 
1591
+                                      <packing>
 
1592
+                                        <property name="x_options">GTK_FILL</property>
 
1593
+                                        <property name="y_options">GTK_FILL</property>
 
1594
+                                      </packing>
 
1595
+                                    </child>
 
1596
+                                    <child>
 
1597
+                                      <object class="GtkHScale" id="device-acceleration-scale">
 
1598
+                                        <property name="visible">True</property>
 
1599
+                                        <property name="can_focus">True</property>
 
1600
+                                        <property name="tooltip_text" translatable="yes">The factor at which the pointer's speed will increase as the mouse is moved</property>
 
1601
+                                        <property name="update_policy">delayed</property>
 
1602
+                                        <property name="adjustment">device-acceleration</property>
 
1603
+                                        <property name="round_digits">1</property>
 
1604
+                                        <property name="value_pos">right</property>
 
1605
+                                      </object>
 
1606
+                                      <packing>
 
1607
+                                        <property name="left_attach">1</property>
 
1608
+                                        <property name="right_attach">2</property>
 
1609
+                                      </packing>
 
1610
+                                    </child>
 
1611
+                                    <child>
 
1612
+                                      <object class="GtkHScale" id="device-threshold-scale">
 
1613
+                                        <property name="visible">True</property>
 
1614
+                                        <property name="can_focus">True</property>
 
1615
+                                        <property name="tooltip_text" translatable="yes">The number of pixels the pointer must move in a short time before it starts accelerating</property>
 
1616
+                                        <property name="update_policy">delayed</property>
 
1617
+                                        <property name="adjustment">device-threshold</property>
 
1618
+                                        <property name="round_digits">0</property>
 
1619
+                                        <property name="digits">0</property>
 
1620
+                                        <property name="value_pos">right</property>
 
1621
+                                      </object>
 
1622
+                                      <packing>
 
1623
+                                        <property name="left_attach">1</property>
 
1624
+                                        <property name="right_attach">2</property>
 
1625
+                                        <property name="top_attach">1</property>
 
1626
+                                        <property name="bottom_attach">2</property>
 
1627
+                                      </packing>
 
1628
+                                    </child>
 
1629
+                                    <child>
 
1630
+                                      <object class="GtkLabel" id="device-threshold-label">
 
1631
+                                        <property name="visible">True</property>
 
1632
+                                        <property name="can_focus">False</property>
 
1633
+                                        <property name="xalign">0</property>
 
1634
+                                        <property name="label" translatable="yes">_Sensitivity:</property>
 
1635
+                                        <property name="use_underline">True</property>
 
1636
+                                        <property name="mnemonic_widget">device-threshold-scale</property>
 
1637
+                                      </object>
 
1638
+                                      <packing>
 
1639
+                                        <property name="top_attach">1</property>
 
1640
+                                        <property name="bottom_attach">2</property>
 
1641
+                                        <property name="x_options">GTK_FILL</property>
 
1642
+                                      </packing>
 
1643
+                                    </child>
 
1644
+                                    <child>
 
1645
+                                      <object class="GtkAlignment" id="alignment7">
 
1646
+                                        <property name="visible">True</property>
 
1647
+                                        <property name="can_focus">False</property>
 
1648
+                                        <property name="xalign">0</property>
 
1649
+                                        <property name="xscale">0</property>
 
1650
+                                        <property name="yscale">0</property>
 
1651
+                                        <child>
 
1652
+                                          <object class="GtkButton" id="device-reset-feedback">
 
1653
+                                            <property name="label" translatable="yes">Reset to De_faults</property>
 
1654
+                                            <property name="visible">True</property>
 
1655
+                                            <property name="can_focus">True</property>
 
1656
+                                            <property name="receives_default">True</property>
 
1657
+                                            <property name="tooltip_text" translatable="yes">Set the acceleration and sensitivity for the selected device to the default values</property>
 
1658
+                                            <property name="use_action_appearance">False</property>
 
1659
+                                            <property name="image">image5</property>
 
1660
+                                            <property name="use_underline">True</property>
 
1661
+                                          </object>
 
1662
+                                        </child>
 
1663
+                                      </object>
 
1664
+                                      <packing>
 
1665
+                                        <property name="right_attach">2</property>
 
1666
+                                        <property name="top_attach">2</property>
 
1667
+                                        <property name="bottom_attach">3</property>
 
1668
+                                      </packing>
 
1669
+                                    </child>
 
1670
                                   </object>
 
1671
-                                  <packing>
 
1672
-                                    <property name="position">2</property>
 
1673
-                                  </packing>
 
1674
                                 </child>
 
1675
                               </object>
 
1676
                             </child>
 
1677
+                            <child type="label">
 
1678
+                              <object class="GtkLabel" id="label15">
 
1679
+                                <property name="visible">True</property>
 
1680
+                                <property name="can_focus">False</property>
 
1681
+                                <property name="label" translatable="yes">Pointer Speed</property>
 
1682
+                                <attributes>
 
1683
+                                  <attribute name="weight" value="bold"/>
 
1684
+                                </attributes>
 
1685
+                              </object>
 
1686
+                            </child>
 
1687
                           </object>
 
1688
+                          <packing>
 
1689
+                            <property name="expand">False</property>
 
1690
+                            <property name="fill">True</property>
 
1691
+                            <property name="position">1</property>
 
1692
+                          </packing>
 
1693
                         </child>
 
1694
-                        <child type="label">
 
1695
-                          <object class="GtkLabel" id="label4">
 
1696
-                            <property name="visible">True</property>
 
1697
-                            <property name="label" translatable="yes">Button Order</property>
 
1698
-                            <attributes>
 
1699
-                              <attribute name="weight" value="bold"/>
 
1700
-                            </attributes>
 
1701
-                          </object>
 
1702
-                        </child>
 
1703
+                      </object>
 
1704
+                    </child>
 
1705
+                    <child type="tab">
 
1706
+                      <object class="GtkLabel" id="label4">
 
1707
+                        <property name="visible">True</property>
 
1708
+                        <property name="can_focus">False</property>
 
1709
+                        <property name="label" translatable="yes">B_uttons and Feedback</property>
 
1710
+                        <property name="use_underline">True</property>
 
1711
                       </object>
 
1712
                       <packing>
 
1713
-                        <property name="expand">False</property>
 
1714
-                        <property name="position">0</property>
 
1715
+                        <property name="tab_fill">False</property>
 
1716
                       </packing>
 
1717
                     </child>
 
1718
                     <child>
 
1719
-                      <object class="GtkFrame" id="frame2">
 
1720
+                      <object class="GtkVBox" id="synaptics-tab">
 
1721
                         <property name="visible">True</property>
 
1722
-                        <property name="label_xalign">0</property>
 
1723
-                        <property name="shadow_type">none</property>
 
1724
+                        <property name="can_focus">False</property>
 
1725
+                        <property name="border_width">6</property>
 
1726
+                        <property name="spacing">6</property>
 
1727
                         <child>
 
1728
-                          <object class="GtkAlignment" id="alignment2">
 
1729
+                          <object class="GtkFrame" id="frame11">
 
1730
                             <property name="visible">True</property>
 
1731
-                            <property name="bottom_padding">6</property>
 
1732
-                            <property name="left_padding">12</property>
 
1733
+                            <property name="can_focus">False</property>
 
1734
+                            <property name="label_xalign">0</property>
 
1735
+                            <property name="shadow_type">none</property>
 
1736
                             <child>
 
1737
-                              <object class="GtkVBox" id="vbox6">
 
1738
+                              <object class="GtkAlignment" id="alignment13">
 
1739
                                 <property name="visible">True</property>
 
1740
-                                <property name="border_width">6</property>
 
1741
-                                <property name="orientation">vertical</property>
 
1742
-                                <property name="spacing">6</property>
 
1743
+                                <property name="can_focus">False</property>
 
1744
+                                <property name="left_padding">12</property>
 
1745
                                 <child>
 
1746
-                                  <object class="GtkLabel" id="mouse-acceleration-label">
 
1747
+                                  <object class="GtkVBox" id="vbox11">
 
1748
                                     <property name="visible">True</property>
 
1749
-                                    <property name="xalign">0</property>
 
1750
-                                    <property name="label" translatable="yes">_Acceleration:</property>
 
1751
-                                    <property name="use_underline">True</property>
 
1752
-                                    <property name="mnemonic_widget">mouse-acceleration-scale</property>
 
1753
-                                  </object>
 
1754
-                                  <packing>
 
1755
-                                    <property name="position">0</property>
 
1756
-                                  </packing>
 
1757
-                                </child>
 
1758
-                                <child>
 
1759
-                                  <object class="GtkHScale" id="mouse-acceleration-scale">
 
1760
-                                    <property name="visible">True</property>
 
1761
-                                    <property name="can_focus">True</property>
 
1762
-                                    <property name="tooltip_text" translatable="yes">The factor at which the pointer's speed will increase as the mouse is moved</property>
 
1763
-                                    <property name="update_policy">delayed</property>
 
1764
-                                    <property name="adjustment">mouse-acceleration</property>
 
1765
-                                    <property name="value_pos">right</property>
 
1766
-                                  </object>
 
1767
-                                  <packing>
 
1768
-                                    <property name="position">1</property>
 
1769
-                                  </packing>
 
1770
-                                </child>
 
1771
-                                <child>
 
1772
-                                  <object class="GtkLabel" id="mouse-threshold-label">
 
1773
-                                    <property name="visible">True</property>
 
1774
-                                    <property name="xalign">0</property>
 
1775
-                                    <property name="label" translatable="yes">T_hreshold:</property>
 
1776
-                                    <property name="use_underline">True</property>
 
1777
-                                    <property name="mnemonic_widget">mouse-threshold-scale</property>
 
1778
-                                  </object>
 
1779
-                                  <packing>
 
1780
-                                    <property name="position">2</property>
 
1781
-                                  </packing>
 
1782
-                                </child>
 
1783
-                                <child>
 
1784
-                                  <object class="GtkHScale" id="mouse-threshold-scale">
 
1785
-                                    <property name="visible">True</property>
 
1786
-                                    <property name="can_focus">True</property>
 
1787
-                                    <property name="tooltip_text" translatable="yes">The number of pixels the pointer must move in a short time before it starts accelerating</property>
 
1788
-                                    <property name="update_policy">delayed</property>
 
1789
-                                    <property name="adjustment">mouse-threshold</property>
 
1790
-                                    <property name="digits">0</property>
 
1791
-                                    <property name="value_pos">right</property>
 
1792
+                                    <property name="can_focus">False</property>
 
1793
+                                    <property name="border_width">6</property>
 
1794
+                                    <property name="spacing">6</property>
 
1795
+                                    <child>
 
1796
+                                      <object class="GtkCheckButton" id="synaptics-disable-while-type">
 
1797
+                                        <property name="label" translatable="yes">Disable to_uchpad while typing</property>
 
1798
+                                        <property name="visible">True</property>
 
1799
+                                        <property name="can_focus">True</property>
 
1800
+                                        <property name="receives_default">False</property>
 
1801
+                                        <property name="tooltip_text" translatable="yes">When selected, the touchpad will be disabled when the keyboard is being used</property>
 
1802
+                                        <property name="use_action_appearance">False</property>
 
1803
+                                        <property name="use_underline">True</property>
 
1804
+                                        <property name="draw_indicator">True</property>
 
1805
+                                      </object>
 
1806
+                                      <packing>
 
1807
+                                        <property name="expand">True</property>
 
1808
+                                        <property name="fill">True</property>
 
1809
+                                        <property name="position">0</property>
 
1810
+                                      </packing>
 
1811
+                                    </child>
 
1812
+                                    <child>
 
1813
+                                      <object class="GtkCheckButton" id="synaptics-tap-to-click">
 
1814
+                                        <property name="label" translatable="yes">T_ap touchpad to click</property>
 
1815
+                                        <property name="visible">True</property>
 
1816
+                                        <property name="can_focus">True</property>
 
1817
+                                        <property name="receives_default">False</property>
 
1818
+                                        <property name="use_action_appearance">False</property>
 
1819
+                                        <property name="use_underline">True</property>
 
1820
+                                        <property name="draw_indicator">True</property>
 
1821
+                                      </object>
 
1822
+                                      <packing>
 
1823
+                                        <property name="expand">True</property>
 
1824
+                                        <property name="fill">True</property>
 
1825
+                                        <property name="position">1</property>
 
1826
+                                      </packing>
 
1827
+                                    </child>
 
1828
                                   </object>
 
1829
-                                  <packing>
 
1830
-                                    <property name="position">3</property>
 
1831
-                                  </packing>
 
1832
                                 </child>
 
1833
+                              </object>
 
1834
+                            </child>
 
1835
+                            <child type="label">
 
1836
+                              <object class="GtkLabel" id="label16">
 
1837
+                                <property name="visible">True</property>
 
1838
+                                <property name="can_focus">False</property>
 
1839
+                                <property name="label" translatable="yes">General</property>
 
1840
+                                <property name="use_markup">True</property>
 
1841
+                                <attributes>
 
1842
+                                  <attribute name="weight" value="bold"/>
 
1843
+                                </attributes>
 
1844
+                              </object>
 
1845
+                            </child>
 
1846
+                          </object>
 
1847
+                          <packing>
 
1848
+                            <property name="expand">False</property>
 
1849
+                            <property name="fill">True</property>
 
1850
+                            <property name="position">0</property>
 
1851
+                          </packing>
 
1852
+                        </child>
 
1853
+                        <child>
 
1854
+                          <object class="GtkFrame" id="frame10">
 
1855
+                            <property name="visible">True</property>
 
1856
+                            <property name="can_focus">False</property>
 
1857
+                            <property name="label_xalign">0</property>
 
1858
+                            <property name="shadow_type">none</property>
 
1859
+                            <child>
 
1860
+                              <object class="GtkAlignment" id="alignment12">
 
1861
+                                <property name="visible">True</property>
 
1862
+                                <property name="can_focus">False</property>
 
1863
+                                <property name="left_padding">12</property>
 
1864
                                 <child>
 
1865
-                                  <object class="GtkAlignment" id="alignment7">
 
1866
+                                  <object class="GtkVBox" id="vbox10">
 
1867
                                     <property name="visible">True</property>
 
1868
-                                    <property name="xalign">0</property>
 
1869
-                                    <property name="xscale">0</property>
 
1870
+                                    <property name="can_focus">False</property>
 
1871
+                                    <property name="border_width">6</property>
 
1872
+                                    <property name="spacing">6</property>
 
1873
                                     <child>
 
1874
-                                      <object class="GtkButton" id="mouse-reset">
 
1875
-                                        <property name="label" translatable="yes">Re_set to Defaults</property>
 
1876
+                                      <object class="GtkHBox" id="hbox4">
 
1877
+                                        <property name="visible">True</property>
 
1878
+                                        <property name="can_focus">False</property>
 
1879
+                                        <property name="spacing">12</property>
 
1880
+                                        <child>
 
1881
+                                          <object class="GtkRadioButton" id="synaptics-scroll-no">
 
1882
+                                            <property name="label" translatable="yes">Di_sabled</property>
 
1883
+                                            <property name="visible">True</property>
 
1884
+                                            <property name="can_focus">True</property>
 
1885
+                                            <property name="receives_default">False</property>
 
1886
+                                            <property name="use_action_appearance">False</property>
 
1887
+                                            <property name="use_underline">True</property>
 
1888
+                                            <property name="active">True</property>
 
1889
+                                            <property name="draw_indicator">True</property>
 
1890
+                                          </object>
 
1891
+                                          <packing>
 
1892
+                                            <property name="expand">False</property>
 
1893
+                                            <property name="fill">True</property>
 
1894
+                                            <property name="position">0</property>
 
1895
+                                          </packing>
 
1896
+                                        </child>
 
1897
+                                        <child>
 
1898
+                                          <object class="GtkRadioButton" id="synaptics-scroll-edge">
 
1899
+                                            <property name="label" translatable="yes">Edge scro_lling</property>
 
1900
+                                            <property name="visible">True</property>
 
1901
+                                            <property name="can_focus">True</property>
 
1902
+                                            <property name="receives_default">False</property>
 
1903
+                                            <property name="use_action_appearance">False</property>
 
1904
+                                            <property name="use_underline">True</property>
 
1905
+                                            <property name="draw_indicator">True</property>
 
1906
+                                            <property name="group">synaptics-scroll-no</property>
 
1907
+                                          </object>
 
1908
+                                          <packing>
 
1909
+                                            <property name="expand">False</property>
 
1910
+                                            <property name="fill">True</property>
 
1911
+                                            <property name="position">1</property>
 
1912
+                                          </packing>
 
1913
+                                        </child>
 
1914
+                                        <child>
 
1915
+                                          <object class="GtkRadioButton" id="synaptics-scroll-two">
 
1916
+                                            <property name="label" translatable="yes">Two-_finger scrolling</property>
 
1917
+                                            <property name="visible">True</property>
 
1918
+                                            <property name="can_focus">True</property>
 
1919
+                                            <property name="receives_default">False</property>
 
1920
+                                            <property name="use_action_appearance">False</property>
 
1921
+                                            <property name="use_underline">True</property>
 
1922
+                                            <property name="draw_indicator">True</property>
 
1923
+                                            <property name="group">synaptics-scroll-no</property>
 
1924
+                                          </object>
 
1925
+                                          <packing>
 
1926
+                                            <property name="expand">True</property>
 
1927
+                                            <property name="fill">True</property>
 
1928
+                                            <property name="position">2</property>
 
1929
+                                          </packing>
 
1930
+                                        </child>
 
1931
+                                      </object>
 
1932
+                                      <packing>
 
1933
+                                        <property name="expand">True</property>
 
1934
+                                        <property name="fill">True</property>
 
1935
+                                        <property name="position">0</property>
 
1936
+                                      </packing>
 
1937
+                                    </child>
 
1938
+                                    <child>
 
1939
+                                      <object class="GtkCheckButton" id="synaptics-scroll-horiz">
 
1940
+                                        <property name="label" translatable="yes">Enable hori_zontal scrolling</property>
 
1941
                                         <property name="visible">True</property>
 
1942
                                         <property name="can_focus">True</property>
 
1943
-                                        <property name="receives_default">True</property>
 
1944
-                                        <property name="tooltip_text" translatable="yes">Set the acceleration and threshold for the selected device to the default values</property>
 
1945
-                                        <property name="image">image1</property>
 
1946
+                                        <property name="receives_default">False</property>
 
1947
+                                        <property name="use_action_appearance">False</property>
 
1948
                                         <property name="use_underline">True</property>
 
1949
+                                        <property name="draw_indicator">True</property>
 
1950
                                       </object>
 
1951
+                                      <packing>
 
1952
+                                        <property name="expand">True</property>
 
1953
+                                        <property name="fill">True</property>
 
1954
+                                        <property name="position">1</property>
 
1955
+                                      </packing>
 
1956
                                     </child>
 
1957
                                   </object>
 
1958
-                                  <packing>
 
1959
-                                    <property name="position">4</property>
 
1960
-                                  </packing>
 
1961
                                 </child>
 
1962
                               </object>
 
1963
                             </child>
 
1964
+                            <child type="label">
 
1965
+                              <object class="GtkLabel" id="label17">
 
1966
+                                <property name="visible">True</property>
 
1967
+                                <property name="can_focus">False</property>
 
1968
+                                <property name="label" translatable="yes">Scrolling</property>
 
1969
+                                <property name="use_markup">True</property>
 
1970
+                                <attributes>
 
1971
+                                  <attribute name="weight" value="bold"/>
 
1972
+                                </attributes>
 
1973
+                              </object>
 
1974
+                            </child>
 
1975
                           </object>
 
1976
+                          <packing>
 
1977
+                            <property name="expand">False</property>
 
1978
+                            <property name="fill">True</property>
 
1979
+                            <property name="position">1</property>
 
1980
+                          </packing>
 
1981
                         </child>
 
1982
-                        <child type="label">
 
1983
-                          <object class="GtkLabel" id="label5">
 
1984
+                      </object>
 
1985
+                      <packing>
 
1986
+                        <property name="position">1</property>
 
1987
+                      </packing>
 
1988
+                    </child>
 
1989
+                    <child type="tab">
 
1990
+                      <object class="GtkLabel" id="synaptics-label">
 
1991
+                        <property name="visible">True</property>
 
1992
+                        <property name="can_focus">False</property>
 
1993
+                        <property name="label" translatable="yes">T_ouchpad</property>
 
1994
+                        <property name="use_underline">True</property>
 
1995
+                      </object>
 
1996
+                      <packing>
 
1997
+                        <property name="position">1</property>
 
1998
+                        <property name="tab_fill">False</property>
 
1999
+                      </packing>
 
2000
+                    </child>
 
2001
+                    <child>
 
2002
+                      <object class="GtkVBox" id="wacom-tab">
 
2003
+                        <property name="visible">True</property>
 
2004
+                        <property name="can_focus">False</property>
 
2005
+                        <property name="border_width">6</property>
 
2006
+                        <property name="spacing">6</property>
 
2007
+                        <child>
 
2008
+                          <object class="GtkFrame" id="frame12">
 
2009
                             <property name="visible">True</property>
 
2010
-                            <property name="label" translatable="yes">Feedback</property>
 
2011
-                            <attributes>
 
2012
-                              <attribute name="weight" value="bold"/>
 
2013
-                            </attributes>
 
2014
+                            <property name="can_focus">False</property>
 
2015
+                            <property name="label_xalign">0</property>
 
2016
+                            <property name="shadow_type">none</property>
 
2017
+                            <child>
 
2018
+                              <object class="GtkAlignment" id="alignment14">
 
2019
+                                <property name="visible">True</property>
 
2020
+                                <property name="can_focus">False</property>
 
2021
+                                <property name="left_padding">12</property>
 
2022
+                                <child>
 
2023
+                                  <object class="GtkTable" id="table2">
 
2024
+                                    <property name="visible">True</property>
 
2025
+                                    <property name="can_focus">False</property>
 
2026
+                                    <property name="border_width">6</property>
 
2027
+                                    <property name="n_rows">2</property>
 
2028
+                                    <property name="n_columns">2</property>
 
2029
+                                    <property name="column_spacing">12</property>
 
2030
+                                    <property name="row_spacing">6</property>
 
2031
+                                    <child>
 
2032
+                                      <object class="GtkLabel" id="label9">
 
2033
+                                        <property name="visible">True</property>
 
2034
+                                        <property name="can_focus">False</property>
 
2035
+                                        <property name="xalign">0</property>
 
2036
+                                        <property name="label" translatable="yes">Tr_acking mode:</property>
 
2037
+                                        <property name="use_underline">True</property>
 
2038
+                                        <property name="mnemonic_widget">wacom-mode</property>
 
2039
+                                      </object>
 
2040
+                                      <packing>
 
2041
+                                        <property name="x_options">GTK_FILL</property>
 
2042
+                                      </packing>
 
2043
+                                    </child>
 
2044
+                                    <child>
 
2045
+                                      <object class="GtkLabel" id="label10">
 
2046
+                                        <property name="visible">True</property>
 
2047
+                                        <property name="can_focus">False</property>
 
2048
+                                        <property name="xalign">0</property>
 
2049
+                                        <property name="label" translatable="yes">_Rotation:</property>
 
2050
+                                        <property name="use_underline">True</property>
 
2051
+                                        <property name="mnemonic_widget">wacom-rotation</property>
 
2052
+                                      </object>
 
2053
+                                      <packing>
 
2054
+                                        <property name="top_attach">1</property>
 
2055
+                                        <property name="bottom_attach">2</property>
 
2056
+                                        <property name="x_options">GTK_FILL</property>
 
2057
+                                      </packing>
 
2058
+                                    </child>
 
2059
+                                    <child>
 
2060
+                                      <object class="GtkComboBox" id="wacom-mode">
 
2061
+                                        <property name="visible">True</property>
 
2062
+                                        <property name="can_focus">False</property>
 
2063
+                                        <property name="model">wacom-mode-store</property>
 
2064
+                                        <child>
 
2065
+                                          <object class="GtkCellRendererText" id="cellrenderertext1"/>
 
2066
+                                          <attributes>
 
2067
+                                            <attribute name="text">1</attribute>
 
2068
+                                          </attributes>
 
2069
+                                        </child>
 
2070
+                                      </object>
 
2071
+                                      <packing>
 
2072
+                                        <property name="left_attach">1</property>
 
2073
+                                        <property name="right_attach">2</property>
 
2074
+                                      </packing>
 
2075
+                                    </child>
 
2076
+                                    <child>
 
2077
+                                      <object class="GtkComboBox" id="wacom-rotation">
 
2078
+                                        <property name="visible">True</property>
 
2079
+                                        <property name="can_focus">False</property>
 
2080
+                                        <property name="model">wacom-rotation-store</property>
 
2081
+                                        <child>
 
2082
+                                          <object class="GtkCellRendererText" id="cellrenderertext2"/>
 
2083
+                                          <attributes>
 
2084
+                                            <attribute name="text">1</attribute>
 
2085
+                                          </attributes>
 
2086
+                                        </child>
 
2087
+                                      </object>
 
2088
+                                      <packing>
 
2089
+                                        <property name="left_attach">1</property>
 
2090
+                                        <property name="right_attach">2</property>
 
2091
+                                        <property name="top_attach">1</property>
 
2092
+                                        <property name="bottom_attach">2</property>
 
2093
+                                      </packing>
 
2094
+                                    </child>
 
2095
+                                  </object>
 
2096
+                                </child>
 
2097
+                              </object>
 
2098
+                            </child>
 
2099
+                            <child type="label">
 
2100
+                              <object class="GtkLabel" id="label18">
 
2101
+                                <property name="visible">True</property>
 
2102
+                                <property name="can_focus">False</property>
 
2103
+                                <property name="label" translatable="yes">General</property>
 
2104
+                                <property name="use_markup">True</property>
 
2105
+                                <attributes>
 
2106
+                                  <attribute name="weight" value="bold"/>
 
2107
+                                </attributes>
 
2108
+                              </object>
 
2109
+                            </child>
 
2110
                           </object>
 
2111
+                          <packing>
 
2112
+                            <property name="expand">False</property>
 
2113
+                            <property name="fill">True</property>
 
2114
+                            <property name="position">0</property>
 
2115
+                          </packing>
 
2116
                         </child>
 
2117
                       </object>
 
2118
                       <packing>
 
2119
-                        <property name="expand">False</property>
 
2120
-                        <property name="position">1</property>
 
2121
+                        <property name="position">2</property>
 
2122
+                      </packing>
 
2123
+                    </child>
 
2124
+                    <child type="tab">
 
2125
+                      <object class="GtkLabel" id="wacom-label">
 
2126
+                        <property name="visible">True</property>
 
2127
+                        <property name="can_focus">False</property>
 
2128
+                        <property name="label" translatable="yes">Table_t</property>
 
2129
+                        <property name="use_underline">True</property>
 
2130
+                      </object>
 
2131
+                      <packing>
 
2132
+                        <property name="position">2</property>
 
2133
+                        <property name="tab_fill">False</property>
 
2134
                       </packing>
 
2135
                     </child>
 
2136
                   </object>
 
2137
                   <packing>
 
2138
-                    <property name="position">1</property>
 
2139
+                    <property name="expand">True</property>
 
2140
+                    <property name="fill">True</property>
 
2141
+                    <property name="position">2</property>
 
2142
                   </packing>
 
2143
                 </child>
 
2144
               </object>
 
2145
@@ -286,7 +754,8 @@
 
2146
             <child type="tab">
 
2147
               <object class="GtkLabel" id="label1">
 
2148
                 <property name="visible">True</property>
 
2149
-                <property name="label" translatable="yes">De_vices</property>
 
2150
+                <property name="can_focus">False</property>
 
2151
+                <property name="label" translatable="yes">_Devices</property>
 
2152
                 <property name="use_underline">True</property>
 
2153
               </object>
 
2154
               <packing>
 
2155
@@ -296,48 +765,54 @@
 
2156
             <child>
 
2157
               <object class="GtkVBox" id="vbox3">
 
2158
                 <property name="visible">True</property>
 
2159
+                <property name="can_focus">False</property>
 
2160
                 <property name="border_width">12</property>
 
2161
-                <property name="orientation">vertical</property>
 
2162
                 <property name="spacing">6</property>
 
2163
                 <child>
 
2164
                   <object class="GtkFrame" id="frame3">
 
2165
                     <property name="visible">True</property>
 
2166
+                    <property name="can_focus">False</property>
 
2167
                     <property name="label_xalign">0</property>
 
2168
                     <property name="shadow_type">none</property>
 
2169
                     <child>
 
2170
                       <object class="GtkAlignment" id="alignment3">
 
2171
                         <property name="visible">True</property>
 
2172
-                        <property name="bottom_padding">6</property>
 
2173
+                        <property name="can_focus">False</property>
 
2174
                         <property name="left_padding">12</property>
 
2175
                         <child>
 
2176
                           <object class="GtkVBox" id="vbox4">
 
2177
                             <property name="visible">True</property>
 
2178
+                            <property name="can_focus">False</property>
 
2179
                             <property name="border_width">6</property>
 
2180
-                            <property name="orientation">vertical</property>
 
2181
                             <property name="spacing">6</property>
 
2182
                             <child>
 
2183
                               <object class="GtkLabel" id="mouse-dnd-label">
 
2184
                                 <property name="visible">True</property>
 
2185
+                                <property name="can_focus">False</property>
 
2186
                                 <property name="xalign">0</property>
 
2187
-                                <property name="label" translatable="yes">T_hreshold:</property>
 
2188
+                                <property name="label" translatable="yes">Th_reshold:</property>
 
2189
                                 <property name="use_underline">True</property>
 
2190
-                                <property name="mnemonic_widget">mouse-dnd-widget</property>
 
2191
+                                <property name="mnemonic_widget">dnd-threshold-scale</property>
 
2192
                               </object>
 
2193
                               <packing>
 
2194
+                                <property name="expand">True</property>
 
2195
+                                <property name="fill">True</property>
 
2196
                                 <property name="position">0</property>
 
2197
                               </packing>
 
2198
                             </child>
 
2199
                             <child>
 
2200
-                              <object class="GtkHScale" id="mouse-dnd-widget">
 
2201
+                              <object class="GtkHScale" id="dnd-threshold-scale">
 
2202
                                 <property name="visible">True</property>
 
2203
                                 <property name="can_focus">True</property>
 
2204
                                 <property name="tooltip_text" translatable="yes">The number of pixels the pointer must move before a drag operation will start</property>
 
2205
                                 <property name="update_policy">delayed</property>
 
2206
-                                <property name="adjustment">mouse-dnd-threshold</property>
 
2207
+                                <property name="adjustment">dnd-threshold</property>
 
2208
                                 <property name="digits">0</property>
 
2209
                                 <property name="value_pos">right</property>
 
2210
                               </object>
 
2211
                               <packing>
 
2212
+                                <property name="expand">True</property>
 
2213
+                                <property name="fill">True</property>
 
2214
                                 <property name="position">1</property>
 
2215
                               </packing>
 
2216
                             </child>
 
2217
@@ -348,6 +823,7 @@
 
2218
                     <child type="label">
 
2219
                       <object class="GtkLabel" id="label6">
 
2220
                         <property name="visible">True</property>
 
2221
+                        <property name="can_focus">False</property>
 
2222
                         <property name="label" translatable="yes">Drag and Drop</property>
 
2223
                         <attributes>
 
2224
                           <attribute name="weight" value="bold"/>
 
2225
@@ -357,74 +833,86 @@
 
2226
                   </object>
 
2227
                   <packing>
 
2228
                     <property name="expand">False</property>
 
2229
+                    <property name="fill">True</property>
 
2230
                     <property name="position">0</property>
 
2231
                   </packing>
 
2232
                 </child>
 
2233
                 <child>
 
2234
                   <object class="GtkFrame" id="frame4">
 
2235
                     <property name="visible">True</property>
 
2236
+                    <property name="can_focus">False</property>
 
2237
                     <property name="label_xalign">0</property>
 
2238
                     <property name="shadow_type">none</property>
 
2239
                     <child>
 
2240
                       <object class="GtkAlignment" id="alignment4">
 
2241
                         <property name="visible">True</property>
 
2242
-                        <property name="border_width">6</property>
 
2243
-                        <property name="bottom_padding">6</property>
 
2244
+                        <property name="can_focus">False</property>
 
2245
                         <property name="left_padding">12</property>
 
2246
                         <child>
 
2247
                           <object class="GtkVBox" id="vbox5">
 
2248
                             <property name="visible">True</property>
 
2249
-                            <property name="orientation">vertical</property>
 
2250
+                            <property name="can_focus">False</property>
 
2251
+                            <property name="border_width">6</property>
 
2252
                             <property name="spacing">6</property>
 
2253
                             <child>
 
2254
-                              <object class="GtkLabel" id="mouse-double-click-time-label">
 
2255
+                              <object class="GtkLabel" id="dclick-time-label">
 
2256
                                 <property name="visible">True</property>
 
2257
+                                <property name="can_focus">False</property>
 
2258
                                 <property name="xalign">0</property>
 
2259
                                 <property name="label" translatable="yes">Ti_me:</property>
 
2260
                                 <property name="use_underline">True</property>
 
2261
-                                <property name="mnemonic_widget">mouse-double-click-time-widget</property>
 
2262
+                                <property name="mnemonic_widget">dclick-time-scale</property>
 
2263
                               </object>
 
2264
                               <packing>
 
2265
+                                <property name="expand">True</property>
 
2266
+                                <property name="fill">True</property>
 
2267
                                 <property name="position">0</property>
 
2268
                               </packing>
 
2269
                             </child>
 
2270
                             <child>
 
2271
-                              <object class="GtkHScale" id="mouse-double-click-time-widget">
 
2272
+                              <object class="GtkHScale" id="dclick-time-scale">
 
2273
                                 <property name="visible">True</property>
 
2274
                                 <property name="can_focus">True</property>
 
2275
                                 <property name="tooltip_text" translatable="yes">Two mouse clicks in less than this length of time (in milliseconds) will be considered a double click</property>
 
2276
                                 <property name="update_policy">delayed</property>
 
2277
-                                <property name="adjustment">mouse-double-click-time</property>
 
2278
+                                <property name="adjustment">dclick-time</property>
 
2279
                                 <property name="digits">0</property>
 
2280
                                 <property name="value_pos">right</property>
 
2281
                               </object>
 
2282
                               <packing>
 
2283
+                                <property name="expand">True</property>
 
2284
+                                <property name="fill">True</property>
 
2285
                                 <property name="position">1</property>
 
2286
                               </packing>
 
2287
                             </child>
 
2288
                             <child>
 
2289
-                              <object class="GtkLabel" id="mouse-double-click-distance-label">
 
2290
+                              <object class="GtkLabel" id="dclick-distance-label">
 
2291
                                 <property name="visible">True</property>
 
2292
+                                <property name="can_focus">False</property>
 
2293
                                 <property name="xalign">0</property>
 
2294
-                                <property name="label" translatable="yes">_Distance:</property>
 
2295
+                                <property name="label" translatable="yes">D_istance:</property>
 
2296
                                 <property name="use_underline">True</property>
 
2297
-                                <property name="mnemonic_widget">mouse-double-click-distance-widget</property>
 
2298
+                                <property name="mnemonic_widget">dclick-distance-scale</property>
 
2299
                               </object>
 
2300
                               <packing>
 
2301
+                                <property name="expand">True</property>
 
2302
+                                <property name="fill">True</property>
 
2303
                                 <property name="position">2</property>
 
2304
                               </packing>
 
2305
                             </child>
 
2306
                             <child>
 
2307
-                              <object class="GtkHScale" id="mouse-double-click-distance-widget">
 
2308
+                              <object class="GtkHScale" id="dclick-distance-scale">
 
2309
                                 <property name="visible">True</property>
 
2310
                                 <property name="can_focus">True</property>
 
2311
                                 <property name="tooltip_text" translatable="yes">The mouse pointer cannot move farther than this distance between two clicks for them to be considered a double click</property>
 
2312
                                 <property name="update_policy">delayed</property>
 
2313
-                                <property name="adjustment">mouse-double-click-distance</property>
 
2314
+                                <property name="adjustment">dclick-distance</property>
 
2315
                                 <property name="digits">0</property>
 
2316
                                 <property name="value_pos">right</property>
 
2317
                               </object>
 
2318
                               <packing>
 
2319
+                                <property name="expand">True</property>
 
2320
+                                <property name="fill">True</property>
 
2321
                                 <property name="position">3</property>
 
2322
                               </packing>
 
2323
                             </child>
 
2324
@@ -435,6 +923,7 @@
 
2325
                     <child type="label">
 
2326
                       <object class="GtkLabel" id="label8">
 
2327
                         <property name="visible">True</property>
 
2328
+                        <property name="can_focus">False</property>
 
2329
                         <property name="label" translatable="yes">Double Click</property>
 
2330
                         <attributes>
 
2331
                           <attribute name="weight" value="bold"/>
 
2332
@@ -444,6 +933,7 @@
 
2333
                   </object>
 
2334
                   <packing>
 
2335
                     <property name="expand">False</property>
 
2336
+                    <property name="fill">True</property>
 
2337
                     <property name="position">1</property>
 
2338
                   </packing>
 
2339
                 </child>
 
2340
@@ -455,6 +945,7 @@
 
2341
             <child type="tab">
 
2342
               <object class="GtkLabel" id="label2">
 
2343
                 <property name="visible">True</property>
 
2344
+                <property name="can_focus">False</property>
 
2345
                 <property name="label" translatable="yes">_Behavior</property>
 
2346
                 <property name="use_underline">True</property>
 
2347
               </object>
 
2348
@@ -464,8 +955,9 @@
 
2349
               </packing>
 
2350
             </child>
 
2351
             <child>
 
2352
-              <object class="GtkHBox" id="mouse-themes-hbox">
 
2353
+              <object class="GtkHBox" id="themes-hbox">
 
2354
                 <property name="visible">True</property>
 
2355
+                <property name="can_focus">False</property>
 
2356
                 <property name="border_width">12</property>
 
2357
                 <property name="spacing">12</property>
 
2358
                 <child>
 
2359
@@ -476,7 +968,7 @@
 
2360
                     <property name="vscrollbar_policy">automatic</property>
 
2361
                     <property name="shadow_type">etched-in</property>
 
2362
                     <child>
 
2363
-                      <object class="GtkTreeView" id="mouse-theme-treeview">
 
2364
+                      <object class="GtkTreeView" id="theme-treeview">
 
2365
                         <property name="width_request">200</property>
 
2366
                         <property name="visible">True</property>
 
2367
                         <property name="can_focus">True</property>
 
2368
@@ -485,51 +977,62 @@
 
2369
                     </child>
 
2370
                   </object>
 
2371
                   <packing>
 
2372
+                    <property name="expand">True</property>
 
2373
+                    <property name="fill">True</property>
 
2374
                     <property name="position">0</property>
 
2375
                   </packing>
 
2376
                 </child>
 
2377
                 <child>
 
2378
                   <object class="GtkVBox" id="vbox9">
 
2379
                     <property name="visible">True</property>
 
2380
-                    <property name="orientation">vertical</property>
 
2381
+                    <property name="can_focus">False</property>
 
2382
                     <property name="spacing">6</property>
 
2383
                     <child>
 
2384
                       <object class="GtkFrame" id="frame5">
 
2385
                         <property name="visible">True</property>
 
2386
+                        <property name="can_focus">False</property>
 
2387
                         <property name="label_xalign">0</property>
 
2388
                         <property name="shadow_type">none</property>
 
2389
                         <child>
 
2390
                           <object class="GtkAlignment" id="alignment5">
 
2391
                             <property name="visible">True</property>
 
2392
-                            <property name="border_width">6</property>
 
2393
-                            <property name="bottom_padding">6</property>
 
2394
+                            <property name="can_focus">False</property>
 
2395
                             <property name="left_padding">12</property>
 
2396
                             <child>
 
2397
                               <object class="GtkHBox" id="hbox7">
 
2398
                                 <property name="visible">True</property>
 
2399
+                                <property name="can_focus">False</property>
 
2400
+                                <property name="border_width">6</property>
 
2401
                                 <property name="spacing">12</property>
 
2402
                                 <child>
 
2403
                                   <object class="GtkLabel" id="label21">
 
2404
                                     <property name="visible">True</property>
 
2405
-                                    <property name="label" translatable="yes">Cursor _Size:</property>
 
2406
+                                    <property name="can_focus">False</property>
 
2407
+                                    <property name="label" translatable="yes">Cursor _size:</property>
 
2408
                                     <property name="use_underline">True</property>
 
2409
-                                    <property name="mnemonic_widget">mouse-cursor-size</property>
 
2410
+                                    <property name="mnemonic_widget">spin1</property>
 
2411
                                   </object>
 
2412
                                   <packing>
 
2413
                                     <property name="expand">False</property>
 
2414
+                                    <property name="fill">True</property>
 
2415
                                     <property name="position">0</property>
 
2416
                                   </packing>
 
2417
                                 </child>
 
2418
                                 <child>
 
2419
-                                  <object class="GtkSpinButton" id="mouse-cursor-size">
 
2420
+                                  <object class="GtkSpinButton" id="spin1">
 
2421
                                     <property name="visible">True</property>
 
2422
                                     <property name="can_focus">True</property>
 
2423
-                                    <property name="adjustment">adjustment6</property>
 
2424
+                                    <property name="primary_icon_activatable">False</property>
 
2425
+                                    <property name="secondary_icon_activatable">False</property>
 
2426
+                                    <property name="primary_icon_sensitive">True</property>
 
2427
+                                    <property name="secondary_icon_sensitive">True</property>
 
2428
+                                    <property name="adjustment">theme-cursor-size</property>
 
2429
                                     <property name="snap_to_ticks">True</property>
 
2430
                                     <property name="numeric">True</property>
 
2431
                                   </object>
 
2432
                                   <packing>
 
2433
                                     <property name="expand">False</property>
 
2434
+                                    <property name="fill">True</property>
 
2435
                                     <property name="position">1</property>
 
2436
                                   </packing>
 
2437
                                 </child>
 
2438
@@ -540,6 +1043,7 @@
 
2439
                         <child type="label">
 
2440
                           <object class="GtkLabel" id="label20">
 
2441
                             <property name="visible">True</property>
 
2442
+                            <property name="can_focus">False</property>
 
2443
                             <property name="label" translatable="yes">Size</property>
 
2444
                             <attributes>
 
2445
                               <attribute name="weight" value="bold"/>
 
2446
@@ -549,23 +1053,33 @@
 
2447
                       </object>
 
2448
                       <packing>
 
2449
                         <property name="expand">False</property>
 
2450
+                        <property name="fill">True</property>
 
2451
                         <property name="position">0</property>
 
2452
                       </packing>
 
2453
                     </child>
 
2454
                     <child>
 
2455
                       <object class="GtkFrame" id="frame6">
 
2456
                         <property name="visible">True</property>
 
2457
+                        <property name="can_focus">False</property>
 
2458
                         <property name="label_xalign">0</property>
 
2459
                         <property name="shadow_type">none</property>
 
2460
                         <child>
 
2461
                           <object class="GtkAlignment" id="alignment6">
 
2462
                             <property name="visible">True</property>
 
2463
+                            <property name="can_focus">False</property>
 
2464
                             <property name="border_width">6</property>
 
2465
+                            <property name="xalign">0</property>
 
2466
+                            <property name="yalign">0</property>
 
2467
+                            <property name="xscale">0</property>
 
2468
+                            <property name="yscale">0</property>
 
2469
+                            <property name="top_padding">6</property>
 
2470
                             <property name="bottom_padding">6</property>
 
2471
-                            <property name="left_padding">12</property>
 
2472
+                            <property name="left_padding">18</property>
 
2473
+                            <property name="right_padding">6</property>
 
2474
                             <child>
 
2475
-                              <object class="GtkImage" id="mouse-theme-preview">
 
2476
+                              <object class="GtkImage" id="theme-preview">
 
2477
                                 <property name="visible">True</property>
 
2478
+                                <property name="can_focus">False</property>
 
2479
                                 <property name="stock">gtk-missing-image</property>
 
2480
                               </object>
 
2481
                             </child>
 
2482
@@ -574,6 +1088,7 @@
 
2483
                         <child type="label">
 
2484
                           <object class="GtkLabel" id="label22">
 
2485
                             <property name="visible">True</property>
 
2486
+                            <property name="can_focus">False</property>
 
2487
                             <property name="label" translatable="yes">Preview</property>
 
2488
                             <attributes>
 
2489
                               <attribute name="weight" value="bold"/>
 
2490
@@ -583,12 +1098,14 @@
 
2491
                       </object>
 
2492
                       <packing>
 
2493
                         <property name="expand">False</property>
 
2494
+                        <property name="fill">True</property>
 
2495
                         <property name="position">1</property>
 
2496
                       </packing>
 
2497
                     </child>
 
2498
                   </object>
 
2499
                   <packing>
 
2500
                     <property name="expand">False</property>
 
2501
+                    <property name="fill">True</property>
 
2502
                     <property name="position">1</property>
 
2503
                   </packing>
 
2504
                 </child>
 
2505
@@ -600,7 +1117,8 @@
 
2506
             <child type="tab">
 
2507
               <object class="GtkLabel" id="label3">
 
2508
                 <property name="visible">True</property>
 
2509
-                <property name="label" translatable="yes">_Theme</property>
 
2510
+                <property name="can_focus">False</property>
 
2511
+                <property name="label" translatable="yes">T_heme</property>
 
2512
                 <property name="use_underline">True</property>
 
2513
               </object>
 
2514
               <packing>
 
2515
@@ -610,42 +1128,66 @@
 
2516
             </child>
 
2517
           </object>
 
2518
           <packing>
 
2519
+            <property name="expand">True</property>
 
2520
+            <property name="fill">True</property>
 
2521
             <property name="position">1</property>
 
2522
           </packing>
 
2523
         </child>
 
2524
-        <child internal-child="action_area">
 
2525
-          <object class="GtkHButtonBox" id="dialog-action_area1">
 
2526
-            <property name="visible">True</property>
 
2527
-            <property name="layout_style">end</property>
 
2528
-            <child>
 
2529
-              <object class="GtkButton" id="button1">
 
2530
-                <property name="label">gtk-close</property>
 
2531
-                <property name="visible">True</property>
 
2532
-                <property name="can_focus">True</property>
 
2533
-                <property name="receives_default">True</property>
 
2534
-                <property name="use_stock">True</property>
 
2535
-              </object>
 
2536
-              <packing>
 
2537
-                <property name="expand">False</property>
 
2538
-                <property name="fill">False</property>
 
2539
-                <property name="position">0</property>
 
2540
-              </packing>
 
2541
-            </child>
 
2542
-          </object>
 
2543
-          <packing>
 
2544
-            <property name="expand">False</property>
 
2545
-            <property name="pack_type">end</property>
 
2546
-            <property name="position">0</property>
 
2547
-          </packing>
 
2548
-        </child>
 
2549
       </object>
 
2550
     </child>
 
2551
     <action-widgets>
 
2552
       <action-widget response="0">button1</action-widget>
 
2553
     </action-widgets>
 
2554
   </object>
 
2555
-  <object class="GtkImage" id="image1">
 
2556
-    <property name="visible">True</property>
 
2557
-    <property name="stock">gtk-revert-to-saved</property>
 
2558
+  <object class="GtkAdjustment" id="theme-cursor-size">
 
2559
+    <property name="lower">16</property>
 
2560
+    <property name="upper">48</property>
 
2561
+    <property name="value">24</property>
 
2562
+    <property name="step_increment">1</property>
 
2563
+    <property name="page_increment">11</property>
 
2564
+  </object>
 
2565
+  <object class="GtkListStore" id="wacom-mode-store">
 
2566
+    <columns>
 
2567
+      <!-- column-name mode -->
 
2568
+      <column type="gchararray"/>
 
2569
+      <!-- column-name title -->
 
2570
+      <column type="gchararray"/>
 
2571
+    </columns>
 
2572
+    <data>
 
2573
+      <row>
 
2574
+        <col id="0">ABSOLUTE</col>
 
2575
+        <col id="1" translatable="yes">Pen (absolute)</col>
 
2576
+      </row>
 
2577
+      <row>
 
2578
+        <col id="0">RELATIVE</col>
 
2579
+        <col id="1" translatable="yes">Mouse (relative)</col>
 
2580
+      </row>
 
2581
+    </data>
 
2582
+  </object>
 
2583
+  <object class="GtkListStore" id="wacom-rotation-store">
 
2584
+    <columns>
 
2585
+      <!-- column-name rotation -->
 
2586
+      <column type="gint"/>
 
2587
+      <!-- column-name title -->
 
2588
+      <column type="gchararray"/>
 
2589
+    </columns>
 
2590
+    <data>
 
2591
+      <row>
 
2592
+        <col id="0">0</col>
 
2593
+        <col id="1" translatable="yes">None (right-handed)</col>
 
2594
+      </row>
 
2595
+      <row>
 
2596
+        <col id="0">3</col>
 
2597
+        <col id="1" translatable="yes">Half (left-handed)</col>
 
2598
+      </row>
 
2599
+      <row>
 
2600
+        <col id="0">1</col>
 
2601
+        <col id="1" translatable="yes">Clockwise</col>
 
2602
+      </row>
 
2603
+      <row>
 
2604
+        <col id="0">2</col>
 
2605
+        <col id="1" translatable="yes">Counterclockwise</col>
 
2606
+      </row>
 
2607
+    </data>
 
2608
   </object>
 
2609
 </interface>
 
2610
--- xfce4-settings-4.8.3.orig/dialogs/mouse-settings/main.c
 
2611
+++ xfce4-settings-4.8.3/dialogs/mouse-settings/main.c
 
2612
@@ -1,7 +1,6 @@
 
2613
-/* $Id$ */
 
2614
 /*
 
2615
- *  Copyright (c) 2008 Nick Schermer <nick@xfce.org>
 
2616
- *                     Jannis Pohlmann <jannis@xfce.org>
 
2617
+ *  Copyright (c) 2008-2011 Nick Schermer <nick@xfce.org>
 
2618
+ *  Copyright (c) 2008      Jannis Pohlmann <jannis@xfce.org>
 
2619
  *
 
2620
  *  This program is free software; you can redistribute it and/or modify
 
2621
  *  it under the terms of the GNU General Public License as published by
 
2622
@@ -33,6 +32,7 @@
 
2623
 #endif
 
2624
 
 
2625
 #include <X11/Xlib.h>
 
2626
+#include <X11/Xatom.h>
 
2627
 #include <X11/extensions/XI.h>
 
2628
 #include <X11/extensions/XInput.h>
 
2629
 #include <X11/extensions/XIproto.h>
 
2630
@@ -79,9 +79,6 @@ XfconfChannel *pointers_channel;
 
2631
 /* lock counter to avoid signals during updates */
 
2632
 static gint locked = 0;
 
2633
 
 
2634
-/* the display for this window */
 
2635
-static GdkDisplay *display;
 
2636
-
 
2637
 /* device update id */
 
2638
 static guint timeout_id = 0;
 
2639
 
 
2640
@@ -129,15 +126,35 @@ enum
 
2641
 
 
2642
 enum
 
2643
 {
 
2644
-    COLUMN_DEVICE_ICON,
 
2645
     COLUMN_DEVICE_NAME,
 
2646
-    COLUMN_DEVICE_DISPLAY_NAME,
 
2647
+    COLUMN_DEVICE_XFCONF_NAME,
 
2648
     COLUMN_DEVICE_XID,
 
2649
-    COLUMN_DEVICE_NBUTTONS,
 
2650
     N_DEVICE_COLUMNS
 
2651
 };
 
2652
 
 
2653
 
 
2654
+
 
2655
+static gchar *
 
2656
+mouse_settings_format_value_px (GtkScale *scale,
 
2657
+                                gdouble   value)
 
2658
+{
 
2659
+   /* pixel value for some of the scales in the dialog */
 
2660
+   return g_strdup_printf (_("%g px"), value);
 
2661
+}
 
2662
+
 
2663
+
 
2664
+
 
2665
+static gchar *
 
2666
+mouse_settings_format_value_ms (GtkScale *scale,
 
2667
+                                gdouble   value)
 
2668
+{
 
2669
+   /* miliseconds value for some of the scales in the dialog */
 
2670
+   return g_strdup_printf (_("%g ms"), value);
 
2671
+}
 
2672
+
 
2673
+
 
2674
+
 
2675
+
 
2676
 #ifdef HAVE_XCURSOR
 
2677
 static GdkPixbuf *
 
2678
 mouse_settings_themes_pixbuf_from_filename (const gchar *filename,
 
2679
@@ -317,7 +334,7 @@ mouse_settings_themes_selection_changed
 
2680
                             COLUMN_THEME_NAME, &name, -1);
 
2681
 
 
2682
         /* update the preview widget */
 
2683
-        image = gtk_builder_get_object (builder, "mouse-theme-preview");
 
2684
+        image = gtk_builder_get_object (builder, "theme-preview");
 
2685
         mouse_settings_themes_preview_image (path, GTK_IMAGE (image));
 
2686
 
 
2687
         /* write configuration (not during a lock) */
 
2688
@@ -530,7 +547,7 @@ mouse_settings_themes_populate_store (Gt
 
2689
     g_free (active_theme);
 
2690
 
 
2691
     /* set the treeview store */
 
2692
-    treeview = gtk_builder_get_object (builder, "mouse-theme-treeview");
 
2693
+    treeview = gtk_builder_get_object (builder, "theme-treeview");
 
2694
     gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
 
2695
     gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), COLUMN_THEME_COMMENT);
 
2696
 
 
2697
@@ -565,56 +582,416 @@ mouse_settings_themes_populate_store (Gt
 
2698
 
 
2699
 
 
2700
 
 
2701
+static gint
 
2702
+mouse_settings_device_get_int_property (XDevice *device,
 
2703
+                                        Atom     prop,
 
2704
+                                        guint    offset,
 
2705
+                                        gint    *horiz)
 
2706
+{
 
2707
+    Atom     type;
 
2708
+    gint     format;
 
2709
+    gulong   n_items, bytes_after;
 
2710
+    guchar  *data;
 
2711
+    gint     val = -1;
 
2712
+    gint     res;
 
2713
+
 
2714
+    gdk_error_trap_push ();
 
2715
+    res = XGetDeviceProperty (GDK_DISPLAY (), device, prop, 0, 1000, False,
 
2716
+                              AnyPropertyType, &type, &format,
 
2717
+                              &n_items, &bytes_after, &data);
 
2718
+    if (gdk_error_trap_pop () == 0 && res == Success)
 
2719
+    {
 
2720
+        if (type == XA_INTEGER)
 
2721
+        {
 
2722
+            if (n_items > offset)
 
2723
+                val = data[offset];
 
2724
+
 
2725
+            if (n_items > 1 + offset && horiz != NULL)
 
2726
+                *horiz = data[offset + 1];
 
2727
+        }
 
2728
+
 
2729
+        XFree (data);
 
2730
+    }
 
2731
+
 
2732
+    return val;
 
2733
+}
 
2734
+
 
2735
+
 
2736
+
 
2737
+static gboolean
 
2738
+mouse_settings_device_get_selected (GtkBuilder  *builder,
 
2739
+                                    XDevice    **device,
 
2740
+                                    gchar      **xfconf_name)
 
2741
+{
 
2742
+    GObject      *combobox;
 
2743
+    GtkTreeIter   iter;
 
2744
+    gboolean      found = FALSE;
 
2745
+    gulong        xid;
 
2746
+    GtkTreeModel *model;
 
2747
+
 
2748
+    /* get the selected item */
 
2749
+    combobox = gtk_builder_get_object (builder, "device-combobox");
 
2750
+    found = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &iter);
 
2751
+    if (found)
 
2752
+    {
 
2753
+        /* get the device id  */
 
2754
+        model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
 
2755
+        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid, -1);
 
2756
+
 
2757
+        if (xfconf_name != NULL)
 
2758
+            gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XFCONF_NAME, xfconf_name, -1);
 
2759
+
 
2760
+        if (device != NULL)
 
2761
+        {
 
2762
+            /* open the device */
 
2763
+            gdk_error_trap_push ();
 
2764
+            *device = XOpenDevice (GDK_DISPLAY (), xid);
 
2765
+            if (gdk_error_trap_pop () != 0 || *device == NULL)
 
2766
+            {
 
2767
+                g_critical ("Unable to open device %ld", xid);
 
2768
+                *device = NULL;
 
2769
+                found = FALSE;
 
2770
+            }
 
2771
+        }
 
2772
+    }
 
2773
+
 
2774
+    return found;
 
2775
+}
 
2776
+
 
2777
+
 
2778
+
 
2779
 static void
 
2780
-mouse_settings_device_selection_changed (GtkTreeSelection *selection,
 
2781
-                                         GtkBuilder       *builder)
 
2782
+mouse_settings_wacom_set_rotation (GtkComboBox *combobox,
 
2783
+                                   GtkBuilder  *builder)
 
2784
+{
 
2785
+    XDevice      *device;
 
2786
+    GtkTreeIter   iter;
 
2787
+    GtkTreeModel *model;
 
2788
+    gint          rotation = 0;
 
2789
+    gchar        *name = NULL;
 
2790
+    gchar        *prop;
 
2791
+
 
2792
+    if (locked > 0)
 
2793
+        return;
 
2794
+
 
2795
+    if (mouse_settings_device_get_selected (builder, &device, &name))
 
2796
+    {
 
2797
+        if (gtk_combo_box_get_active_iter (combobox, &iter))
 
2798
+        {
 
2799
+            model = gtk_combo_box_get_model (combobox);
 
2800
+            gtk_tree_model_get (model, &iter, 0, &rotation, -1);
 
2801
+
 
2802
+            prop = g_strconcat ("/", name, "/Properties/Wacom_Rotation", NULL);
 
2803
+            xfconf_channel_set_int (pointers_channel, prop, rotation);
 
2804
+            g_free (prop);
 
2805
+        }
 
2806
+
 
2807
+        XCloseDevice (GDK_DISPLAY (), device);
 
2808
+    }
 
2809
+
 
2810
+    g_free (name);
 
2811
+}
 
2812
+
 
2813
+
 
2814
+
 
2815
+static void
 
2816
+mouse_settings_wacom_set_mode (GtkComboBox *combobox,
 
2817
+                               GtkBuilder  *builder)
 
2818
+{
 
2819
+    XDevice      *device;
 
2820
+    Display      *xdisplay = GDK_DISPLAY ();
 
2821
+    GtkTreeIter   iter;
 
2822
+    GtkTreeModel *model;
 
2823
+    gchar        *mode = NULL;
 
2824
+    gchar        *name = NULL;
 
2825
+    gchar        *prop;
 
2826
+
 
2827
+    if (locked > 0)
 
2828
+        return;
 
2829
+
 
2830
+    if (mouse_settings_device_get_selected (builder, &device, &name))
 
2831
+    {
 
2832
+        if (gtk_combo_box_get_active_iter (combobox, &iter))
 
2833
+        {
 
2834
+            model = gtk_combo_box_get_model (combobox);
 
2835
+            gtk_tree_model_get (model, &iter, 0, &mode, -1);
 
2836
+
 
2837
+            prop = g_strconcat ("/", name, "/Mode", NULL);
 
2838
+            xfconf_channel_set_string (pointers_channel, prop, mode);
 
2839
+            g_free (prop);
 
2840
+
 
2841
+            g_free (mode);
 
2842
+        }
 
2843
+
 
2844
+        XCloseDevice (xdisplay, device);
 
2845
+    }
 
2846
+
 
2847
+    g_free (name);
 
2848
+}
 
2849
+
 
2850
+
 
2851
+
 
2852
+static void
 
2853
+mouse_settings_synaptics_set_tap_to_click (GtkBuilder *builder)
 
2854
+{
 
2855
+    Display   *xdisplay = GDK_DISPLAY ();
 
2856
+    XDevice   *device;
 
2857
+    gchar     *name = NULL;
 
2858
+    Atom       tap_ation_prop;
 
2859
+    Atom       type;
 
2860
+    gint       format;
 
2861
+    gulong     n, n_items, bytes_after;
 
2862
+    guchar    *data;
 
2863
+    gboolean   tap_to_click;
 
2864
+    GPtrArray *array;
 
2865
+    gint       res;
 
2866
+    GObject   *object;
 
2867
+    gchar     *prop;
 
2868
+    GValue    *val;
 
2869
+
 
2870
+    if (mouse_settings_device_get_selected (builder, &device, &name))
 
2871
+    {
 
2872
+        gdk_error_trap_push ();
 
2873
+        tap_ation_prop = XInternAtom (xdisplay, "Synaptics Tap Action", True);
 
2874
+        res = XGetDeviceProperty (xdisplay, device, tap_ation_prop, 0, 1000, False,
 
2875
+                                  AnyPropertyType, &type, &format,
 
2876
+                                  &n_items, &bytes_after, &data);
 
2877
+        if (gdk_error_trap_pop () == 0
 
2878
+            && res == Success)
 
2879
+        {
 
2880
+            if (type == XA_INTEGER
 
2881
+                && format == 8
 
2882
+                && n_items >= 7)
 
2883
+            {
 
2884
+                object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
 
2885
+                tap_to_click = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
 
2886
+
 
2887
+                /* format: RT, RB, LT, LB, F1, F2, F3 */
 
2888
+                data[4] = tap_to_click ? 1 : 0;
 
2889
+                data[5] = tap_to_click ? 3 : 0;
 
2890
+                data[6] = tap_to_click ? 2 : 0;
 
2891
+
 
2892
+                array = g_ptr_array_sized_new (n_items);
 
2893
+                for (n = 0; n < n_items; n++)
 
2894
+                {
 
2895
+                    val = g_new0 (GValue, 1);
 
2896
+                    g_value_init (val, G_TYPE_INT);
 
2897
+                    g_value_set_int (val, data[n]);
 
2898
+                    g_ptr_array_add (array, val);
 
2899
+                }
 
2900
+
 
2901
+                prop = g_strconcat ("/", name, "/Properties/Synaptics_Tap_Action", NULL);
 
2902
+                xfconf_channel_set_arrayv (pointers_channel, prop, array);
 
2903
+                g_free (prop);
 
2904
+
 
2905
+                xfconf_array_free (array);
 
2906
+            }
 
2907
+
 
2908
+            XFree (data);
 
2909
+        }
 
2910
+    }
 
2911
+
 
2912
+    g_free (name);
 
2913
+}
 
2914
+
 
2915
+
 
2916
+
 
2917
+static void
 
2918
+mouse_settings_synaptics_hscroll_sensitive (GtkBuilder *builder)
 
2919
+{
 
2920
+    gboolean  sensitive = FALSE;
 
2921
+    GObject  *object;
 
2922
+
 
2923
+    object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
 
2924
+    if (gtk_widget_get_sensitive (GTK_WIDGET (object))
 
2925
+        && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)))
 
2926
+        sensitive = TRUE;
 
2927
+
 
2928
+    object = gtk_builder_get_object (builder, "synaptics-scroll-two");
 
2929
+    if (gtk_widget_get_sensitive (GTK_WIDGET (object))
 
2930
+        && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)))
 
2931
+        sensitive = TRUE;
 
2932
+
 
2933
+    object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
 
2934
+    gtk_widget_set_sensitive (GTK_WIDGET (object), sensitive);
 
2935
+}
 
2936
+
 
2937
+
 
2938
+
 
2939
+static void
 
2940
+mouse_settings_synaptics_set_scrolling (GtkWidget  *widget,
 
2941
+                                        GtkBuilder *builder)
 
2942
+{
 
2943
+    gint      edge_scroll[3] = { 0, 0, 0 };
 
2944
+    gint      two_scroll[2] = { 0, 0 };
 
2945
+    GObject  *object;
 
2946
+    gboolean  horizontal = FALSE;
 
2947
+    gchar    *name = NULL, *prop;
 
2948
+
 
2949
+    if (locked > 0)
 
2950
+        return;
 
2951
+
 
2952
+    /*  skip double event if a radio button is toggled */
 
2953
+    if (GTK_IS_RADIO_BUTTON (widget)
 
2954
+        && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
 
2955
+        return;
 
2956
+
 
2957
+    mouse_settings_synaptics_hscroll_sensitive (builder);
 
2958
+
 
2959
+    object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
 
2960
+    if (gtk_widget_get_sensitive (GTK_WIDGET (object)))
 
2961
+        horizontal = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
 
2962
+
 
2963
+    object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
 
2964
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object))
 
2965
+        && gtk_widget_get_sensitive (GTK_WIDGET (object)))
 
2966
+    {
 
2967
+        edge_scroll[0] = TRUE;
 
2968
+        edge_scroll[1] = horizontal;
 
2969
+    }
 
2970
+
 
2971
+    object = gtk_builder_get_object (builder, "synaptics-scroll-two");
 
2972
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object))
 
2973
+        && gtk_widget_get_sensitive (GTK_WIDGET (object)))
 
2974
+    {
 
2975
+        two_scroll[0] = TRUE;
 
2976
+        two_scroll[1] = horizontal;
 
2977
+    }
 
2978
+
 
2979
+    if (mouse_settings_device_get_selected (builder, NULL, &name))
 
2980
+    {
 
2981
+        /* 3 values: vertical, horizontal, corner. */
 
2982
+        prop = g_strconcat ("/", name, "/Properties/Synaptics_Edge_Scrolling", NULL);
 
2983
+        xfconf_channel_set_array (pointers_channel, prop,
 
2984
+                                  G_TYPE_INT, &edge_scroll[0],
 
2985
+                                  G_TYPE_INT, &edge_scroll[1],
 
2986
+                                  G_TYPE_INT, &edge_scroll[2],
 
2987
+                                  G_TYPE_INVALID);
 
2988
+        g_free (prop);
 
2989
+
 
2990
+        /* 2 values: vertical, horizontal. */
 
2991
+        prop = g_strconcat ("/", name, "/Properties/Synaptics_Two-Finger_Scrolling", NULL);
 
2992
+        xfconf_channel_set_array (pointers_channel, prop,
 
2993
+                                  G_TYPE_INT, &two_scroll[0],
 
2994
+                                  G_TYPE_INT, &two_scroll[1],
 
2995
+                                  G_TYPE_INVALID);
 
2996
+        g_free (prop);
 
2997
+    }
 
2998
+
 
2999
+    g_free (name);
 
3000
+}
 
3001
+
 
3002
+
 
3003
+
 
3004
+
 
3005
+static void
 
3006
+mouse_settings_device_set_enabled (GtkToggleButton *button,
 
3007
+                                   GtkBuilder      *builder)
 
3008
 {
 
3009
-    gint               nbuttons;
 
3010
-    Display           *xdisplay;
 
3011
+    gchar    *name = NULL;
 
3012
+    gchar    *prop;
 
3013
+    gboolean  enabled;
 
3014
+    GObject  *object;
 
3015
+
 
3016
+    enabled = gtk_toggle_button_get_active (button);
 
3017
+    object = gtk_builder_get_object (builder, "device-notebook");
 
3018
+    gtk_widget_set_sensitive (GTK_WIDGET (object), enabled);
 
3019
+
 
3020
+    if (locked > 0)
 
3021
+        return;
 
3022
+
 
3023
+    if (mouse_settings_device_get_selected (builder, NULL, &name))
 
3024
+    {
 
3025
+        prop = g_strconcat ("/", name, "/Properties/Device_Enabled", NULL);
 
3026
+        xfconf_channel_set_int (pointers_channel, prop, enabled);
 
3027
+        g_free (prop);
 
3028
+    }
 
3029
+
 
3030
+    g_free (name);
 
3031
+}
 
3032
+
 
3033
+
 
3034
+
 
3035
+static void
 
3036
+mouse_settings_device_selection_changed (GtkBuilder *builder)
 
3037
+{
 
3038
+    gint               nbuttons = 0;
 
3039
+    Display           *xdisplay = GDK_DISPLAY ();
 
3040
     XDevice           *device;
 
3041
+    XDeviceInfo       *device_info;
 
3042
     XFeedbackState    *states, *pt;
 
3043
+    XAnyClassPtr       any;
 
3044
     gint               nstates;
 
3045
     XPtrFeedbackState *state;
 
3046
-    gint               i;
 
3047
+    gint               i, n;
 
3048
     guchar            *buttonmap;
 
3049
     gint               id_1 = 0, id_3 = 0;
 
3050
     gint               id_4 = 0, id_5 = 0;
 
3051
     gdouble            acceleration = -1.00;
 
3052
     gint               threshold = -1;
 
3053
     GObject           *object;
 
3054
-    GtkTreeModel      *model;
 
3055
-    GtkTreeIter        iter;
 
3056
-    gboolean           has_selection;
 
3057
-    XID                xid;
 
3058
+    gint               ndevices;
 
3059
+    Atom               synaptics_prop;
 
3060
+    Atom               wacom_prop;
 
3061
+    Atom               synaptics_tap_prop;
 
3062
+    Atom               synaptics_edge_scroll_prop;
 
3063
+    Atom               synaptics_two_scroll_prop;
 
3064
+    Atom               device_enabled_prop;
 
3065
+    Atom               wacom_rotation_prop;
 
3066
+    gint               is_enabled = -1;
 
3067
+    gboolean           is_synaptics = FALSE;
 
3068
+    gboolean           is_wacom = FALSE;
 
3069
+    gint               synaptics_tap_to_click = -1;
 
3070
+    gint               synaptics_edge_scroll = -1;
 
3071
+    gint               synaptics_edge_hscroll = -1;
 
3072
+    gint               synaptics_two_scroll = -1;
 
3073
+    gint               synaptics_two_hscroll = -1;
 
3074
+    gint               wacom_rotation = -1;
 
3075
+    Atom              *props;
 
3076
+    gint               nprops;
 
3077
+    gint               wacom_mode = -1;
 
3078
 
 
3079
     /* lock the dialog */
 
3080
     locked++;
 
3081
 
 
3082
-    /* flush x and trap errors */
 
3083
-    gdk_flush ();
 
3084
-    gdk_error_trap_push ();
 
3085
-
 
3086
     /* get the selected item */
 
3087
-    has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
 
3088
-    if (G_LIKELY (has_selection))
 
3089
+    if (mouse_settings_device_get_selected (builder, &device, NULL))
 
3090
     {
 
3091
-        /* get device id and number of buttons */
 
3092
-        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid,
 
3093
-                            COLUMN_DEVICE_NBUTTONS, &nbuttons, -1);
 
3094
+        gdk_error_trap_push ();
 
3095
+        device_info = XListInputDevices (xdisplay, &ndevices);
 
3096
+        if (gdk_error_trap_pop () == 0 && device_info != NULL)
 
3097
+        {
 
3098
+            /* find mode and number of buttons */
 
3099
+            for (i = 0; i < ndevices; i++)
 
3100
+            {
 
3101
+                if (device_info[i].id != device->device_id)
 
3102
+                    continue;
 
3103
+
 
3104
+                any = device_info[i].inputclassinfo;
 
3105
+                for (n = 0; n < device_info[i].num_classes; n++)
 
3106
+                {
 
3107
+                    if (any->class == ButtonClass)
 
3108
+                        nbuttons = ((XButtonInfoPtr) any)->num_buttons;
 
3109
+                    else if (any->class == ValuatorClass)
 
3110
+                        wacom_mode = ((XValuatorInfoPtr) any)->mode == Absolute ? 0 : 1;
 
3111
+
 
3112
+                    any = (XAnyClassPtr) ((gchar *) any + any->length);
 
3113
+                }
 
3114
 
 
3115
-        /* get the x display */
 
3116
-        xdisplay = gdk_x11_display_get_xdisplay (display);
 
3117
+                break;
 
3118
+            }
 
3119
 
 
3120
-        /* open the device */
 
3121
-        device = XOpenDevice (xdisplay, xid);
 
3122
+            XFreeDeviceList (device_info);
 
3123
+        }
 
3124
 
 
3125
-        if (G_LIKELY (device))
 
3126
+        /* get the button mapping */
 
3127
+        if (nbuttons > 0)
 
3128
         {
 
3129
-            /* allocate button map */
 
3130
             buttonmap = g_new0 (guchar, nbuttons);
 
3131
-
 
3132
-            /* get the button mapping */
 
3133
+            gdk_error_trap_push ();
 
3134
             XGetDeviceButtonMapping (xdisplay, device, buttonmap, nbuttons);
 
3135
+            if (gdk_error_trap_pop () != 0)
 
3136
+                g_critical ("Failed to get button map");
 
3137
 
 
3138
             /* figure out the position of the first and second/third button in the map */
 
3139
             for (i = 0; i < nbuttons; i++)
 
3140
@@ -629,60 +1006,152 @@ mouse_settings_device_selection_changed
 
3141
                     id_5 = i;
 
3142
             }
 
3143
 
 
3144
-            /* cleanup */
 
3145
             g_free (buttonmap);
 
3146
+        }
 
3147
+        else
 
3148
+        {
 
3149
+            g_critical ("Device has no buttons");
 
3150
+        }
 
3151
 
 
3152
-            /* get the feedback states for this device */
 
3153
-            states = XGetFeedbackControl (xdisplay, device, &nstates);
 
3154
-            if (states != NULL)
 
3155
+        /* get the feedback states for this device */
 
3156
+        gdk_error_trap_push ();
 
3157
+        states = XGetFeedbackControl (xdisplay, device, &nstates);
 
3158
+        if (gdk_error_trap_pop () != 0 || states == NULL)
 
3159
+        {
 
3160
+             g_critical ("Failed to get feedback states");
 
3161
+        }
 
3162
+        else
 
3163
+        {
 
3164
+            /* get the pointer feedback class */
 
3165
+            for (pt = states, i = 0; i < nstates; i++)
 
3166
             {
 
3167
-                /* get the pointer feedback class */
 
3168
-                for (pt = states, i = 0; i < nstates; i++)
 
3169
+                if (pt->class == PtrFeedbackClass)
 
3170
                 {
 
3171
-                    if (pt->class == PtrFeedbackClass)
 
3172
-                    {
 
3173
-                        /* get the state */
 
3174
-                        state = (XPtrFeedbackState *) pt;
 
3175
-                        acceleration = (gdouble) state->accelNum / (gdouble) state->accelDenom;
 
3176
-                        threshold = state->threshold;
 
3177
+                    /* get the state */
 
3178
+                    state = (XPtrFeedbackState *) pt;
 
3179
+                    acceleration = (gdouble) state->accelNum / (gdouble) state->accelDenom;
 
3180
+                    threshold = state->threshold;
 
3181
+                }
 
3182
 
 
3183
-                        /* done */
 
3184
-                        break;
 
3185
-                    }
 
3186
+                /* advance the offset */
 
3187
+                pt = (XFeedbackState *) ((gchar *) pt + pt->length);
 
3188
+            }
 
3189
 
 
3190
-                    /* advance the offset */
 
3191
-                    pt = (XFeedbackState *) ((gchar *) pt + pt->length);
 
3192
-                }
 
3193
+            XFreeFeedbackList (states);
 
3194
+        }
 
3195
 
 
3196
-                XFreeFeedbackList (states);
 
3197
+        /* wacom and synaptics specific properties */
 
3198
+        device_enabled_prop = XInternAtom (xdisplay, "Device Enabled", True);
 
3199
+        synaptics_prop = XInternAtom (xdisplay, "Synaptics Off", True);
 
3200
+        wacom_prop = XInternAtom (xdisplay, "Wacom Tool Type", True);
 
3201
+        synaptics_tap_prop = XInternAtom (xdisplay, "Synaptics Tap Action", True);
 
3202
+        synaptics_edge_scroll_prop = XInternAtom (xdisplay, "Synaptics Edge Scrolling", True);
 
3203
+        synaptics_two_scroll_prop = XInternAtom (xdisplay, "Synaptics Two-Finger Scrolling", True);
 
3204
+        wacom_rotation_prop = XInternAtom (xdisplay, "Wacom Rotation", True);
 
3205
+
 
3206
+        /* check if this is a synaptics or wacom device */
 
3207
+        gdk_error_trap_push ();
 
3208
+        props = XListDeviceProperties (xdisplay, device, &nprops);
 
3209
+        if (gdk_error_trap_pop () == 0 && props != NULL)
 
3210
+        {
 
3211
+            for (i = 0; i < nprops; i++)
 
3212
+            {
 
3213
+                if (props[i] == device_enabled_prop)
 
3214
+                    is_enabled = mouse_settings_device_get_int_property (device, props[i], 0, NULL);
 
3215
+                else if (props[i] == synaptics_prop)
 
3216
+                    is_synaptics = TRUE;
 
3217
+                else if (props[i] == wacom_prop)
 
3218
+                    is_wacom = TRUE;
 
3219
+                else if (props[i] == synaptics_tap_prop)
 
3220
+                    synaptics_tap_to_click = mouse_settings_device_get_int_property (device, props[i], 4, NULL);
 
3221
+                else if (props[i] == synaptics_edge_scroll_prop)
 
3222
+                    synaptics_edge_scroll = mouse_settings_device_get_int_property (device, props[i], 0, &synaptics_edge_hscroll);
 
3223
+                else if (props[i] == synaptics_two_scroll_prop)
 
3224
+                    synaptics_two_scroll = mouse_settings_device_get_int_property (device, props[i], 0, &synaptics_two_hscroll);
 
3225
+                else if (props[i] == wacom_rotation_prop)
 
3226
+                    wacom_rotation = mouse_settings_device_get_int_property (device, props[i], 0, NULL);
 
3227
             }
 
3228
 
 
3229
-            /* close the device */
 
3230
-            XCloseDevice (xdisplay, device);
 
3231
+            XFree (props);
 
3232
         }
 
3233
+
 
3234
+        /* close the device */
 
3235
+        XCloseDevice (xdisplay, device);
 
3236
     }
 
3237
 
 
3238
     /* update button order */
 
3239
-    object = gtk_builder_get_object (builder, id_1 > id_3 ? "mouse-left-handed" : "mouse-right-handed");
 
3240
+    object = gtk_builder_get_object (builder, id_1 > id_3 ? "device-left-handed" : "device-right-handed");
 
3241
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), TRUE);
 
3242
 
 
3243
-    object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
 
3244
+    object = gtk_builder_get_object (builder, "device-reverse-scrolling");
 
3245
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), !!(id_5 < id_4));
 
3246
     gtk_widget_set_sensitive (GTK_WIDGET (object), nbuttons >= 5);
 
3247
 
 
3248
     /* update acceleration scale */
 
3249
-    object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
 
3250
+    object = gtk_builder_get_object (builder, "device-acceleration-scale");
 
3251
     gtk_range_set_value (GTK_RANGE (object), acceleration);
 
3252
     gtk_widget_set_sensitive (GTK_WIDGET (object), acceleration != -1);
 
3253
 
 
3254
     /* update threshold scale */
 
3255
-    object = gtk_builder_get_object (builder, "mouse-threshold-scale");
 
3256
+    object = gtk_builder_get_object (builder, "device-threshold-scale");
 
3257
     gtk_range_set_value (GTK_RANGE (object), threshold);
 
3258
     gtk_widget_set_sensitive (GTK_WIDGET (object), threshold != -1);
 
3259
 
 
3260
-    /* flush and remove the x error trap */
 
3261
-    gdk_flush ();
 
3262
-    gdk_error_trap_pop ();
 
3263
+    object = gtk_builder_get_object (builder, "device-enabled");
 
3264
+    gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled != -1);
 
3265
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), is_enabled > 0);
 
3266
+
 
3267
+    object = gtk_builder_get_object (builder, "device-notebook");
 
3268
+    gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled == 1);
 
3269
+
 
3270
+    /* synaptics options */
 
3271
+    object = gtk_builder_get_object (builder, "synaptics-tab");
 
3272
+    gtk_widget_set_visible (GTK_WIDGET (object), is_synaptics);
 
3273
+
 
3274
+    if (is_synaptics)
 
3275
+    {
 
3276
+        object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
 
3277
+        gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_tap_to_click != -1);
 
3278
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_tap_to_click > 0);
 
3279
+
 
3280
+        object = gtk_builder_get_object (builder, "synaptics-scroll-no");
 
3281
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_edge_scroll == -1 && synaptics_two_scroll == -1);
 
3282
+
 
3283
+        object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
 
3284
+        gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_edge_scroll != -1);
 
3285
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_edge_scroll > 0);
 
3286
+
 
3287
+        object = gtk_builder_get_object (builder, "synaptics-scroll-two");
 
3288
+        gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_two_scroll != -1);
 
3289
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_two_scroll > 0);
 
3290
+
 
3291
+        object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
 
3292
+        mouse_settings_synaptics_hscroll_sensitive (builder);
 
3293
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object),
 
3294
+                                      synaptics_edge_hscroll == 1 || synaptics_two_hscroll == 1);
 
3295
+    }
 
3296
+
 
3297
+    /* wacom options */
 
3298
+    object = gtk_builder_get_object (builder, "wacom-tab");
 
3299
+    gtk_widget_set_visible (GTK_WIDGET (object), is_wacom);
 
3300
+
 
3301
+    if (is_wacom)
 
3302
+    {
 
3303
+        object = gtk_builder_get_object (builder, "wacom-mode");
 
3304
+        gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_mode != -1);
 
3305
+        gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_mode == -1 ? 1 : wacom_mode);
 
3306
+
 
3307
+        object = gtk_builder_get_object (builder, "wacom-rotation");
 
3308
+        gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_rotation != -1);
 
3309
+        /* 3 (half) comes afer none */
 
3310
+        if (wacom_rotation == 3)
 
3311
+            wacom_rotation = 1;
 
3312
+        else if (wacom_rotation > 0)
 
3313
+            wacom_rotation++;
 
3314
+        else if (wacom_rotation == -1)
 
3315
+            wacom_rotation = 0;
 
3316
+        gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_rotation);
 
3317
+    }
 
3318
 
 
3319
     /* unlock */
 
3320
     locked--;
 
3321
@@ -693,11 +1162,9 @@ mouse_settings_device_selection_changed
 
3322
 static void
 
3323
 mouse_settings_device_save (GtkBuilder *builder)
 
3324
 {
 
3325
-    GObject          *treeview;
 
3326
-    GtkTreeSelection *selection;
 
3327
+    GObject          *combobox;
 
3328
     GtkTreeModel     *model;
 
3329
     GtkTreeIter       iter;
 
3330
-    gboolean          has_selection;
 
3331
     gchar            *name;
 
3332
     GObject          *object;
 
3333
     gchar             property_name[512];
 
3334
@@ -710,22 +1177,17 @@ mouse_settings_device_save (GtkBuilder *
 
3335
     if (locked > 0)
 
3336
         return;
 
3337
 
 
3338
-    /* get the treeview */
 
3339
-    treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
 
3340
-
 
3341
-    /* get the selection */
 
3342
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
 
3343
-
 
3344
-    has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
 
3345
-    if (G_LIKELY (has_selection))
 
3346
+    combobox = gtk_builder_get_object (builder, "device-combobox");
 
3347
+    if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &iter))
 
3348
     {
 
3349
         /* get device id and number of buttons */
 
3350
-        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_NAME, &name, -1);
 
3351
+        model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
 
3352
+        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XFCONF_NAME, &name, -1);
 
3353
 
 
3354
         if (G_LIKELY (name))
 
3355
         {
 
3356
             /* store the button order */
 
3357
-            object = gtk_builder_get_object (builder, "mouse-right-handed");
 
3358
+            object = gtk_builder_get_object (builder, "device-right-handed");
 
3359
             g_snprintf (property_name, sizeof (property_name), "/%s/RightHanded", name);
 
3360
             righthanded = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
 
3361
             if (!xfconf_channel_has_property (pointers_channel, property_name)
 
3362
@@ -733,21 +1195,21 @@ mouse_settings_device_save (GtkBuilder *
 
3363
                 xfconf_channel_set_bool (pointers_channel, property_name, righthanded);
 
3364
 
 
3365
             /* store reverse scrolling */
 
3366
-            object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
 
3367
+            object = gtk_builder_get_object (builder, "device-reverse-scrolling");
 
3368
             g_snprintf (property_name, sizeof (property_name), "/%s/ReverseScrolling", name);
 
3369
             reverse_scrolling = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
 
3370
             if (xfconf_channel_get_bool (pointers_channel, property_name, FALSE) != reverse_scrolling)
 
3371
                 xfconf_channel_set_bool (pointers_channel, property_name, reverse_scrolling);
 
3372
 
 
3373
             /* store the threshold */
 
3374
-            object = gtk_builder_get_object (builder, "mouse-threshold-scale");
 
3375
+            object = gtk_builder_get_object (builder, "device-threshold-scale");
 
3376
             g_snprintf (property_name, sizeof (property_name), "/%s/Threshold", name);
 
3377
             threshold = gtk_range_get_value (GTK_RANGE (object));
 
3378
             if (xfconf_channel_get_int (pointers_channel, property_name, -1) != threshold)
 
3379
                 xfconf_channel_set_int (pointers_channel, property_name, threshold);
 
3380
 
 
3381
             /* store the acceleration */
 
3382
-            object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
 
3383
+            object = gtk_builder_get_object (builder, "device-acceleration-scale");
 
3384
             g_snprintf (property_name, sizeof (property_name), "/%s/Acceleration", name);
 
3385
             acceleration = gtk_range_get_value (GTK_RANGE (object));
 
3386
             if (xfconf_channel_get_double (pointers_channel, property_name, -1) != acceleration)
 
3387
@@ -761,55 +1223,6 @@ mouse_settings_device_save (GtkBuilder *
 
3388
 
 
3389
 
 
3390
 
 
3391
-static void
 
3392
-mouse_settings_device_name_edited (GtkCellRendererText *renderer,
 
3393
-                                   gchar               *path,
 
3394
-                                   gchar               *new_name,
 
3395
-                                   GtkBuilder          *builder)
 
3396
-{
 
3397
-    GObject          *treeview;
 
3398
-    GtkTreeSelection *selection;
 
3399
-    gboolean          has_selection;
 
3400
-    GtkTreeModel     *model;
 
3401
-    GtkTreeIter       iter;
 
3402
-    gchar            *internal_name;
 
3403
-    gchar            *property_name;
 
3404
-    gchar            *new_name_escaped;
 
3405
-
 
3406
-    /* check if the new name is valid */
 
3407
-    if (new_name == NULL || *new_name == '\0')
 
3408
-        return;
 
3409
-
 
3410
-    /* get the treeview's selection */
 
3411
-    treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
 
3412
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
 
3413
-
 
3414
-    /* get the selected item */
 
3415
-    has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
 
3416
-    if (G_LIKELY (has_selection))
 
3417
-    {
 
3418
-        /* get the internal device name */
 
3419
-        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_NAME, &internal_name, -1);
 
3420
-
 
3421
-        /* store the new name in the channel */
 
3422
-        property_name = g_strdup_printf ("/%s", internal_name);
 
3423
-        xfconf_channel_set_string (pointers_channel, property_name, new_name);
 
3424
-
 
3425
-        /* escape before adding in the store */
 
3426
-        new_name_escaped = g_markup_escape_text (new_name, -1);
 
3427
-
 
3428
-        /* set the new device name in the store */
 
3429
-        gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_DEVICE_DISPLAY_NAME, new_name_escaped, -1);
 
3430
-
 
3431
-        /* cleanup */
 
3432
-        g_free (new_name_escaped);
 
3433
-        g_free (property_name);
 
3434
-        g_free (internal_name);
 
3435
-    }
 
3436
-}
 
3437
-
 
3438
-
 
3439
-
 
3440
 static gchar *
 
3441
 mouse_settings_device_xfconf_name (const gchar *name)
 
3442
 {
 
3443
@@ -844,180 +1257,95 @@ static void
 
3444
 mouse_settings_device_populate_store (GtkBuilder *builder,
 
3445
                                       gboolean    create_store)
 
3446
 {
 
3447
-    Display           *xdisplay;
 
3448
-    XDeviceInfo       *device_list, *device_info;
 
3449
-    gchar             *display_name, *usb;
 
3450
-    gshort             num_buttons;
 
3451
-    gint               ndevices;
 
3452
-    gint               i, m;
 
3453
-    XAnyClassPtr       ptr;
 
3454
-    GtkTreeIter        iter;
 
3455
-    GtkListStore      *store;
 
3456
-    GObject           *treeview;
 
3457
-    GtkTreePath       *path = NULL;
 
3458
-    GtkTreeViewColumn *column;
 
3459
-    GtkCellRenderer   *renderer;
 
3460
-    GtkTreeSelection  *selection;
 
3461
-    gchar             *device_name;
 
3462
-    gchar             *property_name;
 
3463
-    gchar             *property_value;
 
3464
+    XDeviceInfo     *device_list, *device_info;
 
3465
+    gint             ndevices;
 
3466
+    gint             i;
 
3467
+    GtkTreeIter      iter;
 
3468
+    GtkListStore    *store;
 
3469
+    GObject         *combobox;
 
3470
+    GtkCellRenderer *renderer;
 
3471
+    gchar           *xfconf_name;
 
3472
+    gboolean         has_active_item = FALSE;
 
3473
 
 
3474
     /* lock */
 
3475
     locked++;
 
3476
 
 
3477
-    /* flush x and trap errors */
 
3478
-    gdk_flush ();
 
3479
-    gdk_error_trap_push ();
 
3480
-
 
3481
-    /* get the treeview */
 
3482
-    treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
 
3483
+    combobox = gtk_builder_get_object (builder, "device-combobox");
 
3484
 
 
3485
     /* create or get the store */
 
3486
     if (G_LIKELY (create_store))
 
3487
     {
 
3488
-        store = gtk_list_store_new (N_DEVICE_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
 
3489
-                                    G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
 
3490
+        store = gtk_list_store_new (N_DEVICE_COLUMNS,
 
3491
+                                    G_TYPE_STRING /* COLUMN_DEVICE_NAME */,
 
3492
+                                    G_TYPE_STRING /* COLUMN_DEVICE_XFCONF_NAME */,
 
3493
+                                    G_TYPE_ULONG /* COLUMN_DEVICE_XID */);
 
3494
+        gtk_combo_box_set_model (GTK_COMBO_BOX (combobox), GTK_TREE_MODEL (store));
 
3495
+
 
3496
+        /* text renderer */
 
3497
+        renderer = gtk_cell_renderer_text_new ();
 
3498
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
 
3499
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
 
3500
+                                        "text", COLUMN_DEVICE_NAME, NULL);
 
3501
+
 
3502
+        g_signal_connect_swapped (G_OBJECT (combobox), "changed",
 
3503
+            G_CALLBACK (mouse_settings_device_selection_changed), builder);
 
3504
     }
 
3505
     else
 
3506
     {
 
3507
-        store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)));
 
3508
+        store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combobox)));
 
3509
         gtk_list_store_clear (store);
 
3510
     }
 
3511
 
 
3512
-    /* get the x display */
 
3513
-    xdisplay = gdk_x11_display_get_xdisplay (display);
 
3514
-
 
3515
     /* get all the registered devices */
 
3516
-    device_list = XListInputDevices (xdisplay, &ndevices);
 
3517
+    gdk_error_trap_push ();
 
3518
+    device_list = XListInputDevices (GDK_DISPLAY (), &ndevices);
 
3519
+    if (gdk_error_trap_pop () != 0 || device_list == NULL)
 
3520
+    {
 
3521
+        g_message ("No devices found");
 
3522
+        goto bailout;
 
3523
+    }
 
3524
 
 
3525
     for (i = 0; i < ndevices; i++)
 
3526
     {
 
3527
         /* get the device */
 
3528
         device_info = &device_list[i];
 
3529
 
 
3530
-        /* filter out the pointer devices */
 
3531
-        if (device_info->use == IsXExtensionPointer)
 
3532
+        /* filter out the pointer and virtual devices */
 
3533
+        if (device_info->use != IsXExtensionPointer
 
3534
+            || g_str_has_prefix (device_info->name, "Virtual core XTEST"))
 
3535
+            continue;
 
3536
+
 
3537
+        /* create a valid xfconf device name */
 
3538
+        xfconf_name = mouse_settings_device_xfconf_name (device_info->name);
 
3539
+
 
3540
+        /* insert in the store */
 
3541
+        gtk_list_store_insert_with_values (store, &iter, i,
 
3542
+                                           COLUMN_DEVICE_XFCONF_NAME, xfconf_name,
 
3543
+                                           COLUMN_DEVICE_NAME, device_info->name,
 
3544
+                                           COLUMN_DEVICE_XID, device_info->id,
 
3545
+                                           -1);
 
3546
+
 
3547
+        /* check if we should select this device */
 
3548
+        if (device_info->name != NULL
 
3549
+            && opt_device_name != NULL
 
3550
+            && strcmp (opt_device_name, device_info->name) == 0)
 
3551
         {
 
3552
-            /* get the device classes */
 
3553
-            ptr = device_info->inputclassinfo;
 
3554
-
 
3555
-            /* walk all the classes */
 
3556
-            for (m = 0, num_buttons = 0; m < device_info->num_classes; m++)
 
3557
-            {
 
3558
-                /* find the button class */
 
3559
-                if (ptr->class == ButtonClass)
 
3560
-                {
 
3561
-                    /* get the number of buttons */
 
3562
-                    num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
 
3563
-
 
3564
-                    /* done */
 
3565
-                    break;
 
3566
-                }
 
3567
-
 
3568
-                /* advance the offset */
 
3569
-                ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
 
3570
-            }
 
3571
-
 
3572
-            /* only append devices with buttons */
 
3573
-            if (G_UNLIKELY (num_buttons <= 0))
 
3574
-                continue;
 
3575
-
 
3576
-            /* ignore XTEST device */
 
3577
-            if (g_str_has_prefix (device_info->name, "Virtual core XTEST"))
 
3578
-                continue;
 
3579
-
 
3580
-            /* create a valid xfconf device name */
 
3581
-            device_name = mouse_settings_device_xfconf_name (device_info->name);
 
3582
-
 
3583
-            /* check if there is a custom name set by the user */
 
3584
-            property_name = g_strdup_printf ("/%s", device_name);
 
3585
-            if (xfconf_channel_has_property (pointers_channel, property_name))
 
3586
-            {
 
3587
-                /* get the name from the config file, escape it */
 
3588
-                property_value = xfconf_channel_get_string (pointers_channel, property_name, NULL);
 
3589
-                display_name = g_markup_escape_text (property_value, -1);
 
3590
-                g_free (property_value);
 
3591
-            }
 
3592
-            else
 
3593
-            {
 
3594
-                /* get the device name, escaped */
 
3595
-                display_name = g_markup_escape_text (device_info->name, -1);
 
3596
-
 
3597
-                /* get rid of usb crap in the name */
 
3598
-                if ((usb = strstr (display_name, "-usb")) != NULL)
 
3599
-                    *usb = '\0';
 
3600
-            }
 
3601
+            gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
 
3602
+            g_free (opt_device_name);
 
3603
+            opt_device_name = NULL;
 
3604
+            has_active_item = TRUE;
 
3605
+        }
 
3606
 
 
3607
-            /* insert in the store */
 
3608
-            gtk_list_store_insert_with_values (store, &iter, i,
 
3609
-                                               COLUMN_DEVICE_ICON, "input-mouse",
 
3610
-                                               COLUMN_DEVICE_NAME, device_name,
 
3611
-                                               COLUMN_DEVICE_DISPLAY_NAME, display_name,
 
3612
-                                               COLUMN_DEVICE_XID, device_info->id,
 
3613
-                                               COLUMN_DEVICE_NBUTTONS, num_buttons, -1);
 
3614
-
 
3615
-            /* check if we should select this device (for user convience also the display name) */
 
3616
-            if (opt_device_name && (strcmp (opt_device_name, device_info->name) == 0
 
3617
-                || (display_name && strcmp (opt_device_name, display_name) == 0)))
 
3618
-            {
 
3619
-                path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
 
3620
-                g_free (opt_device_name);
 
3621
-                opt_device_name = NULL;
 
3622
-            }
 
3623
+        g_free (xfconf_name);
 
3624
 
 
3625
-            /* cleanup */
 
3626
-            g_free (property_name);
 
3627
-            g_free (device_name);
 
3628
-            g_free (display_name);
 
3629
-        }
 
3630
     }
 
3631
 
 
3632
-    /* cleanup */
 
3633
     XFreeDeviceList (device_list);
 
3634
 
 
3635
-    /* flush and remove the x error trap */
 
3636
-    gdk_flush ();
 
3637
-    gdk_error_trap_pop ();
 
3638
+    if (!has_active_item)
 
3639
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
 
3640
 
 
3641
-    /* get the selection */
 
3642
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
 
3643
-
 
3644
-    if (G_LIKELY (create_store))
 
3645
-    {
 
3646
-        /* set the treeview model */
 
3647
-        gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
 
3648
-        gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), COLUMN_DEVICE_DISPLAY_NAME);
 
3649
-
 
3650
-        /* icon renderer */
 
3651
-        renderer = gtk_cell_renderer_pixbuf_new ();
 
3652
-        column = gtk_tree_view_column_new_with_attributes ("", renderer, "icon-name", COLUMN_DEVICE_ICON, NULL);
 
3653
-        g_object_set (G_OBJECT (renderer), "stock-size", GTK_ICON_SIZE_DND, NULL);
 
3654
-        gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
3655
-
 
3656
-        /* text renderer */
 
3657
-        renderer = gtk_cell_renderer_text_new ();
 
3658
-        column = gtk_tree_view_column_new_with_attributes ("", renderer, "markup", COLUMN_DEVICE_DISPLAY_NAME, NULL);
 
3659
-        g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, "editable", TRUE, NULL);
 
3660
-        g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (mouse_settings_device_name_edited), builder);
 
3661
-        gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
3662
-
 
3663
-        /* setup tree selection */
 
3664
-        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
3665
-        g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (mouse_settings_device_selection_changed), builder);
 
3666
-    }
 
3667
-
 
3668
-    /* select the mouse in the tree */
 
3669
-    if (G_LIKELY (path == NULL))
 
3670
-        path = gtk_tree_path_new_first ();
 
3671
-    gtk_tree_selection_select_path (selection, path);
 
3672
-    gtk_tree_path_free (path);
 
3673
-
 
3674
-    /* sort after selecting the path */
 
3675
-    if (G_LIKELY (create_store))
 
3676
-    {
 
3677
-        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), COLUMN_DEVICE_XID, GTK_SORT_ASCENDING);
 
3678
-        g_object_unref (G_OBJECT (store));
 
3679
-    }
 
3680
+    bailout:
 
3681
 
 
3682
     /* unlock */
 
3683
     locked--;
 
3684
@@ -1029,18 +1357,15 @@ static gboolean
 
3685
 mouse_settings_device_update_sliders (gpointer user_data)
 
3686
 {
 
3687
     GtkBuilder *builder = GTK_BUILDER (user_data);
 
3688
-    GObject    *treeview, *button;
 
3689
+    GObject    *button;
 
3690
 
 
3691
     GDK_THREADS_ENTER ();
 
3692
 
 
3693
-    /* get the treeview */
 
3694
-    treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
 
3695
-
 
3696
     /* update */
 
3697
-    mouse_settings_device_selection_changed (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), builder);
 
3698
+    mouse_settings_device_selection_changed (builder);
 
3699
 
 
3700
     /* make the button sensitive again */
 
3701
-    button = gtk_builder_get_object (builder, "mouse-reset");
 
3702
+    button = gtk_builder_get_object (builder, "device-reset-feedback");
 
3703
     gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
 
3704
 
 
3705
     GDK_THREADS_LEAVE ();
 
3706
@@ -1063,30 +1388,24 @@ static void
 
3707
 mouse_settings_device_reset (GtkWidget  *button,
 
3708
                              GtkBuilder *builder)
 
3709
 {
 
3710
-    GObject          *treeview;
 
3711
-    GtkTreeSelection *selection;
 
3712
-    gchar            *name, *property_name;
 
3713
-    gboolean          has_selection;
 
3714
-    GtkTreeModel     *model;
 
3715
-    GtkTreeIter       iter;
 
3716
+    gchar        *name, *property_name;
 
3717
+    GtkTreeModel *model;
 
3718
+    GtkTreeIter   iter;
 
3719
+    GObject      *combobox;
 
3720
 
 
3721
     /* leave when locked */
 
3722
     if (locked > 0)
 
3723
         return;
 
3724
 
 
3725
-    /* get the treeview */
 
3726
-    treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
 
3727
-
 
3728
-    /* get the selection */
 
3729
-    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
 
3730
-
 
3731
-    has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
 
3732
-    if (G_LIKELY (has_selection))
 
3733
+    /* get the selected item */
 
3734
+    combobox = gtk_builder_get_object (builder, "device-combobox");
 
3735
+    if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &iter))
 
3736
     {
 
3737
         /* get device id and number of buttons */
 
3738
-        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_NAME, &name, -1);
 
3739
+        model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
 
3740
+        gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XFCONF_NAME, &name, -1);
 
3741
 
 
3742
-        if (G_LIKELY (name && timeout_id == 0))
 
3743
+        if (G_LIKELY (name != NULL && timeout_id == 0))
 
3744
         {
 
3745
             /* make the button insensitive */
 
3746
             gtk_widget_set_sensitive (button, FALSE);
 
3747
@@ -1136,25 +1455,18 @@ mouse_settings_event_filter (GdkXEvent *
 
3748
 static void
 
3749
 mouse_settings_create_event_filter (GtkBuilder *builder)
 
3750
 {
 
3751
-    Display     *xdisplay;
 
3752
+    Display     *xdisplay = GDK_DISPLAY ();
 
3753
     XEventClass  event_class;
 
3754
 
 
3755
-    /* flush x and trap errors */
 
3756
-    gdk_flush ();
 
3757
-    gdk_error_trap_push ();
 
3758
-
 
3759
-    /* get the default display and root window */
 
3760
-    xdisplay = gdk_x11_display_get_xdisplay (display);
 
3761
-    if (G_UNLIKELY (!xdisplay))
 
3762
-        return;
 
3763
-
 
3764
     /* monitor device change events */
 
3765
+    gdk_error_trap_push ();
 
3766
     DevicePresence (xdisplay, device_presence_event_type, event_class);
 
3767
     XSelectExtensionEvent (xdisplay, RootWindow (xdisplay, DefaultScreen (xdisplay)), &event_class, 1);
 
3768
-
 
3769
-    /* flush and remove the x error trap */
 
3770
-    gdk_flush ();
 
3771
-    gdk_error_trap_pop ();
 
3772
+    if (gdk_error_trap_pop () != 0)
 
3773
+    {
 
3774
+        g_critical ("Failed to setup the device event filter");
 
3775
+        return;
 
3776
+    }
 
3777
 
 
3778
     /* add an event filter */
 
3779
     gdk_window_add_filter (NULL, mouse_settings_event_filter, builder);
 
3780
@@ -1173,6 +1485,10 @@ main (gint argc, gchar **argv)
 
3781
     GError            *error = NULL;
 
3782
     GObject           *object;
 
3783
     XExtensionVersion *version = NULL;
 
3784
+    gchar             *syndaemon;
 
3785
+    guint              i;
 
3786
+    const gchar       *synaptics_scroll[] = { "synaptics-scroll-no", "synaptics-scroll-edge",
 
3787
+                                              "synaptics-scroll-two", "synaptics-scroll-horiz" };
 
3788
 
 
3789
     /* setup translation domain */
 
3790
     xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
 
3791
@@ -1255,53 +1571,106 @@ main (gint argc, gchar **argv)
 
3792
             /* lock */
 
3793
             locked++;
 
3794
 
 
3795
-            /* set the working display for this instance */
 
3796
-            display = gdk_display_get_default ();
 
3797
-
 
3798
-            /* populate the devices treeview */
 
3799
+            /* populate the devices combobox */
 
3800
             mouse_settings_device_populate_store (builder, TRUE);
 
3801
 
 
3802
             /* connect signals */
 
3803
-            object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
 
3804
-            g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
 
3805
-
 
3806
-            object = gtk_builder_get_object (builder, "mouse-threshold-scale");
 
3807
-            g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
 
3808
+            object = gtk_builder_get_object (builder, "device-enabled");
 
3809
+            g_signal_connect (G_OBJECT (object), "toggled",
 
3810
+                              G_CALLBACK (mouse_settings_device_set_enabled), builder);
 
3811
+
 
3812
+            object = gtk_builder_get_object (builder, "device-acceleration-scale");
 
3813
+            g_signal_connect_swapped (G_OBJECT (object), "value-changed",
 
3814
+                                      G_CALLBACK (mouse_settings_device_save), builder);
 
3815
+
 
3816
+            object = gtk_builder_get_object (builder, "device-threshold-scale");
 
3817
+            g_signal_connect (G_OBJECT (object), "format-value",
 
3818
+                              G_CALLBACK (mouse_settings_format_value_px), NULL);
 
3819
+            g_signal_connect_swapped (G_OBJECT (object), "value-changed",
 
3820
+                                      G_CALLBACK (mouse_settings_device_save), builder);
 
3821
+
 
3822
+            object = gtk_builder_get_object (builder, "device-left-handed");
 
3823
+            g_signal_connect_swapped (G_OBJECT (object), "toggled",
 
3824
+                                      G_CALLBACK (mouse_settings_device_save), builder);
 
3825
+
 
3826
+            object = gtk_builder_get_object (builder, "device-right-handed");
 
3827
+            g_signal_connect_swapped (G_OBJECT (object), "toggled",
 
3828
+                                      G_CALLBACK (mouse_settings_device_save), builder);
 
3829
+
 
3830
+            object = gtk_builder_get_object (builder, "device-reverse-scrolling");
 
3831
+            g_signal_connect_swapped (G_OBJECT (object), "toggled",
 
3832
+                                      G_CALLBACK (mouse_settings_device_save), builder);
 
3833
+
 
3834
+            object = gtk_builder_get_object (builder, "device-reset-feedback");
 
3835
+            g_signal_connect (G_OBJECT (object), "clicked",
 
3836
+                              G_CALLBACK (mouse_settings_device_reset), builder);
 
3837
+
 
3838
+            object = gtk_builder_get_object (builder, "synaptics-disable-while-type");
 
3839
+            syndaemon = g_find_program_in_path ("syndaemon");
 
3840
+            gtk_widget_set_sensitive (GTK_WIDGET (object), syndaemon != NULL);
 
3841
+            g_free (syndaemon);
 
3842
+            xfconf_g_property_bind (pointers_channel, "/DisableTouchpadWhileTyping",
 
3843
+                                    G_TYPE_BOOLEAN, G_OBJECT (object), "active");
 
3844
+
 
3845
+            object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
 
3846
+            g_signal_connect_swapped (G_OBJECT (object), "toggled",
 
3847
+                                      G_CALLBACK (mouse_settings_synaptics_set_tap_to_click), builder);
 
3848
 
 
3849
-            object = gtk_builder_get_object (builder, "mouse-left-handed");
 
3850
-            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
 
3851
+            for (i = 0; i < G_N_ELEMENTS (synaptics_scroll); i++)
 
3852
+            {
 
3853
+                object = gtk_builder_get_object (builder, synaptics_scroll[i]);
 
3854
+                g_signal_connect (G_OBJECT (object), "toggled",
 
3855
+                                  G_CALLBACK (mouse_settings_synaptics_set_scrolling), builder);
 
3856
+            }
 
3857
 
 
3858
-            object = gtk_builder_get_object (builder, "mouse-right-handed");
 
3859
-            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
 
3860
+            object = gtk_builder_get_object (builder, "wacom-mode");
 
3861
+            g_signal_connect (G_OBJECT (object), "changed",
 
3862
+                              G_CALLBACK (mouse_settings_wacom_set_mode), builder);
 
3863
+
 
3864
+            object = gtk_builder_get_object (builder, "wacom-rotation");
 
3865
+            g_signal_connect (G_OBJECT (object), "changed",
 
3866
+                              G_CALLBACK (mouse_settings_wacom_set_rotation), builder);
 
3867
 
 
3868
-            object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
 
3869
-            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
 
3870
 
 
3871
-            object = gtk_builder_get_object (builder, "mouse-reset");
 
3872
-            g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_device_reset), builder);
 
3873
 
 
3874
 #ifdef HAVE_XCURSOR
 
3875
             /* populate the themes treeview */
 
3876
             mouse_settings_themes_populate_store (builder);
 
3877
 
 
3878
             /* connect the cursor size in the cursor tab */
 
3879
-            object = gtk_builder_get_object (builder, "mouse-cursor-size");
 
3880
-            xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize", G_TYPE_INT, G_OBJECT (object), "value");
 
3881
+            object = gtk_builder_get_object (builder, "theme-cursor-size");
 
3882
+            xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize",
 
3883
+                                    G_TYPE_INT, G_OBJECT (object), "value");
 
3884
 #else
 
3885
             /* hide the themes tab */
 
3886
-            object = gtk_builder_get_object (builder, "mouse-themes-hbox");
 
3887
+            object = gtk_builder_get_object (builder, "themes-hbox");
 
3888
             gtk_widget_hide (GTK_WIDGET (object));
 
3889
 #endif /* !HAVE_XCURSOR */
 
3890
 
 
3891
             /* connect sliders in the gtk tab */
 
3892
-            object = gtk_builder_get_object (builder, "mouse-dnd-threshold");
 
3893
-            xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold", G_TYPE_INT, G_OBJECT (object), "value");
 
3894
-
 
3895
-            object = gtk_builder_get_object (builder, "mouse-double-click-time");
 
3896
-            xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime", G_TYPE_INT, G_OBJECT (object), "value");
 
3897
-
 
3898
-            object = gtk_builder_get_object (builder, "mouse-double-click-distance");
 
3899
-            xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance", G_TYPE_INT, G_OBJECT (object), "value");
 
3900
+            object = gtk_builder_get_object (builder, "dnd-threshold");
 
3901
+            xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold",
 
3902
+                                    G_TYPE_INT, G_OBJECT (object), "value");\
 
3903
+
 
3904
+            object = gtk_builder_get_object (builder, "dnd-threshold-scale");
 
3905
+            g_signal_connect (G_OBJECT (object), "format-value",
 
3906
+                              G_CALLBACK (mouse_settings_format_value_px), NULL);
 
3907
+
 
3908
+            object = gtk_builder_get_object (builder, "dclick-time");
 
3909
+            xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime",
 
3910
+                                    G_TYPE_INT, G_OBJECT (object), "value");
 
3911
+
 
3912
+            object = gtk_builder_get_object (builder, "dclick-time-scale");
 
3913
+            g_signal_connect (G_OBJECT (object), "format-value",
 
3914
+                              G_CALLBACK (mouse_settings_format_value_ms), NULL);
 
3915
+
 
3916
+            object = gtk_builder_get_object (builder, "dclick-distance");
 
3917
+            xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance",
 
3918
+                                    G_TYPE_INT, G_OBJECT (object), "value");
 
3919
+
 
3920
+            object = gtk_builder_get_object (builder, "dclick-distance-scale");
 
3921
+            g_signal_connect (G_OBJECT (object), "format-value",
 
3922
+                              G_CALLBACK (mouse_settings_format_value_px), NULL);
 
3923
 
 
3924
 #ifdef HAS_DEVICE_HOTPLUGGING
 
3925
             /* create the event filter for device monitoring */