]> www.fi.muni.cz Git - evince.git/commitdiff
Delay popup showing. Mirror gtk logic/times.
authorMarco Pesenti Gritti <mpg@redhat.com>
Mon, 5 Sep 2005 08:57:08 +0000 (08:57 +0000)
committerMarco Pesenti Gritti <marco@src.gnome.org>
Mon, 5 Sep 2005 08:57:08 +0000 (08:57 +0000)
2005-09-05  Marco Pesenti Gritti  <mpg@redhat.com>

        * lib/ev-tooltip.c: (ev_tooltip_dispose), (ev_tooltip_class_init),
        (ev_tooltip_set_position), (ev_tooltip_recently_shown),
        (ev_tooltip_timeout), (ev_tooltip_activate),
        (ev_tooltip_deactivate):
        * lib/ev-tooltip.h:
        * shell/ev-view.c: (ev_view_motion_notify_event):

        Delay popup showing. Mirror gtk logic/times.

ChangeLog
lib/ev-tooltip.c
lib/ev-tooltip.h
shell/ev-view.c

index 2148ed67e95d95ce87e008fa0e8f877aeaf31b45..bf854ab29de550e4e559c1985c191606bd8afaf9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-09-05  Marco Pesenti Gritti  <mpg@redhat.com>
+
+       * lib/ev-tooltip.c: (ev_tooltip_dispose), (ev_tooltip_class_init),
+       (ev_tooltip_set_position), (ev_tooltip_recently_shown),
+       (ev_tooltip_timeout), (ev_tooltip_activate),
+       (ev_tooltip_deactivate):
+       * lib/ev-tooltip.h:
+       * shell/ev-view.c: (ev_view_motion_notify_event):
+
+       Delay popup showing. Mirror gtk logic/times.
+
 2005-09-03  Marco Pesenti Gritti  <mpg@redhat.com>
 
        * lib/Makefile.am:
index 14326ab2b9b19a17a9395ad0d51557affe8bcded..5e32c5807a29f72b2c123ab305d5f371d6216dac 100644 (file)
 
 #include <gtk/gtklabel.h>
 
+#define DEFAULT_DELAY 500
+#define STICKY_DELAY 0
+#define STICKY_REVERT_DELAY 1000
+
 struct _EvTooltipPrivate {
        GtkWidget *label;
+       GTimeVal last_deactivate;
+       int timer_tag;
+       gboolean active;
 };
 
 G_DEFINE_TYPE (EvTooltip, ev_tooltip, GTK_TYPE_WINDOW)
@@ -49,12 +56,24 @@ ev_tooltip_expose_event (GtkWidget      *widget,
        return GTK_WIDGET_CLASS (ev_tooltip_parent_class)->expose_event (widget, event);
 }
 
+static void
+ev_tooltip_dispose (GObject *object)
+{
+       EvTooltip *tooltip = EV_TOOLTIP (object);
+
+       if (tooltip->priv->timer_tag) {
+               g_source_remove (tooltip->priv->timer_tag);
+               tooltip->priv->timer_tag = 0;
+       }
+}
+
 static void
 ev_tooltip_class_init (EvTooltipClass *class)
 {
        GObjectClass *g_object_class = G_OBJECT_CLASS (class);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
+       g_object_class->dispose = ev_tooltip_dispose;
        widget_class->expose_event = ev_tooltip_expose_event;
 
        g_type_class_add_private (g_object_class, sizeof (EvTooltipPrivate));
@@ -115,3 +134,67 @@ ev_tooltip_set_position (EvTooltip *tooltip, int x, int y)
 
        gtk_window_move (GTK_WINDOW (tooltip), x + root_x, y + root_y);
 }
+
+static gboolean
+ev_tooltip_recently_shown (EvTooltip *tooltip)
+{
+       GTimeVal now;
+       glong msec;
+  
+       g_get_current_time (&now);
+
+       msec = (now.tv_sec  - tooltip->priv->last_deactivate.tv_sec) * 1000 +
+              (now.tv_usec - tooltip->priv->last_deactivate.tv_usec) / 1000;
+
+       return (msec < STICKY_REVERT_DELAY);
+}
+
+static gint
+ev_tooltip_timeout (gpointer data)
+{
+       GtkWidget *tooltip = GTK_WIDGET (data);
+
+       gtk_widget_show (tooltip);
+
+       return FALSE;
+}
+
+void
+ev_tooltip_activate (EvTooltip *tooltip)
+{
+       int delay;
+
+       if (tooltip->priv->active) {
+               return;
+       } else {
+               tooltip->priv->active = TRUE;
+       }
+
+       if (ev_tooltip_recently_shown (tooltip)) {
+               delay = STICKY_DELAY;
+       } else {
+               delay = DEFAULT_DELAY;
+       }
+
+       tooltip->priv->timer_tag = g_timeout_add (delay, ev_tooltip_timeout,
+                                                 (gpointer)tooltip);
+}
+
+void
+ev_tooltip_deactivate (EvTooltip *tooltip)
+{
+       if (!tooltip->priv->active) {
+               return;
+       } else {
+               tooltip->priv->active = FALSE;
+       }
+
+       if (tooltip->priv->timer_tag) {
+               g_source_remove (tooltip->priv->timer_tag);
+               tooltip->priv->timer_tag = 0;
+       }
+
+       gtk_widget_hide (GTK_WIDGET (tooltip));
+
+       g_get_current_time (&tooltip->priv->last_deactivate);
+}
index b57368c38e59e1910ada4c9245d58b8a8bd7a3fc..025a242792ccb3cdfe358cfdacbb8394a669d031 100644 (file)
@@ -58,6 +58,8 @@ void       ev_tooltip_set_text           (EvTooltip  *tooltip,
 void       ev_tooltip_set_position (EvTooltip  *tooltip,
                                    int         x,
                                    int         y);
+void       ev_tooltip_activate     (EvTooltip  *tooltip);
+void       ev_tooltip_deactivate   (EvTooltip  *tooltip);
 
 G_END_DECLS
 
index f5b22fd1648989f7a1d484b4e1e4df5e2cb91606..2edcd858cc9345566704aee3eed53eee2618ce94 100644 (file)
@@ -1532,7 +1532,7 @@ ev_view_motion_notify_event (GtkWidget      *widget,
                link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y);
 
                if (!link && view->link_tooltip) {
-                       gtk_widget_hide (view->link_tooltip);
+                       ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip));
                }
 
                 if (link) {
@@ -1543,7 +1543,7 @@ ev_view_motion_notify_event (GtkWidget      *widget,
                        }
                        ev_tooltip_set_position (EV_TOOLTIP (view->link_tooltip), event->x, event->y);
                        ev_tooltip_set_text (EV_TOOLTIP (view->link_tooltip), msg);
-                       gtk_widget_show (view->link_tooltip);
+                       ev_tooltip_activate (EV_TOOLTIP (view->link_tooltip));
                        g_free (msg);
 
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK);