569
mouse_settings_device_selection_changed (GtkTreeSelection *selection,
586
mouse_settings_device_get_int_property (XDevice *device,
593
gulong n_items, bytes_after;
598
gdk_error_trap_push ();
599
res = XGetDeviceProperty (GDK_DISPLAY (), device, prop, 0, 1000, False,
600
AnyPropertyType, &type, &format,
601
&n_items, &bytes_after, &data);
602
if (gdk_error_trap_pop () == 0 && res == Success)
604
if (type == XA_INTEGER)
606
if (n_items > offset)
609
if (n_items > 1 + offset && horiz != NULL)
610
*horiz = data[offset + 1];
622
mouse_settings_device_get_selected (GtkBuilder *builder,
628
gboolean found = FALSE;
632
/* get the selected item */
633
combobox = gtk_builder_get_object (builder, "device-combobox");
634
found = gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combobox), &iter);
637
/* get the device id */
638
model = gtk_combo_box_get_model (GTK_COMBO_BOX (combobox));
639
gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid, -1);
641
if (xfconf_name != NULL)
642
gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XFCONF_NAME, xfconf_name, -1);
646
/* open the device */
647
gdk_error_trap_push ();
648
*device = XOpenDevice (GDK_DISPLAY (), xid);
649
if (gdk_error_trap_pop () != 0 || *device == NULL)
651
g_critical ("Unable to open device %ld", xid);
664
mouse_settings_wacom_set_rotation (GtkComboBox *combobox,
677
if (mouse_settings_device_get_selected (builder, &device, &name))
679
if (gtk_combo_box_get_active_iter (combobox, &iter))
681
model = gtk_combo_box_get_model (combobox);
682
gtk_tree_model_get (model, &iter, 0, &rotation, -1);
684
prop = g_strconcat ("/", name, "/Properties/Wacom_Rotation", NULL);
685
xfconf_channel_set_int (pointers_channel, prop, rotation);
689
XCloseDevice (GDK_DISPLAY (), device);
698
mouse_settings_wacom_set_mode (GtkComboBox *combobox,
702
Display *xdisplay = GDK_DISPLAY ();
712
if (mouse_settings_device_get_selected (builder, &device, &name))
714
if (gtk_combo_box_get_active_iter (combobox, &iter))
716
model = gtk_combo_box_get_model (combobox);
717
gtk_tree_model_get (model, &iter, 0, &mode, -1);
719
prop = g_strconcat ("/", name, "/Mode", NULL);
720
xfconf_channel_set_string (pointers_channel, prop, mode);
726
XCloseDevice (xdisplay, device);
735
mouse_settings_synaptics_set_tap_to_click (GtkBuilder *builder)
737
Display *xdisplay = GDK_DISPLAY ();
743
gulong n, n_items, bytes_after;
745
gboolean tap_to_click;
752
if (mouse_settings_device_get_selected (builder, &device, &name))
754
gdk_error_trap_push ();
755
tap_ation_prop = XInternAtom (xdisplay, "Synaptics Tap Action", True);
756
res = XGetDeviceProperty (xdisplay, device, tap_ation_prop, 0, 1000, False,
757
AnyPropertyType, &type, &format,
758
&n_items, &bytes_after, &data);
759
if (gdk_error_trap_pop () == 0
762
if (type == XA_INTEGER
766
object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
767
tap_to_click = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
769
/* format: RT, RB, LT, LB, F1, F2, F3 */
770
data[4] = tap_to_click ? 1 : 0;
771
data[5] = tap_to_click ? 3 : 0;
772
data[6] = tap_to_click ? 2 : 0;
774
array = g_ptr_array_sized_new (n_items);
775
for (n = 0; n < n_items; n++)
777
val = g_new0 (GValue, 1);
778
g_value_init (val, G_TYPE_INT);
779
g_value_set_int (val, data[n]);
780
g_ptr_array_add (array, val);
783
prop = g_strconcat ("/", name, "/Properties/Synaptics_Tap_Action", NULL);
784
xfconf_channel_set_arrayv (pointers_channel, prop, array);
787
xfconf_array_free (array);
800
mouse_settings_synaptics_hscroll_sensitive (GtkBuilder *builder)
802
gboolean sensitive = FALSE;
805
object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
806
if (gtk_widget_get_sensitive (GTK_WIDGET (object))
807
&& gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)))
810
object = gtk_builder_get_object (builder, "synaptics-scroll-two");
811
if (gtk_widget_get_sensitive (GTK_WIDGET (object))
812
&& gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object)))
815
object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
816
gtk_widget_set_sensitive (GTK_WIDGET (object), sensitive);
822
mouse_settings_synaptics_set_scrolling (GtkWidget *widget,
825
gint edge_scroll[3] = { 0, 0, 0 };
826
gint two_scroll[2] = { 0, 0 };
828
gboolean horizontal = FALSE;
829
gchar *name = NULL, *prop;
834
/* skip double event if a radio button is toggled */
835
if (GTK_IS_RADIO_BUTTON (widget)
836
&& !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
839
mouse_settings_synaptics_hscroll_sensitive (builder);
841
object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
842
if (gtk_widget_get_sensitive (GTK_WIDGET (object)))
843
horizontal = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
845
object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
846
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object))
847
&& gtk_widget_get_sensitive (GTK_WIDGET (object)))
849
edge_scroll[0] = TRUE;
850
edge_scroll[1] = horizontal;
853
object = gtk_builder_get_object (builder, "synaptics-scroll-two");
854
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object))
855
&& gtk_widget_get_sensitive (GTK_WIDGET (object)))
857
two_scroll[0] = TRUE;
858
two_scroll[1] = horizontal;
861
if (mouse_settings_device_get_selected (builder, NULL, &name))
863
/* 3 values: vertical, horizontal, corner. */
864
prop = g_strconcat ("/", name, "/Properties/Synaptics_Edge_Scrolling", NULL);
865
xfconf_channel_set_array (pointers_channel, prop,
866
G_TYPE_INT, &edge_scroll[0],
867
G_TYPE_INT, &edge_scroll[1],
868
G_TYPE_INT, &edge_scroll[2],
872
/* 2 values: vertical, horizontal. */
873
prop = g_strconcat ("/", name, "/Properties/Synaptics_Two-Finger_Scrolling", NULL);
874
xfconf_channel_set_array (pointers_channel, prop,
875
G_TYPE_INT, &two_scroll[0],
876
G_TYPE_INT, &two_scroll[1],
888
mouse_settings_device_set_enabled (GtkToggleButton *button,
896
enabled = gtk_toggle_button_get_active (button);
897
object = gtk_builder_get_object (builder, "device-notebook");
898
gtk_widget_set_sensitive (GTK_WIDGET (object), enabled);
903
if (mouse_settings_device_get_selected (builder, NULL, &name))
905
prop = g_strconcat ("/", name, "/Properties/Device_Enabled", NULL);
906
xfconf_channel_set_int (pointers_channel, prop, enabled);
916
mouse_settings_device_selection_changed (GtkBuilder *builder)
919
Display *xdisplay = GDK_DISPLAY ();
921
XDeviceInfo *device_info;
575
922
XFeedbackState *states, *pt;
577
925
XPtrFeedbackState *state;
579
927
guchar *buttonmap;
580
928
gint id_1 = 0, id_3 = 0;
581
929
gint id_4 = 0, id_5 = 0;
582
930
gdouble acceleration = -1.00;
583
931
gint threshold = -1;
587
gboolean has_selection;
936
Atom synaptics_tap_prop;
937
Atom synaptics_edge_scroll_prop;
938
Atom synaptics_two_scroll_prop;
939
Atom device_enabled_prop;
940
Atom wacom_rotation_prop;
941
gint is_enabled = -1;
942
gboolean is_synaptics = FALSE;
943
gboolean is_wacom = FALSE;
944
gint synaptics_tap_to_click = -1;
945
gint synaptics_edge_scroll = -1;
946
gint synaptics_edge_hscroll = -1;
947
gint synaptics_two_scroll = -1;
948
gint synaptics_two_hscroll = -1;
949
gint wacom_rotation = -1;
952
gint wacom_mode = -1;
590
954
/* lock the dialog */
593
/* flush x and trap errors */
595
gdk_error_trap_push ();
597
957
/* get the selected item */
598
has_selection = gtk_tree_selection_get_selected (selection, &model, &iter);
599
if (G_LIKELY (has_selection))
958
if (mouse_settings_device_get_selected (builder, &device, NULL))
601
/* get device id and number of buttons */
602
gtk_tree_model_get (model, &iter, COLUMN_DEVICE_XID, &xid,
603
COLUMN_DEVICE_NBUTTONS, &nbuttons, -1);
605
/* get the x display */
606
xdisplay = gdk_x11_display_get_xdisplay (display);
608
/* open the device */
609
device = XOpenDevice (xdisplay, xid);
611
if (G_LIKELY (device))
613
/* allocate button map */
960
gdk_error_trap_push ();
961
device_info = XListInputDevices (xdisplay, &ndevices);
962
if (gdk_error_trap_pop () == 0 && device_info != NULL)
964
/* find mode and number of buttons */
965
for (i = 0; i < ndevices; i++)
967
if (device_info[i].id != device->device_id)
970
any = device_info[i].inputclassinfo;
971
for (n = 0; n < device_info[i].num_classes; n++)
973
if (any->class == ButtonClass)
974
nbuttons = ((XButtonInfoPtr) any)->num_buttons;
975
else if (any->class == ValuatorClass)
976
wacom_mode = ((XValuatorInfoPtr) any)->mode == Absolute ? 0 : 1;
978
any = (XAnyClassPtr) ((gchar *) any + any->length);
984
XFreeDeviceList (device_info);
987
/* get the button mapping */
614
990
buttonmap = g_new0 (guchar, nbuttons);
616
/* get the button mapping */
991
gdk_error_trap_push ();
617
992
XGetDeviceButtonMapping (xdisplay, device, buttonmap, nbuttons);
993
if (gdk_error_trap_pop () != 0)
994
g_critical ("Failed to get button map");
619
996
/* figure out the position of the first and second/third button in the map */
620
997
for (i = 0; i < nbuttons; i++)
633
1009
g_free (buttonmap);
1013
g_critical ("Device has no buttons");
635
/* get the feedback states for this device */
636
states = XGetFeedbackControl (xdisplay, device, &nstates);
1016
/* get the feedback states for this device */
1017
gdk_error_trap_push ();
1018
states = XGetFeedbackControl (xdisplay, device, &nstates);
1019
if (gdk_error_trap_pop () != 0 || states == NULL)
1021
g_critical ("Failed to get feedback states");
1025
/* get the pointer feedback class */
1026
for (pt = states, i = 0; i < nstates; i++)
639
/* get the pointer feedback class */
640
for (pt = states, i = 0; i < nstates; i++)
1028
if (pt->class == PtrFeedbackClass)
642
if (pt->class == PtrFeedbackClass)
645
state = (XPtrFeedbackState *) pt;
646
acceleration = (gdouble) state->accelNum / (gdouble) state->accelDenom;
647
threshold = state->threshold;
653
/* advance the offset */
654
pt = (XFeedbackState *) ((gchar *) pt + pt->length);
1031
state = (XPtrFeedbackState *) pt;
1032
acceleration = (gdouble) state->accelNum / (gdouble) state->accelDenom;
1033
threshold = state->threshold;
657
XFreeFeedbackList (states);
660
/* close the device */
661
XCloseDevice (xdisplay, device);
1036
/* advance the offset */
1037
pt = (XFeedbackState *) ((gchar *) pt + pt->length);
1040
XFreeFeedbackList (states);
1043
/* wacom and synaptics specific properties */
1044
device_enabled_prop = XInternAtom (xdisplay, "Device Enabled", True);
1045
synaptics_prop = XInternAtom (xdisplay, "Synaptics Off", True);
1046
wacom_prop = XInternAtom (xdisplay, "Wacom Tool Type", True);
1047
synaptics_tap_prop = XInternAtom (xdisplay, "Synaptics Tap Action", True);
1048
synaptics_edge_scroll_prop = XInternAtom (xdisplay, "Synaptics Edge Scrolling", True);
1049
synaptics_two_scroll_prop = XInternAtom (xdisplay, "Synaptics Two-Finger Scrolling", True);
1050
wacom_rotation_prop = XInternAtom (xdisplay, "Wacom Rotation", True);
1052
/* check if this is a synaptics or wacom device */
1053
gdk_error_trap_push ();
1054
props = XListDeviceProperties (xdisplay, device, &nprops);
1055
if (gdk_error_trap_pop () == 0 && props != NULL)
1057
for (i = 0; i < nprops; i++)
1059
if (props[i] == device_enabled_prop)
1060
is_enabled = mouse_settings_device_get_int_property (device, props[i], 0, NULL);
1061
else if (props[i] == synaptics_prop)
1062
is_synaptics = TRUE;
1063
else if (props[i] == wacom_prop)
1065
else if (props[i] == synaptics_tap_prop)
1066
synaptics_tap_to_click = mouse_settings_device_get_int_property (device, props[i], 4, NULL);
1067
else if (props[i] == synaptics_edge_scroll_prop)
1068
synaptics_edge_scroll = mouse_settings_device_get_int_property (device, props[i], 0, &synaptics_edge_hscroll);
1069
else if (props[i] == synaptics_two_scroll_prop)
1070
synaptics_two_scroll = mouse_settings_device_get_int_property (device, props[i], 0, &synaptics_two_hscroll);
1071
else if (props[i] == wacom_rotation_prop)
1072
wacom_rotation = mouse_settings_device_get_int_property (device, props[i], 0, NULL);
1078
/* close the device */
1079
XCloseDevice (xdisplay, device);
665
1082
/* update button order */
666
object = gtk_builder_get_object (builder, id_1 > id_3 ? "mouse-left-handed" : "mouse-right-handed");
1083
object = gtk_builder_get_object (builder, id_1 > id_3 ? "device-left-handed" : "device-right-handed");
667
1084
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), TRUE);
669
object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
1086
object = gtk_builder_get_object (builder, "device-reverse-scrolling");
670
1087
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), !!(id_5 < id_4));
671
1088
gtk_widget_set_sensitive (GTK_WIDGET (object), nbuttons >= 5);
673
1090
/* update acceleration scale */
674
object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
1091
object = gtk_builder_get_object (builder, "device-acceleration-scale");
675
1092
gtk_range_set_value (GTK_RANGE (object), acceleration);
676
1093
gtk_widget_set_sensitive (GTK_WIDGET (object), acceleration != -1);
678
1095
/* update threshold scale */
679
object = gtk_builder_get_object (builder, "mouse-threshold-scale");
1096
object = gtk_builder_get_object (builder, "device-threshold-scale");
680
1097
gtk_range_set_value (GTK_RANGE (object), threshold);
681
1098
gtk_widget_set_sensitive (GTK_WIDGET (object), threshold != -1);
683
/* flush and remove the x error trap */
685
gdk_error_trap_pop ();
1100
object = gtk_builder_get_object (builder, "device-enabled");
1101
gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled != -1);
1102
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), is_enabled > 0);
1104
object = gtk_builder_get_object (builder, "device-notebook");
1105
gtk_widget_set_sensitive (GTK_WIDGET (object), is_enabled == 1);
1107
/* synaptics options */
1108
object = gtk_builder_get_object (builder, "synaptics-tab");
1109
gtk_widget_set_visible (GTK_WIDGET (object), is_synaptics);
1113
object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
1114
gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_tap_to_click != -1);
1115
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_tap_to_click > 0);
1117
object = gtk_builder_get_object (builder, "synaptics-scroll-no");
1118
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_edge_scroll == -1 && synaptics_two_scroll == -1);
1120
object = gtk_builder_get_object (builder, "synaptics-scroll-edge");
1121
gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_edge_scroll != -1);
1122
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_edge_scroll > 0);
1124
object = gtk_builder_get_object (builder, "synaptics-scroll-two");
1125
gtk_widget_set_sensitive (GTK_WIDGET (object), synaptics_two_scroll != -1);
1126
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), synaptics_two_scroll > 0);
1128
object = gtk_builder_get_object (builder, "synaptics-scroll-horiz");
1129
mouse_settings_synaptics_hscroll_sensitive (builder);
1130
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object),
1131
synaptics_edge_hscroll == 1 || synaptics_two_hscroll == 1);
1135
object = gtk_builder_get_object (builder, "wacom-tab");
1136
gtk_widget_set_visible (GTK_WIDGET (object), is_wacom);
1140
object = gtk_builder_get_object (builder, "wacom-mode");
1141
gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_mode != -1);
1142
gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_mode == -1 ? 1 : wacom_mode);
1144
object = gtk_builder_get_object (builder, "wacom-rotation");
1145
gtk_widget_set_sensitive (GTK_WIDGET (object), wacom_rotation != -1);
1146
/* 3 (half) comes afer none */
1147
if (wacom_rotation == 3)
1149
else if (wacom_rotation > 0)
1151
else if (wacom_rotation == -1)
1153
gtk_combo_box_set_active (GTK_COMBO_BOX (object), wacom_rotation);
844
1257
mouse_settings_device_populate_store (GtkBuilder *builder,
845
1258
gboolean create_store)
848
XDeviceInfo *device_list, *device_info;
849
gchar *display_name, *usb;
857
GtkTreePath *path = NULL;
858
GtkTreeViewColumn *column;
859
GtkCellRenderer *renderer;
860
GtkTreeSelection *selection;
862
gchar *property_name;
863
gchar *property_value;
1260
XDeviceInfo *device_list, *device_info;
1264
GtkListStore *store;
1266
GtkCellRenderer *renderer;
1268
gboolean has_active_item = FALSE;
868
/* flush x and trap errors */
870
gdk_error_trap_push ();
872
/* get the treeview */
873
treeview = gtk_builder_get_object (builder, "mouse-devices-treeview");
1273
combobox = gtk_builder_get_object (builder, "device-combobox");
875
1275
/* create or get the store */
876
1276
if (G_LIKELY (create_store))
878
store = gtk_list_store_new (N_DEVICE_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
879
G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
1278
store = gtk_list_store_new (N_DEVICE_COLUMNS,
1279
G_TYPE_STRING /* COLUMN_DEVICE_NAME */,
1280
G_TYPE_STRING /* COLUMN_DEVICE_XFCONF_NAME */,
1281
G_TYPE_ULONG /* COLUMN_DEVICE_XID */);
1282
gtk_combo_box_set_model (GTK_COMBO_BOX (combobox), GTK_TREE_MODEL (store));
1285
renderer = gtk_cell_renderer_text_new ();
1286
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
1287
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
1288
"text", COLUMN_DEVICE_NAME, NULL);
1290
g_signal_connect_swapped (G_OBJECT (combobox), "changed",
1291
G_CALLBACK (mouse_settings_device_selection_changed), builder);
883
store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)));
1295
store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combobox)));
884
1296
gtk_list_store_clear (store);
887
/* get the x display */
888
xdisplay = gdk_x11_display_get_xdisplay (display);
890
1299
/* get all the registered devices */
891
device_list = XListInputDevices (xdisplay, &ndevices);
1300
gdk_error_trap_push ();
1301
device_list = XListInputDevices (GDK_DISPLAY (), &ndevices);
1302
if (gdk_error_trap_pop () != 0 || device_list == NULL)
1304
g_message ("No devices found");
893
1308
for (i = 0; i < ndevices; i++)
895
1310
/* get the device */
896
1311
device_info = &device_list[i];
898
/* filter out the pointer devices */
899
if (device_info->use == IsXExtensionPointer)
1313
/* filter out the pointer and virtual devices */
1314
if (device_info->use != IsXExtensionPointer
1315
|| g_str_has_prefix (device_info->name, "Virtual core XTEST"))
1318
/* create a valid xfconf device name */
1319
xfconf_name = mouse_settings_device_xfconf_name (device_info->name);
1321
/* insert in the store */
1322
gtk_list_store_insert_with_values (store, &iter, i,
1323
COLUMN_DEVICE_XFCONF_NAME, xfconf_name,
1324
COLUMN_DEVICE_NAME, device_info->name,
1325
COLUMN_DEVICE_XID, device_info->id,
1328
/* check if we should select this device */
1329
if (device_info->name != NULL
1330
&& opt_device_name != NULL
1331
&& strcmp (opt_device_name, device_info->name) == 0)
901
/* get the device classes */
902
ptr = device_info->inputclassinfo;
904
/* walk all the classes */
905
for (m = 0, num_buttons = 0; m < device_info->num_classes; m++)
907
/* find the button class */
908
if (ptr->class == ButtonClass)
910
/* get the number of buttons */
911
num_buttons = ((XButtonInfoPtr) ptr)->num_buttons;
917
/* advance the offset */
918
ptr = (XAnyClassPtr) ((gchar *) ptr + ptr->length);
921
/* only append devices with buttons */
922
if (G_UNLIKELY (num_buttons <= 0))
925
/* ignore XTEST device */
926
if (g_str_has_prefix (device_info->name, "Virtual core XTEST"))
929
/* create a valid xfconf device name */
930
device_name = mouse_settings_device_xfconf_name (device_info->name);
932
/* check if there is a custom name set by the user */
933
property_name = g_strdup_printf ("/%s", device_name);
934
if (xfconf_channel_has_property (pointers_channel, property_name))
936
/* get the name from the config file, escape it */
937
property_value = xfconf_channel_get_string (pointers_channel, property_name, NULL);
938
display_name = g_markup_escape_text (property_value, -1);
939
g_free (property_value);
943
/* get the device name, escaped */
944
display_name = g_markup_escape_text (device_info->name, -1);
946
/* get rid of usb crap in the name */
947
if ((usb = strstr (display_name, "-usb")) != NULL)
951
/* insert in the store */
952
gtk_list_store_insert_with_values (store, &iter, i,
953
COLUMN_DEVICE_ICON, "input-mouse",
954
COLUMN_DEVICE_NAME, device_name,
955
COLUMN_DEVICE_DISPLAY_NAME, display_name,
956
COLUMN_DEVICE_XID, device_info->id,
957
COLUMN_DEVICE_NBUTTONS, num_buttons, -1);
959
/* check if we should select this device (for user convience also the display name) */
960
if (opt_device_name && (strcmp (opt_device_name, device_info->name) == 0
961
|| (display_name && strcmp (opt_device_name, display_name) == 0)))
963
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter);
964
g_free (opt_device_name);
965
opt_device_name = NULL;
969
g_free (property_name);
970
g_free (device_name);
971
g_free (display_name);
1333
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
1334
g_free (opt_device_name);
1335
opt_device_name = NULL;
1336
has_active_item = TRUE;
1339
g_free (xfconf_name);
976
1343
XFreeDeviceList (device_list);
978
/* flush and remove the x error trap */
980
gdk_error_trap_pop ();
982
/* get the selection */
983
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
985
if (G_LIKELY (create_store))
987
/* set the treeview model */
988
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
989
gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), COLUMN_DEVICE_DISPLAY_NAME);
992
renderer = gtk_cell_renderer_pixbuf_new ();
993
column = gtk_tree_view_column_new_with_attributes ("", renderer, "icon-name", COLUMN_DEVICE_ICON, NULL);
994
g_object_set (G_OBJECT (renderer), "stock-size", GTK_ICON_SIZE_DND, NULL);
995
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
998
renderer = gtk_cell_renderer_text_new ();
999
column = gtk_tree_view_column_new_with_attributes ("", renderer, "markup", COLUMN_DEVICE_DISPLAY_NAME, NULL);
1000
g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, "editable", TRUE, NULL);
1001
g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (mouse_settings_device_name_edited), builder);
1002
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1004
/* setup tree selection */
1005
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
1006
g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (mouse_settings_device_selection_changed), builder);
1009
/* select the mouse in the tree */
1010
if (G_LIKELY (path == NULL))
1011
path = gtk_tree_path_new_first ();
1012
gtk_tree_selection_select_path (selection, path);
1013
gtk_tree_path_free (path);
1015
/* sort after selecting the path */
1016
if (G_LIKELY (create_store))
1018
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), COLUMN_DEVICE_XID, GTK_SORT_ASCENDING);
1019
g_object_unref (G_OBJECT (store));
1345
if (!has_active_item)
1346
gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
1258
/* set the working display for this instance */
1259
display = gdk_display_get_default ();
1261
/* populate the devices treeview */
1574
/* populate the devices combobox */
1262
1575
mouse_settings_device_populate_store (builder, TRUE);
1264
1577
/* connect signals */
1265
object = gtk_builder_get_object (builder, "mouse-acceleration-scale");
1266
g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
1268
object = gtk_builder_get_object (builder, "mouse-threshold-scale");
1269
g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_device_save), builder);
1271
object = gtk_builder_get_object (builder, "mouse-left-handed");
1272
g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
1274
object = gtk_builder_get_object (builder, "mouse-right-handed");
1275
g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
1277
object = gtk_builder_get_object (builder, "mouse-reverse-scrolling");
1278
g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_device_save), builder);
1280
object = gtk_builder_get_object (builder, "mouse-reset");
1281
g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_device_reset), builder);
1578
object = gtk_builder_get_object (builder, "device-enabled");
1579
g_signal_connect (G_OBJECT (object), "toggled",
1580
G_CALLBACK (mouse_settings_device_set_enabled), builder);
1582
object = gtk_builder_get_object (builder, "device-acceleration-scale");
1583
g_signal_connect_swapped (G_OBJECT (object), "value-changed",
1584
G_CALLBACK (mouse_settings_device_save), builder);
1586
object = gtk_builder_get_object (builder, "device-threshold-scale");
1587
g_signal_connect (G_OBJECT (object), "format-value",
1588
G_CALLBACK (mouse_settings_format_value_px), NULL);
1589
g_signal_connect_swapped (G_OBJECT (object), "value-changed",
1590
G_CALLBACK (mouse_settings_device_save), builder);
1592
object = gtk_builder_get_object (builder, "device-left-handed");
1593
g_signal_connect_swapped (G_OBJECT (object), "toggled",
1594
G_CALLBACK (mouse_settings_device_save), builder);
1596
object = gtk_builder_get_object (builder, "device-right-handed");
1597
g_signal_connect_swapped (G_OBJECT (object), "toggled",
1598
G_CALLBACK (mouse_settings_device_save), builder);
1600
object = gtk_builder_get_object (builder, "device-reverse-scrolling");
1601
g_signal_connect_swapped (G_OBJECT (object), "toggled",
1602
G_CALLBACK (mouse_settings_device_save), builder);
1604
object = gtk_builder_get_object (builder, "device-reset-feedback");
1605
g_signal_connect (G_OBJECT (object), "clicked",
1606
G_CALLBACK (mouse_settings_device_reset), builder);
1608
object = gtk_builder_get_object (builder, "synaptics-disable-while-type");
1609
syndaemon = g_find_program_in_path ("syndaemon");
1610
gtk_widget_set_sensitive (GTK_WIDGET (object), syndaemon != NULL);
1612
xfconf_g_property_bind (pointers_channel, "/DisableTouchpadWhileTyping",
1613
G_TYPE_BOOLEAN, G_OBJECT (object), "active");
1615
object = gtk_builder_get_object (builder, "synaptics-tap-to-click");
1616
g_signal_connect_swapped (G_OBJECT (object), "toggled",
1617
G_CALLBACK (mouse_settings_synaptics_set_tap_to_click), builder);
1619
for (i = 0; i < G_N_ELEMENTS (synaptics_scroll); i++)
1621
object = gtk_builder_get_object (builder, synaptics_scroll[i]);
1622
g_signal_connect (G_OBJECT (object), "toggled",
1623
G_CALLBACK (mouse_settings_synaptics_set_scrolling), builder);
1626
object = gtk_builder_get_object (builder, "wacom-mode");
1627
g_signal_connect (G_OBJECT (object), "changed",
1628
G_CALLBACK (mouse_settings_wacom_set_mode), builder);
1630
object = gtk_builder_get_object (builder, "wacom-rotation");
1631
g_signal_connect (G_OBJECT (object), "changed",
1632
G_CALLBACK (mouse_settings_wacom_set_rotation), builder);
1283
1636
#ifdef HAVE_XCURSOR
1284
1637
/* populate the themes treeview */
1285
1638
mouse_settings_themes_populate_store (builder);
1287
1640
/* connect the cursor size in the cursor tab */
1288
object = gtk_builder_get_object (builder, "mouse-cursor-size");
1289
xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize", G_TYPE_INT, G_OBJECT (object), "value");
1641
object = gtk_builder_get_object (builder, "theme-cursor-size");
1642
xfconf_g_property_bind (xsettings_channel, "/Gtk/CursorThemeSize",
1643
G_TYPE_INT, G_OBJECT (object), "value");
1291
1645
/* hide the themes tab */
1292
object = gtk_builder_get_object (builder, "mouse-themes-hbox");
1646
object = gtk_builder_get_object (builder, "themes-hbox");
1293
1647
gtk_widget_hide (GTK_WIDGET (object));
1294
1648
#endif /* !HAVE_XCURSOR */
1296
1650
/* connect sliders in the gtk tab */
1297
object = gtk_builder_get_object (builder, "mouse-dnd-threshold");
1298
xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold", G_TYPE_INT, G_OBJECT (object), "value");
1300
object = gtk_builder_get_object (builder, "mouse-double-click-time");
1301
xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime", G_TYPE_INT, G_OBJECT (object), "value");
1303
object = gtk_builder_get_object (builder, "mouse-double-click-distance");
1304
xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance", G_TYPE_INT, G_OBJECT (object), "value");
1651
object = gtk_builder_get_object (builder, "dnd-threshold");
1652
xfconf_g_property_bind (xsettings_channel, "/Net/DndDragThreshold",
1653
G_TYPE_INT, G_OBJECT (object), "value");\
1655
object = gtk_builder_get_object (builder, "dnd-threshold-scale");
1656
g_signal_connect (G_OBJECT (object), "format-value",
1657
G_CALLBACK (mouse_settings_format_value_px), NULL);
1659
object = gtk_builder_get_object (builder, "dclick-time");
1660
xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickTime",
1661
G_TYPE_INT, G_OBJECT (object), "value");
1663
object = gtk_builder_get_object (builder, "dclick-time-scale");
1664
g_signal_connect (G_OBJECT (object), "format-value",
1665
G_CALLBACK (mouse_settings_format_value_ms), NULL);
1667
object = gtk_builder_get_object (builder, "dclick-distance");
1668
xfconf_g_property_bind (xsettings_channel, "/Net/DoubleClickDistance",
1669
G_TYPE_INT, G_OBJECT (object), "value");
1671
object = gtk_builder_get_object (builder, "dclick-distance-scale");
1672
g_signal_connect (G_OBJECT (object), "format-value",
1673
G_CALLBACK (mouse_settings_format_value_px), NULL);
1306
1675
#ifdef HAS_DEVICE_HOTPLUGGING
1307
1676
/* create the event filter for device monitoring */