[Xfce4-commits] <xfce4-settings:master> Add new dialog and read properties, writing not working yet.
Nick Schermer
noreply at xfce.org
Wed May 25 19:00:07 CEST 2011
Updating branch refs/heads/master
to ad3c6becb24551b84c2187f456fa83dd03784b37 (commit)
from 6fd444dd84dba1144007ee400833ca4f22ce2325 (commit)
commit ad3c6becb24551b84c2187f456fa83dd03784b37
Author: Nick Schermer <nick at xfce.org>
Date: Sun May 22 23:07:58 2011 +0200
Add new dialog and read properties, writing not working yet.
configure.ac.in | 8 +-
dialogs/mouse-settings/Makefile.am | 2 +
dialogs/mouse-settings/main.c | 483 ++++++++---
dialogs/mouse-settings/mouse-dialog.glade | 870 +++++++++++++++-----
.../mouse-settings/xfce-mouse-settings.desktop.in | 2 +-
5 files changed, 999 insertions(+), 366 deletions(-)
diff --git a/configure.ac.in b/configure.ac.in
index 800e30a..82e9a24 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -63,7 +63,7 @@ AC_PROG_LIBTOOL()
dnl **********************************
dnl *** Check for standard headers ***
dnl **********************************
-AC_CHECK_HEADERS([errno.h memory.h math.h stdlib.h string.h unistd.h signal.h time.h])
+AC_CHECK_HEADERS([errno.h memory.h math.h stdlib.h string.h unistd.h signal.h time.h sys/types.h])
dnl ******************************
dnl *** Check for i18n support ***
@@ -74,9 +74,9 @@ dnl ***********************************
dnl *** Check for required packages ***
dnl ***********************************
XDT_CHECK_PACKAGE([EXO], [exo-1], [0.6.0])
-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
-XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0])
-XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.16.0])
+XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.20.0])
+XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0])
+XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.24.0])
XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.8.0])
XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.8.0])
XDT_CHECK_PACKAGE([LIBXFCE4KBD_PRIVATE], [libxfce4kbd-private-2], [4.8.0])
diff --git a/dialogs/mouse-settings/Makefile.am b/dialogs/mouse-settings/Makefile.am
index 9da814f..3975905 100644
--- a/dialogs/mouse-settings/Makefile.am
+++ b/dialogs/mouse-settings/Makefile.am
@@ -22,6 +22,7 @@ xfce4_mouse_settings_CFLAGS = \
$(XFCONF_CFLAGS) \
$(XI_CFLAGS) \
$(XFCONF_CFLAGS) \
+ $(LIBX11_CFLAGS) \
$(PLATFORM_CFLAGS)
xfce4_mouse_settings_LDFLAGS = \
@@ -34,6 +35,7 @@ xfce4_mouse_settings_LDADD = \
$(LIBXFCE4UI_LIBS) \
$(XFCONF_LIBS) \
$(XI_LIBS) \
+ $(LIBX11_LIBS) \
-lm
if HAVE_XCURSOR
diff --git a/dialogs/mouse-settings/main.c b/dialogs/mouse-settings/main.c
index 595339b..517093d 100644
--- a/dialogs/mouse-settings/main.c
+++ b/dialogs/mouse-settings/main.c
@@ -33,6 +33,7 @@
#endif
#include <X11/Xlib.h>
+#include <X11/Xatom.h>
#include <X11/extensions/XI.h>
#include <X11/extensions/XInput.h>
#include <X11/extensions/XIproto.h>
@@ -132,11 +133,30 @@ enum
COLUMN_DEVICE_NAME,
COLUMN_DEVICE_XFCONF_NAME,
COLUMN_DEVICE_XID,
- COLUMN_DEVICE_NBUTTONS,
N_DEVICE_COLUMNS
};
+
+static gchar *
+mouse_settings_format_value_px (GtkScale *scale,
+ gdouble value)
+{
+ return g_strdup_printf ("%g px", value);
+}
+
+
+
+static gchar *
+mouse_settings_format_value_ms (GtkScale *scale,
+ gdouble value)
+{
+ return g_strdup_printf ("%g ms", value);
+}
+
+
+
+
#ifdef HAVE_XCURSOR
static GdkPixbuf *
mouse_settings_themes_pixbuf_from_filename (const gchar *filename,
@@ -316,7 +336,7 @@ mouse_settings_themes_selection_changed (GtkTreeSelection *selection,
COLUMN_THEME_NAME, &name, -1);
/* update the preview widget */
- image = gtk_builder_get_object (builder, "mouse-theme-preview");
+ image = gtk_builder_get_object (builder, "theme-preview");
mouse_settings_themes_preview_image (path, GTK_IMAGE (image));
/* write configuration (not during a lock) */
@@ -529,7 +549,7 @@ mouse_settings_themes_populate_store (GtkBuilder *builder)
g_free (active_theme);
/* set the treeview store */
- treeview = gtk_builder_get_object (builder, "mouse-theme-treeview");
+ treeview = gtk_builder_get_object (builder, "theme-treeview");
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), COLUMN_THEME_COMMENT);
@@ -564,16 +584,51 @@ mouse_settings_themes_populate_store (GtkBuilder *builder)
+static gint
+mouse_settings_device_get_int_property (XDevice *device,
+ Atom prop,
+ gint *horiz)
+{
+ Display *xdisplay = gdk_x11_display_get_xdisplay (display);
+ Atom type;
+ gint format;
+ gulong n_items, bytes_after;
+ guchar *data;
+ gint val = -1;
+
+ if (XGetDeviceProperty (xdisplay, device, prop, 0, 1000, False,
+ AnyPropertyType, &type, &format,
+ &n_items, &bytes_after, &data) == Success)
+ {
+ if (type == XA_INTEGER)
+ {
+ if (n_items > 0)
+ val = data[0];
+
+ if (n_items > 1 && horiz != NULL)
+ *horiz = data[1];
+ }
+
+ XFree (data);
+ }
+
+ return val;
+}
+
+
+
static void
mouse_settings_device_selection_changed (GtkBuilder *builder)
{
- gint nbuttons;
+ gint nbuttons = 0;
Display *xdisplay;
XDevice *device;
+ XDeviceInfo *device_info;
XFeedbackState *states, *pt;
+ XAnyClassPtr any;
gint nstates;
XPtrFeedbackState *state;
- gint i;
+ gint i, n;
guchar *buttonmap;
gint id_1 = 0, id_3 = 0;
gint id_4 = 0, id_5 = 0;
@@ -582,58 +637,120 @@ mouse_settings_device_selection_changed (GtkBuilder *builder)
GObject *object;
GtkTreeModel *model;
GObject *combobox;
+ gint ndevices;
GtkTreeIter iter;
- XID xid;
+ gulong xid;
+ Atom synaptics_prop;
+ Atom wacom_prop;
+ Atom synaptics_tap_prop;
+ Atom synaptics_edge_scroll_prop;
+ Atom synaptics_two_scroll_prop;
+ Atom device_enabled_prop;
+ Atom wacom_rotation_prop;
+ gint is_enabled = -1;
+ gboolean is_synaptics = FALSE;
+ gboolean is_wacom = FALSE;
+ gint synaptics_tap_to_click = -1;
+ gint synaptics_edge_scroll = -1;
+ gint synaptics_edge_hscroll = -1;
+ gint synaptics_two_scroll = -1;
+ gint synaptics_two_hscroll = -1;
+ gint wacom_rotation = -1;
+ Atom *props;
+ gint nprops;
+ gint wacom_mode = -1;
/* lock the dialog */
locked++;
- /* flush x and trap errors */
- gdk_flush ();
- gdk_error_trap_push ();
-
/* get the selected item */
combobox = gtk_builder_get_object (builder, "device-combobox");
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &iter))
{
/* get device id and number of buttons */
model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
- gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid,
- COLUMN_DEVICE_NBUTTONS, &nbuttons, -1);
+ gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid, -1);
/* get the x display */
xdisplay = gdk_x11_display_get_xdisplay (display);
/* open the device */
+ gdk_error_trap_push ();
device = XOpenDevice (xdisplay, xid);
-
- if (G_LIKELY (device))
+ if (gdk_error_trap_pop () != 0 || device == NULL)
{
- /* allocate button map */
- buttonmap = g_new0 (guchar, nbuttons);
+ g_critical ("Unable to open device %ld", xid);
+ }
+ else
+ {
+ gdk_error_trap_push ();
+ device_info = XListInputDevices (xdisplay, &ndevices);
+ if (gdk_error_trap_pop () == 0 && device_info != NULL)
+ {
+ /* find mode and number of buttons */
+ for (i = 0; i < ndevices; i++)
+ {
+ if (device_info[i].id != xid)
+ continue;
- /* get the button mapping */
- XGetDeviceButtonMapping (xdisplay, device, buttonmap, nbuttons);
+ any = device_info[i].inputclassinfo;
+ for (n = 0; n < device_info[i].num_classes; n++)
+ {
+ if (any->class == ButtonClass)
+ nbuttons = ((XButtonInfoPtr) any)->num_buttons;
+ else if (any->class == ValuatorClass)
+ wacom_mode = ((XValuatorInfoPtr) any)->mode == Absolute ? 0 : 1;
- /* figure out the position of the first and second/third button in the map */
- for (i = 0; i < nbuttons; i++)
+ any = (XAnyClassPtr) ((gchar *) any + any->length);
+ }
+
+ break;
+ }
+
+ XFreeDeviceList (device_info);
+ }
+ else
{
- if (buttonmap[i] == 1)
- id_1 = i;
- else if (buttonmap[i] == (nbuttons < 3 ? 2 : 3))
- id_3 = i;
- else if (buttonmap[i] == 4)
- id_4 = i;
- else if (buttonmap[i] == 5)
- id_5 = i;
+ g_message ("error %p", device_info);
}
- /* cleanup */
- g_free (buttonmap);
+ /* get the button mapping */
+ if (nbuttons > 0)
+ {
+ buttonmap = g_new0 (guchar, nbuttons);
+ gdk_error_trap_push ();
+ XGetDeviceButtonMapping (xdisplay, device, buttonmap, nbuttons);
+ if (gdk_error_trap_pop () != 0)
+ g_critical ("Failed to get button map");
+
+ /* figure out the position of the first and second/third button in the map */
+ for (i = 0; i < nbuttons; i++)
+ {
+ if (buttonmap[i] == 1)
+ id_1 = i;
+ else if (buttonmap[i] == (nbuttons < 3 ? 2 : 3))
+ id_3 = i;
+ else if (buttonmap[i] == 4)
+ id_4 = i;
+ else if (buttonmap[i] == 5)
+ id_5 = i;
+ }
+
+ g_free (buttonmap);
+ }
+ else
+ {
+ g_critical ("Device has no buttons");
+ }
/* get the feedback states for this device */
+ gdk_error_trap_push ();
states = XGetFeedbackControl (xdisplay, device, &nstates);
- if (states != NULL)
+ if (gdk_error_trap_pop () != 0 || states == NULL)
+ {
+ g_critical ("Failed to get feedback states");
+ }
+ else
{
/* get the pointer feedback class */
for (pt = states, i = 0; i < nstates; i++)
@@ -644,9 +761,6 @@ mouse_settings_device_selection_changed (GtkBuilder *builder)
state = (XPtrFeedbackState *) pt;
acceleration = (gdouble) state->accelNum / (gdouble) state->accelDenom;
threshold = state->threshold;
-
- /* done */
- break;
}
/* advance the offset */
@@ -656,32 +770,117 @@ mouse_settings_device_selection_changed (GtkBuilder *builder)
XFreeFeedbackList (states);
}
+ /* wacom and synaptics specific properties */
+ device_enabled_prop = XInternAtom (xdisplay, "Device Enabled", True);
+ synaptics_prop = XInternAtom (xdisplay, "Synaptics Off", True);
+ wacom_prop = XInternAtom (xdisplay, "Wacom Tool Type", True);
+ synaptics_tap_prop = XInternAtom (xdisplay, "Synaptics Tap Action", True);
+ synaptics_edge_scroll_prop = XInternAtom (xdisplay, "Synaptics Edge Scrolling", True);
+ synaptics_two_scroll_prop = XInternAtom (xdisplay, "Synaptics Two-Finger Scrolling", True);
+ wacom_rotation_prop = XInternAtom (xdisplay, "Wacom Rotation", True);
+
+ /* check if this is a synaptics or wacom device */
+ gdk_error_trap_push ();
+ props = XListDeviceProperties (xdisplay, device, &nprops);
+ if (gdk_error_trap_pop () == 0 && props != NULL)
+ {
+ for (i = 0; i < nprops; i++)
+ {
+ if (props[i] == device_enabled_prop)
+ is_enabled = mouse_settings_device_get_int_property (device, props[i], NULL);
+ else if (props[i] == synaptics_prop)
+ is_synaptics = TRUE;
+ else if (props[i] == wacom_prop)
+ is_wacom = TRUE;
+ else if (props[i] == synaptics_tap_prop)
+ synaptics_tap_to_click = mouse_settings_device_get_int_property (device, props[i], NULL);
+ else if (props[i] == synaptics_edge_scroll_prop)
+ synaptics_edge_scroll = mouse_settings_device_get_int_property (device, props[i], &synaptics_edge_hscroll);
+ else if (props[i] == synaptics_two_scroll_prop)
+ synaptics_two_scroll = mouse_settings_device_get_int_property (device, props[i], &synaptics_two_hscroll);
+ else if (props[i] == wacom_rotation_prop)
+ wacom_rotation = mouse_settings_device_get_int_property (device, props[i], NULL);
+ }
+
+ XFree (props);
+ }
+
/* close the device */
XCloseDevice (xdisplay, device);
}
}
/* update button order */
- object = gtk_builder_get_object (builder, id_1 > id_3 ? "mouse-left-handed" : "mouse-right-handed");
+ object = gtk_builder_get_object (builder, id_1 > id_3 ? "device-left-handed" : "device-right-handed");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), TRUE);
- object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
+ object = gtk_builder_get_object (builder, "device-reverse-scrolling");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), !!(id_5 < id_4));
gtk_widget_set_sensitive (GTK_WIDGET (object), nbuttons >= 5);
/* update acceleration scale */
- object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
+ object = gtk_builder_get_object (builder, "device-acceleration-scale");
gtk_range_set_value (GTK_RANGE (object), acceleration);
gtk_widget_set_sensitive (GTK_WIDGET (object), acceleration != -1);
/* update threshold scale */
- object = gtk_builder_get_object (builder, "mouse-threshold-scale");
+ object = gtk_builder_get_object (builder, "device-threshold-scale");
gtk_range_set_value (GTK_RANGE (object), threshold);
gtk_widget_set_sensitive (GTK_WIDGET (object), threshold != -1);
- /* flush and remove the x error trap */
- gdk_flush ();
- gdk_error_trap_pop ();
+ object = gtk_builder_get_object (builder, "device-enabled");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled != -1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), is_enabled > 0);
+
+ object = gtk_builder_get_object (builder, "device-notebook");
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (object), is_synaptics || is_wacom);
+
+ /* synaptics options */
+ object = gtk_builder_get_object (builder, "synaptics-tab");
+ gtk_widget_set_visible (GTK_WIDGET (object), is_synaptics);
+
+ if (is_synaptics)
+ {
+ object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_tap_to_click != -1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_tap_to_click > 0);
+
+ object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_edge_scroll != -1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_edge_scroll > 0);
+
+ object = gtk_builder_get_object (builder, "synaptics-scroll-two");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_two_scroll != -1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_two_scroll > 0);
+
+ object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_two_hscroll != -1 || synaptics_edge_hscroll != 1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object),
+ (synaptics_edge_scroll == 1 && synaptics_edge_hscroll == 1)
+ || (synaptics_two_scroll == 1 && synaptics_two_hscroll == 1));
+ }
+
+ /* wacom options */
+ object = gtk_builder_get_object (builder, "wacom-tab");
+ gtk_widget_set_visible (GTK_WIDGET (object), is_wacom);
+
+ if (is_wacom)
+ {
+ object = gtk_builder_get_object (builder, "wacom-mode");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_mode != -1);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_mode == -1 ? 1 : wacom_mode);
+
+ object = gtk_builder_get_object (builder, "wacom-rotation");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_rotation != -1);
+ /* 3 (half) comes afer none */
+ if (wacom_rotation == 3)
+ wacom_rotation = 1;
+ else if (wacom_rotation > 0)
+ wacom_rotation++;
+ else if (wacom_rotation == -1)
+ wacom_rotation = 0;
+ gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_rotation);
+ }
/* unlock */
locked--;
@@ -717,7 +916,7 @@ mouse_settings_device_save (GtkBuilder *builder)
if (G_LIKELY (name))
{
/* store the button order */
- object = gtk_builder_get_object (builder, "mouse-right-handed");
+ object = gtk_builder_get_object (builder, "device-right-handed");
g_snprintf (property_name, sizeof (property_name), "/%s/RightHanded", name);
righthanded = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
if (!xfconf_channel_has_property (pointers_channel, property_name)
@@ -725,21 +924,21 @@ mouse_settings_device_save (GtkBuilder *builder)
xfconf_channel_set_bool (pointers_channel, property_name, righthanded);
/* store reverse scrolling */
- object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
+ object = gtk_builder_get_object (builder, "device-reverse-scrolling");
g_snprintf (property_name, sizeof (property_name), "/%s/ReverseScrolling", name);
reverse_scrolling = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
if (xfconf_channel_get_bool (pointers_channel, property_name, FALSE) != reverse_scrolling)
xfconf_channel_set_bool (pointers_channel, property_name, reverse_scrolling);
/* store the threshold */
- object = gtk_builder_get_object (builder, "mouse-threshold-scale");
+ object = gtk_builder_get_object (builder, "device-threshold-scale");
g_snprintf (property_name, sizeof (property_name), "/%s/Threshold", name);
threshold = gtk_range_get_value (GTK_RANGE (object));
if (xfconf_channel_get_int (pointers_channel, property_name, -1) != threshold)
xfconf_channel_set_int (pointers_channel, property_name, threshold);
/* store the acceleration */
- object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
+ object = gtk_builder_get_object (builder, "device-acceleration-scale");
g_snprintf (property_name, sizeof (property_name), "/%s/Acceleration", name);
acceleration = gtk_range_get_value (GTK_RANGE (object));
if (xfconf_channel_get_double (pointers_channel, property_name, -1) != acceleration)
@@ -789,10 +988,8 @@ mouse_settings_device_populate_store (GtkBuilder *builder,
{
Display *xdisplay;
XDeviceInfo *device_list, *device_info;
- gshort num_buttons;
gint ndevices;
- gint i, m;
- XAnyClassPtr ptr;
+ gint i;
GtkTreeIter iter;
GtkListStore *store;
GObject *combobox;
@@ -803,22 +1000,22 @@ mouse_settings_device_populate_store (GtkBuilder *builder,
/* lock */
locked++;
- /* flush x and trap errors */
- gdk_flush ();
- gdk_error_trap_push ();
-
combobox = gtk_builder_get_object (builder, "device-combobox");
/* create or get the store */
if (G_LIKELY (create_store))
{
- store = gtk_list_store_new (N_DEVICE_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
+ store = gtk_list_store_new (N_DEVICE_COLUMNS,
+ G_TYPE_STRING /* COLUMN_DEVICE_NAME */,
+ G_TYPE_STRING /* COLUMN_DEVICE_XFCONF_NAME */,
+ G_TYPE_ULONG /* COLUMN_DEVICE_XID */);
gtk_combo_box_set_model (GTK_COMBO_BOX (combobox), GTK_TREE_MODEL (store));
/* text renderer */
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", COLUMN_DEVICE_NAME, NULL);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+ "text", COLUMN_DEVICE_NAME, NULL);
g_signal_connect_swapped (G_OBJECT (combobox), "changed",
G_CALLBACK (mouse_settings_device_selection_changed), builder);
@@ -833,67 +1030,47 @@ mouse_settings_device_populate_store (GtkBuilder *builder,
xdisplay = gdk_x11_display_get_xdisplay (display);
/* get all the registered devices */
+ gdk_error_trap_push ();
device_list = XListInputDevices (xdisplay, &ndevices);
+ if (gdk_error_trap_pop () != 0 || device_list == NULL)
+ {
+ g_message ("No devices found");
+ goto bailout;
+ }
for (i = 0; i < ndevices; i++)
{
/* get the device */
device_info = &device_list[i];
- /* filter out the pointer devices */
- if (device_info->use == IsXExtensionPointer)
+ /* filter out the pointer and virtual devices */
+ if (device_info->use != IsXExtensionPointer
+ || g_str_has_prefix (device_info->name, "Virtual core XTEST"))
+ continue;
+
+ /* create a valid xfconf device name */
+ xfconf_name = mouse_settings_device_xfconf_name (device_info->name);
+
+ /* insert in the store */
+ gtk_list_store_insert_with_values (store, &iter, i,
+ COLUMN_DEVICE_XFCONF_NAME, xfconf_name,
+ COLUMN_DEVICE_NAME, device_info->name,
+ COLUMN_DEVICE_XID, device_info->id,
+ -1);
+
+ /* check if we should select this device */
+ if (device_info->name != NULL
+ && opt_device_name != NULL
+ && strcmp (opt_device_name, device_info->name) == 0)
{
- /* get the device classes */
- ptr = device_info->inputclassinfo;
-
- /* walk all the classes */
- for (m = 0, num_buttons = 0; m < device_info->num_classes; m++)
- {
- /* find the button class */
- if (ptr->class == ButtonClass)
- {
- /* get the number of buttons */
- num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
-
- /* done */
- break;
- }
-
- /* advance the offset */
- ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
- }
-
- /* only append devices with buttons */
- if (G_UNLIKELY (num_buttons <= 0))
- continue;
-
- /* ignore XTEST device */
- if (g_str_has_prefix (device_info->name, "Virtual core XTEST"))
- continue;
-
- /* create a valid xfconf device name */
- xfconf_name = mouse_settings_device_xfconf_name (device_info->name);
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
+ g_free (opt_device_name);
+ opt_device_name = NULL;
+ has_active_item = TRUE;
+ }
- /* insert in the store */
- gtk_list_store_insert_with_values (store, &iter, i,
- COLUMN_DEVICE_XFCONF_NAME, xfconf_name,
- COLUMN_DEVICE_NAME, device_info->name,
- COLUMN_DEVICE_XID, device_info->id,
- COLUMN_DEVICE_NBUTTONS, num_buttons, -1);
+ g_free (xfconf_name);
- /* check if we should select this device */
- if (device_info->name != NULL
- && opt_device_name != NULL
- && strcmp (opt_device_name, device_info->name) == 0)
- {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
- g_free (opt_device_name);
- opt_device_name = NULL;
- has_active_item = TRUE;
- }
-
- g_free (xfconf_name);
- }
}
XFreeDeviceList (device_list);
@@ -901,9 +1078,7 @@ mouse_settings_device_populate_store (GtkBuilder *builder,
if (!has_active_item)
gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
- /* flush and remove the x error trap */
- gdk_flush ();
- gdk_error_trap_pop ();
+ bailout:
/* unlock */
locked--;
@@ -923,7 +1098,7 @@ mouse_settings_device_update_sliders (gpointer user_data)
mouse_settings_device_selection_changed (builder);
/* make the button sensitive again */
- button = gtk_builder_get_object (builder, "mouse-reset");
+ button = gtk_builder_get_object (builder, "device-reset-feedback");
gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
GDK_THREADS_LEAVE ();
@@ -1016,22 +1191,20 @@ mouse_settings_create_event_filter (GtkBuilder *builder)
Display *xdisplay;
XEventClass event_class;
- /* flush x and trap errors */
- gdk_flush ();
- gdk_error_trap_push ();
-
/* get the default display and root window */
xdisplay = gdk_x11_display_get_xdisplay (display);
if (G_UNLIKELY (!xdisplay))
return;
/* monitor device change events */
+ gdk_error_trap_push ();
DevicePresence (xdisplay, device_presence_event_type, event_class);
XSelectExtensionEvent (xdisplay, RootWindow (xdisplay, DefaultScreen (xdisplay)), &event_class, 1);
-
- /* flush and remove the x error trap */
- gdk_flush ();
- gdk_error_trap_pop ();
+ if (gdk_error_trap_pop () != 0)
+ {
+ g_critical ("Failed to setup the device event filter");
+ return;
+ }
/* add an event filter */
gdk_window_add_filter (NULL, mouse_settings_event_filter, builder);
@@ -1050,6 +1223,7 @@ main (gint argc, gchar **argv)
GError *error = NULL;
GObject *object;
XExtensionVersion *version = NULL;
+ gchar *syndaemon;
/* setup translation domain */
xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
@@ -1140,46 +1314,79 @@ main (gint argc, gchar **argv)
mouse_settings_device_populate_store (builder, TRUE);
/* connect signals */
- object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
- g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
+ object = gtk_builder_get_object (builder, "device-acceleration-scale");
+ g_signal_connect_swapped (G_OBJECT (object), "value-changed",
+ G_CALLBACK (mouse_settings_device_save), builder);
- object = gtk_builder_get_object (builder, "mouse-threshold-scale");
- g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
+ object = gtk_builder_get_object (builder, "device-threshold-scale");
+ g_signal_connect (G_OBJECT (object), "format-value",
+ G_CALLBACK (mouse_settings_format_value_px), NULL);
+ g_signal_connect_swapped (G_OBJECT (object), "value-changed",
+ G_CALLBACK (mouse_settings_device_save), builder);
- object = gtk_builder_get_object (builder, "mouse-left-handed");
- g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
+ object = gtk_builder_get_object (builder, "device-left-handed");
+ g_signal_connect_swapped (G_OBJECT (object), "toggled",
+ G_CALLBACK (mouse_settings_device_save), builder);
- object = gtk_builder_get_object (builder, "mouse-right-handed");
- g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
+ object = gtk_builder_get_object (builder, "device-right-handed");
+ g_signal_connect_swapped (G_OBJECT (object), "toggled",
+ G_CALLBACK (mouse_settings_device_save), builder);
+
+ object = gtk_builder_get_object (builder, "device-reverse-scrolling");
+ g_signal_connect_swapped (G_OBJECT (object), "toggled",
+ G_CALLBACK (mouse_settings_device_save), builder);
+
+ object = gtk_builder_get_object (builder, "device-reset-feedback");
+ g_signal_connect (G_OBJECT (object), "clicked",
+ G_CALLBACK (mouse_settings_device_reset), builder);
+
+ object = gtk_builder_get_object (builder, "synaptics-disable-while-type");
+ syndaemon = g_find_program_in_path ("syndaemon");
+ gtk_widget_set_sensitive (GTK_WIDGET (object), syndaemon != NULL);
+ g_free (syndaemon);
+ xfconf_g_property_bind (pointers_channel, "/DisableTouchpadWhileTyping",
+ G_TYPE_BOOLEAN, G_OBJECT (object), "active");
- object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
- g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
- object = gtk_builder_get_object (builder, "mouse-reset");
- g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_device_reset), builder);
#ifdef HAVE_XCURSOR
/* populate the themes treeview */
mouse_settings_themes_populate_store (builder);
/* connect the cursor size in the cursor tab */
- object = gtk_builder_get_object (builder, "mouse-cursor-size");
- xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize", G_TYPE_INT, G_OBJECT (object), "value");
+ object = gtk_builder_get_object (builder, "theme-cursor-size");
+ xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize",
+ G_TYPE_INT, G_OBJECT (object), "value");
#else
/* hide the themes tab */
- object = gtk_builder_get_object (builder, "mouse-themes-hbox");
+ object = gtk_builder_get_object (builder, "themes-hbox");
gtk_widget_hide (GTK_WIDGET (object));
#endif /* !HAVE_XCURSOR */
/* connect sliders in the gtk tab */
- object = gtk_builder_get_object (builder, "mouse-dnd-threshold");
- xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold", G_TYPE_INT, G_OBJECT (object), "value");
+ object = gtk_builder_get_object (builder, "dnd-threshold");
+ xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold",
+ G_TYPE_INT, G_OBJECT (object), "value");\
+
+ object = gtk_builder_get_object (builder, "dnd-threshold-scale");
+ g_signal_connect (G_OBJECT (object), "format-value",
+ G_CALLBACK (mouse_settings_format_value_px), NULL);
+
+ object = gtk_builder_get_object (builder, "dclick-time");
+ xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime",
+ G_TYPE_INT, G_OBJECT (object), "value");
+
+ object = gtk_builder_get_object (builder, "dclick-time-scale");
+ g_signal_connect (G_OBJECT (object), "format-value",
+ G_CALLBACK (mouse_settings_format_value_ms), NULL);
- object = gtk_builder_get_object (builder, "mouse-double-click-time");
- xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime", G_TYPE_INT, G_OBJECT (object), "value");
+ object = gtk_builder_get_object (builder, "dclick-distance");
+ xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance",
+ G_TYPE_INT, G_OBJECT (object), "value");
- object = gtk_builder_get_object (builder, "mouse-double-click-distance");
- xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance", G_TYPE_INT, G_OBJECT (object), "value");
+ object = gtk_builder_get_object (builder, "dclick-distance-scale");
+ g_signal_connect (G_OBJECT (object), "format-value",
+ G_CALLBACK (mouse_settings_format_value_px), NULL);
#ifdef HAS_DEVICE_HOTPLUGGING
/* create the event filter for device monitoring */
diff --git a/dialogs/mouse-settings/mouse-dialog.glade b/dialogs/mouse-settings/mouse-dialog.glade
index c4a0d95..74e9ef0 100644
--- a/dialogs/mouse-settings/mouse-dialog.glade
+++ b/dialogs/mouse-settings/mouse-dialog.glade
@@ -3,28 +3,48 @@
<requires lib="gtk+" version="2.20"/>
<!-- interface-requires libxfce4ui 4.5 -->
<!-- interface-naming-policy project-wide -->
- <object class="GtkAdjustment" id="adjustment6">
- <property name="lower">16</property>
- <property name="upper">48</property>
- <property name="value">24</property>
+ <object class="GtkAdjustment" id="dclick-distance">
+ <property name="upper">20</property>
+ <property name="value">4</property>
<property name="step_increment">1</property>
- <property name="page_increment">11</property>
+ <property name="page_increment">5</property>
</object>
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="stock">gtk-revert-to-saved</property>
+ <object class="GtkAdjustment" id="dclick-time">
+ <property name="lower">100</property>
+ <property name="upper">2000</property>
+ <property name="value">250</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">100</property>
</object>
- <object class="GtkAdjustment" id="mouse-acceleration">
+ <object class="GtkAdjustment" id="device-acceleration">
<property name="lower">0.10000000000000001</property>
<property name="upper">10</property>
<property name="value">2</property>
<property name="step_increment">0.10000000000000001</property>
<property name="page_increment">1</property>
</object>
+ <object class="GtkAdjustment" id="device-threshold">
+ <property name="lower">1</property>
+ <property name="upper">30</property>
+ <property name="value">4</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">5</property>
+ </object>
+ <object class="GtkAdjustment" id="dnd-threshold">
+ <property name="lower">1</property>
+ <property name="upper">50</property>
+ <property name="value">8</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-revert-to-saved</property>
+ </object>
<object class="XfceTitledDialog" id="mouse-dialog">
<property name="can_focus">False</property>
- <property name="title" translatable="yes">Mouse</property>
+ <property name="title" translatable="yes">Mouse and Touchpad</property>
<property name="window_position">center-on-parent</property>
<property name="icon_name">preferences-desktop-peripherals</property>
<property name="type_hint">dialog</property>
@@ -82,7 +102,7 @@
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">_Device:</property>
+ <property name="label" translatable="yes">De_vice:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">device-combobox</property>
<property name="angle">0.050000000000000003</property>
@@ -112,9 +132,14 @@
</packing>
</child>
<child>
- <object class="GtkHSeparator" id="hseparator1">
+ <object class="GtkCheckButton" id="device-enabled">
+ <property name="label" translatable="yes">_Enable this device</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -123,226 +148,598 @@
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox2">
+ <object class="GtkNotebook" id="device-notebook">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">6</property>
+ <property name="can_focus">True</property>
<child>
- <object class="GtkFrame" id="frame1">
+ <object class="GtkVBox" id="device-box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkAlignment" id="alignment1">
+ <object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkVBox" id="vbox12">
+ <object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="spacing">6</property>
+ <property name="left_padding">12</property>
<child>
- <object class="GtkRadioButton" id="mouse-right-handed">
- <property name="label" translatable="yes">_Right handed</property>
+ <object class="GtkVBox" id="vbox12">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_action_appearance">False</property>
- <property name="use_underline">True</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="mouse-left-handed">
- <property name="label" translatable="yes">_Left handed</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_action_appearance">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">mouse-right-handed</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="mouse-reverse-scrolling">
- <property name="label" translatable="yes">Re_verse scroll direction</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">When selected, the scroll wheel will work in the opposite direction</property>
- <property name="use_action_appearance">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="device-right-handed">
+ <property name="label" translatable="yes">_Right-handed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="device-left-handed">
+ <property name="label" translatable="yes">_Left-handed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">device-right-handed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="device-reverse-scrolling">
+ <property name="label" translatable="yes">Reverse scroll d_irection</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">When selected, the scroll wheel will work in the opposite direction</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Buttons</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
</child>
- <child type="label">
- <object class="GtkLabel" id="label4">
+ <child>
+ <object class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">General</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="device-acceleration-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Acceleration:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">device-acceleration-scale</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="device-acceleration-scale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The factor at which the pointer's speed will increase as the mouse is moved</property>
+ <property name="update_policy">delayed</property>
+ <property name="adjustment">device-acceleration</property>
+ <property name="round_digits">1</property>
+ <property name="value_pos">right</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="device-threshold-scale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">The number of pixels the pointer must move in a short time before it starts accelerating</property>
+ <property name="update_policy">delayed</property>
+ <property name="adjustment">device-threshold</property>
+ <property name="round_digits">0</property>
+ <property name="digits">0</property>
+ <property name="value_pos">right</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="device-threshold-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Sensitivity:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">device-threshold-scale</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <object class="GtkButton" id="device-reset-feedback">
+ <property name="label" translatable="yes">Reset to De_faults</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Set the acceleration and sensitivity for the selected device to the default values</property>
+ <property name="use_action_appearance">False</property>
+ <property name="image">image5</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Pointer Speed</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_General</property>
+ <property name="use_underline">True</property>
+ </object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
+ <property name="tab_fill">False</property>
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame2">
+ <object class="GtkVBox" id="synaptics-tab">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkAlignment" id="alignment2">
+ <object class="GtkFrame" id="frame11">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkTable" id="table1">
+ <object class="GtkAlignment" id="alignment13">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">12</property>
- <property name="row_spacing">6</property>
- <child>
- <object class="GtkLabel" id="mouse-acceleration-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">_Acceleration:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-acceleration-scale</property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkHScale" id="mouse-acceleration-scale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">The factor at which the pointer's speed will increase as the mouse is moved</property>
- <property name="update_policy">delayed</property>
- <property name="adjustment">mouse-acceleration</property>
- <property name="round_digits">1</property>
- <property name="value_pos">right</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
+ <property name="left_padding">12</property>
<child>
- <object class="GtkHScale" id="mouse-threshold-scale">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">The number of pixels the pointer must move in a short time before it starts accelerating</property>
- <property name="update_policy">delayed</property>
- <property name="adjustment">mouse-threshold</property>
- <property name="round_digits">0</property>
- <property name="digits">0</property>
- <property name="value_pos">right</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="mouse-threshold-label">
+ <object class="GtkVBox" id="vbox11">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">S_ensitivity:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-threshold-scale</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="synaptics-disable-while-type">
+ <property name="label" translatable="yes">Disable to_uchpad while typing</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">When selected, the touchpad will be disabled when the keyboard is being used</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="synaptics-tap-to-click">
+ <property name="label" translatable="yes">T_ap touchpad to click</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
</child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">General</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
<child>
- <object class="GtkAlignment" id="alignment7">
+ <object class="GtkVBox" id="vbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkButton" id="mouse-reset">
- <property name="label" translatable="yes">Re_set to Defaults</property>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="synaptics-scroll-no">
+ <property name="label" translatable="yes">Di_sabled</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="synaptics-scroll-edge">
+ <property name="label" translatable="yes">Edge scro_lling</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">synaptics-scroll-no</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="synaptics-scroll-two">
+ <property name="label" translatable="yes">Two-_finger scrolling</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">synaptics-scroll-no</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="synaptics-scroll-horiz">
+ <property name="label" translatable="yes">Enable hori_zontal scrolling</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="tooltip_text" translatable="yes">Set the acceleration and threshold for the selected device to the default values</property>
+ <property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
- <property name="image">image1</property>
<property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
- <packing>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Scrolling</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
- <child type="label">
- <object class="GtkLabel" id="label5">
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">T_ouchpad</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="wacom-tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkFrame" id="frame12">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Pointer Speed</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Tr_acking mode:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">wacom-mode</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Rotation:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">wacom-rotation</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="wacom-mode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">wacom-mode-store</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="wacom-rotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">wacom-rotation-store</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">General</property>
+ <property name="use_markup">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
</child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Table_t</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
</packing>
</child>
</object>
@@ -358,7 +755,7 @@
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">De_vices</property>
+ <property name="label" translatable="yes">_Devices</property>
<property name="use_underline">True</property>
</object>
<packing>
@@ -381,7 +778,6 @@
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="bottom_padding">6</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox4">
@@ -394,9 +790,9 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">T_hreshold:</property>
+ <property name="label" translatable="yes">Th_reshold:</property>
<property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-dnd-widget</property>
+ <property name="mnemonic_widget">dnd-threshold-scale</property>
</object>
<packing>
<property name="expand">True</property>
@@ -405,12 +801,12 @@
</packing>
</child>
<child>
- <object class="GtkHScale" id="mouse-dnd-widget">
+ <object class="GtkHScale" id="dnd-threshold-scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">The number of pixels the pointer must move before a drag operation will start</property>
<property name="update_policy">delayed</property>
- <property name="adjustment">mouse-dnd-threshold</property>
+ <property name="adjustment">dnd-threshold</property>
<property name="digits">0</property>
<property name="value_pos">right</property>
</object>
@@ -451,22 +847,21 @@
<object class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="bottom_padding">6</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="border_width">6</property>
<property name="spacing">6</property>
<child>
- <object class="GtkLabel" id="mouse-double-click-time-label">
+ <object class="GtkLabel" id="dclick-time-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Ti_me:</property>
<property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-double-click-time-widget</property>
+ <property name="mnemonic_widget">dclick-time-scale</property>
</object>
<packing>
<property name="expand">True</property>
@@ -475,12 +870,12 @@
</packing>
</child>
<child>
- <object class="GtkHScale" id="mouse-double-click-time-widget">
+ <object class="GtkHScale" id="dclick-time-scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<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>
<property name="update_policy">delayed</property>
- <property name="adjustment">mouse-double-click-time</property>
+ <property name="adjustment">dclick-time</property>
<property name="digits">0</property>
<property name="value_pos">right</property>
</object>
@@ -491,13 +886,13 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="mouse-double-click-distance-label">
+ <object class="GtkLabel" id="dclick-distance-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">_Distance:</property>
+ <property name="label" translatable="yes">D_istance:</property>
<property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-double-click-distance-widget</property>
+ <property name="mnemonic_widget">dclick-distance-scale</property>
</object>
<packing>
<property name="expand">True</property>
@@ -506,12 +901,12 @@
</packing>
</child>
<child>
- <object class="GtkHScale" id="mouse-double-click-distance-widget">
+ <object class="GtkHScale" id="dclick-distance-scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<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>
<property name="update_policy">delayed</property>
- <property name="adjustment">mouse-double-click-distance</property>
+ <property name="adjustment">dclick-distance</property>
<property name="digits">0</property>
<property name="value_pos">right</property>
</object>
@@ -560,7 +955,7 @@
</packing>
</child>
<child>
- <object class="GtkHBox" id="mouse-themes-hbox">
+ <object class="GtkHBox" id="themes-hbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">12</property>
@@ -573,7 +968,7 @@
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">etched-in</property>
<child>
- <object class="GtkTreeView" id="mouse-theme-treeview">
+ <object class="GtkTreeView" id="theme-treeview">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -602,21 +997,20 @@
<object class="GtkAlignment" id="alignment5">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="bottom_padding">6</property>
<property name="left_padding">12</property>
<child>
<object class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="border_width">6</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label21">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Cursor _Size:</property>
+ <property name="label" translatable="yes">Cursor _size:</property>
<property name="use_underline">True</property>
- <property name="mnemonic_widget">mouse-cursor-size</property>
+ <property name="mnemonic_widget">spin1</property>
</object>
<packing>
<property name="expand">False</property>
@@ -625,14 +1019,14 @@
</packing>
</child>
<child>
- <object class="GtkSpinButton" id="mouse-cursor-size">
+ <object class="GtkSpinButton" id="spin1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
- <property name="adjustment">adjustment6</property>
+ <property name="adjustment">theme-cursor-size</property>
<property name="snap_to_ticks">True</property>
<property name="numeric">True</property>
</object>
@@ -674,10 +1068,16 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <property name="top_padding">6</property>
<property name="bottom_padding">6</property>
- <property name="left_padding">12</property>
+ <property name="left_padding">18</property>
+ <property name="right_padding">6</property>
<child>
- <object class="GtkImage" id="mouse-theme-preview">
+ <object class="GtkImage" id="theme-preview">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
@@ -718,7 +1118,7 @@
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">_Theme</property>
+ <property name="label" translatable="yes">T_heme</property>
<property name="use_underline">True</property>
</object>
<packing>
@@ -739,31 +1139,55 @@
<action-widget response="0">button1</action-widget>
</action-widgets>
</object>
- <object class="GtkAdjustment" id="mouse-dnd-threshold">
- <property name="lower">1</property>
- <property name="upper">50</property>
- <property name="value">8</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkAdjustment" id="mouse-double-click-distance">
- <property name="upper">20</property>
- <property name="value">4</property>
+ <object class="GtkAdjustment" id="theme-cursor-size">
+ <property name="lower">16</property>
+ <property name="upper">48</property>
+ <property name="value">24</property>
<property name="step_increment">1</property>
- <property name="page_increment">5</property>
+ <property name="page_increment">11</property>
</object>
- <object class="GtkAdjustment" id="mouse-double-click-time">
- <property name="lower">100</property>
- <property name="upper">2000</property>
- <property name="value">250</property>
- <property name="step_increment">1</property>
- <property name="page_increment">100</property>
+ <object class="GtkListStore" id="wacom-mode-store">
+ <columns>
+ <!-- column-name mode -->
+ <column type="gchararray"/>
+ <!-- column-name title -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">ABSOLUTE</col>
+ <col id="1" translatable="yes">Pen (absolute)</col>
+ </row>
+ <row>
+ <col id="0">RELATIVE</col>
+ <col id="1" translatable="yes">Mouse (relative)</col>
+ </row>
+ </data>
</object>
- <object class="GtkAdjustment" id="mouse-threshold">
- <property name="lower">1</property>
- <property name="upper">30</property>
- <property name="value">4</property>
- <property name="step_increment">1</property>
- <property name="page_increment">5</property>
+ <object class="GtkListStore" id="wacom-rotation-store">
+ <columns>
+ <!-- column-name rotation -->
+ <column type="gint"/>
+ <!-- column-name title -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">0</col>
+ <col id="1" translatable="yes">None (right-handed)</col>
+ </row>
+ <row>
+ <col id="0">3</col>
+ <col id="1" translatable="yes">Half (left-handed)</col>
+ </row>
+ <row>
+ <col id="0">1</col>
+ <col id="1" translatable="yes">Clockwise</col>
+ </row>
+ <row>
+ <col id="0">2</col>
+ <col id="1" translatable="yes">Counterclockwise</col>
+ </row>
+ </data>
</object>
</interface>
diff --git a/dialogs/mouse-settings/xfce-mouse-settings.desktop.in b/dialogs/mouse-settings/xfce-mouse-settings.desktop.in
index 3bd540f..56c194b 100644
--- a/dialogs/mouse-settings/xfce-mouse-settings.desktop.in
+++ b/dialogs/mouse-settings/xfce-mouse-settings.desktop.in
@@ -1,6 +1,6 @@
[Desktop Entry]
Version=1.0
-_Name=Mouse
+_Name=Mouse and Touchpad
_Comment=Configure pointer device behavior and appearance
Exec=xfce4-mouse-settings
Icon=preferences-desktop-peripherals
More information about the Xfce4-commits
mailing list