X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-application.c;h=5a870148fd3c4352fc9e984cc8c5081598987433;hb=761de5f5ba44cc94c98adf2b68809ea453d6bdfa;hp=d8aff98be235fdbc498accaa38d496cb302a182b;hpb=9e737159821cbf89d0311df1708892897410c4dd;p=evince.git diff --git a/shell/ev-application.c b/shell/ev-application.c index d8aff98b..5a870148 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -27,10 +27,12 @@ #include #include +#include #include #ifdef GDK_WINDOWING_X11 #include #endif +#include #include "totem-scrsaver.h" @@ -39,9 +41,7 @@ #endif #include "ev-application.h" -#include "ev-document-factory.h" #include "ev-file-helpers.h" -#include "ev-utils.h" #include "ev-stock-icons.h" #ifdef ENABLE_DBUS @@ -58,26 +58,19 @@ static gboolean ev_application_open_uri (EvApplication *application, #include "ev-application-service.h" #endif -static void ev_application_save_print_settings (EvApplication *application); - struct _EvApplication { GObject base_instance; - EvWindow *window; - gchar *uri; + gchar *uri; gchar *dot_dir; gchar *data_dir; - gchar *accel_map_file; - gchar *toolbars_file; #ifdef ENABLE_DBUS DBusGConnection *connection; EvMediaPlayerKeys *keys; #endif - EggToolbarsModel *toolbars_model; - TotemScrsaver *scr_saver; #ifdef WITH_SMCLIENT @@ -86,10 +79,6 @@ struct _EvApplication { gchar *filechooser_open_uri; gchar *filechooser_save_uri; - - GtkPrintSettings *print_settings; - GtkPageSetup *page_setup; - GKeyFile *print_settings_file; }; struct _EvApplicationClass { @@ -105,10 +94,6 @@ G_DEFINE_TYPE (EvApplication, ev_application, G_TYPE_OBJECT); #define APPLICATION_DBUS_INTERFACE "org.gnome.evince.Application" #endif -#define EV_PRINT_SETTINGS_FILE "print-settings" -#define EV_PRINT_SETTINGS_GROUP "Print Settings" -#define EV_PAGE_SETUP_GROUP "Page Setup" - /** * ev_application_get_instance: * @@ -423,7 +408,17 @@ ev_spawn (const char *uri, gboolean res; GError *error = NULL; +#ifdef G_OS_WIN32 +{ + gchar *dir; + + dir = g_win32_get_package_installation_directory_of_module (NULL); + argv[arg++] = g_build_filename (dir, "bin", "evince", NULL); + g_free (dir); +} +#else argv[arg++] = g_build_filename (BINDIR, "evince", NULL); +#endif /* Page label */ if (dest) { @@ -472,6 +467,49 @@ ev_spawn (const char *uri, } } +static 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; +} + +static EvWindow * +ev_application_get_empty_window (EvApplication *application, + GdkScreen *screen) +{ + EvWindow *empty_window = NULL; + GList *windows = ev_application_get_windows (application); + GList *l; + + for (l = windows; l != NULL; l = l->next) { + EvWindow *window = EV_WINDOW (l->data); + + if (ev_window_is_empty (window) && + gtk_window_get_screen (GTK_WINDOW (window)) == screen) { + empty_window = window; + break; + } + } + + g_list_free (windows); + + return empty_window; +} + + #ifdef ENABLE_DBUS static gboolean ev_application_register_uri (EvApplication *application, @@ -565,14 +603,13 @@ ev_application_unregister_uri (EvApplication *application, static void ev_application_open_uri_in_window (EvApplication *application, const char *uri, + EvWindow *ev_window, GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, const gchar *search_string, guint timestamp) { - EvWindow *ev_window = application->window; - if (screen) { ev_stock_icons_set_screen (screen); gtk_window_set_screen (GTK_WINDOW (ev_window), screen); @@ -618,14 +655,14 @@ ev_application_open_uri_at_dest (EvApplication *application, const gchar *search_string, guint timestamp) { + EvWindow *ev_window; + g_return_if_fail (uri != NULL); - if (application->window && !ev_window_is_empty (application->window)) { - if (application->uri && strcmp (application->uri, uri) != 0) { - /* spawn a new evince process */ - ev_spawn (uri, screen, dest, mode, search_string, timestamp); - return; - } + if (application->uri && strcmp (application->uri, uri) != 0) { + /* spawn a new evince process */ + ev_spawn (uri, screen, dest, mode, search_string, timestamp); + return; } else { #ifdef ENABLE_DBUS GHashTable *args = build_args (screen, dest, mode, search_string); @@ -640,13 +677,14 @@ ev_application_open_uri_at_dest (EvApplication *application, return; #endif /* ENABLE_DBUS */ - if (!application->window) - application->window = EV_WINDOW (ev_window_new ()); + ev_window = ev_application_get_empty_window (application, screen); + if (!ev_window) + ev_window = EV_WINDOW (ev_window_new ()); } application->uri = g_strdup (uri); - ev_application_open_uri_in_window (application, uri, + ev_application_open_uri_in_window (application, uri, ev_window, screen, dest, mode, search_string, timestamp); @@ -666,8 +704,6 @@ ev_application_open_window (EvApplication *application, { GtkWidget *new_window = ev_window_new (); - application->window = EV_WINDOW (new_window); - if (screen) { ev_stock_icons_set_screen (screen); gtk_window_set_screen (GTK_WINDOW (new_window), screen); @@ -702,12 +738,13 @@ ev_application_open_uri (EvApplication *application, guint timestamp, GError **error) { + GList *windows, *l; EvLinkDest *dest = NULL; EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; const gchar *search_string = NULL; GdkScreen *screen = NULL; - g_assert (application->window != NULL); + g_assert (application->uri != NULL); /* FIXME: we don't need uri anymore, * maybe this method should be renamed @@ -726,10 +763,16 @@ ev_application_open_uri (EvApplication *application, search_string = get_find_string_from_args (args); } - ev_application_open_uri_in_window (application, uri, - screen, dest, mode, - search_string, - timestamp); + windows = ev_application_get_windows (application); + for (l = windows; l != NULL; l = g_list_next (l)) { + EvWindow *ev_window = EV_WINDOW (l->data); + + ev_application_open_uri_in_window (application, uri, ev_window, + screen, dest, mode, + search_string, + timestamp); + } + g_list_free (windows); if (dest) g_object_unref (dest); @@ -752,6 +795,50 @@ ev_application_open_uri_list (EvApplication *application, } } +static void +ev_application_accel_map_save (EvApplication *application) +{ + gchar *accel_map_file; + gchar *tmp_filename; + gint fd; + + accel_map_file = g_build_filename (g_get_home_dir (), + ".gnome2", "accels", + "evince", NULL); + + tmp_filename = g_strdup_printf ("%s.XXXXXX", accel_map_file); + + fd = g_mkstemp (tmp_filename); + if (fd == -1) { + g_free (accel_map_file); + g_free (tmp_filename); + + return; + } + gtk_accel_map_save_fd (fd); + close (fd); + + if (g_rename (tmp_filename, accel_map_file) == -1) { + /* FIXME: win32? */ + g_unlink (tmp_filename); + } + + g_free (accel_map_file); + g_free (tmp_filename); +} + +static void +ev_application_accel_map_load (EvApplication *application) +{ + gchar *accel_map_file; + + accel_map_file = g_build_filename (g_get_home_dir (), + ".gnome2", "accels", + "evince", NULL); + gtk_accel_map_load (accel_map_file); + g_free (accel_map_file); +} + void ev_application_shutdown (EvApplication *application) { @@ -764,35 +851,10 @@ ev_application_shutdown (EvApplication *application) application->uri = NULL; } - if (application->accel_map_file) { - gtk_accel_map_save (application->accel_map_file); - g_free (application->accel_map_file); - application->accel_map_file = NULL; - } - - if (application->toolbars_model) { - g_object_unref (application->toolbars_model); - g_free (application->toolbars_file); - application->toolbars_model = NULL; - application->toolbars_file = NULL; - } + ev_application_accel_map_save (application); - ev_application_save_print_settings (application); - - if (application->print_settings_file) { - g_key_file_free (application->print_settings_file); - application->print_settings_file = NULL; - } - - if (application->print_settings) { - g_object_unref (application->print_settings); - application->print_settings = NULL; - } - - if (application->page_setup) { - g_object_unref (application->page_setup); - application->page_setup = NULL; - } + g_object_unref (application->scr_saver); + application->scr_saver = NULL; #ifdef ENABLE_DBUS if (application->keys) { @@ -828,9 +890,6 @@ ev_application_class_init (EvApplicationClass *ev_application_class) static void ev_application_init (EvApplication *ev_application) { - gint i; - const gchar *home_dir; - gchar *toolbar_path; GError *error = NULL; ev_application->dot_dir = g_build_filename (g_get_home_dir (), @@ -838,10 +897,6 @@ ev_application_init (EvApplication *ev_application) "evince", NULL); - /* FIXME: why make this fatal? */ - if (!ev_dir_ensure_exists (ev_application->dot_dir, 0700)) - exit (1); - #ifdef G_OS_WIN32 { gchar *dir; @@ -856,51 +911,9 @@ ev_application_init (EvApplication *ev_application) ev_application_init_session (ev_application); - home_dir = g_get_home_dir (); - if (home_dir) { - ev_application->accel_map_file = g_build_filename (home_dir, - ".gnome2", - "accels", - "evince", - NULL); - gtk_accel_map_load (ev_application->accel_map_file); - } - - ev_application->toolbars_model = egg_toolbars_model_new (); - - ev_application->toolbars_file = g_build_filename - (ev_application->dot_dir, "evince_toolbar.xml", NULL); - - toolbar_path = g_build_filename (ev_application->data_dir, - "evince-toolbar.xml", NULL); - egg_toolbars_model_load_names (ev_application->toolbars_model, - toolbar_path); - - if (!egg_toolbars_model_load_toolbars (ev_application->toolbars_model, - ev_application->toolbars_file)) { - egg_toolbars_model_load_toolbars (ev_application->toolbars_model, - toolbar_path); - } - g_free (toolbar_path); + ev_application_accel_map_load (ev_application); - /* Open item doesn't exist anymore, - * convert it to OpenRecent for compatibility - */ - for (i = 0; i < egg_toolbars_model_n_items (ev_application->toolbars_model, 0); i++) { - const gchar *item; - - item = egg_toolbars_model_item_nth (ev_application->toolbars_model, 0, i); - if (g_ascii_strcasecmp (item, "FileOpen") == 0) { - egg_toolbars_model_remove_item (ev_application->toolbars_model, 0, i); - egg_toolbars_model_add_item (ev_application->toolbars_model, 0, i, - "FileOpenRecent"); - ev_application_save_toolbars_model (ev_application); - break; - } - } - - egg_toolbars_model_set_flags (ev_application->toolbars_model, 0, - EGG_TB_MODEL_NOT_REMOVABLE); + ev_application->scr_saver = totem_scrsaver_new (); #ifdef ENABLE_DBUS ev_application->connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error); @@ -908,7 +921,6 @@ ev_application_init (EvApplication *ev_application) dbus_g_connection_register_g_object (ev_application->connection, APPLICATION_DBUS_OBJECT_PATH, G_OBJECT (ev_application)); - ev_application->scr_saver = totem_scrsaver_new (ev_application->connection); } else { g_warning ("Error connection to DBus: %s\n", error->message); g_error_free (error); @@ -920,7 +932,12 @@ ev_application_init (EvApplication *ev_application) gboolean ev_application_has_window (EvApplication *application) { - return application->window != NULL; + GList *windows = ev_application_get_windows (application); + gboolean retval = windows != NULL; + + g_list_free (windows); + + return retval; } const gchar * @@ -947,19 +964,6 @@ ev_application_get_media_keys (EvApplication *application) #endif /* ENABLE_DBUS */ } -EggToolbarsModel * -ev_application_get_toolbars_model (EvApplication *application) -{ - return application->toolbars_model; -} - -void -ev_application_save_toolbars_model (EvApplication *application) -{ - egg_toolbars_model_save_toolbars (application->toolbars_model, - application->toolbars_file, "1.0"); -} - void ev_application_set_filechooser_uri (EvApplication *application, GtkFileChooserAction action, @@ -992,160 +996,22 @@ ev_application_get_filechooser_uri (EvApplication *application, void ev_application_screensaver_enable (EvApplication *application) { - if (application->scr_saver) - totem_scrsaver_enable (application->scr_saver); + totem_scrsaver_enable (application->scr_saver); } void ev_application_screensaver_disable (EvApplication *application) { - if (application->scr_saver) - totem_scrsaver_disable (application->scr_saver); -} - -static GKeyFile * -ev_application_get_print_settings_file (EvApplication *application) -{ - gchar *filename; - - if (application->print_settings_file) - return application->print_settings_file; - - application->print_settings_file = g_key_file_new (); - - filename = g_build_filename (ev_application_get_dot_dir (application), EV_PRINT_SETTINGS_FILE, NULL); - if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { - GError *error = NULL; - - g_key_file_load_from_file (application->print_settings_file, - filename, - G_KEY_FILE_KEEP_COMMENTS | - G_KEY_FILE_KEEP_TRANSLATIONS, - &error); - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } - } - g_free (filename); - - return application->print_settings_file; -} - -static void -ev_application_save_print_settings (EvApplication *application) -{ - GKeyFile *key_file; - gchar *filename; - gchar *data; - gssize data_length; - GError *error = NULL; - - if (!application->print_settings && !application->page_setup) - return; - - key_file = ev_application_get_print_settings_file (application); - if (application->print_settings) - gtk_print_settings_to_key_file (application->print_settings, - key_file, - EV_PRINT_SETTINGS_GROUP); - if (application->page_setup) - gtk_page_setup_to_key_file (application->page_setup, - key_file, - EV_PAGE_SETUP_GROUP); - - filename = g_build_filename (ev_application_get_dot_dir (application), EV_PRINT_SETTINGS_FILE, NULL); - data = g_key_file_to_data (key_file, (gsize *)&data_length, NULL); - g_file_set_contents (filename, data, data_length, &error); - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } - g_free (data); - g_free (filename); -} - -GtkPrintSettings * -ev_application_get_print_settings (EvApplication *application) -{ - GKeyFile *key_file; - GtkPrintSettings *print_settings; - - if (application->print_settings) - return application->print_settings; - - key_file = ev_application_get_print_settings_file (application); - print_settings = g_key_file_has_group (key_file, EV_PRINT_SETTINGS_GROUP) ? - gtk_print_settings_new_from_key_file (key_file, EV_PRINT_SETTINGS_GROUP, NULL) : - gtk_print_settings_new (); - - application->print_settings = print_settings ? print_settings : gtk_print_settings_new (); - - return application->print_settings; -} - -void -ev_application_set_print_settings (EvApplication *application, - GtkPrintSettings *settings) -{ - GKeyFile *key_file; - - g_return_if_fail (GTK_IS_PRINT_SETTINGS (settings)); - - if (settings == application->print_settings) - return; - - key_file = ev_application_get_print_settings_file (application); - - if (application->print_settings) - g_object_unref (application->print_settings); - - application->print_settings = g_object_ref (settings); - gtk_print_settings_to_key_file (settings, key_file, EV_PRINT_SETTINGS_GROUP); -} - -GtkPageSetup * -ev_application_get_page_setup (EvApplication *application) -{ - GKeyFile *key_file; - GtkPageSetup *page_setup; - - if (application->page_setup) - return application->page_setup; - - key_file = ev_application_get_print_settings_file (application); - page_setup = g_key_file_has_group (key_file, EV_PAGE_SETUP_GROUP) ? - gtk_page_setup_new_from_key_file (key_file, EV_PAGE_SETUP_GROUP, NULL) : - gtk_page_setup_new (); - - application->page_setup = page_setup ? page_setup : gtk_page_setup_new (); - - return application->page_setup; -} - -void -ev_application_set_page_setup (EvApplication *application, - GtkPageSetup *page_setup) -{ - GKeyFile *key_file; - - g_return_if_fail (GTK_IS_PAGE_SETUP (page_setup)); - - if (page_setup == application->page_setup) - return; - - key_file = ev_application_get_print_settings_file (application); - - if (application->page_setup) - g_object_unref (application->page_setup); - - application->page_setup = g_object_ref (page_setup); - gtk_page_setup_to_key_file (page_setup, key_file, EV_PAGE_SETUP_GROUP); + totem_scrsaver_disable (application->scr_saver); } const gchar * -ev_application_get_dot_dir (EvApplication *application) +ev_application_get_dot_dir (EvApplication *application, + gboolean create) { + if (create) + g_mkdir_with_parents (application->dot_dir, 0700); + return application->dot_dir; }