From 57a8ca8e4c7ee8cd49081ba500563d33cfa048d0 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Tue, 18 Jan 2005 12:45:49 +0000 Subject: [PATCH] Fix bugs in the links implementation and change cursor when hovering a 2005-01-18 Marco Pesenti Gritti * pdf/xpdf/pdf-document.cc: * shell/ev-view.c: (status_message_from_link), (ev_view_set_status), (ev_view_set_cursor), (ev_view_motion_notify_event), (ev_view_init): * shell/ev-window.c: (view_status_changed_cb), (ev_window_init): Fix bugs in the links implementation and change cursor when hovering a link. --- ChangeLog | 11 +++++++++ pdf/xpdf/pdf-document.cc | 6 ++++- shell/ev-view.c | 48 +++++++++++++++++++++++++++++++++++----- shell/ev-window.c | 12 ++++++++-- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index e884400d..7e3ed84d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-01-18 Marco Pesenti Gritti + + * pdf/xpdf/pdf-document.cc: + * shell/ev-view.c: (status_message_from_link), + (ev_view_set_status), (ev_view_set_cursor), + (ev_view_motion_notify_event), (ev_view_init): + * shell/ev-window.c: (view_status_changed_cb), (ev_window_init): + + Fix bugs in the links implementation and change cursor + when hovering a link. + 2005-01-17 Bryan Clark * viewer/.cvsignore: added cvsignore file for viewer directory diff --git a/pdf/xpdf/pdf-document.cc b/pdf/xpdf/pdf-document.cc index a8824e88..36ad3743 100644 --- a/pdf/xpdf/pdf-document.cc +++ b/pdf/xpdf/pdf-document.cc @@ -1005,7 +1005,11 @@ pdf_document_get_link (EvDocument *document, int x, int y) PdfDocument *pdf_document = PDF_DOCUMENT (document); LinkAction *action; - action = pdf_document->links->find (x, y); + y = pdf_document->out->getBitmapHeight() - y; + + action = pdf_document->links->find ((double)x / pdf_document->scale, + (double)y / pdf_document->scale); + if (action) { return build_link_from_action (pdf_document, action, ""); } else { diff --git a/shell/ev-view.c b/shell/ev-view.c index 8e18ec48..7ca3630b 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -55,6 +55,11 @@ static const GtkTargetEntry targets[] = { { "UTF8_STRING", 0, TARGET_UTF8_STRING }, }; +typedef enum { + EV_VIEW_CURSOR_NORMAL, + EV_VIEW_CURSOR_HAND +} EvViewCursor; + struct _EvView { GtkWidget parent_instance; @@ -72,6 +77,7 @@ struct _EvView { gboolean pressed_button; gboolean has_selection; GdkRectangle selection; + EvViewCursor cursor; GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; @@ -552,7 +558,7 @@ status_message_from_link (EvLink *link) break; case EV_LINK_TYPE_PAGE: page = ev_link_get_page (link); - msg = g_strdup_printf (_("Page %d"), page); + msg = g_strdup_printf (_("Go to page %d"), page); break; case EV_LINK_TYPE_EXTERNAL_URI: msg = g_strdup (ev_link_get_uri (link)); @@ -569,9 +575,11 @@ ev_view_set_status (EvView *view, const char *message) { g_return_if_fail (EV_IS_VIEW (view)); - g_free (view->status); - view->status = g_strdup (message); - g_object_notify (G_OBJECT (view), "status"); + if (message != view->status) { + g_free (view->status); + view->status = g_strdup (message); + g_object_notify (G_OBJECT (view), "status"); + } } static void @@ -584,6 +592,31 @@ ev_view_set_find_status (EvView *view, const char *message) g_object_notify (G_OBJECT (view), "find-status"); } +static void +ev_view_set_cursor (EvView *view, EvViewCursor new_cursor) +{ + GdkCursor *cursor; + GtkWidget *widget = GTK_WIDGET (view); + + if (view->cursor == new_cursor) { + return; + } + + switch (new_cursor) { + case EV_VIEW_CURSOR_NORMAL: + gdk_window_set_cursor (widget->window, NULL); + break; + case EV_VIEW_CURSOR_HAND: + cursor = gdk_cursor_new_for_display + (gdk_display_get_default(), GDK_HAND2); + gdk_window_set_cursor (widget->window, cursor); + gdk_cursor_unref (cursor); + break; + } + + view->cursor = new_cursor; +} + static gboolean ev_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) @@ -605,10 +638,14 @@ ev_view_motion_notify_event (GtkWidget *widget, msg = status_message_from_link (link); ev_view_set_status (view, msg); + ev_view_set_cursor (view, EV_VIEW_CURSOR_HAND); g_free (msg); g_object_unref (link); - } + } else { + ev_view_set_status (view, NULL); + ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + } } gtk_widget_queue_draw (widget); @@ -871,6 +908,7 @@ ev_view_init (EvView *view) view->scale = 1.0; view->pressed_button = -1; + view->cursor = EV_VIEW_CURSOR_NORMAL; gtk_widget_modify_bg (GTK_WIDGET (view), GTK_STATE_NORMAL, &white); diff --git a/shell/ev-window.c b/shell/ev-window.c index 0b8679cb..54effcd2 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -73,6 +73,7 @@ struct _EvWindowPrivate { GtkUIManager *ui_manager; GtkWidget *statusbar; guint help_message_cid; + guint view_message_cid; GtkWidget *exit_fullscreen_popup; char *uri; @@ -1166,9 +1167,14 @@ view_status_changed_cb (EvView *view, { const char *message; + gtk_statusbar_pop (GTK_STATUSBAR (ev_window->priv->statusbar), + ev_window->priv->view_message_cid); + message = ev_view_get_status (view); - gtk_statusbar_push (GTK_STATUSBAR (ev_window->priv->statusbar), - ev_window->priv->help_message_cid, message); + if (message) { + gtk_statusbar_push (GTK_STATUSBAR (ev_window->priv->statusbar), + ev_window->priv->view_message_cid, message); + } } static void @@ -1582,6 +1588,8 @@ ev_window_init (EvWindow *ev_window) FALSE, TRUE, 0); ev_window->priv->help_message_cid = gtk_statusbar_get_context_id (GTK_STATUSBAR (ev_window->priv->statusbar), "help_message"); + ev_window->priv->view_message_cid = gtk_statusbar_get_context_id + (GTK_STATUSBAR (ev_window->priv->statusbar), "view_message"); ev_window->priv->find_bar = egg_find_bar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box), -- 2.43.5