X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-application.c;h=46001f494207d7cf64d5ae126b7d4afa86a73c38;hb=b2ad055bb54dd89f3e8748302cfbd5c6f746d6a4;hp=8fb487114a10fbeb621600b6bf4d63c94e16f56c;hpb=22f03e75fd3a285e7242d6f74ba8921039c2e632;p=evince.git diff --git a/shell/ev-application.c b/shell/ev-application.c index 8fb48711..46001f49 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -31,7 +31,6 @@ #include "totem-scrsaver.h" #include "eggsmclient.h" -#include "eggdesktopfile.h" #include "ev-application.h" #include "ev-document-factory.h" @@ -47,7 +46,8 @@ #include "ev-application-service.h" #endif -static void ev_application_add_icon_path_for_screen (GdkScreen *screen); +static void ev_application_add_icon_path_for_screen (GdkScreen *screen); +static void ev_application_save_print_settings (EvApplication *application); struct _EvApplication { GObject base_instance; @@ -69,9 +69,8 @@ struct _EvApplication { #endif /* ENABLE_DBUS */ GtkPrintSettings *print_settings; -#if GTK_CHECK_VERSION (2, 11, 0) - gchar *print_settings_file; -#endif + GtkPageSetup *page_setup; + GKeyFile *print_settings_file; }; struct _EvApplicationClass { @@ -82,6 +81,10 @@ G_DEFINE_TYPE (EvApplication, ev_application, G_TYPE_OBJECT); #define APPLICATION_SERVICE_NAME "org.gnome.evince.ApplicationService" +#define EV_PRINT_SETTINGS_FILE "print-settings" +#define EV_PRINT_SETTINGS_GROUP "Print Settings" +#define EV_PAGE_SETUP_GROUP "Page Setup" + #ifdef ENABLE_DBUS gboolean ev_application_register_service (EvApplication *application) @@ -229,8 +232,6 @@ smclient_quit_cb (EggSMClient *client, static void ev_application_init_session (EvApplication *application) { - egg_set_desktop_file (GNOMEDATADIR "/applications/evince.desktop"); - application->smclient = egg_sm_client_get (); g_signal_connect (application->smclient, "save_state", G_CALLBACK (smclient_save_state_cb), @@ -451,7 +452,8 @@ ev_application_open_window (EvApplication *application, } ev_application_add_icon_path_for_screen (screen); - gtk_widget_show (new_window); + if (!GTK_WIDGET_REALIZED (new_window)) + gtk_widget_realize (new_window); if (timestamp <= 0) timestamp = gdk_x11_get_server_time (GTK_WIDGET (new_window)->window); @@ -609,15 +611,16 @@ ev_application_open_uri_at_dest (EvApplication *application, ev_window_open_uri (new_window, uri, dest, mode, search_string, unlink_temp_file, print_settings); - ev_document_fc_mutex_lock (); - gtk_widget_show (GTK_WIDGET (new_window)); - ev_document_fc_mutex_unlock (); + if (!GTK_WIDGET_REALIZED (GTK_WIDGET (new_window))) + gtk_widget_realize (GTK_WIDGET (new_window)); if (timestamp <= 0) timestamp = gdk_x11_get_server_time (GTK_WIDGET (new_window)->window); gdk_x11_window_set_user_time (GTK_WIDGET (new_window)->window, timestamp); - + + ev_document_fc_mutex_lock (); gtk_window_present (GTK_WINDOW (new_window)); + ev_document_fc_mutex_unlock (); } /** @@ -694,32 +697,29 @@ ev_application_shutdown (EvApplication *application) application->toolbars_file = NULL; } -#if GTK_CHECK_VERSION (2, 11, 0) + ev_application_save_print_settings (application); + if (application->print_settings_file) { - if (application->print_settings) { - GError *error = NULL; - - gtk_print_settings_to_file (application->print_settings, - application->print_settings_file, - &error); - if (error) { - g_warning ("%s", error->message); - g_error_free (error); - } - - g_object_unref (application->print_settings); - application->print_settings = NULL; - } - - g_free (application->print_settings_file); + g_key_file_free (application->print_settings_file); application->print_settings_file = NULL; } -#else /* ! GTK 2.11.0 */ + if (application->print_settings) { g_object_unref (application->print_settings); application->print_settings = NULL; } -#endif /* GTK 2.11.0 */ + + if (application->page_setup) { + g_object_unref (application->page_setup); + application->page_setup = NULL; + } + +#ifdef ENABLE_DBUS + if (application->keys) { + g_object_unref (application->keys); + application->keys = NULL; + } +#endif /* ENABLE_DBUS */ g_free (application->last_chooser_uri); g_object_unref (application); @@ -823,13 +823,11 @@ ev_application_get_windows (EvApplication *application) * * Returns: A #EvMediaPlayerKeys. */ -GObject -*ev_application_get_media_keys (EvApplication *application) +GObject * +ev_application_get_media_keys (EvApplication *application) { #ifdef ENABLE_DBUS - if (!application->keys) - return NULL; - return g_object_ref (G_OBJECT (application->keys)); + return G_OBJECT (application->keys); #else return NULL; #endif /* ENABLE_DBUS */ @@ -875,34 +873,83 @@ ev_application_screensaver_disable (EvApplication *application) totem_scrsaver_disable (application->scr_saver); } -GtkPrintSettings * -ev_application_get_print_settings (EvApplication *application) +static GKeyFile * +ev_application_get_print_settings_file (EvApplication *application) { - if (application->print_settings) - return application->print_settings; + gchar *filename; -#if GTK_CHECK_VERSION (2, 11, 0) - if (!application->print_settings_file) { - application->print_settings_file = - g_build_filename (ev_dot_dir (), "print-settings", NULL); - } + if (application->print_settings_file) + return application->print_settings_file; - if (g_file_test (application->print_settings_file, G_FILE_TEST_IS_REGULAR)) { + application->print_settings_file = g_key_file_new (); + + filename = g_build_filename (ev_dot_dir (), EV_PRINT_SETTINGS_FILE, NULL); + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { GError *error = NULL; - - application->print_settings = - gtk_print_settings_new_from_file (application->print_settings_file, &error); - + + 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); - } else { - return application->print_settings; } } -#endif /* GTK 2.11.0 */ + 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; - application->print_settings = gtk_print_settings_new (); + 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_dot_dir (), 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; } @@ -911,14 +958,57 @@ 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); +}