/* UI Builders */
GtkActionGroup *action_group;
+ GtkActionGroup *popups_action_group;
GtkUIManager *ui_manager;
/* Fullscreen mode */
GtkWidget *fullscreen_toolbar;
GtkWidget *fullscreen_popup;
GSource *fullscreen_timeout_source;
+
+ /* Popup link */
+ GtkWidget *popup;
+ EvLink *link;
/* Document */
char *uri;
static void ev_window_cmd_view_presentation (GtkAction *action,
EvWindow *window);
static void show_fullscreen_popup (EvWindow *window);
+static void ev_popup_cmd_open_link (GtkAction *action,
+ EvWindow *window);
+static void ev_popup_cmd_copy_link_address (GtkAction *action,
+ EvWindow *window);
G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
GValue show_toolbar = { 0, };
if (ev_metadata_manager_get (NULL, "show_toolbar", &show_toolbar, FALSE)) {
- if (!g_value_get_boolean (&show_toolbar));
+ if (!g_value_get_boolean (&show_toolbar))
chrome &= ~EV_CHROME_TOOLBAR;
}
window->priv->chrome = chrome;
}
}
+static gboolean
+view_menu_popup_cb (EvView *view,
+ EvLink *link,
+ EvWindow *ev_window)
+{
+ GtkWidget *popup;
+ gboolean show_external = FALSE;
+ gboolean show_internal = FALSE;
+ GtkAction *action;
+
+ if (ev_window->priv->link)
+ g_object_unref (ev_window->priv->link);
+ if (link)
+ ev_window->priv->link = g_object_ref (link);
+ else
+ ev_window->priv->link = NULL;
+
+ popup = ev_window->priv->popup;
+
+ if (ev_window->priv->link)
+ switch (ev_link_get_link_type (ev_window->priv->link)) {
+ case EV_LINK_TYPE_PAGE:
+ case EV_LINK_TYPE_PAGE_FIT:
+ case EV_LINK_TYPE_PAGE_FITH:
+ case EV_LINK_TYPE_PAGE_FITV:
+ case EV_LINK_TYPE_PAGE_FITR:
+ case EV_LINK_TYPE_PAGE_XYZ:
+ show_internal = TRUE;
+ break;
+ case EV_LINK_TYPE_EXTERNAL_URI:
+ case EV_LINK_TYPE_LAUNCH:
+ show_external = TRUE;
+ break;
+ default:
+ break;
+ }
+
+ action = gtk_action_group_get_action (ev_window->priv->popups_action_group,
+ "OpenLink");
+ gtk_action_set_visible (action, show_external);
+
+ action = gtk_action_group_get_action (ev_window->priv->popups_action_group,
+ "CopyLinkAddress");
+ gtk_action_set_visible (action, show_external);
+
+ action = gtk_action_group_get_action (ev_window->priv->popups_action_group,
+ "GoLink");
+ gtk_action_set_visible (action, show_internal);
+
+ gtk_menu_popup (GTK_MENU (popup), NULL, NULL,
+ NULL, NULL,
+ 3, gtk_get_current_event_time ());
+ return TRUE;
+}
+
static void
view_find_status_changed_cb (EvView *view,
GParamSpec *pspec,
priv->action_group = NULL;
}
+ if (priv->popups_action_group) {
+ g_object_unref (priv->popups_action_group);
+ priv->popups_action_group = NULL;
+ }
+
if (priv->page_cache) {
g_signal_handlers_disconnect_by_func (priv->page_cache, page_changed_cb, window);
priv->page_cache = NULL;
gtk_widget_destroy (priv->password_dialog);
}
+ if (priv->link) {
+ g_object_unref (priv->link);
+ priv->link = NULL;
+ }
+
if (priv->find_bar) {
g_signal_handlers_disconnect_by_func
(window->priv->find_bar,
{ "FileOpen", GTK_STOCK_OPEN, N_("_Open..."), "<control>O",
N_("Open an existing document"),
G_CALLBACK (ev_window_cmd_file_open) },
- { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), NULL, NULL,
+ { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), "<control>S",
+ N_("Save a copy of the current document"),
G_CALLBACK (ev_window_cmd_save_as) },
{ "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
N_("Print this document"),
G_CALLBACK (ev_window_cmd_view_page_width) },
};
+/* Popups specific items */
+static const GtkActionEntry popups_entries [] = {
+ /* Links */
+ { "OpenLink", GTK_STOCK_OPEN, N_("_Open Link"), NULL,
+ NULL, G_CALLBACK (ev_popup_cmd_open_link) },
+ { "GoLink", GTK_STOCK_GO_FORWARD, N_("_Go To"), NULL,
+ NULL, G_CALLBACK (ev_popup_cmd_open_link) },
+ { "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL,
+ NULL,
+ G_CALLBACK (ev_popup_cmd_copy_link_address) },
+};
+
static void
drag_data_received_cb (GtkWidget *widget, GdkDragContext *context,
gint x, gint y, GtkSelectionData *selection_data,
}
}
+static void
+ev_popup_cmd_open_link (GtkAction *action, EvWindow *window)
+{
+ ev_view_goto_link (EV_VIEW (window->priv->view), window->priv->link);
+}
+
+static void
+ev_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window)
+{
+ GtkClipboard *clipboard;
+ const gchar *uri;
+
+ uri = ev_link_get_uri (window->priv->link);
+
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+ GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_set_text (clipboard, uri, -1);
+}
+
static void
ev_window_init (EvWindow *ev_window)
{
ev_window_set_view_accels_sensitivity (ev_window, FALSE);
+ action_group = gtk_action_group_new ("PopupsActions");
+ ev_window->priv->popups_action_group = action_group;
+ gtk_action_group_set_translation_domain (action_group, NULL);
+ gtk_action_group_add_actions (action_group, popups_entries,
+ G_N_ELEMENTS (popups_entries), ev_window);
+ gtk_ui_manager_insert_action_group (ev_window->priv->ui_manager,
+ action_group, 0);
+
if (!gtk_ui_manager_add_ui_from_file (ev_window->priv->ui_manager,
DATADIR"/evince-ui.xml",
&error)) {
g_signal_connect_object (ev_window->priv->view, "external-link",
G_CALLBACK (view_external_link_cb),
ev_window, 0);
+ g_signal_connect_object (ev_window->priv->view,
+ "popup",
+ G_CALLBACK (view_menu_popup_cb),
+ ev_window, 0);
gtk_widget_show (ev_window->priv->view);
gtk_widget_show (ev_window->priv->password_view);
G_CALLBACK (find_bar_search_changed_cb),
ev_window);
+ /* Popups */
+ ev_window->priv->popup = gtk_ui_manager_get_widget (ev_window->priv->ui_manager,
+ "/DocumentPopup");
+ ev_window->priv->link = NULL;
+
/* Give focus to the document view */
gtk_widget_grab_focus (ev_window->priv->view);