mousetweaks r158 - in trunk: . data src



Author: gerdk
Date: Sat May 17 15:01:40 2008
New Revision: 158
URL: http://svn.gnome.org/viewvc/mousetweaks?rev=158&view=rev

Log:
2008-05-17 Gerd Kohlberger <gerdk svn gnome org>

	* src/dwell-click-applet.c:
	Fix ref counting bug.
	Add on/off button to activate dwelling.



Modified:
   trunk/ChangeLog
   trunk/data/dwell-click-applet.glade
   trunk/src/dwell-click-applet.c

Modified: trunk/data/dwell-click-applet.glade
==============================================================================
--- trunk/data/dwell-click-applet.glade	(original)
+++ trunk/data/dwell-click-applet.glade	Sat May 17 15:01:40 2008
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.2 on Thu Mar 27 13:11:06 2008 -->
+<!--Generated with glade3 3.4.5 on Sat May 17 14:59:29 2008 -->
 <glade-interface>
   <widget class="GtkWindow" id="horizontal">
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -8,95 +8,133 @@
     <child>
       <widget class="GtkHBox" id="box_hori">
         <property name="visible">True</property>
-        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-        <property name="homogeneous">True</property>
+        <property name="spacing">4</property>
         <child>
-          <widget class="GtkRadioButton" id="single_click">
+          <widget class="GtkToggleButton" id="enable">
             <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Single Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="tooltip_text">Enable Dwell Click</property>
             <property name="response_id">0</property>
-            <property name="active">True</property>
             <child>
-              <widget class="GtkImage" id="single_click_img">
+              <widget class="GtkImage" id="image1">
                 <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="stock">gtk-ok</property>
               </widget>
             </child>
           </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+          </packing>
         </child>
         <child>
-          <widget class="GtkRadioButton" id="double_click">
+          <widget class="GtkVSeparator" id="vseparator1">
             <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Double Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click</property>
-            <child>
-              <widget class="GtkImage" id="double_click_img">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
-              </widget>
-            </child>
           </widget>
           <packing>
+            <property name="expand">False</property>
             <property name="position">1</property>
           </packing>
         </child>
         <child>
-          <widget class="GtkRadioButton" id="drag_click">
+          <widget class="GtkHBox" id="ct_box">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Drag Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click</property>
+            <property name="homogeneous">True</property>
             <child>
-              <widget class="GtkImage" id="drag_click_img">
+              <widget class="GtkRadioButton" id="single_click">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="tooltip" translatable="yes">Single Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="active">True</property>
+                <child>
+                  <widget class="GtkImage" id="single_click_img">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
               </widget>
             </child>
-          </widget>
-          <packing>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkRadioButton" id="right_click">
-            <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Right Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click</property>
             <child>
-              <widget class="GtkImage" id="right_click_img">
+              <widget class="GtkRadioButton" id="double_click">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Double Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click</property>
+                <child>
+                  <widget class="GtkImage" id="double_click_img">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkRadioButton" id="drag_click">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="tooltip" translatable="yes">Drag Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click</property>
+                <child>
+                  <widget class="GtkImage" id="drag_click_img">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
               </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkRadioButton" id="right_click">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Right Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click</property>
+                <child>
+                  <widget class="GtkImage" id="right_click_img">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
             </child>
           </widget>
           <packing>
-            <property name="position">3</property>
+            <property name="expand">False</property>
+            <property name="position">2</property>
           </packing>
         </child>
       </widget>
@@ -107,94 +145,132 @@
     <child>
       <widget class="GtkVBox" id="box_vert">
         <property name="visible">True</property>
-        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">4</property>
         <child>
-          <widget class="GtkRadioButton" id="single_click_v">
+          <widget class="GtkToggleButton" id="enable_v">
             <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Single Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="tooltip_text">Enable Dwell Click</property>
             <property name="response_id">0</property>
-            <property name="active">True</property>
             <child>
-              <widget class="GtkImage" id="single_click_img_v">
+              <widget class="GtkImage" id="image2">
                 <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="stock">gtk-ok</property>
               </widget>
             </child>
           </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+          </packing>
         </child>
         <child>
-          <widget class="GtkRadioButton" id="double_click_v">
+          <widget class="GtkHSeparator" id="hseparator1">
             <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Double Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click_v</property>
