[Xfce4-commits] <xfce4-settings:nick/pointers> Add support to change device properties and mode.

Nick Schermer noreply at xfce.org
Sat May 21 18:40:05 CEST 2011


Updating branch refs/heads/nick/pointers
         to 364e626ef69ff7f97d248195f45b0af73e676694 (commit)
       from 0f1600035b34cd6a816efc38422b1802d3db1d92 (commit)

commit 364e626ef69ff7f97d248195f45b0af73e676694
Author: Nick Schermer <nick at xfce.org>
Date:   Sat May 21 18:33:15 2011 +0200

    Add support to change device properties and mode.
    
    Add code to write device properties to input device. The
    properties are read from the /<devicename>/Properties/*
    path in xfconf and support the string (atom), int and float
    properties (using doubles, since xfconf has no float type).
    
    Also add support for changing the input device mode (relative
    or absolute), something important for touchpads.
    
    With this in place, each frontend can change device properties
    in Xfce, xfsettingsd will take care of setting them and restore
    them on login and when the device is attached.

 dialogs/mouse-settings/main.c             |   44 +++
 dialogs/mouse-settings/mouse-dialog.glade |  440 +++++++++++++++++++++++++++--
 xfsettingsd/pointers.c                    |  273 +++++++++++++++++-
 3 files changed, 716 insertions(+), 41 deletions(-)

diff --git a/dialogs/mouse-settings/main.c b/dialogs/mouse-settings/main.c
index 595339b..fa51e33 100644
--- a/dialogs/mouse-settings/main.c
+++ b/dialogs/mouse-settings/main.c
@@ -990,6 +990,23 @@ mouse_settings_device_reset (GtkWidget  *button,
 
 
 
+static void
+mouse_settings_touchpad_save (GtkBuilder *builder)
+{
+        
+}
+
+
+
+static void
+mouse_settings_touchpad_reset (GtkWidget  *button,
+                               GtkBuilder *builder)
+{
+        
+}
+
+
+
 #ifdef HAS_DEVICE_HOTPLUGGING
 static GdkFilterReturn
 mouse_settings_event_filter (GdkXEvent *xevent,
@@ -1158,6 +1175,33 @@ main (gint argc, gchar **argv)
             object = gtk_builder_get_object (builder, "mouse-reset");
             g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_device_reset), builder);
 
+            object = gtk_builder_get_object (builder, "touchpad-type-disable");
+            xfconf_g_property_bind (pointers_channel, "/Touchpad/DisableWhileTyping", G_TYPE_BOOLEAN, G_OBJECT (object), "active");
+
+            object = gtk_builder_get_object (builder, "touchpad-tapping");
+            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-scroll-no");
+            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-scroll-edge");
+            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-scroll-two");
+            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-scroll-horiz");
+            g_signal_connect_swapped (G_OBJECT (object), "toggled", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-acceleration-scale");
+            g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-threshold-scale");
+            g_signal_connect_swapped (G_OBJECT (object), "value-changed", G_CALLBACK (mouse_settings_touchpad_save), builder);
+
+            object = gtk_builder_get_object (builder, "touchpad-reset");
+            g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (mouse_settings_touchpad_reset), builder);
+
 #ifdef HAVE_XCURSOR
             /* populate the themes treeview */
             mouse_settings_themes_populate_store (builder);
diff --git a/dialogs/mouse-settings/mouse-dialog.glade b/dialogs/mouse-settings/mouse-dialog.glade
index c4a0d95..1a8b90a 100644
--- a/dialogs/mouse-settings/mouse-dialog.glade
+++ b/dialogs/mouse-settings/mouse-dialog.glade
@@ -3,7 +3,7 @@
   <requires lib="gtk+" version="2.20"/>
   <!-- interface-requires libxfce4ui 4.5 -->
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkAdjustment" id="adjustment6">
+  <object class="GtkAdjustment" id="cursor-size">
     <property name="lower">16</property>
     <property name="upper">48</property>
     <property name="value">24</property>
@@ -15,6 +15,11 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-revert-to-saved</property>
   </object>
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-revert-to-saved</property>
+  </object>
   <object class="GtkAdjustment" id="mouse-acceleration">
     <property name="lower">0.10000000000000001</property>
     <property name="upper">10</property>
@@ -145,15 +150,45 @@
                                 <property name="border_width">6</property>
                                 <property name="spacing">6</property>
                                 <child>
-                                  <object class="GtkRadioButton" id="mouse-right-handed">
-                                    <property name="label" translatable="yes">_Right handed</property>
+                                  <object class="GtkHBox" id="hbox3">
                                     <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>
+                                    <property name="can_focus">False</property>
+                                    <property name="spacing">12</property>
+                                    <child>
+                                      <object class="GtkRadioButton" id="mouse-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="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="active">True</property>
+                                        <property name="draw_indicator">True</property>
+                                        <property name="group">mouse-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>
@@ -162,15 +197,14 @@
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkRadioButton" id="mouse-left-handed">
-                                    <property name="label" translatable="yes">_Left handed</property>
+                                  <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="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>
@@ -179,12 +213,11 @@
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkCheckButton" id="mouse-reverse-scrolling">
-                                    <property name="label" translatable="yes">Re_verse scroll direction</property>
+                                  <object class="GtkCheckButton" id="device-disable">
+                                    <property name="label" translatable="yes">Disable _device</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>
@@ -358,7 +391,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">Dev_ices</property>
                 <property name="use_underline">True</property>
               </object>
               <packing>
@@ -366,6 +399,346 @@
               </packing>
             </child>
             <child>
+              <object class="GtkVBox" id="vbox6">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="border_width">12</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkFrame" id="frame7">
+                    <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="alignment8">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox7">
+                            <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="GtkCheckButton" id="touchpad-type-disable">
+                                <property name="label" translatable="yes">Disable touc_hpad while typing</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">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="touchpad-tapping">
+                                <property name="label" translatable="yes">Enable _mouse clicks with touchpad</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>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label10">
+                        <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="frame8">
+                    <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="alignment9">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox8">
+                            <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="GtkHBox" id="hbox2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="spacing">12</property>
+                                <child>
+                                  <object class="GtkRadioButton" id="touchpad-scroll-no">
+                                    <property name="label" translatable="yes">_Disabled</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="touchpad-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="active">True</property>
+                                    <property name="draw_indicator">True</property>
+                                    <property name="group">touchpad-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="touchpad-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="active">True</property>
+                                    <property name="draw_indicator">True</property>
+                                    <property name="group">touchpad-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="touchpad-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">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>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label11">
+                        <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>
+                  <object class="GtkFrame" id="frame9">
+                    <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="alignment10">
+                        <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">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="touchpad-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">touchpad-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="touchpad-acceleration-scale">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="update_policy">delayed</property>
+                                <property name="adjustment">touchpad-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="touchpad-threshold-scale">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="update_policy">delayed</property>
+                                <property name="adjustment">touchpad-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="touchpad-threshold-label">
+                                <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">touchpad-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="alignment11">
+                                <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="touchpad-reset">
+                                    <property name="label" translatable="yes">Re_set to Defaults</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="use_action_appearance">False</property>
+                                    <property name="image">image2</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="label12">
+                        <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">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label9">
+                <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="vbox3">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
@@ -381,7 +754,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">
@@ -451,13 +823,12 @@
                       <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">
@@ -544,7 +915,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">1</property>
+                <property name="position">2</property>
               </packing>
             </child>
             <child type="tab">
@@ -555,7 +926,7 @@
                 <property name="use_underline">True</property>
               </object>
               <packing>
-                <property name="position">1</property>
+                <property name="position">2</property>
                 <property name="tab_fill">False</property>
               </packing>
             </child>
@@ -602,13 +973,12 @@
                           <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">
@@ -632,7 +1002,7 @@
                                     <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">cursor-size</property>
                                     <property name="snap_to_ticks">True</property>
                                     <property name="numeric">True</property>
                                   </object>
