[evince] libview: Add delay before showing link preview popover



commit 727657a4e13fd00bbb5bd35c1c19e80723a8bbb0
Author: Mads Chr. Olesen <mads mchro dk>
Date:   Sun Jun 28 12:08:20 2020 +0200

    libview: Add delay before showing link preview popover
    
    Partially fixes #662

 libview/ev-view-private.h |  1 +
 libview/ev-view.c         | 23 ++++++++++++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)
---
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index 648a4b30..bcf66cee 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -138,6 +138,7 @@ typedef struct {
        gdouble    top;
        GtkWidget *popover;
        EvLink    *link;
+       guint      delay_timeout_id;
 } EvLinkPreview;
 
 struct _EvView {
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 51f856f4..23afc9b9 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -121,6 +121,7 @@ typedef struct {
 #define LINK_PREVIEW_PAGE_RATIO 1.0 / 3.0     /* Size of popover with respect to page size */
 #define LINK_PREVIEW_HORIZONTAL_LINK_POS 0.5  /* as fraction of preview width */
 #define LINK_PREVIEW_VERTICAL_LINK_POS 0.3    /* as fraction of preview height */
+#define LINK_PREVIEW_DELAY_MS 300             /* Delay before showing preview in milliseconds */
 
 /*** Scrolling ***/
 static void       view_update_range_and_current_page         (EvView             *view);
@@ -161,6 +162,7 @@ static void       link_preview_job_finished_cb               (EvJobThumbnail
                                                              EvView             *view);
 static gboolean   link_preview_popover_motion_notify         (EvView             *view,
                                                              GdkEventMotion     *event);
+static gboolean   link_preview_delayed_show                  (EvView *view);
 /*** Forms ***/
 static EvFormField *ev_view_get_form_field_at_location       (EvView             *view,
                                                               gdouble            x,
@@ -2291,7 +2293,11 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y)
                if (type == EV_LINK_DEST_TYPE_NAMED)
                        g_object_unref (dest);
 
-               gtk_widget_show (popover);
+               view->link_preview.delay_timeout_id = g_timeout_add (LINK_PREVIEW_DELAY_MS,
+                                                                    (GSourceFunc)link_preview_delayed_show,
+                                                                    view);
+               g_source_set_name_by_id (view->link_preview.delay_timeout_id,
+                                        "[evince] link_preview_timeout");
        } else {
                ev_view_link_preview_popover_cleanup (view);
                view->link_preview.link = NULL;
@@ -5230,6 +5236,16 @@ link_preview_popover_motion_notify (EvView         *view,
        return TRUE;
 }
 
+static gboolean
+link_preview_delayed_show (EvView *view)
+{
+       GtkWidget *popover = view->link_preview.popover;
+       gtk_widget_show (popover);
+
+       view->link_preview.delay_timeout_id = 0;
+       return FALSE;
+}
+
 static void
 link_preview_job_finished_cb (EvJobThumbnail *job,
                              EvView *view)
@@ -5270,6 +5286,11 @@ ev_view_link_preview_popover_cleanup (EvView *view) {
                gtk_widget_destroy (view->link_preview.popover);
                view->link_preview.popover = NULL;
        }
+
+       if (view->link_preview.delay_timeout_id) {
+               g_source_remove (view->link_preview.delay_timeout_id);
+               view->link_preview.delay_timeout_id = 0;
+       }
 }
 
 static gboolean


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