-            <child>
-              <widget class="GtkImage" id="double_click_img_v">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
-              </widget>
-            </child>
           </widget>
           <packing>
+            <property name="expand">False</property>
             <property name="position">1</property>
           </packing>
         </child>
         <child>
-          <widget class="GtkRadioButton" id="drag_click_v">
+          <widget class="GtkVBox" id="ct_box_v">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Drag Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click_v</property>
             <child>
-              <widget class="GtkImage" id="drag_click_img_v">
+              <widget class="GtkRadioButton" id="single_click_v">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="tooltip" translatable="yes">Single Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="active">True</property>
+                <child>
+                  <widget class="GtkImage" id="single_click_img_v">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
               </widget>
             </child>
-          </widget>
-          <packing>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkRadioButton" id="right_click_v">
-            <property name="visible">True</property>
-            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-            <property name="tooltip" translatable="yes">Right Click</property>
-            <property name="relief">GTK_RELIEF_NONE</property>
-            <property name="focus_on_click">False</property>
-            <property name="image_position">GTK_POS_TOP</property>
-            <property name="response_id">0</property>
-            <property name="group">single_click_v</property>
             <child>
-              <widget class="GtkImage" id="right_click_img_v">
+              <widget class="GtkRadioButton" id="double_click_v">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Double Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click_v</property>
+                <child>
+                  <widget class="GtkImage" id="double_click_img_v">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkRadioButton" id="drag_click_v">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="stock">gtk-missing-image</property>
-                <property name="icon_size">5</property>
+                <property name="tooltip" translatable="yes">Drag Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click_v</property>
+                <child>
+                  <widget class="GtkImage" id="drag_click_img_v">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
               </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkRadioButton" id="right_click_v">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="tooltip" translatable="yes">Right Click</property>
+                <property name="relief">GTK_RELIEF_NONE</property>
+                <property name="focus_on_click">False</property>
+                <property name="image_position">GTK_POS_TOP</property>
+                <property name="response_id">0</property>
+                <property name="group">single_click_v</property>
+                <child>
+                  <widget class="GtkImage" id="right_click_img_v">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="stock">gtk-missing-image</property>
+                    <property name="icon_size">5</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">3</property>
+              </packing>
             </child>
           </widget>
           <packing>
-            <property name="position">3</property>
+            <property name="expand">False</property>
+            <property name="position">2</property>
           </packing>
         </child>
       </widget>

Modified: trunk/src/dwell-click-applet.c
==============================================================================
--- trunk/src/dwell-click-applet.c	(original)
+++ trunk/src/dwell-click-applet.c	Sat May 17 15:01:40 2008
@@ -32,12 +32,15 @@
     DBusGProxy  *proxy;
     GladeXML    *xml;
     GtkWidget   *box;
+    GtkWidget   *ct_box;
+    GtkWidget   *enable;
     GtkWidget   *button;
     GdkPixbuf   *click[4];
     gint         button_width;
     gint         button_height;
     gint         cct;
     gboolean     active;
+    guint        tid;
 };
 
 static const gchar *img_widgets[] = {
@@ -54,7 +57,6 @@
     "single_click_img_v"
 };
 
-static void update_sensitivity (DwellData         *dd);
 static void preferences_dialog (BonoboUIComponent *component,
 				gpointer           data,
 				const char        *cname);
@@ -72,6 +74,18 @@
     BONOBO_UI_VERB_END
 };
 
+static void
+update_sensitivity (DwellData *dd)
+{
+    gboolean dwell, sensitive;
+    gint mode;
+
+    dwell = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dd->enable));
+    mode = gconf_client_get_int (dd->client, OPT_MODE, NULL);
+    sensitive = dd->active && dwell && mode == DWELL_MODE_CTW;
+    gtk_widget_set_sensitive (dd->ct_box, sensitive);
+}
+
 static gboolean
 do_not_eat (GtkWidget *widget, GdkEventButton *bev, gpointer user)
 {
@@ -82,6 +96,56 @@
 }
 
 static void
