From e17522f07726a89adbe1a2402ae4920b2a8b4f38 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Mon, 30 Jul 2007 16:35:31 +0000 Subject: [PATCH] Fix a headers problem with ev-link 2007-07-30 Carlos Garcia Campos * libdocument/ev-document-info.h: * libdocument/ev-document.h: * shell/ev-page-action.h: * shell/ev-sidebar-links.h: Fix a headers problem with ev-link * libdocument/ev-link.[ch]: (ev_link_mapping_get_area): * shell/ev-view-private.h: * shell/ev-view.c: (ev_view_handle_cursor_over_xy), (get_link_area), (ev_view_query_tooltip), (ev_view_leave_notify_event), (ev_view_destroy), (ev_view_class_init): Use new gtk tooltips when available instead of ev-tooltip. svn path=/trunk/; revision=2599 --- ChangeLog | 18 ++++++++ libdocument/ev-document-info.h | 1 - libdocument/ev-document.h | 1 - libdocument/ev-link.c | 21 ++++++++++ libdocument/ev-link.h | 14 ++++--- shell/ev-page-action.h | 1 + shell/ev-sidebar-links.h | 1 + shell/ev-view-private.h | 2 + shell/ev-view.c | 75 ++++++++++++++++++++++++++++++++-- 9 files changed, 123 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5c2e7b11..0a21ca81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2007-07-30 Carlos Garcia Campos + + * libdocument/ev-document-info.h: + * libdocument/ev-document.h: + * shell/ev-page-action.h: + * shell/ev-sidebar-links.h: + + Fix a headers problem with ev-link + + * libdocument/ev-link.[ch]: (ev_link_mapping_get_area): + * shell/ev-view-private.h: + * shell/ev-view.c: (ev_view_handle_cursor_over_xy), + (get_link_area), (ev_view_query_tooltip), + (ev_view_leave_notify_event), (ev_view_destroy), + (ev_view_class_init): + + Use new gtk tooltips when available instead of ev-tooltip. + 2007-07-30 Carlos Garcia Campos * shell/ev-window.c: (update_chrome_visibility), diff --git a/libdocument/ev-document-info.h b/libdocument/ev-document-info.h index 0cd1ef85..b5e86543 100644 --- a/libdocument/ev-document-info.h +++ b/libdocument/ev-document-info.h @@ -23,7 +23,6 @@ #include #include -#include "ev-link.h" G_BEGIN_DECLS diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h index e83295f0..833491e2 100644 --- a/libdocument/ev-document.h +++ b/libdocument/ev-document.h @@ -27,7 +27,6 @@ #include #include -#include "ev-link.h" #include "ev-document-info.h" #include "ev-render-context.h" diff --git a/libdocument/ev-link.c b/libdocument/ev-link.c index 17e44213..1e8251a8 100644 --- a/libdocument/ev-link.c +++ b/libdocument/ev-link.c @@ -224,6 +224,27 @@ ev_link_mapping_find (GList *link_mapping, return link; } +void +ev_link_mapping_get_area (GList *link_mapping, + EvLink *link, + EvRectangle *area) +{ + GList *list; + + for (list = link_mapping; list; list = list->next) { + EvLinkMapping *mapping = list->data; + + if (mapping->link == link) { + area->x1 = mapping->x1; + area->y1 = mapping->y1; + area->x2 = mapping->x2; + area->y2 = mapping->y2; + + break; + } + } +} + gint ev_link_get_page (EvLink *link) { diff --git a/libdocument/ev-link.h b/libdocument/ev-link.h index 9bd7f6e0..136047c7 100644 --- a/libdocument/ev-link.h +++ b/libdocument/ev-link.h @@ -21,6 +21,7 @@ #define EV_LINK_H #include +#include "ev-document.h" #include "ev-link-action.h" G_BEGIN_DECLS @@ -43,7 +44,7 @@ EvLink *ev_link_new (const gchar *title, const gchar *ev_link_get_title (EvLink *self); EvLinkAction *ev_link_get_action (EvLink *self); -gint ev_link_get_page (EvLink *link); +gint ev_link_get_page (EvLink *link); /* Link Mapping stuff */ typedef struct _EvLinkMapping EvLinkMapping; @@ -56,10 +57,13 @@ struct _EvLinkMapping gdouble y2; }; -void ev_link_mapping_free (GList *link_mapping); -EvLink *ev_link_mapping_find (GList *link_mapping, - gdouble x, - gdouble y); +void ev_link_mapping_free (GList *link_mapping); +EvLink *ev_link_mapping_find (GList *link_mapping, + gdouble x, + gdouble y); +void ev_link_mapping_get_area (GList *link_mapping, + EvLink *link, + EvRectangle *area); G_END_DECLS #endif /* !EV_LINK_H */ diff --git a/shell/ev-page-action.h b/shell/ev-page-action.h index c9785c65..82f3ac80 100644 --- a/shell/ev-page-action.h +++ b/shell/ev-page-action.h @@ -24,6 +24,7 @@ #include #include #include +#include "ev-link.h" G_BEGIN_DECLS diff --git a/shell/ev-sidebar-links.h b/shell/ev-sidebar-links.h index 36fb1da2..f1a6b870 100644 --- a/shell/ev-sidebar-links.h +++ b/shell/ev-sidebar-links.h @@ -26,6 +26,7 @@ #include #include "ev-document.h" +#include "ev-link.h" #include "ev-utils.h" G_BEGIN_DECLS diff --git a/shell/ev-view-private.h b/shell/ev-view-private.h index 12d5c8a3..feed78a9 100644 --- a/shell/ev-view-private.h +++ b/shell/ev-view-private.h @@ -142,9 +142,11 @@ struct _EvView { /* Image DND */ ImageDNDInfo image_dnd_info; +#if !GTK_CHECK_VERSION (2, 11, 7) /* Links */ GtkWidget *link_tooltip; EvLink *hovered_link; +#endif /* Goto Popup */ GtkWidget *goto_window; diff --git a/shell/ev-view.c b/shell/ev-view.c index 1f9e8244..577aefc4 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -42,7 +42,9 @@ #include "ev-job-queue.h" #include "ev-page-cache.h" #include "ev-pixbuf-cache.h" +#if !GTK_CHECK_VERSION (2, 11, 7) #include "ev-tooltip.h" +#endif #include "ev-application.h" #define EV_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_VIEW, EvViewClass)) @@ -1497,7 +1499,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) return; link = ev_view_get_link_at_location (view, x, y); - + +#if !GTK_CHECK_VERSION (2, 11, 7) if (view->link_tooltip == NULL) { view->link_tooltip = ev_tooltip_new (GTK_WIDGET (view)); } @@ -1506,8 +1509,12 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) view->hovered_link = link; ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); } +#endif if (link) { +#if GTK_CHECK_VERSION (2, 11, 7) + g_object_set (view, "has-tooltip", TRUE, NULL); +#else char *msg = tip_from_link (view, link); if (msg && g_utf8_validate (msg, -1, NULL)) { @@ -1518,7 +1525,7 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) ev_tooltip_activate (tooltip); } g_free (msg); - +#endif ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); } else if ((field = ev_view_get_form_field_at_location (view, x, y))) { if (field->is_read_only) { @@ -2527,6 +2534,60 @@ ev_view_popup_menu (GtkWidget *widget) return ev_view_do_popup_menu (EV_VIEW (widget), x, y); } +#if GTK_CHECK_VERSION (2, 11, 7) +static void +get_link_area (EvView *view, + gint x, + gint y, + EvLink *link, + GdkRectangle *area) +{ + EvRectangle ev_rect; + GList *link_mapping; + gint page; + gint x_offset = 0, y_offset = 0; + + x += view->scroll_x; + y += view->scroll_y; + + find_page_at_location (view, x, y, &page, &x_offset, &y_offset); + + link_mapping = ev_pixbuf_cache_get_link_mapping (view->pixbuf_cache, page); + ev_link_mapping_get_area (link_mapping, link, &ev_rect); + + doc_rect_to_view_rect (view, page, &ev_rect, area); + area->y -= view->scroll_y ; +} + +static gboolean +ev_view_query_tooltip (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tip, + GtkTooltip *tooltip) +{ + EvView *view = EV_VIEW (widget); + EvLink *link; + gchar *text; + + link = ev_view_get_link_at_location (view, x, y); + if (!link) + return FALSE; + + text = tip_from_link (view, link); + if (text && g_utf8_validate (text, -1, NULL)) { + GdkRectangle link_area; + + get_link_area (view, x, y, link, &link_area); + gtk_tooltip_set_text (tooltip, text); + gtk_tooltip_set_tip_area (tooltip, &link_area); + } + g_free (text); + + return TRUE; +} +#endif /* GTK_CHECK_VERSION (2, 11, 7) */ + static gboolean ev_view_button_press_event (GtkWidget *widget, GdkEventButton *event) @@ -3260,11 +3321,13 @@ ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event) view->cursor == EV_VIEW_CURSOR_IBEAM) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); +#if !GTK_CHECK_VERSION (2, 11, 7) if (view->link_tooltip) { view->hovered_link = NULL; ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); } - +#endif + return FALSE; } @@ -3595,11 +3658,12 @@ ev_view_destroy (GtkObject *object) view->pixbuf_cache = NULL; } +#if !GTK_CHECK_VERSION (2, 11, 7) if (view->link_tooltip) { gtk_widget_destroy (view->link_tooltip); view->link_tooltip = NULL; } - +#endif if (view->goto_window) { gtk_widget_destroy (view->goto_window); view->goto_window = NULL; @@ -3768,6 +3832,9 @@ ev_view_class_init (EvViewClass *class) widget_class->drag_motion = ev_view_drag_motion; widget_class->drag_data_received = ev_view_drag_data_received; widget_class->popup_menu = ev_view_popup_menu; +#if GTK_CHECK_VERSION (2, 11, 7) + widget_class->query_tooltip = ev_view_query_tooltip; +#endif gtk_object_class->destroy = ev_view_destroy; -- 2.43.5