X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-application.c;h=3a099f3218170b4cb553fc2c351b27bc5a38656a;hb=cdba8578739fd46880c53fdacc66c58b38278506;hp=fd43c881eb65bfc984065dc3d70f253143b27270;hpb=2611a8f2b7a04116d9e50dece68115495f31a66e;p=evince.git diff --git a/shell/ev-application.c b/shell/ev-application.c index fd43c881..3a099f32 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -22,6 +22,7 @@ #include +#include #include #include @@ -31,11 +32,11 @@ #include "totem-scrsaver.h" #include "eggsmclient.h" -#include "eggdesktopfile.h" #include "ev-application.h" #include "ev-document-factory.h" #include "ev-file-helpers.h" +#include "ev-metadata-manager.h" #include "ev-utils.h" #ifdef ENABLE_DBUS @@ -47,13 +48,14 @@ #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; + gchar *dot_dir; gchar *accel_map_file; - gchar *toolbars_file; EggToolbarsModel *toolbars_model; @@ -69,19 +71,24 @@ 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 { GObjectClass base_class; }; +static EvApplication *instance; + 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) @@ -130,7 +137,9 @@ ev_application_register_service (EvApplication *application) G_OBJECT (application)); application->scr_saver = totem_scrsaver_new (connection); - + + ev_metadata_manager_init (); + return TRUE; } #endif /* ENABLE_DBUS */ @@ -145,8 +154,6 @@ ev_application_register_service (EvApplication *application) EvApplication * ev_application_get_instance (void) { - static EvApplication *instance; - if (!instance) { instance = EV_APPLICATION (g_object_new (EV_TYPE_APPLICATION, NULL)); } @@ -229,8 +236,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), @@ -454,11 +459,15 @@ ev_application_open_window (EvApplication *application, if (!GTK_WIDGET_REALIZED (new_window)) gtk_widget_realize (new_window); +#ifdef GDK_WINDOWING_X11 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); gtk_window_present (GTK_WINDOW (new_window)); +#else + gtk_window_present_with_time (GTK_WINDOW (new_window), timestamp); +#endif /* GDK_WINDOWING_X11 */ return TRUE; } @@ -613,6 +622,7 @@ ev_application_open_uri_at_dest (EvApplication *application, if (!GTK_WIDGET_REALIZED (GTK_WIDGET (new_window))) gtk_widget_realize (GTK_WIDGET (new_window)); +#ifdef GDK_WINDOWING_X11 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); @@ -620,6 +630,11 @@ ev_application_open_uri_at_dest (EvApplication *application, ev_document_fc_mutex_lock (); gtk_window_present (GTK_WINDOW (new_window)); ev_document_fc_mutex_unlock (); +#else + ev_document_fc_mutex_lock (); + gtk_window_present_with_time (GTK_WINDOW (new_window), timestamp); + ev_document_fc_mutex_unlock (); +#endif /* GDK_WINDOWING_X11 */ } /** @@ -696,35 +711,39 @@ 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 */ + ev_metadata_manager_shutdown (); + + g_free (application->dot_dir); + application->dot_dir = NULL; g_free (application->last_chooser_uri); + application->last_chooser_uri = NULL; + g_object_unref (application); + instance = NULL; gtk_main_quit (); } @@ -742,6 +761,15 @@ ev_application_init (EvApplication *ev_application) ev_application_init_session (ev_application); + ev_application->dot_dir = g_build_filename (g_get_home_dir (), + ".gnome2", + "evince", + NULL); + + /* FIXME: why make this fatal? */ + if (!ev_dir_ensure_exists (ev_application->dot_dir, 0700)) + exit (1); + home_dir = g_get_home_dir (); if (home_dir) { ev_application->accel_map_file = g_build_filename (home_dir, @@ -755,7 +783,7 @@ ev_application_init (EvApplication *ev_application) ev_application->toolbars_model = egg_toolbars_model_new (); ev_application->toolbars_file = g_build_filename - (ev_dot_dir (), "evince_toolbar.xml", NULL); + (ev_application->dot_dir, "evince_toolbar.xml", NULL); egg_toolbars_model_load_names (ev_application->toolbars_model, DATADIR "/evince-toolbar.xml"); @@ -825,13 +853,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 */ @@ -877,34 +903,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_application_get_dot_dir (application), 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; + + 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; - application->print_settings = gtk_print_settings_new (); + 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; } @@ -913,14 +988,63 @@ 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); +} + +const gchar * +ev_application_get_dot_dir (EvApplication *application) +{ + return application->dot_dir; +}