+enable_dwell_changed (GtkToggleButton *button, gpointer data)
+{
+    DwellData *dd = data;
+    gboolean dwell, ctw;
+
+    ctw = gconf_client_get_bool (dd->client, OPT_CTW, NULL);
+    if (ctw)
+	gconf_client_set_bool (dd->client, OPT_CTW, FALSE, NULL);
+
+    dwell = gtk_toggle_button_get_active (button);
+    gconf_client_set_bool (dd->client, OPT_DWELL, dwell, NULL);
+}
+
+static gboolean
+activation_timeout (gpointer data)
+{
+    DwellData *dd = data;
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable), TRUE);
+    dd->tid = 0;
+
+    return FALSE;
+}
+
+static gboolean
+enable_dwell_crossing (GtkWidget        *widget,
+		       GdkEventCrossing *event,
+		       gpointer          data)
+{
+    DwellData *dd = data;
+
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dd->enable)))
+	return FALSE;
+
+    if (event->type == GDK_ENTER_NOTIFY) {
+	gdouble delay;
+
+	delay = gconf_client_get_float (dd->client, OPT_DWELL_T, NULL);
+	dd->tid = g_timeout_add (delay * 1000, activation_timeout, dd);
+    }
+    else {
+	if (dd->tid != 0) {
+	    g_source_remove (dd->tid);
+	    dd->tid = 0;
+	}
+    }
+    return FALSE;
+}
+
+static void
 button_cb (GtkToggleButton *button, gpointer data)
 {
     DwellData *dd = data;
@@ -158,18 +222,23 @@
 applet_orient_changed (PanelApplet *applet, guint orient, gpointer data)
 {
     DwellData *dd = data;
+    gboolean dwell;
 
-    gtk_container_remove (GTK_CONTAINER (applet), dd->box);
+    gtk_container_remove (GTK_CONTAINER (applet), g_object_ref (dd->box));
 
     switch (orient) {
     case PANEL_APPLET_ORIENT_UP:
     case PANEL_APPLET_ORIENT_DOWN:
 	dd->box = WID ("box_hori");
+	dd->ct_box = WID ("ct_box");
+	dd->enable = WID ("enable");
 	dd->button = WID ("single_click");
 	break;
     case PANEL_APPLET_ORIENT_LEFT:
     case PANEL_APPLET_ORIENT_RIGHT:
 	dd->box = WID ("box_vert");
+	dd->ct_box = WID ("ct_box_v");
+	dd->enable = WID ("enable_v");
 	dd->button = WID ("single_click_v");
     default:
 	break;
@@ -177,8 +246,14 @@
 
     if (dd->box->parent)
 	gtk_widget_reparent (dd->box, GTK_WIDGET (applet));
-    else
+    else {
 	gtk_container_add (GTK_CONTAINER (applet), dd->box);
+	g_object_unref (dd->box);
+    }
+
+    dwell = gconf_client_get_bool (dd->client, OPT_DWELL, NULL);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable), dwell);
+    update_sensitivity (dd);
 }
 
 static void
@@ -191,12 +266,9 @@
 	if (dd->click[i])
 	    g_object_unref (dd->click[i]);
 
-    g_object_unref (WID ("box_vert"));
-    g_object_unref (WID ("box_hori"));
     g_object_unref (dd->client);
     g_object_unref (dd->proxy);
     g_object_unref (dd->xml);
-
     g_slice_free (DwellData, dd);
 }
 
