X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-application.c;h=c0a7ea2ba9c5eac017ff2f4949813649ca846143;hb=43f12175ba221f7c241f0c9cde323c23b8db53e8;hp=9048653f3fd4325a69303c1128c4c7d060ea44ed;hpb=96820f5584e3a27ceebb1b0995c476f7c0953d0b;p=evince.git diff --git a/shell/ev-application.c b/shell/ev-application.c index 9048653f..c0a7ea2b 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #ifdef ENABLE_DBUS @@ -72,12 +73,22 @@ 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 if (request_name_result == DBUS_REQUEST_NAME_REPLY_EXISTS) { return FALSE; @@ -111,11 +122,69 @@ ev_application_get_instance (void) return instance; } +static void +removed_from_session (GnomeClient *client, EvApplication *application) +{ + ev_application_shutdown (application); +} + +static gint +save_session (GnomeClient *client, gint phase, GnomeSaveStyle save_style, gint shutdown, + GnomeInteractStyle interact_style, gint fast, EvApplication *application) +{ + GList *windows, *l; + char **restart_argv; + int argc = 0, k; + + windows = ev_application_get_windows (application); + restart_argv = g_new (char *, g_list_length (windows) + 1); + restart_argv[argc++] = g_strdup ("evince"); + + for (l = windows; l != NULL; l = l->next) { + EvWindow *window = EV_WINDOW (l->data); + restart_argv[argc++] = g_strdup (ev_window_get_uri (window)); + } + + gnome_client_set_restart_command (client, argc, restart_argv); + + for (k = 0; k < argc; k++) { + g_free (restart_argv[k]); + } + + g_list_free (windows); + g_free (restart_argv); + + return TRUE; +} + +static void +init_session (EvApplication *application) +{ + GnomeClient *client; + + client = gnome_master_client (); + + g_signal_connect (client, "save_yourself", + G_CALLBACK (save_session), application); + g_signal_connect (client, "die", + G_CALLBACK (removed_from_session), application); +} + gboolean ev_application_open_window (EvApplication *application, + guint32 timestamp, GError **error) { - gtk_widget_show (ev_window_new ()); + GtkWidget *new_window = ev_window_new (); + + 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; } @@ -124,17 +193,15 @@ static EvWindow * ev_application_get_empty_window (EvApplication *application) { EvWindow *empty_window = NULL; - GList *windows = gtk_window_list_toplevels (); + GList *windows = ev_application_get_windows (application); GList *l; for (l = windows; l != NULL; l = l->next) { - if (EV_IS_WINDOW (l->data)) { - EvWindow *window = EV_WINDOW (l->data); + EvWindow *window = EV_WINDOW (l->data); - if (ev_window_is_empty (window)) { - empty_window = window; - break; - } + if (ev_window_is_empty (window)) { + empty_window = window; + break; } } @@ -157,7 +224,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; } @@ -173,6 +240,7 @@ gboolean ev_application_open_uri (EvApplication *application, const char *uri, const char *page_label, + guint timestamp, GError **error) { EvWindow *new_window; @@ -181,8 +249,12 @@ ev_application_open_uri (EvApplication *application, 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; } @@ -191,10 +263,19 @@ ev_application_open_uri (EvApplication *application, if (new_window == NULL) { new_window = EV_WINDOW (ev_window_new ()); } - + + /* We need to load uri before showing the window, so + we can restore window size without flickering */ ev_window_open_uri (new_window, uri); + 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); @@ -204,12 +285,17 @@ ev_application_open_uri (EvApplication *application, } void -ev_application_open_uri_list (EvApplication *application, GSList *uri_list) +ev_application_open_uri_list (EvApplication *application, + GSList *uri_list, + guint timestamp) { GSList *l; for (l = uri_list; l != NULL; l = l->next) { - ev_application_open_uri (application, (char *)l->data, NULL, NULL); + ev_application_open_uri (application, (char *)l->data, + NULL, + timestamp, + NULL); } } @@ -228,7 +314,9 @@ ev_application_shutdown (EvApplication *application) application->recent_model = NULL; } + g_free (application->last_chooser_uri); g_object_unref (application); + gtk_main_quit (); } @@ -240,28 +328,50 @@ ev_application_class_init (EvApplicationClass *ev_application_class) static void ev_application_init (EvApplication *ev_application) { + init_session (ev_application); + ev_application->toolbars_model = egg_toolbars_model_new (); ev_application->toolbars_file = g_build_filename (ev_dot_dir (), "evince_toolbar.xml", NULL); - if (!g_file_test (ev_application->toolbars_file, G_FILE_TEST_EXISTS)) { + if (!egg_toolbars_model_load (ev_application->toolbars_model, + ev_application->toolbars_file)) { egg_toolbars_model_load (ev_application->toolbars_model, DATADIR"/evince-toolbar.xml"); - } else { - egg_toolbars_model_load (ev_application->toolbars_model, - ev_application->toolbars_file); } egg_toolbars_model_set_flags (ev_application->toolbars_model, 0, EGG_TB_MODEL_NOT_REMOVABLE); ev_application->recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU); + /* FIXME we should add a mime type filter but current eggrecent + has only a varargs style api which does not work well when + the list of mime types is dynamic */ egg_recent_model_set_limit (ev_application->recent_model, 5); egg_recent_model_set_filter_groups (ev_application->recent_model, "Evince", NULL); } +GList * +ev_application_get_windows (EvApplication *application) +{ + GList *l, *toplevels; + GList *windows = NULL; + + toplevels = gtk_window_list_toplevels (); + + for (l = toplevels; l != NULL; l = l->next) { + if (EV_IS_WINDOW (l->data)) { + windows = g_list_append (windows, l->data); + } + } + + g_list_free (toplevels); + + return windows; +} + EggToolbarsModel *ev_application_get_toolbars_model (EvApplication *application) { return application->toolbars_model; @@ -278,4 +388,14 @@ void ev_application_save_toolbars_model (EvApplication *application) application->toolbars_file, "1.0"); } +void ev_application_set_chooser_uri (EvApplication *application, 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; +}