]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-application.c
Fix page-label command line option. Bug #342070.
[evince.git] / shell / ev-application.c
index eed7be8b7cfd5596af9f9452f0a8150f71effc96..381b4e36c8a7788da53e4e4d1264598a97eca08f 100644 (file)
@@ -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 <glib.h>
 #include <glib/gi18n.h>
 
 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;
        }
@@ -169,13 +183,8 @@ ev_application_open_window (EvApplication  *application,
 
        gtk_widget_show (new_window);
        
-#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        gtk_window_present_with_time (GTK_WINDOW (new_window),
                                      timestamp);
-#else
-       gtk_window_present (GTK_WINDOW (new_window));
-#endif
-
        return TRUE;
 }
 
@@ -214,7 +223,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;
                        }
@@ -226,26 +235,24 @@ 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) {
-#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
                gtk_window_present_with_time (GTK_WINDOW (new_window),
                                              timestamp);
-#else
-               gtk_window_present (GTK_WINDOW (new_window));
-#endif 
-               return TRUE;
+               if (dest)
+                       ev_window_goto_dest (new_window, dest);
+
+               return;
        }
 
        new_window = ev_application_get_empty_window (application);
@@ -256,19 +263,31 @@ 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));
 
-#ifdef HAVE_GTK_WINDOW_PRESENT_WITH_TIME
        gtk_window_present_with_time (GTK_WINDOW (new_window),
                                      timestamp);
-#else
-       gtk_window_present (GTK_WINDOW (new_window));
-#endif
+}
 
-       if (page_label != NULL) {
-               ev_window_open_page_label (new_window, page_label);
+gboolean
+ev_application_open_uri (EvApplication  *application,
+                        const char     *uri,
+                        const char     *page_label,
+                        guint           timestamp,
+                        GError        **error)
+{
+       
+       if (page_label && strcmp (page_label, "") != 0) {
+               EvLinkDest *dest;
+               
+               dest = ev_link_dest_new_page_label (page_label);
+
+               ev_application_open_uri_at_dest (application, uri, dest, timestamp);
+               g_object_unref (dest);
+       } else {
+               ev_application_open_uri_at_dest (application, uri, NULL, timestamp);
        }
 
        return TRUE;
@@ -283,9 +302,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);
        }
 }
 
@@ -303,8 +320,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 ();
 }
 
@@ -323,9 +342,12 @@ ev_application_init (EvApplication *ev_application)
        ev_application->toolbars_file = g_build_filename
                        (ev_dot_dir (), "evince_toolbar.xml", NULL);
 
-       if (!egg_toolbars_model_load (ev_application->toolbars_model,
+       egg_toolbars_model_load_names (ev_application->toolbars_model,
+                                      DATADIR "/evince-toolbar.xml");
+
+       if (!egg_toolbars_model_load_toolbars (ev_application->toolbars_model,
                                      ev_application->toolbars_file)) {
-               egg_toolbars_model_load (ev_application->toolbars_model,
+               egg_toolbars_model_load_toolbars (ev_application->toolbars_model,
                                         DATADIR"/evince-toolbar.xml");
        }
 
@@ -372,8 +394,18 @@ EggRecentModel *ev_application_get_recent_model (EvApplication *application)
 
 void ev_application_save_toolbars_model (EvApplication *application)
 {
-        egg_toolbars_model_save (application->toolbars_model,
-                                application->toolbars_file, "1.0");
+        egg_toolbars_model_save_toolbars (application->toolbars_model,
+                                         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;
+}