@@ -266,47 +338,53 @@
 static void
 setup_box (DwellData *dd)
 {
+    GtkWidget *widget;
     gint i;
 
     /* horizontal */
-    init_button (dd, WID ("single_click"));
+    widget = WID ("single_click");
+    init_button (dd, widget);
+    g_signal_connect (widget, "size-allocate",
+		      G_CALLBACK (button_size_allocate), dd);
     init_button (dd, WID ("double_click"));
     init_button (dd, WID ("drag_click"));
     init_button (dd, WID ("right_click"));
 
+    widget = WID ("enable");
+    g_signal_connect (widget, "button-press-event",
+		      G_CALLBACK (do_not_eat), NULL);
+    g_signal_connect (widget, "toggled",
+		      G_CALLBACK (enable_dwell_changed), dd);
+    g_signal_connect (widget, "enter-notify-event",
+		      G_CALLBACK (enable_dwell_crossing), dd);
+    g_signal_connect (widget, "leave-notify-event",
+		      G_CALLBACK (enable_dwell_crossing), dd);
+
     /* vertical */
-    init_button (dd, WID ("single_click_v"));
+    widget = WID ("single_click_v");
+    init_button (dd, widget);
+    g_signal_connect (WID ("single_click_v"), "size-allocate",
+		      G_CALLBACK (button_size_allocate), dd);
     init_button (dd, WID ("double_click_v"));
     init_button (dd, WID ("drag_click_v"));
     init_button (dd, WID ("right_click_v"));
 
+    widget = WID ("enable_v");
+    g_signal_connect (widget, "button-press-event",
+		      G_CALLBACK (do_not_eat), NULL);
+    g_signal_connect (widget, "toggled",
+		      G_CALLBACK (enable_dwell_changed), dd);
+    g_signal_connect (widget, "enter-notify-event",
+		      G_CALLBACK (enable_dwell_crossing), dd);
+    g_signal_connect (widget, "leave-notify-event",
+		      G_CALLBACK (enable_dwell_crossing), dd);
+
     for (i = 0; i < N_CLICK_TYPES; i++) {
 	gtk_image_set_from_pixbuf (GTK_IMAGE (WID (img_widgets[i])),
 				   dd->click[i]);
 	gtk_image_set_from_pixbuf (GTK_IMAGE (WID (img_widgets_v[i])),
 				   dd->click[i]);
     }
-    /* make sure widgets don't get destroyed (reparenting) */
-    g_object_ref (WID ("box_hori"));
-    g_object_ref (WID ("box_vert"));
-
-    g_signal_connect (WID ("single_click"), "size-allocate",
-		      G_CALLBACK (button_size_allocate), dd);
-    g_signal_connect (WID ("single_click_v"), "size-allocate",
-		      G_CALLBACK (button_size_allocate), dd);
-}
-
-static void
-update_sensitivity (DwellData *dd)
-{
-    gint mode;
-    gboolean enabled, sensitive;
-
-    enabled = gconf_client_get_bool (dd->client, OPT_DWELL, NULL);
-    mode = gconf_client_get_int (dd->client, OPT_MODE, NULL);
-
-    sensitive = dd->active && enabled && mode == DWELL_MODE_CTW;
-    gtk_widget_set_sensitive (dd->box, sensitive);
 }
 
 static void
@@ -314,7 +392,7 @@
 		   guint       clicktype,
 		   gpointer    data)
 {
-    DwellData *dd = (DwellData *) data;
+    DwellData *dd = data;
     GtkToggleButton *button;
     GSList *group;
 
@@ -398,11 +476,19 @@
 static void
 gconf_value_changed (GConfClient *client,
 		     const gchar *key,
-		     GConfValue *value,
-		     gpointer data)
+		     GConfValue  *value,
+		     gpointer     data)
 {
-    if (g_str_equal (key, OPT_MODE) || g_str_equal (key, OPT_DWELL))
-	update_sensitivity (data);
+    DwellData *dd = data;
+
+    if (g_str_equal (key, OPT_MODE)) {
+	update_sensitivity (dd);
+    } else if (g_str_equal (key, OPT_DWELL) &&
+	       value->type == GCONF_VALUE_BOOL) {
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable),
+				      gconf_value_get_bool (value));
+	update_sensitivity (dd);
+    }
 }
 
 static gboolean
@@ -411,6 +497,7 @@
     DwellData *dd;
     GtkWidget *about;
     PanelAppletOrient orient;
+    gboolean dwell;
 
     dd = g_slice_new0 (DwellData);
     if (!dd)
@@ -483,13 +570,20 @@
     if (orient == PANEL_APPLET_ORIENT_UP ||
 	orient == PANEL_APPLET_ORIENT_DOWN) {
 	dd->box = WID ("box_hori");
+	dd->ct_box = WID ("ct_box");
+	dd->enable = WID ("enable");
 	dd->button = WID ("single_click");
     }
     else {
 	dd->box = WID ("box_vert");
+	dd->ct_box = WID ("ct_box_v");
+	dd->enable = WID ("enable_v");
 	dd->button = WID ("single_click_v");
     }
 
+    dwell = gconf_client_get_bool (dd->client, OPT_DWELL, NULL);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable), dwell);
+
     setup_box (dd);
     gtk_widget_reparent (dd->box, GTK_WIDGET (applet));
     gtk_widget_show (GTK_WIDGET (applet));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]