@@ -674,8 +1044,10 @@
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="border_width">6</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">
                                 <property name="visible">True</property>
@@ -711,7 +1083,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
               </packing>
             </child>
             <child type="tab">
@@ -722,7 +1094,7 @@
                 <property name="use_underline">True</property>
               </object>
               <packing>
-                <property name="position">2</property>
+                <property name="position">3</property>
                 <property name="tab_fill">False</property>
               </packing>
             </child>
@@ -766,4 +1138,18 @@
     <property name="step_increment">1</property>
     <property name="page_increment">5</property>
   </object>
+  <object class="GtkAdjustment" id="touchpad-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="touchpad-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>
 </interface>
diff --git a/xfsettingsd/pointers.c b/xfsettingsd/pointers.c
index 96edb6f..26f4feb 100644
--- a/xfsettingsd/pointers.c
+++ b/xfsettingsd/pointers.c
@@ -25,6 +25,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>
@@ -35,6 +36,8 @@
 #include <xfconf/xfconf.h>
 #include <libxfce4util/libxfce4util.h>
 
+#include <dbus/dbus-glib.h>
+
 #include "debug.h"
 #include "pointers.h"
 
@@ -42,6 +45,8 @@
 
 #define MAX_DENOMINATOR (100.00)
 
+#define XFCONF_TYPE_G_VALUE_ARRAY (dbus_g_type_get_collection ("GPtrArray", G_TYPE_VALUE))
+
 /* Xi 1.4 is required */
 #define MIN_XI_VERS_MAJOR 1
 #define MIN_XI_VERS_MINOR 4
@@ -89,6 +94,15 @@ struct _XfcePointersHelper
 #endif
 };
 
+typedef struct
+{
+    Display     *xdisplay;
+    XDevice     *device;
+    XDeviceInfo *device_info;
+    gsize        prop_name_len;
+}
+XfcePointerData;
+
 
 
 G_DEFINE_TYPE (XfcePointersHelper, xfce_pointers_helper, G_TYPE_OBJECT);
