commit a6ce89dd110b604cb4f36e013446237c34a85a8e Author: Joseph Maher Date: Sat Sep 14 22:20:40 2013 -0400 Update Michal 'hramrach' Suchanek's patch from bug 688636 to the current git tree patch: add option to always open a new window when opening a file is requested Committer: Joseph Maher On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) modified: data/evince.1 modified: shell/ev-application.c modified: shell/ev-application.h modified: shell/ev-gdbus.xml modified: shell/ev-window.c modified: shell/ev-window.h modified: shell/main.c diff --git a/data/evince.1 b/data/evince.1 index 9add86a..227ec16 100644 --- a/data/evince.1 +++ b/data/evince.1 @@ -33,6 +33,9 @@ Prints the command line options. \fB\-p, \-\-page\-label=PAGE\fR Open the document on the page with the specified page label (or page number). .TP +\fB\-o, \-\-really\-open\fR +Open new view of the document even if another window showing the document is already open. +.TP \fB\-i, \-\-page\-index=NUMBER\fR Open the document on the page with the specified page index (this is the exact page number, not a page label). .TP diff --git a/shell/ev-application.c b/shell/ev-application.c index 2115596..dadfab1 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -138,7 +138,7 @@ ev_application_load_session (EvApplication *application) ev_application_open_uri_at_dest (application, uri, gdk_screen_get_default (), NULL, 0, NULL, - GDK_CURRENT_TIME); + GDK_CURRENT_TIME, 0); g_free (uri); g_key_file_free (state_file); @@ -351,6 +351,7 @@ typedef struct { EvWindowRunMode mode; gchar *search_string; guint timestamp; + gboolean new_view; } EvRegisterDocData; static void @@ -491,7 +492,7 @@ on_register_uri_cb (GObject *source_object, owner, APPLICATION_DBUS_OBJECT_PATH, APPLICATION_DBUS_INTERFACE, - "Reload", + (data->new_view ? "NewView" : "Reload"), g_variant_builder_end (&builder), NULL, G_DBUS_CALL_FLAGS_NONE, @@ -524,7 +525,8 @@ ev_application_register_uri (EvApplication *application, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, - guint timestamp) + guint timestamp, + gboolean new_view) { EvRegisterDocData *data; @@ -560,6 +562,7 @@ ev_application_register_uri (EvApplication *application, data->mode = mode; data->search_string = search_string ? g_strdup (search_string) : NULL; data->timestamp = timestamp; + data->new_view = new_view; g_dbus_connection_call (g_application_get_dbus_connection (G_APPLICATION (application)), EVINCE_DAEMON_SERVICE, @@ -639,7 +642,6 @@ ev_application_open_uri_in_window (EvApplication *application, if (!gtk_widget_get_realized (GTK_WIDGET (ev_window))) gtk_widget_realize (GTK_WIDGET (ev_window)); - #ifdef GDK_WINDOWING_X11 gdk_window = gtk_widget_get_window (GTK_WIDGET (ev_window)); if (GDK_IS_X11_WINDOW (gdk_window)) { @@ -693,7 +695,8 @@ ev_application_open_uri_at_dest (EvApplication *application, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, - guint timestamp) + guint timestamp, + gboolean new_view) { g_return_if_fail (uri != NULL); @@ -709,7 +712,7 @@ ev_application_open_uri_at_dest (EvApplication *application, /* Register the uri or send Reload to * remote instance if already registered */ - ev_application_register_uri (application, uri, screen, dest, mode, search_string, timestamp); + ev_application_register_uri (application, uri, screen, dest, mode, search_string, timestamp, new_view); #else _ev_application_open_uri_at_dest (application, uri, screen, dest, mode, search_string, timestamp); #endif /* ENABLE_DBUS */ @@ -783,13 +786,16 @@ handle_get_window_list_cb (EvEvinceApplication *object, return TRUE; } -static gboolean -handle_reload_cb (EvEvinceApplication *object, - GDBusMethodInvocation *invocation, - GVariant *args, - guint timestamp, - EvApplication *application) -{ +typedef enum { HDC_RELOAD, HDC_NEWVIEW } hdc_action; + + static void + handle_document_cb (EvEvinceApplication *object, + hdc_action action, + GVariant *args, + guint timestamp, + EvApplication *application) + { + GList *windows, *l; GVariantIter iter; const gchar *key; @@ -800,6 +806,7 @@ handle_reload_cb (EvEvinceApplication *object, EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; const gchar *search_string = NULL; GdkScreen *screen = NULL; + EvWindow *window = NULL; g_variant_iter_init (&iter, args); @@ -832,20 +839,54 @@ handle_reload_cb (EvEvinceApplication *object, for (l = windows; l != NULL; l = g_list_next (l)) { if (!EV_IS_WINDOW (l->data)) continue; + window = EV_WINDOW (l->data); - ev_application_open_uri_in_window (application, NULL, - EV_WINDOW (l->data), - screen, dest, mode, - search_string, - timestamp); + switch (action) { + case HDC_NEWVIEW: + l = NULL; /* exit cycle */ + /* FIXME screen and timestamp discarded here */ + ev_window_new_view(window, dest, mode, search_string); + break; + case HDC_RELOAD: + ev_application_open_uri_in_window (application, NULL, + EV_WINDOW (l->data), + screen, dest, mode, + search_string, + timestamp); + break; + } } if (dest) g_object_unref (dest); +} - ev_evince_application_complete_reload (object, invocation); +static gboolean +handle_reload_cb (EvEvinceApplication *object, + GDBusMethodInvocation *invocation, + GVariant *args, + guint timestamp, + EvApplication *application) +{ + handle_document_cb(object, HDC_RELOAD, args, timestamp, application); - return TRUE; + ev_evince_application_complete_reload (object, invocation); + + return TRUE; +} + +static gboolean +handle_new_view_cb (EvEvinceApplication *object, + GDBusMethodInvocation *invocation, + GVariant *args, + guint timestamp, + EvApplication *application) +{ + handle_document_cb(object, HDC_NEWVIEW, args, timestamp, application); + + ev_evince_application_complete_new_view (object, invocation); + + return TRUE; } #endif /* ENABLE_DBUS */ @@ -860,7 +901,7 @@ ev_application_open_uri_list (EvApplication *application, for (l = uri_list; l != NULL; l = l->next) { ev_application_open_uri_at_dest (application, (char *)l->data, screen, NULL, 0, NULL, - timestamp); + timestamp, 0); } } @@ -1106,6 +1147,9 @@ ev_application_dbus_register (GApplication *gapplication, g_signal_connect (skeleton, "handle-reload", G_CALLBACK (handle_reload_cb), application); + g_signal_connect (skeleton, "handle-new-view", + G_CALLBACK (handle_new_view_cb), + application); application->keys = ev_media_player_keys_new (); return TRUE; diff --git a/shell/ev-application.h b/shell/ev-application.h index 5ec870e..4274b61 100644 --- a/shell/ev-application.h +++ b/shell/ev-application.h @@ -59,7 +59,8 @@ void ev_application_open_uri_at_dest (EvApplication *applicati EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, - guint32 timestamp); + guint32 timestamp, + gboolean new_view); void ev_application_open_uri_list (EvApplication *application, GSList *uri_list, GdkScreen *screen, diff --git a/shell/ev-gdbus.xml b/shell/ev-gdbus.xml index b6b50d1..8392b0f 100644 --- a/shell/ev-gdbus.xml +++ b/shell/ev-gdbus.xml @@ -8,6 +8,10 @@ + + + + diff --git a/shell/ev-window.c b/shell/ev-window.c index f258155..d2d331e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -2530,16 +2530,25 @@ static void ev_window_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) { + ev_window_new_view(window, dest, 0, NULL); +} + +void ev_window_new_view (EvWindow *window, + EvLinkDest *dest, + EvWindowRunMode mode, + const gchar * search_string) +{ EvWindow *new_window = EV_WINDOW (ev_window_new ()); if (window->priv->metadata) new_window->priv->metadata = g_object_ref (window->priv->metadata); ev_window_open_document (new_window, window->priv->document, - dest, 0, NULL); + dest, mode, search_string); gtk_window_present (GTK_WINDOW (new_window)); } + static void ev_window_cmd_file_open_copy (GtkAction *action, EvWindow *window) { @@ -2560,7 +2569,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action, ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, NULL, gtk_get_current_event_time ()); + NULL, 0, NULL, gtk_get_current_event_time (), 0); } static void @@ -2570,7 +2579,7 @@ ev_window_open_recent_action_item_activated (EvOpenRecentAction *action, { ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, NULL, gtk_get_current_event_time ()); + NULL, 0, NULL, gtk_get_current_event_time (), 0); } static void @@ -6632,7 +6641,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action) ev_link_action_get_dest (action), 0, NULL, - gtk_get_current_event_time ()); + gtk_get_current_event_time (), 0); g_free (uri); } diff --git a/shell/ev-window.h b/shell/ev-window.h index fd2d0b5..247ffec 100644 --- a/shell/ev-window.h +++ b/shell/ev-window.h @@ -81,6 +81,10 @@ void ev_window_open_document (EvWindow *ev_window, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string); +void ev_window_new_view (EvWindow *ev_window, + EvLinkDest *dest, + EvWindowRunMode mode, + const gchar *search_string); gboolean ev_window_is_empty (const EvWindow *ev_window); void ev_window_print_range (EvWindow *ev_window, int first_page, diff --git a/shell/main.c b/shell/main.c index c1e756b..ec3f9e9 100644 --- a/shell/main.c +++ b/shell/main.c @@ -54,6 +54,7 @@ static gchar *ev_find_string; static gint ev_page_index = 0; static gchar *ev_named_dest; static gboolean preview_mode = FALSE; +static gboolean really_open = FALSE; static gboolean fullscreen_mode = FALSE; static gboolean presentation_mode = FALSE; static gboolean unlink_temp_file = FALSE; @@ -81,6 +82,7 @@ static const GOptionEntry goption_options[] = { "fullscreen", 'f', 0, G_OPTION_ARG_NONE, &fullscreen_mode, N_("Run evince in fullscreen mode"), NULL }, { "presentation", 's', 0, G_OPTION_ARG_NONE, &presentation_mode, N_("Run evince in presentation mode"), NULL }, { "preview", 'w', 0, G_OPTION_ARG_NONE, &preview_mode, N_("Run evince as a previewer"), NULL }, + { "really-open", 'o', 0, G_OPTION_ARG_NONE, &really_open, N_("Open a new view even if file is already open in evince"), NULL }, { "find", 'l', 0, G_OPTION_ARG_STRING, &ev_find_string, N_("The word or phrase to find in the document"), N_("STRING")}, { "unlink-tempfile", 'u', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &unlink_temp_file, NULL, NULL }, { "print-settings", 't', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, &print_settings, NULL, NULL }, @@ -221,11 +223,9 @@ load_files (const char **files) continue; } - - ev_application_open_uri_at_dest (EV_APP, uri, screen, dest, mode, ev_find_string, - GDK_CURRENT_TIME); + GDK_CURRENT_TIME, really_open); if (dest) g_object_unref (dest);