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
16
Author: Lionel Le Folgoc <mrpouit@ubuntu.com>
18
Last-Update: 2012-01-23
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])
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
47
- * Copyright (c) 2008 Nick Schermer <nick@xfce.org>
48
+ * Copyright (c) 2008-2011 Nick Schermer <nick@xfce.org>
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
56
+#ifdef HAVE_SYS_TYPES_H
57
+#include <sys/types.h>
68
+#include <X11/Xatom.h>
69
#include <X11/extensions/XI.h>
70
#include <X11/extensions/XInput.h>
71
#include <X11/extensions/XIproto.h>
73
#include <xfconf/xfconf.h>
74
#include <libxfce4util/libxfce4util.h>
76
+#include <dbus/dbus-glib.h>
82
#define MAX_DENOMINATOR (100.00)
84
+#define XFCONF_TYPE_G_VALUE_ARRAY (dbus_g_type_get_collection ("GPtrArray", G_TYPE_VALUE))
86
/* Xi 1.4 is required */
87
#define MIN_XI_VERS_MAJOR 1
88
#define MIN_XI_VERS_MINOR 4
93
-static void xfce_pointers_helper_change_button_mapping_swap (guchar *buttonmap,
98
-static void xfce_pointers_helper_change_button_mapping (XDeviceInfo *device_info,
102
- gint reverse_scrolling);
103
-static gint xfce_pointers_helper_gcd (gint num,
105
-static void xfce_pointers_helper_change_feedback (XDevice *device,
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,
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,
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);
134
@@ -100,12 +98,23 @@ struct _XfcePointersHelper
136
XfconfChannel *channel;
138
+ GPid syndaemon_pid;
140
#ifdef HAS_DEVICE_HOTPLUGGING
141
/* device presence event type */
142
gint device_presence_event_type;
150
+ XDeviceInfo *device_info;
151
+ gsize prop_name_len;
157
G_DEFINE_TYPE (XfcePointersHelper, xfce_pointers_helper, G_TYPE_OBJECT);
158
@@ -115,7 +124,9 @@ G_DEFINE_TYPE (XfcePointersHelper, xfce_
160
xfce_pointers_helper_class_init (XfcePointersHelperClass *klass)
162
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
164
+ gobject_class->finalize = xfce_pointers_helper_finalize;
168
@@ -129,6 +140,8 @@ xfce_pointers_helper_init (XfcePointersH
169
XEventClass event_class;
172
+ helper->syndaemon_pid = 0;
174
/* get the default display */
175
xdisplay = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
177
@@ -157,27 +170,26 @@ xfce_pointers_helper_init (XfcePointersH
178
xfce_pointers_helper_restore_devices (helper, NULL);
180
/* monitor the channel */
181
- g_signal_connect (G_OBJECT (helper->channel), "property-changed", G_CALLBACK (xfce_pointers_helper_channel_property_changed), NULL);
183
-#ifdef HAS_DEVICE_HOTPLUGGING
184
- /* flush x and trap errors */
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);
190
+ /* launch syndaemon if required */
191
+ xfce_pointers_helper_syndaemon_check (helper);
193
- if (G_LIKELY (xdisplay))
194
+#ifdef HAS_DEVICE_HOTPLUGGING
195
+ if (G_LIKELY (xdisplay != NULL))
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);
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);
207
+ g_warning ("Failed to create device filter");
210
- /* flush and remove the x error trap */
212
- gdk_error_trap_pop ();
216
@@ -185,18 +197,125 @@ xfce_pointers_helper_init (XfcePointersH
220
+xfce_pointers_helper_finalize (GObject *object)
222
+ xfce_pointers_helper_syndaemon_stop (XFCE_POINTERS_HELPER (object));
224
+ (*G_OBJECT_CLASS (xfce_pointers_helper_parent_class)->finalize) (object);
230
+xfce_pointers_helper_syndaemon_stop (XfcePointersHelper *helper)
232
+ if (helper->syndaemon_pid != 0)
234
+ kill (helper->syndaemon_pid, SIGHUP);
235
+ g_spawn_close_pid (helper->syndaemon_pid);
236
+ helper->syndaemon_pid = 0;
243
+xfce_pointers_helper_syndaemon_check (XfcePointersHelper *helper)
245
+ Display *xdisplay = GDK_DISPLAY ();
246
+ XDeviceInfo *device_list;
249
+ Atom touchpad_type;
250
+ Atom touchpad_off_prop;
253
+ gboolean have_synaptics = FALSE;
254
+ gchar *args[] = { "syndaemon", "-i", "2.0", "-K", "-R", NULL };
255
+ GError *error = NULL;
257
+ /* only stop a running daemon */
258
+ if (!xfconf_channel_get_bool (helper->channel, "/DisableTouchpadWhileTyping", FALSE))
259
+ goto start_stop_daemon;
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;
266
+ touchpad_type = XInternAtom (xdisplay, XI_TOUCHPAD, True);
267
+ touchpad_off_prop = XInternAtom (xdisplay, "Synaptics Off", True);
269
+ for (n = 0; n < ndevices; n++)
271
+ /* search for a touchpad */
272
+ if (device_list[n].type != touchpad_type)
275
+ gdk_error_trap_push ();
276
+ device = XOpenDevice (xdisplay, device_list[n].id);
277
+ if (gdk_error_trap_pop () != 0 || device == NULL)
279
+ g_critical ("Unable to open device %s", device_list[n].name);
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
289
+ for (i = 0; !have_synaptics && i < nprops; i++)
290
+ have_synaptics = props[i] == touchpad_off_prop;
295
+ XCloseDevice (xdisplay, device);
297
+ if (have_synaptics)
301
+ XFreeDeviceList (device_list);
305
+ if (have_synaptics)
307
+ if (helper->syndaemon_pid == 0)
309
+ if (!g_spawn_async (NULL, args, NULL, G_SPAWN_SEARCH_PATH,
310
+ NULL, NULL, &helper->syndaemon_pid, &error))
312
+ g_critical ("Spawning syndaemon failed: %s", error->message);
313
+ g_error_free (error);
319
+ /* stop the daemon */
320
+ xfce_pointers_helper_syndaemon_stop (helper);
327
xfce_pointers_helper_change_button_mapping_swap (guchar *buttonmap,
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++)
344
if (buttonmap[n] == id_1)
346
@@ -208,13 +327,18 @@ xfce_pointers_helper_change_button_mappi
347
if (G_LIKELY (id_a != -1 && id_b != -1))
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)))
354
/* swap the buttons in the button map */
355
buttonmap[id_a] = id_2;
356
buttonmap[id_b] = id_1;
366
@@ -227,24 +351,18 @@ xfce_pointers_helper_change_button_mappi
367
gint reverse_scrolling)
370
- gshort num_buttons;
371
+ gshort num_buttons = 0;
373
+ gboolean map_changed = FALSE;
377
- /* get the device classes */
378
- ptr = device_info->inputclassinfo;
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++)
385
- /* find the button class */
386
if (ptr->class == ButtonClass)
388
- /* get the number of buttons */
389
num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
395
@@ -252,44 +370,60 @@ xfce_pointers_helper_change_button_mappi
396
ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
399
- if (G_LIKELY (num_buttons > 0))
400
+ if (num_buttons == 0)
402
- /* allocate the button map */
403
- buttonmap = g_new0 (guchar, num_buttons);
404
+ g_critical ("Device %s has no buttons", device_info->name);
408
- /* get the button mapping */
409
- gdk_error_trap_push ();
410
- XGetDeviceButtonMapping (xdisplay, device, buttonmap, num_buttons);
411
- if (gdk_error_trap_pop ())
413
- g_warning ("Failed to get button mapping");
416
+ /* allocate the button map */
417
+ buttonmap = g_new0 (guchar, num_buttons);
419
- if (right_handed != -1)
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)
427
+ g_warning ("Failed to get button mapping");
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);
434
+ /* -1 means we don't change this in the mapping */
435
+ if (right_handed != -1)
437
+ /* get the right button number */
438
+ right_button = MIN (num_buttons, 3);
440
- if (reverse_scrolling != -1 && num_buttons >= 5)
442
- /* check the buttons and swap them if needed */
443
- xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons, 4, 5, !reverse_scrolling);
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 */,
450
+ map_changed = TRUE;
453
+ /* -1 means we don't change this in the mapping */
454
+ if (reverse_scrolling != -1 && num_buttons >= 5)
456
+ /* check the buttons and swap them if needed */
457
+ if (xfce_pointers_helper_change_button_mapping_swap (buttonmap, num_buttons,
459
+ 5 /* scroll down */,
460
+ !reverse_scrolling))
461
+ map_changed = TRUE;
464
- /* set the new button mapping */
465
+ /* only set on changes */
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");
474
-out: g_free (buttonmap);
475
+ if (gdk_error_trap_pop () != 0)
476
+ g_warning ("Failed to set button mapping");
481
+ g_free (buttonmap);
485
@@ -305,71 +439,128 @@ xfce_pointers_helper_gcd (gint num,
489
-xfce_pointers_helper_change_feedback (XDevice *device,
492
- gdouble acceleration)
493
+xfce_pointers_helper_change_feedback (XDeviceInfo *device_info,
497
+ gdouble acceleration)
499
XFeedbackState *states, *pt;
501
XPtrFeedbackControl feedback;
504
- gint num = -1, denom = -1, gcd;
505
+ gint num, denom, gcd;
506
+ gboolean found = FALSE;
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)
513
+ g_critical ("Failed to get the feedback states of device %s",
514
+ device_info->name);
518
- if (G_LIKELY (states))
519
+ for (pt = states, n = 0; n < num_feedbacks; n++)
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)
526
- /* find the pointer feedback class */
527
- if (pt->class == PtrFeedbackClass)
529
- if (acceleration > 0 || acceleration == -1)
531
- if (acceleration > 0)
533
- /* calculate the faction of the acceleration */
534
- num = acceleration * MAX_DENOMINATOR;
535
- denom = MAX_DENOMINATOR;
536
- gcd = xfce_pointers_helper_gcd (num, denom);
540
+ /* advance the offset */
541
+ pt = (XFeedbackState *) ((gchar *) pt + pt->length);
546
- mask |= DvAccelNum | DvAccelDenom;
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;
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)
563
+ if (acceleration > 0)
565
+ /* calculate the faction of the acceleration */
566
+ num = acceleration * MAX_DENOMINATOR;
567
+ denom = MAX_DENOMINATOR;
568
+ gcd = xfce_pointers_helper_gcd (num, denom);
572
- /* setup the mask for the threshold */
573
- if (threshold > 0 || threshold == -1)
574
- mask |= DvThreshold;
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;
586
- /* change feedback for this device */
587
- XChangeFeedbackControl (xdisplay, device, mask, (XFeedbackControl *)(void *)&feedback);
588
+ /* include acceleration in the mask */
589
+ mask |= DvAccelNum | DvAccelDenom;
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)
600
+ feedback.threshold = threshold;
602
- /* advance the offset */
603
- pt = (XFeedbackState *) ((gchar *) pt + pt->length);
604
+ mask |= DvThreshold;
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)
615
+ g_warning ("Failed to set feedback states for device %s",
616
+ device_info->name);
624
+ g_critical ("Unable to find PtrFeedbackClass for %s",
625
+ device_info->name);
628
+ XFreeFeedbackList (states);
634
+xfce_pointers_helper_change_mode (XDeviceInfo *device_info,
637
+ const gchar *mode_name)
641
+ if (strcmp (mode_name, "RELATIVE") == 0)
643
+ else if (strcmp (mode_name, "ABSOLUTE") == 0)
647
+ g_warning ("Unknown device mode %s, only RELATIVE and ABSOLUTE are valid", mode_name);
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");
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);
664
+ g_string_append_c (string, *p);
668
string = g_string_append_c (string, '_');
672
/* return the new string */
673
@@ -405,96 +600,284 @@ xfce_pointers_helper_device_xfconf_name
677
+xfce_pointers_helper_change_property (XDeviceInfo *device_info,
680
+ const gchar *prop_name,
681
+ const GValue *value)
689
+ gulong n_items, bytes_after, i;
692
+ GPtrArray *array = NULL;
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);
707
+ /* because of the True in XInternAtom we quit here if the property
708
+ * does not exists on any of the devices */
712
+ gdk_error_trap_push ();
713
+ props = XListDeviceProperties (xdisplay, device, &n_props);
714
+ if (gdk_error_trap_pop () != 0 || props == NULL)
717
+ float_atom = XInternAtom (xdisplay, "FLOAT", False);
719
+ for (n = 0; n < n_props; n++)
721
+ /* find the matching property */
722
+ if (props[n] != prop)
725
+ if (XGetDeviceProperty (xdisplay, device, prop, 0, 1000, False,
726
+ AnyPropertyType, &type, &format,
727
+ &n_items, &bytes_after, &data.c) == Success)
730
+ && (G_VALUE_HOLDS_INT (value)
731
+ || G_VALUE_HOLDS_STRING (value)
732
+ || G_VALUE_HOLDS_DOUBLE (value)))
734
+ /* only 1 items to set */
737
+ else if (G_VALUE_TYPE (value) == XFCONF_TYPE_G_VALUE_ARRAY)
739
+ array = g_value_get_boxed (value);
740
+ if (array->len != n_items)
742
+ g_critical ("Nr device property items (%ld) and xfconf value (%d) differ",
743
+ n_items, array->len);
749
+ g_critical ("Invalid device property combination");
753
+ /* reset check counter */
756
+ for (i = 0; i < n_items; i++)
758
+ /* get value from pointer array */
760
+ val = g_ptr_array_index (array, i);
764
+ if (G_VALUE_HOLDS_INT (val)
765
+ && type == XA_INTEGER)
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);
775
+ g_critical ("Unknown format %d for integer", format);
779
+ else if (G_VALUE_HOLDS_STRING (val)
783
+ /* set atom (reference to a string) */
784
+ data.a[i] = XInternAtom (xdisplay, g_value_get_string (val), False);
786
+ else if (G_VALUE_HOLDS_DOUBLE (val) /* xfconf doesn't support floats */
787
+ && type == float_atom
790
+ data.l[i] = g_value_get_double (val);
794
+ g_critical ("Unknown property type %s: target = %s, format = %d",
795
+ G_VALUE_TYPE_NAME (val), XGetAtomName (xdisplay, type), format);
799
+ /* the item was successfully updated */
803
+ if (n_succeeds == n_items)
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)
810
+ g_critical ("Failed to set device property %s for %s",
811
+ prop_name, device_info->name);
827
+xfce_pointers_helper_change_properties (gpointer key,
829
+ gpointer user_data)
831
+ XfcePointerData *pointer_data = user_data;
832
+ const gchar *prop_name = ((gchar *) key) + pointer_data->prop_name_len;
834
+ xfce_pointers_helper_change_property (pointer_data->device_info,
835
+ pointer_data->device,
836
+ pointer_data->xdisplay,
843
xfce_pointers_helper_restore_devices (XfcePointersHelper *helper,
846
- Display *xdisplay = GDK_DISPLAY ();
847
- XDeviceInfo *device_list, *device_info;
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;
859
+ gchar *device_name;
861
+ gboolean right_handed;
862
+ gboolean reverse_scrolling;
864
+ gdouble acceleration;
866
+ XfcePointerData pointer_data;
869
- /* flush x and trap errors */
871
gdk_error_trap_push ();
873
- /* get all the registered devices */
874
device_list = XListInputDevices (xdisplay, &ndevices);
875
+ if (gdk_error_trap_pop () != 0 || device_list == NULL)
877
+ g_message ("No input devices found");
881
for (n = 0; n < ndevices; n++)
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)
890
+ /* filter out the device if one is set */
891
+ if (xid != NULL && device_info->id != *xid)
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)
901
- /* filter devices */
902
- if (xid && device_info->id != *xid)
904
+ g_critical ("Unable to open device %s", device_info->name);
908
- /* open the device */
909
- device = XOpenDevice (xdisplay, device_info->id);
910
- if (G_LIKELY (device))
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);
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);
923
- /* check if we have a property for this device, else continue */
924
- if (xfconf_channel_has_property (helper->channel, righthanded_str))
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);
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)
939
+ xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
940
+ right_handed, reverse_scrolling);
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);
952
- g_free (reverse_scrolling_str);
953
- g_free (threshold_str);
954
- g_free (acceleration_str);
956
+ g_snprintf (prop, sizeof (prop), "/%s/Acceleration", device_name);
957
+ acceleration = xfconf_channel_get_double (helper->channel, prop, -1.00);
960
- g_free (righthanded_str);
961
- g_free (device_name);
962
+ if (threshold != -1 || acceleration != -1.00)
964
+ xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
965
+ threshold, acceleration);
968
- /* close the device */
969
- XCloseDevice (xdisplay, device);
971
+ /* read mode settings */
972
+ g_snprintf (prop, sizeof (prop), "/%s/Mode", device_name);
973
+ mode = xfconf_channel_get_string (helper->channel, prop, NULL);
976
+ xfce_pointers_helper_change_mode (device_info, device, xdisplay, mode);
978
+ /* set device properties */
979
+ g_snprintf (prop, sizeof (prop), "/%s/Properties", device_name);
980
+ props = xfconf_channel_get_properties (helper->channel, prop);
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;
989
+ g_hash_table_foreach (props, xfce_pointers_helper_change_properties, &pointer_data);
991
+ g_hash_table_destroy (props);
994
+ g_free (device_name);
995
+ XCloseDevice (xdisplay, device);
999
XFreeDeviceList (device_list);
1001
- /* flush and remove the x error trap */
1003
- gdk_error_trap_pop ();
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)
1017
Display *xdisplay = GDK_DISPLAY ();
1018
XDeviceInfo *device_list, *device_info;
1019
@@ -503,73 +886,104 @@ xfce_pointers_helper_channel_property_ch
1023
- /* flush x and trap errors */
1025
- gdk_error_trap_push ();
1026
+ if (G_UNLIKELY (property_name == NULL))
1029
+ /* check the daemon status */
1030
+ if (strcmp (property_name, "/DisableTouchpadWhileTyping") == 0)
1032
+ xfce_pointers_helper_syndaemon_check (helper);
1036
/* split the property name (+1 so skip the first slash in the name) */
1037
names = g_strsplit (property_name + 1, "/", -1);
1039
- /* check if splitting worked */
1040
- if (names && g_strv_length (names) == 2)
1041
+ if (names != NULL && g_strv_length (names) >= 2)
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)
1048
+ g_message ("No input devices found");
1052
for (n = 0; n < ndevices; n++)
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)
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)
1067
- /* create a valid xfconf device name */
1068
- device_name = xfce_pointers_helper_device_xfconf_name (device_info->name);
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)
1077
- /* open the device */
1078
- device = XOpenDevice (xdisplay, device_info->id);
1079
- if (G_LIKELY (device))
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));
1091
- /* close the device */
1092
- XCloseDevice (xdisplay, device);
1094
+ g_critical ("Unable to open device %s", device_info->name);
1098
- /* stop searching */
1100
+ /* check the property that requires updating */
1101
+ if (strcmp (names[1], "RightHanded") == 0)
1103
+ xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
1104
+ g_value_get_boolean (value), -1);
1106
+ else if (strcmp (names[1], "ReverseScrolling") == 0)
1108
+ xfce_pointers_helper_change_button_mapping (device_info, device, xdisplay,
1109
+ -1, g_value_get_boolean (value));
1111
+ else if (strcmp (names[1], "Threshold") == 0)
1113
+ xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
1114
+ g_value_get_int (value), -2.00);
1116
+ else if (strcmp (names[1], "Acceleration") == 0)
1118
+ xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
1119
+ -2, g_value_get_double (value));
1121
+ else if (strcmp (names[1], "Properties") == 0)
1123
+ xfce_pointers_helper_change_property (device_info, device, xdisplay,
1126
+ else if (strcmp (names[1], "Mode") == 0)
1128
+ xfce_pointers_helper_change_mode (device_info, device, xdisplay,
1129
+ g_value_get_string (value));
1133
+ g_warning ("Unknown property %s set for device %s",
1134
+ property_name, device_info->name);
1138
- g_free (device_name);
1139
+ XCloseDevice (xdisplay, device);
1141
+ /* stop searching */
1145
+ g_free (device_name);
1149
XFreeDeviceList (device_list);
1155
- /* flush and remove the x error trap */
1157
- gdk_error_trap_pop ();
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);
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)
1175
+ /* restore device settings */
1176
+ if (dpn_event->devchange == DeviceAdded)
1177
+ xfce_pointers_helper_restore_devices (helper, &dpn_event->deviceid);
1179
+ /* check if we need to launch syndaemon */
1180
+ xfce_pointers_helper_syndaemon_check (helper);
1183
return GDK_FILTER_CONTINUE;
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 = \
1191
+ $(LIBX11_CFLAGS) \
1194
xfce4_mouse_settings_LDFLAGS = \
1195
@@ -34,6 +35,7 @@ xfce4_mouse_settings_LDADD = \
1196
$(LIBXFCE4UI_LIBS) \
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
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
1216
-<?xml version="1.0"?>
1217
+<?xml version="1.0" encoding="UTF-8"?>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
1318
+ <property name="expand">False</property>
1319
+ <property name="fill">False</property>
1320
+ <property name="position">0</property>
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>
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>
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>
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>
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>
1367
+ <property name="expand">False</property>
1368
+ <property name="fill">True</property>
1369
+ <property name="position">0</property>
1373
+ <object class="GtkComboBox" id="device-combobox">
1374
+ <property name="visible">True</property>
1375
+ <property name="can_focus">False</property>
1378
+ <property name="expand">True</property>
1379
+ <property name="fill">True</property>
1380
+ <property name="position">1</property>
1385
+ <property name="expand">False</property>
1386
+ <property name="fill">True</property>
1387
<property name="position">0</property>
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>
1404
+ <property name="expand">False</property>
1405
+ <property name="fill">True</property>
1406
+ <property name="position">1</property>
1410
+ <object class="GtkNotebook" id="device-notebook">
1411
+ <property name="visible">True</property>
1412
+ <property name="can_focus">True</property>
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>
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>
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>
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>
1452
- <property name="position">0</property>
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>
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>
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>
1485
+ <property name="expand">False</property>
1486
+ <property name="fill">True</property>
1487
+ <property name="position">0</property>
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>
1502
+ <property name="expand">False</property>
1503
+ <property name="fill">True</property>
1504
+ <property name="position">1</property>
1509
+ <property name="expand">True</property>
1510
+ <property name="fill">True</property>
1511
+ <property name="position">0</property>
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>
1526
+ <property name="expand">True</property>
1527
+ <property name="fill">True</property>
1528
+ <property name="position">1</property>
1533
- <property name="position">1</property>
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>
1544
+ <attribute name="weight" value="bold"/>
1550
+ <property name="expand">False</property>
1551
+ <property name="fill">True</property>
1552
+ <property name="position">0</property>
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>
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>
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>
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>
1592
+ <property name="x_options">GTK_FILL</property>
1593
+ <property name="y_options">GTK_FILL</property>
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>
1607
+ <property name="left_attach">1</property>
1608
+ <property name="right_attach">2</property>
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>
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>
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>
1639
+ <property name="top_attach">1</property>
1640
+ <property name="bottom_attach">2</property>
1641
+ <property name="x_options">GTK_FILL</property>
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>
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>
1665
+ <property name="right_attach">2</property>
1666
+ <property name="top_attach">2</property>
1667
+ <property name="bottom_attach">3</property>
1672
- <property name="position">2</property>
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>
1683
+ <attribute name="weight" value="bold"/>
1689
+ <property name="expand">False</property>
1690
+ <property name="fill">True</property>
1691
+ <property name="position">1</property>
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>
1699
- <attribute name="weight" value="bold"/>
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>
1713
- <property name="expand">False</property>
1714
- <property name="position">0</property>
1715
+ <property name="tab_fill">False</property>
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>
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>
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>
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>
1755
- <property name="position">0</property>
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>
1768
- <property name="position">1</property>
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>
1780
- <property name="position">2</property>
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>
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>
1807
+ <property name="expand">True</property>
1808
+ <property name="fill">True</property>
1809
+ <property name="position">0</property>
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>
1823
+ <property name="expand">True</property>
1824
+ <property name="fill">True</property>
1825
+ <property name="position">1</property>
1830
- <property name="position">3</property>
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>
1842
+ <attribute name="weight" value="bold"/>
1848
+ <property name="expand">False</property>
1849
+ <property name="fill">True</property>
1850
+ <property name="position">0</property>
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>
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>
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>
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>
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>
1892
+ <property name="expand">False</property>
1893
+ <property name="fill">True</property>
1894
+ <property name="position">0</property>
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>
1909
+ <property name="expand">False</property>
1910
+ <property name="fill">True</property>
1911
+ <property name="position">1</property>
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>
1926
+ <property name="expand">True</property>
1927
+ <property name="fill">True</property>
1928
+ <property name="position">2</property>
1933
+ <property name="expand">True</property>
1934
+ <property name="fill">True</property>
1935
+ <property name="position">0</property>
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>
1952
+ <property name="expand">True</property>
1953
+ <property name="fill">True</property>
1954
+ <property name="position">1</property>
1959
- <property name="position">4</property>
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>
1971
+ <attribute name="weight" value="bold"/>
1977
+ <property name="expand">False</property>
1978
+ <property name="fill">True</property>
1979
+ <property name="position">1</property>
1982
- <child type="label">
1983
- <object class="GtkLabel" id="label5">
1986
+ <property name="position">1</property>
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>
1997
+ <property name="position">1</property>
1998
+ <property name="tab_fill">False</property>
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>
2008
+ <object class="GtkFrame" id="frame12">
2009
<property name="visible">True</property>
2010
- <property name="label" translatable="yes">Feedback</property>
2012
- <attribute name="weight" value="bold"/>
2014
+ <property name="can_focus">False</property>
2015
+ <property name="label_xalign">0</property>
2016
+ <property name="shadow_type">none</property>
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>
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>
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>
2041
+ <property name="x_options">GTK_FILL</property>
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>
2054
+ <property name="top_attach">1</property>
2055
+ <property name="bottom_attach">2</property>
2056
+ <property name="x_options">GTK_FILL</property>
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>
2065
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
2067
+ <attribute name="text">1</attribute>
2072
+ <property name="left_attach">1</property>
2073
+ <property name="right_attach">2</property>
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>
2082
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
2084
+ <attribute name="text">1</attribute>
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>
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>
2106
+ <attribute name="weight" value="bold"/>
2112
+ <property name="expand">False</property>
2113
+ <property name="fill">True</property>
2114
+ <property name="position">0</property>
2119
- <property name="expand">False</property>
2120
- <property name="position">1</property>
2121
+ <property name="position">2</property>
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>
2132
+ <property name="position">2</property>
2133
+ <property name="tab_fill">False</property>
2138
- <property name="position">1</property>
2139
+ <property name="expand">True</property>
2140
+ <property name="fill">True</property>
2141
+ <property name="position">2</property>
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>
2155
@@ -296,48 +765,54 @@
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>
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>
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>
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>
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>
2194
+ <property name="expand">True</property>
2195
+ <property name="fill">True</property>
2196
<property name="position">0</property>
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>
2212
+ <property name="expand">True</property>
2213
+ <property name="fill">True</property>
2214
<property name="position">1</property>
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>
2224
<attribute name="weight" value="bold"/>
2225
@@ -357,74 +833,86 @@
2228
<property name="expand">False</property>
2229
+ <property name="fill">True</property>
2230
<property name="position">0</property>
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>
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>
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>
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>
2265
+ <property name="expand">True</property>
2266
+ <property name="fill">True</property>
2267
<property name="position">0</property>
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>
2283
+ <property name="expand">True</property>
2284
+ <property name="fill">True</property>
2285
<property name="position">1</property>
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>
2301
+ <property name="expand">True</property>
2302
+ <property name="fill">True</property>
2303
<property name="position">2</property>
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>
2319
+ <property name="expand">True</property>
2320
+ <property name="fill">True</property>
2321
<property name="position">3</property>
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>
2331
<attribute name="weight" value="bold"/>
2335
<property name="expand">False</property>
2336
+ <property name="fill">True</property>
2337
<property name="position">1</property>
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>
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>
2360
<property name="vscrollbar_policy">automatic</property>
2361
<property name="shadow_type">etched-in</property>
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 @@
2372
+ <property name="expand">True</property>
2373
+ <property name="fill">True</property>
2374
<property name="position">0</property>
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>
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>
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>
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>
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>
2413
<property name="expand">False</property>
2414
+ <property name="fill">True</property>
2415
<property name="position">0</property>
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>
2433
<property name="expand">False</property>
2434
+ <property name="fill">True</property>
2435
<property name="position">1</property>
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>
2445
<attribute name="weight" value="bold"/>
2446
@@ -549,23 +1053,33 @@
2449
<property name="expand">False</property>
2450
+ <property name="fill">True</property>
2451
<property name="position">0</property>
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>
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>
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>
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>
2489
<attribute name="weight" value="bold"/>
2490
@@ -583,12 +1098,14 @@
2493
<property name="expand">False</property>
2494
+ <property name="fill">True</property>
2495
<property name="position">1</property>
2500
<property name="expand">False</property>
2501
+ <property name="fill">True</property>
2502
<property name="position">1</property>
2505
@@ -600,7 +1117,8 @@
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>
2515
@@ -610,42 +1128,66 @@
2519
+ <property name="expand">True</property>
2520
+ <property name="fill">True</property>
2521
<property name="position">1</property>
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>
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>
2537
- <property name="expand">False</property>
2538
- <property name="fill">False</property>
2539
- <property name="position">0</property>
2544
- <property name="expand">False</property>
2545
- <property name="pack_type">end</property>
2546
- <property name="position">0</property>
2552
<action-widget response="0">button1</action-widget>
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>
2565
+ <object class="GtkListStore" id="wacom-mode-store">
2567
+ <!-- column-name mode -->
2568
+ <column type="gchararray"/>
2569
+ <!-- column-name title -->
2570
+ <column type="gchararray"/>
2574
+ <col id="0">ABSOLUTE</col>
2575
+ <col id="1" translatable="yes">Pen (absolute)</col>
2578
+ <col id="0">RELATIVE</col>
2579
+ <col id="1" translatable="yes">Mouse (relative)</col>
2583
+ <object class="GtkListStore" id="wacom-rotation-store">
2585
+ <!-- column-name rotation -->
2586
+ <column type="gint"/>
2587
+ <!-- column-name title -->
2588
+ <column type="gchararray"/>
2592
+ <col id="0">0</col>
2593
+ <col id="1" translatable="yes">None (right-handed)</col>
2596
+ <col id="0">3</col>
2597
+ <col id="1" translatable="yes">Half (left-handed)</col>
2600
+ <col id="0">1</col>
2601
+ <col id="1" translatable="yes">Clockwise</col>
2604
+ <col id="0">2</col>
2605
+ <col id="1" translatable="yes">Counterclockwise</col>
2610
--- xfce4-settings-4.8.3.orig/dialogs/mouse-settings/main.c
2611
+++ xfce4-settings-4.8.3/dialogs/mouse-settings/main.c
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>
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
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;
2634
-/* the display for this window */
2635
-static GdkDisplay *display;
2637
/* device update id */
2638
static guint timeout_id = 0;
2640
@@ -129,15 +126,35 @@ enum
2644
- COLUMN_DEVICE_ICON,
2646
- COLUMN_DEVICE_DISPLAY_NAME,
2647
+ COLUMN_DEVICE_XFCONF_NAME,
2649
- COLUMN_DEVICE_NBUTTONS,
2656
+mouse_settings_format_value_px (GtkScale *scale,
2659
+ /* pixel value for some of the scales in the dialog */
2660
+ return g_strdup_printf (_("%g px"), value);
2666
+mouse_settings_format_value_ms (GtkScale *scale,
2669
+ /* miliseconds value for some of the scales in the dialog */
2670
+ return g_strdup_printf (_("%g ms"), value);
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);
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));
2687
/* write configuration (not during a lock) */
2688
@@ -530,7 +547,7 @@ mouse_settings_themes_populate_store (Gt
2689
g_free (active_theme);
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);
2697
@@ -565,56 +582,416 @@ mouse_settings_themes_populate_store (Gt
2702
+mouse_settings_device_get_int_property (XDevice *device,
2709
+ gulong n_items, bytes_after;
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)
2720
+ if (type == XA_INTEGER)
2722
+ if (n_items > offset)
2723
+ val = data[offset];
2725
+ if (n_items > 1 + offset && horiz != NULL)
2726
+ *horiz = data[offset + 1];
2738
+mouse_settings_device_get_selected (GtkBuilder *builder,
2740
+ gchar **xfconf_name)
2742
+ GObject *combobox;
2744
+ gboolean found = FALSE;
2746
+ GtkTreeModel *model;
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);
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);
2757
+ if (xfconf_name != NULL)
2758
+ gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XFCONF_NAME, xfconf_name, -1);
2760
+ if (device != NULL)
2762
+ /* open the device */
2763
+ gdk_error_trap_push ();
2764
+ *device = XOpenDevice (GDK_DISPLAY (), xid);
2765
+ if (gdk_error_trap_pop () != 0 || *device == NULL)
2767
+ g_critical ("Unable to open device %ld", xid);
2780
-mouse_settings_device_selection_changed (GtkTreeSelection *selection,
2781
- GtkBuilder *builder)
2782
+mouse_settings_wacom_set_rotation (GtkComboBox *combobox,
2783
+ GtkBuilder *builder)
2787
+ GtkTreeModel *model;
2788
+ gint rotation = 0;
2789
+ gchar *name = NULL;
2795
+ if (mouse_settings_device_get_selected (builder, &device, &name))
2797
+ if (gtk_combo_box_get_active_iter (combobox, &iter))
2799
+ model = gtk_combo_box_get_model (combobox);
2800
+ gtk_tree_model_get (model, &iter, 0, &rotation, -1);
2802
+ prop = g_strconcat ("/", name, "/Properties/Wacom_Rotation", NULL);
2803
+ xfconf_channel_set_int (pointers_channel, prop, rotation);
2807
+ XCloseDevice (GDK_DISPLAY (), device);
2816
+mouse_settings_wacom_set_mode (GtkComboBox *combobox,
2817
+ GtkBuilder *builder)
2820
+ Display *xdisplay = GDK_DISPLAY ();
2822
+ GtkTreeModel *model;
2823
+ gchar *mode = NULL;
2824
+ gchar *name = NULL;
2830
+ if (mouse_settings_device_get_selected (builder, &device, &name))
2832
+ if (gtk_combo_box_get_active_iter (combobox, &iter))
2834
+ model = gtk_combo_box_get_model (combobox);
2835
+ gtk_tree_model_get (model, &iter, 0, &mode, -1);
2837
+ prop = g_strconcat ("/", name, "/Mode", NULL);
2838
+ xfconf_channel_set_string (pointers_channel, prop, mode);
2844
+ XCloseDevice (xdisplay, device);
2853
+mouse_settings_synaptics_set_tap_to_click (GtkBuilder *builder)
2855
+ Display *xdisplay = GDK_DISPLAY ();
2857
+ gchar *name = NULL;
2858
+ Atom tap_ation_prop;
2861
+ gulong n, n_items, bytes_after;
2863
+ gboolean tap_to_click;
2870
+ if (mouse_settings_device_get_selected (builder, &device, &name))
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)
2880
+ if (type == XA_INTEGER
2884
+ object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
2885
+ tap_to_click = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
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;
2892
+ array = g_ptr_array_sized_new (n_items);
2893
+ for (n = 0; n < n_items; n++)
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);
2901
+ prop = g_strconcat ("/", name, "/Properties/Synaptics_Tap_Action", NULL);
2902
+ xfconf_channel_set_arrayv (pointers_channel, prop, array);
2905
+ xfconf_array_free (array);
2918
+mouse_settings_synaptics_hscroll_sensitive (GtkBuilder *builder)
2920
+ gboolean sensitive = FALSE;
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)))
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)))
2933
+ object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
2934
+ gtk_widget_set_sensitive (GTK_WIDGET (object), sensitive);
2940
+mouse_settings_synaptics_set_scrolling (GtkWidget *widget,
2941
+ GtkBuilder *builder)
2943
+ gint edge_scroll[3] = { 0, 0, 0 };
2944
+ gint two_scroll[2] = { 0, 0 };
2946
+ gboolean horizontal = FALSE;
2947
+ gchar *name = NULL, *prop;
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)))
2957
+ mouse_settings_synaptics_hscroll_sensitive (builder);
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));
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)))
2967
+ edge_scroll[0] = TRUE;
2968
+ edge_scroll[1] = horizontal;
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)))
2975
+ two_scroll[0] = TRUE;
2976
+ two_scroll[1] = horizontal;
2979
+ if (mouse_settings_device_get_selected (builder, NULL, &name))
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],
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],
3006
+mouse_settings_device_set_enabled (GtkToggleButton *button,
3007
+ GtkBuilder *builder)
3010
- Display *xdisplay;
3011
+ gchar *name = NULL;
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);
3023
+ if (mouse_settings_device_get_selected (builder, NULL, &name))
3025
+ prop = g_strconcat ("/", name, "/Properties/Device_Enabled", NULL);
3026
+ xfconf_channel_set_int (pointers_channel, prop, enabled);
3036
+mouse_settings_device_selection_changed (GtkBuilder *builder)
3038
+ gint nbuttons = 0;
3039
+ Display *xdisplay = GDK_DISPLAY ();
3041
+ XDeviceInfo *device_info;
3042
XFeedbackState *states, *pt;
3045
XPtrFeedbackState *state;
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;
3054
- GtkTreeModel *model;
3056
- gboolean has_selection;
3059
+ Atom synaptics_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;
3077
+ gint wacom_mode = -1;
3079
/* lock the dialog */
3082
- /* flush x and trap errors */
3084
- gdk_error_trap_push ();
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))
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)
3098
+ /* find mode and number of buttons */
3099
+ for (i = 0; i < ndevices; i++)
3101
+ if (device_info[i].id != device->device_id)
3104
+ any = device_info[i].inputclassinfo;
3105
+ for (n = 0; n < device_info[i].num_classes; n++)
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;
3112
+ any = (XAnyClassPtr) ((gchar *) any + any->length);
3115
- /* get the x display */
3116
- xdisplay = gdk_x11_display_get_xdisplay (display);
3120
- /* open the device */
3121
- device = XOpenDevice (xdisplay, xid);
3122
+ XFreeDeviceList (device_info);
3125
- if (G_LIKELY (device))
3126
+ /* get the button mapping */
3129
- /* allocate button map */
3130
buttonmap = g_new0 (guchar, nbuttons);
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");
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
3149
+ g_critical ("Device has no buttons");
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)
3160
+ g_critical ("Failed to get feedback states");
3164
+ /* get the pointer feedback class */
3165
+ for (pt = states, i = 0; i < nstates; i++)
3167
- /* get the pointer feedback class */
3168
- for (pt = states, i = 0; i < nstates; i++)
3169
+ if (pt->class == PtrFeedbackClass)
3171
- if (pt->class == PtrFeedbackClass)
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;
3186
+ /* advance the offset */
3187
+ pt = (XFeedbackState *) ((gchar *) pt + pt->length);
3190
- /* advance the offset */
3191
- pt = (XFeedbackState *) ((gchar *) pt + pt->length);
3193
+ XFreeFeedbackList (states);
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);
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)
3211
+ for (i = 0; i < nprops; i++)
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)
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);
3229
- /* close the device */
3230
- XCloseDevice (xdisplay, device);
3234
+ /* close the device */
3235
+ XCloseDevice (xdisplay, device);
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);
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);
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);
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);
3260
- /* flush and remove the x error trap */
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);
3267
+ object = gtk_builder_get_object (builder, "device-notebook");
3268
+ gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled == 1);
3270
+ /* synaptics options */
3271
+ object = gtk_builder_get_object (builder, "synaptics-tab");
3272
+ gtk_widget_set_visible (GTK_WIDGET (object), is_synaptics);
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);
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);
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);
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);
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);
3297
+ /* wacom options */
3298
+ object = gtk_builder_get_object (builder, "wacom-tab");
3299
+ gtk_widget_set_visible (GTK_WIDGET (object), is_wacom);
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);
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)
3314
+ else if (wacom_rotation == -1)
3315
+ wacom_rotation = 0;
3316
+ gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_rotation);
3321
@@ -693,11 +1162,9 @@ mouse_settings_device_selection_changed
3323
mouse_settings_device_save (GtkBuilder *builder)
3325
- GObject *treeview;
3326
- GtkTreeSelection *selection;
3327
+ GObject *combobox;
3328
GtkTreeModel *model;
3330
- gboolean has_selection;
3333
gchar property_name[512];
3334
@@ -710,22 +1177,17 @@ mouse_settings_device_save (GtkBuilder *
3338
- /* get the treeview */
3339
- treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
3341
- /* get the selection */
3342
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
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))
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);
3354
if (G_LIKELY (name))
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);
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);
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);
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 *
3392
-mouse_settings_device_name_edited (GtkCellRendererText *renderer,
3395
- GtkBuilder *builder)
3397
- GObject *treeview;
3398
- GtkTreeSelection *selection;
3399
- gboolean has_selection;
3400
- GtkTreeModel *model;
3402
- gchar *internal_name;
3403
- gchar *property_name;
3404
- gchar *new_name_escaped;
3406
- /* check if the new name is valid */
3407
- if (new_name == NULL || *new_name == '\0')
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));
3414
- /* get the selected item */
3415
- has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
3416
- if (G_LIKELY (has_selection))
3418
- /* get the internal device name */
3419
- gtk_tree_model_get (model, &iter, COLUMN_DEVICE_NAME, &internal_name, -1);
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);
3425
- /* escape before adding in the store */
3426
- new_name_escaped = g_markup_escape_text (new_name, -1);
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);
3432
- g_free (new_name_escaped);
3433
- g_free (property_name);
3434
- g_free (internal_name);
3441
mouse_settings_device_xfconf_name (const gchar *name)
3443
@@ -844,180 +1257,95 @@ static void
3444
mouse_settings_device_populate_store (GtkBuilder *builder,
3445
gboolean create_store)
3447
- Display *xdisplay;
3448
- XDeviceInfo *device_list, *device_info;
3449
- gchar *display_name, *usb;
3450
- gshort num_buttons;
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;
3468
+ GtkListStore *store;
3469
+ GObject *combobox;
3470
+ GtkCellRenderer *renderer;
3471
+ gchar *xfconf_name;
3472
+ gboolean has_active_item = FALSE;
3477
- /* flush x and trap errors */
3479
- gdk_error_trap_push ();
3481
- /* get the treeview */
3482
- treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
3483
+ combobox = gtk_builder_get_object (builder, "device-combobox");
3485
/* create or get the store */
3486
if (G_LIKELY (create_store))
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));
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);
3502
+ g_signal_connect_swapped (G_OBJECT (combobox), "changed",
3503
+ G_CALLBACK (mouse_settings_device_selection_changed), builder);
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);
3512
- /* get the x display */
3513
- xdisplay = gdk_x11_display_get_xdisplay (display);
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)
3521
+ g_message ("No devices found");
3525
for (i = 0; i < ndevices; i++)
3527
/* get the device */
3528
device_info = &device_list[i];
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"))
3537
+ /* create a valid xfconf device name */
3538
+ xfconf_name = mouse_settings_device_xfconf_name (device_info->name);
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,
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)
3552
- /* get the device classes */
3553
- ptr = device_info->inputclassinfo;
3555
- /* walk all the classes */
3556
- for (m = 0, num_buttons = 0; m < device_info->num_classes; m++)
3558
- /* find the button class */
3559
- if (ptr->class == ButtonClass)
3561
- /* get the number of buttons */
3562
- num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
3568
- /* advance the offset */
3569
- ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
3572
- /* only append devices with buttons */
3573
- if (G_UNLIKELY (num_buttons <= 0))
3576
- /* ignore XTEST device */
3577
- if (g_str_has_prefix (device_info->name, "Virtual core XTEST"))
3580
- /* create a valid xfconf device name */
3581
- device_name = mouse_settings_device_xfconf_name (device_info->name);
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))
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);
3594
- /* get the device name, escaped */
3595
- display_name = g_markup_escape_text (device_info->name, -1);
3597
- /* get rid of usb crap in the name */
3598
- if ((usb = strstr (display_name, "-usb")) != NULL)
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;
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);
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)))
3619
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
3620
- g_free (opt_device_name);
3621
- opt_device_name = NULL;
3623
+ g_free (xfconf_name);
3626
- g_free (property_name);
3627
- g_free (device_name);
3628
- g_free (display_name);
3633
XFreeDeviceList (device_list);
3635
- /* flush and remove the x error trap */
3637
- gdk_error_trap_pop ();
3638
+ if (!has_active_item)
3639
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
3641
- /* get the selection */
3642
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
3644
- if (G_LIKELY (create_store))
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);
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);
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);
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);
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);
3674
- /* sort after selecting the path */
3675
- if (G_LIKELY (create_store))
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));
3684
@@ -1029,18 +1357,15 @@ static gboolean
3685
mouse_settings_device_update_sliders (gpointer user_data)
3687
GtkBuilder *builder = GTK_BUILDER (user_data);
3688
- GObject *treeview, *button;
3691
GDK_THREADS_ENTER ();
3693
- /* get the treeview */
3694
- treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
3697
- mouse_settings_device_selection_changed (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), builder);
3698
+ mouse_settings_device_selection_changed (builder);
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);
3705
GDK_THREADS_LEAVE ();
3706
@@ -1063,30 +1388,24 @@ static void
3707
mouse_settings_device_reset (GtkWidget *button,
3708
GtkBuilder *builder)
3710
- GObject *treeview;
3711
- GtkTreeSelection *selection;
3712
- gchar *name, *property_name;
3713
- gboolean has_selection;
3714
- GtkTreeModel *model;
3716
+ gchar *name, *property_name;
3717
+ GtkTreeModel *model;
3719
+ GObject *combobox;
3721
/* leave when locked */
3725
- /* get the treeview */
3726
- treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
3728
- /* get the selection */
3729
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
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))
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);
3742
- if (G_LIKELY (name && timeout_id == 0))
3743
+ if (G_LIKELY (name != NULL && timeout_id == 0))
3745
/* make the button insensitive */
3746
gtk_widget_set_sensitive (button, FALSE);
3747
@@ -1136,25 +1455,18 @@ mouse_settings_event_filter (GdkXEvent *
3749
mouse_settings_create_event_filter (GtkBuilder *builder)
3751
- Display *xdisplay;
3752
+ Display *xdisplay = GDK_DISPLAY ();
3753
XEventClass event_class;
3755
- /* flush x and trap errors */
3757
- gdk_error_trap_push ();
3759
- /* get the default display and root window */
3760
- xdisplay = gdk_x11_display_get_xdisplay (display);
3761
- if (G_UNLIKELY (!xdisplay))
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);
3769
- /* flush and remove the x error trap */
3771
- gdk_error_trap_pop ();
3772
+ if (gdk_error_trap_pop () != 0)
3774
+ g_critical ("Failed to setup the device event filter");
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;
3783
XExtensionVersion *version = NULL;
3786
+ const gchar *synaptics_scroll[] = { "synaptics-scroll-no", "synaptics-scroll-edge",
3787
+ "synaptics-scroll-two", "synaptics-scroll-horiz" };
3789
/* setup translation domain */
3790
xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
3791
@@ -1255,53 +1571,106 @@ main (gint argc, gchar **argv)
3795
- /* set the working display for this instance */
3796
- display = gdk_display_get_default ();
3798
- /* populate the devices treeview */
3799
+ /* populate the devices combobox */
3800
mouse_settings_device_populate_store (builder, TRUE);
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);
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);
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);
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);
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);
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);
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);
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);
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");
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);
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++)
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);
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);
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);
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);
3871
- object = gtk_builder_get_object (builder, "mouse-reset");
3872
- g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_device_reset), builder);
3875
/* populate the themes treeview */
3876
mouse_settings_themes_populate_store (builder);
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");
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 */
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");
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");
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");\
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);
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");
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);
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");
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);
3924
#ifdef HAS_DEVICE_HOTPLUGGING
3925
/* create the event filter for device monitoring */