@@ -294,7 +308,7 @@ xfce_pointers_helper_change_button_mapping (XDeviceInfo *device_info,
     }
     else
     {
-        xfsettings_dbg (XFSD_DEBUG_POINTERS, "[%s] new buttonmap not changed",
+        xfsettings_dbg (XFSD_DEBUG_POINTERS, "[%s] buttonmap not changed",
                         device_info->name);
     }
 
@@ -422,6 +436,35 @@ xfce_pointers_helper_change_feedback (XDeviceInfo *device_info,
 
 
 
+static void
+xfce_pointers_helper_change_mode (XDeviceInfo  *device_info,
+                                  XDevice      *device,
+                                  Display      *xdisplay,
+                                  const gchar  *mode_name)
+{
+    gint mode;
+
+    if (strcmp (mode_name, "RELATIVE") == 0)
+        mode = Relative;
+    else if (strcmp (mode_name, "ABSOLUTE") == 0)
+        mode = Absolute;
+    else
+    {
+        g_warning ("Unknown device mode %s, only RELATIVE and ABSOLUTE are valid", mode_name);
+        return;
+    }
+
+    gdk_error_trap_push ();
+    XSetDeviceMode (xdisplay, device, mode);
+    if (gdk_error_trap_pop () != 0)
+        g_critical ("Failed to change the device mode");
+
+    xfsettings_dbg (XFSD_DEBUG_POINTERS,
+                    "[%s] Set mode to %s", device_info->name, mode_name);
+}
+
+
+
 static gchar *
 xfce_pointers_helper_device_xfconf_name (const gchar *name)
 {
@@ -457,19 +500,192 @@ xfce_pointers_helper_device_xfconf_name (const gchar *name)
 
 
 static void
+xfce_pointers_helper_change_property (XDeviceInfo  *device_info,
+                                      XDevice      *device,
+                                      Display      *xdisplay,
+                                      const gchar  *prop_name,
+                                      const GValue *value)
+{
+    Atom         *props;
+    gint          n, n_props;
+    Atom          prop;
+    gchar        *atom_name;
+    Atom          type;
+    gint          format;
+    gulong        n_items, bytes_after, i;
+    gulong        n_succeeds;
+    Atom          float_atom;
+    GPtrArray    *array = NULL;
+    const GValue *val;
+    union {
+        guchar *c;
+        gshort *s;
+        glong  *l;
+        Atom   *a;
+    } data;
+
+    /* assuming the device property never contained underscores... */
+    atom_name = g_strdup (prop_name);
+    g_strdelimit (atom_name, "_", ' ');
+    prop = XInternAtom (xdisplay, atom_name, True);
+    g_free (atom_name);
+
+    /* because of the True in XInternAtom we quit here if the property
+     * does not exists on any of the devices */
+    if (prop == None)
+        return;
+
+    gdk_error_trap_push ();
+    props = XListDeviceProperties (xdisplay, device, &n_props);
+    if (gdk_error_trap_pop () != 0 || props == NULL)
+        return;
+
+    float_atom = XInternAtom (xdisplay, "FLOAT", False);
+
+    for (n = 0; n < n_props; n++)
+    {
+        /* find the matching property */
+        if (props[n] != prop)
+            continue;
+
+        if (XGetDeviceProperty (xdisplay, device, prop, 0, 1000, False,
+                                AnyPropertyType, &type, &format,
+                                &n_items, &bytes_after, &data.c) == Success)
+        {
+            if (n_items == 1
+                && (G_VALUE_HOLDS_INT (value)
+                    || G_VALUE_HOLDS_STRING (value)
+                    || G_VALUE_HOLDS_DOUBLE (value)))
+            {
+                /* only 1 items to set */
+                val = value;
+            }
+            else if (G_VALUE_TYPE (value) == XFCONF_TYPE_G_VALUE_ARRAY)
+            {
+                array = g_value_get_boxed (value);
+                if (array->len != n_items)
+                {
+                    g_critical ("Nr device property items (%ld) and xfconf value (%d) differ",
+                                n_items, array->len);
+                    break;
+                }
+            }
+            else
+            {
+                g_critical ("Invalid device property combination");
+                break;
+            }
+
+            /* reset check counter */
+            n_succeeds = 0;
+
+            for (i = 0; i < n_items; i++)
+            {
+                /* get value from pointer array */
+                if (array != NULL)
+                    val = g_ptr_array_index (array, i);
+                else
+                    val = value;
+
+                if (G_VALUE_HOLDS_INT (val)
+                    && type == XA_INTEGER)
+                {
+                    if (format == 8)
+                        data.c[i] = g_value_get_int (val);
+                    else if (format == 16)
+                        data.s[i] = g_value_get_int (val);
+                    else if (format == 32)
+                        data.l[i] = g_value_get_int (val);
+                    else
+                    {
+                        g_critical ("Unknown format %d for integer", format);
+                        break;
+                    }
+                }
+                else if (G_VALUE_HOLDS_STRING (val)
+                         && type == XA_ATOM
+                         && format == 32)
+                {
+                    /* set atom (reference to a string) */
+                    data.a[i] = XInternAtom (xdisplay, g_value_get_string (val), False);
+                }
+                else if (G_VALUE_HOLDS_DOUBLE (val) /* xfconf doesn't support floats */
+                         && type == float_atom
+                         && format == 32)
+                {
+                    data.l[i] = g_value_get_double (val);
+                }
+                else
+                {
+                    g_critical ("Unknown property type %s: target = %s, format = %d",
+                                G_VALUE_TYPE_NAME (val), XGetAtomName (xdisplay, type), format);
+                    break;
+                }
+
+                /* the item was successfully updated */
+                n_succeeds++;
+            }
+
+            if (n_succeeds == n_items)
+            {
+                gdk_error_trap_push ();
+                XChangeDeviceProperty (xdisplay, device, prop, type, format,
+                                       PropModeReplace, data.c, n_items);
+                if (gdk_error_trap_pop () != 0)
+                {
+                    g_critical ("Failed to set device property %s for %s",
+                                prop_name, device_info->name);
+                }
+
+                xfsettings_dbg (XFSD_DEBUG_POINTERS,
+                                "[%s] Changed device property %s",
+                                device_info->name, prop_name);
+            }
+
+            XFree (data.c);
+        }
+
+        break;
+    }
+
+    XFree (props);
+}
+
+
+
+static void
+xfce_pointers_helper_change_properties (gpointer key,
+                                        gpointer value,
+                                        gpointer user_data)
+{
+    XfcePointerData *pointer_data = user_data;
+    const gchar     *prop_name = ((gchar *) key) + pointer_data->prop_name_len;
+
+    xfce_pointers_helper_change_property (pointer_data->device_info,
+                                          pointer_data->device,
+                                          pointer_data->xdisplay,
+                                          prop_name, value);
+}
+
+
+
+static void
 xfce_pointers_helper_restore_devices (XfcePointersHelper *helper,
                                       XID                *xid)
 {
-    Display     *xdisplay = GDK_DISPLAY ();
-    XDeviceInfo *device_list, *device_info;
-    gint         n, ndevices;
-    XDevice     *device;
-    gchar       *device_name;
-    gchar        prop[256];
-    gboolean     right_handed;
-    gboolean     reverse_scrolling;
-    gint         threshold;
-    gdouble      acceleration;
+    Display         *xdisplay = GDK_DISPLAY ();
+    XDeviceInfo     *device_list, *device_info;
+    gint             n, ndevices;
+    XDevice         *device;
+    gchar           *device_name;
+    gchar            prop[256];
+    gboolean         right_handed;
+    gboolean         reverse_scrolling;
+    gint             threshold;
+    gdouble          acceleration;
+    GHashTable      *props;
+    XfcePointerData  pointer_data;
+    const gchar     *mode;
 
     gdk_error_trap_push ();
     device_list = XListInputDevices (xdisplay, &ndevices);
@@ -529,6 +745,29 @@ xfce_pointers_helper_restore_devices (XfcePointersHelper *helper,
                                                   threshold, acceleration);
         }
 
+        /* read mode settings */
+        g_snprintf (prop, sizeof (prop), "/%s/Mode", device_name);
+        mode =  xfconf_channel_get_string  (helper->channel, prop, NULL);
+
+        if (mode != NULL)
+            xfce_pointers_helper_change_mode (device_info, device, xdisplay, mode);
+
+        /* set device properties */
+        g_snprintf (prop, sizeof (prop), "/%s/Properties", device_name);
+        props = xfconf_channel_get_properties (helper->channel, prop);
+
+        if (props != NULL)
+        {
+            pointer_data.xdisplay = xdisplay;
+            pointer_data.device = device;
+            pointer_data.device_info = device_info;
+            pointer_data.prop_name_len = strlen (prop) + 1;
+
+            g_hash_table_foreach (props, xfce_pointers_helper_change_properties, &pointer_data);
+
+            g_hash_table_destroy (props);
+        }
+
         g_free (device_name);
         XCloseDevice (xdisplay, device);
     }
@@ -608,10 +847,16 @@ xfce_pointers_helper_channel_property_changed (XfconfChannel *channel,
                     xfce_pointers_helper_change_feedback (device_info, device, xdisplay,
                                                           -2, g_value_get_double (value));
                 }
-                /*else if (strcmp (names[1], "Properties") == 0)
+                else if (strcmp (names[1], "Properties") == 0)
                 {
-                    xfce_pointers_helper_change_properties (device_info, device, xdisplay);
-                }*/
+                    xfce_pointers_helper_change_property (device_info, device, xdisplay,
+                                                          names[2], value);
+                }
+                else if (strcmp (names[1], "Mode") == 0)
+                {
+                    xfce_pointers_helper_change_mode (device_info, device, xdisplay,
+                                                      g_value_get_string (value));
+                }
                 else
                 {
                     g_warning ("Unknown property %s set for device %s",



More information about the Xfce4-commits mailing list