mousetweaks r196 - in trunk: . src



Author: gerdk
Date: Thu Jun 26 12:35:45 2008
New Revision: 196
URL: http://svn.gnome.org/viewvc/mousetweaks?rev=196&view=rev

Log:
2008-06-26 Gerd Kohlberger <gerdk svn gnome org>

	* src/dwell-click-applet.c: Add time animation to enable button.



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

Modified: trunk/src/dwell-click-applet.c
==============================================================================
--- trunk/src/dwell-click-applet.c	(original)
+++ trunk/src/dwell-click-applet.c	Thu Jun 26 12:35:45 2008
@@ -40,7 +40,10 @@
     gint         button_height;
     gint         cct;
     gboolean     active;
+    GTimer      *timer;
     guint        tid;
+    gdouble      delay;
+    gdouble      elapsed;
 };
 
 static const gchar *img_widgets[] = {
@@ -115,11 +118,19 @@
 activation_timeout (gpointer data)
 {
     DwellData *dd = data;
+    gboolean stop;
 
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable), TRUE);
-    dd->tid = 0;
+    if ((dd->elapsed = g_timer_elapsed (dd->timer, NULL)) < dd->delay)
+	stop = TRUE;
+    else {
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dd->enable), TRUE);
+	dd->tid = 0;
+	dd->elapsed = 0.0;
+	stop = FALSE;
+    }
+    gtk_widget_queue_draw (dd->enable);
 
-    return FALSE;
+    return stop;
 }
 
 static gboolean
@@ -128,6 +139,7 @@
 		       gpointer          data)
 {
     DwellData *dd = data;
+    GError *error = NULL;
 
     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dd->enable)))
 	return FALSE;
@@ -135,18 +147,58 @@
     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);
+	if (!dd->tid) {
+	    dd->delay = gconf_client_get_float (dd->client, OPT_DWELL_T, &error);
+	    if (error) {
+		g_error_free (error);
+		dd->delay = 1.2;
+	    }
+	    g_timer_start (dd->timer);
+	    dd->tid = g_timeout_add (100, activation_timeout, dd);
+	}
     }
     else {
-	if (dd->tid != 0) {
+	if (dd->tid) {
 	    g_source_remove (dd->tid);
 	    dd->tid = 0;
+	    dd->elapsed = 0.0;
 	}
     }
     return FALSE;
 }
 
+static gboolean
+enable_dwell_exposed (GtkWidget      *widget,
+		      GdkEventExpose *event,
+		      gpointer        data)
+{
+    DwellData *dd = data;
+    cairo_t *cr;
+    GdkColor c;
+    gdouble x, y, w, h;
+    gint fwidth, fpad;
+
+    c = widget->style->bg[GTK_STATE_SELECTED];
+    gtk_widget_style_get (widget,
+			  "focus-line-width", &fwidth,
+			  "focus-padding", &fpad,
+			  NULL); 
+    x = widget->allocation.x + fwidth + fpad;
+    y = widget->allocation.y + fwidth + fpad;
+    w = widget->allocation.width - (fwidth + fpad) * 2;
+    h = widget->allocation.height - (fwidth + fpad) * 2;
+
+    cr = gdk_cairo_create (widget->window);
+    cairo_set_source_rgba (cr,
+			   c.red / 65535., c.green / 65535., c.blue / 65535.,
+			   0.5); 
+    cairo_rectangle (cr, x, y, w, (h * dd->elapsed) / dd->delay);
+    cairo_fill (cr);
+    cairo_destroy (cr);
+
+    return FALSE;
+}
+
 static void
 button_cb (GtkToggleButton *button, gpointer data)
 {
@@ -271,6 +323,7 @@
     g_object_unref (dd->client);
     g_object_unref (dd->proxy);
     g_object_unref (dd->xml);
+    g_timer_destroy (dd->timer);
     g_slice_free (DwellData, dd);
 }
 
@@ -366,6 +419,8 @@
 		      G_CALLBACK (enable_dwell_crossing), dd);
     g_signal_connect (widget, "leave-notify-event",
 		      G_CALLBACK (enable_dwell_crossing), dd);
+    g_signal_connect_after (widget, "expose-event",
+			    G_CALLBACK (enable_dwell_exposed), dd);
 
     /* vertical */
     vgroup = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
@@ -388,6 +443,8 @@
 		      G_CALLBACK (enable_dwell_crossing), dd);
     g_signal_connect (widget, "leave-notify-event",
 		      G_CALLBACK (enable_dwell_crossing), dd);
+    g_signal_connect_after (widget, "expose-event",
+			    G_CALLBACK (enable_dwell_exposed), dd);
 
     for (i = 0; i < N_CLICK_TYPES; i++) {
 	gtk_image_set_from_pixbuf (GTK_IMAGE (WID (img_widgets[i])),
@@ -535,6 +592,7 @@
 
     dd->active = mousetweaks_is_active ();
     dd->cct = DWELL_CLICK_TYPE_SINGLE;
+    dd->timer = g_timer_new ();
 
     /* about dialog */
     about = WID ("about");



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