X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-application.c;h=ffa58ee72ee00274cc7f05cead9f7855cd89e5ec;hb=f222d19fbbd936de7f403eb29666b41e3447b48d;hp=1b64c3dbc7701616470dd399faca4dc64cb4fa9e;hpb=30582eef6d8c325d026e7db0301921ddba21dfec;p=evince.git diff --git a/shell/ev-application.c b/shell/ev-application.c index 1b64c3db..ffa58ee7 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -26,8 +26,8 @@ #include "ev-application.h" #include "ev-utils.h" -#include "ev-document-types.h" #include "ev-file-helpers.h" +#include "ev-document-factory.h" #include #include @@ -46,20 +46,22 @@ G_DEFINE_TYPE (EvApplication, ev_application, G_TYPE_OBJECT); -#define EV_APPLICATION_GET_PRIVATE(object) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_APPLICATION, EvApplicationPrivate)) - #define APPLICATION_SERVICE_NAME "org.gnome.evince.ApplicationService" #ifdef ENABLE_DBUS gboolean ev_application_register_service (EvApplication *application) { - DBusGConnection *connection; + static DBusGConnection *connection = NULL; DBusGProxy *driver_proxy; GError *err = NULL; guint request_name_result; + if (connection) { + g_warning ("Service already registered."); + return FALSE; + } + connection = dbus_g_bus_get (DBUS_BUS_STARTER, &err); if (connection == NULL) { g_warning ("Service registration failed."); @@ -73,13 +75,25 @@ ev_application_register_service (EvApplication *application) DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); +#if DBUS_VERSION >= 60 if (!org_freedesktop_DBus_request_name (driver_proxy, APPLICATION_SERVICE_NAME, + DBUS_NAME_FLAG_DO_NOT_QUEUE, + &request_name_result, &err)) { + g_warning ("Service registration failed."); + g_clear_error (&err); + } +#else + if (!org_freedesktop_DBus_request_name (driver_proxy, + APPLICATION_SERVICE_NAME, 0, &request_name_result, &err)) { g_warning ("Service registration failed."); g_clear_error (&err); } +#endif + g_object_unref (driver_proxy); + if (request_name_result == DBUS_REQUEST_NAME_REPLY_EXISTS) { return FALSE; } @@ -91,9 +105,6 @@ ev_application_register_service (EvApplication *application) dbus_g_object_type_install_info (EV_TYPE_APPLICATION, &dbus_glib_ev_application_object_info); #endif -#ifdef ENABLE_COMICS - GtkFileFilter *comics_filter; -#endif dbus_g_connection_register_g_object (connection, "/org/gnome/evince/Evince", @@ -178,7 +189,6 @@ ev_application_open_window (EvApplication *application, #else gtk_window_present (GTK_WINDOW (new_window)); #endif - return TRUE; } @@ -217,7 +227,7 @@ ev_application_get_uri_window (EvApplication *application, const char *uri) EvWindow *window = EV_WINDOW (l->data); const char *window_uri = ev_window_get_uri (window); - if (window_uri && strcmp (window_uri, uri) == 0) { + if (window_uri && strcmp (window_uri, uri) == 0 && !ev_window_is_empty (window)) { uri_window = window; break; } @@ -229,16 +239,15 @@ ev_application_get_uri_window (EvApplication *application, const char *uri) return uri_window; } -gboolean -ev_application_open_uri (EvApplication *application, - const char *uri, - const char *page_label, - guint timestamp, - GError **error) +void +ev_application_open_uri_at_dest (EvApplication *application, + const char *uri, + EvLinkDest *dest, + guint timestamp) { EvWindow *new_window; - g_return_val_if_fail (uri != NULL, FALSE); + g_return_if_fail (uri != NULL); new_window = ev_application_get_uri_window (application, uri); if (new_window != NULL) { @@ -247,8 +256,11 @@ ev_application_open_uri (EvApplication *application, timestamp); #else gtk_window_present (GTK_WINDOW (new_window)); -#endif - return TRUE; +#endif + if (dest) + ev_window_goto_dest (new_window, dest); + + return; } new_window = ev_application_get_empty_window (application); @@ -259,7 +271,7 @@ ev_application_open_uri (EvApplication *application, /* We need to load uri before showing the window, so we can restore window size without flickering */ - ev_window_open_uri (new_window, uri); + ev_window_open_uri (new_window, uri, dest); gtk_widget_show (GTK_WIDGET (new_window)); @@ -269,9 +281,22 @@ ev_application_open_uri (EvApplication *application, #else gtk_window_present (GTK_WINDOW (new_window)); #endif +} + +gboolean +ev_application_open_uri (EvApplication *application, + const char *uri, + const char *page_label, + guint timestamp, + GError **error) +{ + ev_application_open_uri_at_dest (application, uri, NULL, timestamp); + + if (page_label && strcmp (page_label, "") != 0) { + EvWindow *window; - if (page_label != NULL) { - ev_window_open_page_label (new_window, page_label); + window = ev_application_get_uri_window (application, uri); + ev_window_open_page_label (window, page_label); } return TRUE; @@ -286,9 +311,7 @@ ev_application_open_uri_list (EvApplication *application, for (l = uri_list; l != NULL; l = l->next) { ev_application_open_uri (application, (char *)l->data, - NULL, - timestamp, - NULL); + NULL, timestamp, NULL); } } @@ -306,8 +329,10 @@ ev_application_shutdown (EvApplication *application) g_object_unref (application->recent_model); application->recent_model = NULL; } - + + g_free (application->last_chooser_uri); g_object_unref (application); + gtk_main_quit (); } @@ -379,4 +404,14 @@ void ev_application_save_toolbars_model (EvApplication *application) application->toolbars_file, "1.0"); } +void ev_application_set_chooser_uri (EvApplication *application, const gchar *uri) +{ + g_free (application->last_chooser_uri); + application->last_chooser_uri = g_strdup (uri); +} + +const gchar* ev_application_get_chooser_uri (EvApplication *application) +{ + return application->last_chooser_uri; +}