X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-window.c;h=e45d485608e509ddd3612280ab0dad8d41f13237;hb=bf325e9279324f02bcadc0145cd553ed94c23d2d;hp=ec17680d18e50ec0c3e12cf8badbc2aec369f759;hpb=a5c289563df30337b5321e72ddfc48c5f905a3ac;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index ec17680d..e45d4856 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -39,6 +39,7 @@ #include "ev-print-job.h" #include "ev-document-thumbnails.h" #include "ev-document-links.h" +#include "ev-document-types.h" #include "ev-document-find.h" #include "ev-document-security.h" #include "ev-job-queue.h" @@ -47,16 +48,6 @@ #include "egg-recent-view.h" #include "egg-recent-model.h" -#include "ev-poppler.h" -#include "pixbuf-document.h" -#include "ps-document.h" -#ifdef ENABLE_DVI -#include "dvi-document.h" -#endif -#ifdef ENABLE_DJVU -#include "djvu-document.h" -#endif - #include #include #include @@ -101,7 +92,6 @@ struct _EvWindowPrivate { GtkWidget *toolbar; GtkWidget *hpaned; GtkWidget *sidebar; - GtkWidget *thumbs_sidebar; GtkWidget *find_bar; GtkWidget *scrolled_window; GtkWidget *view; @@ -135,7 +125,7 @@ struct _EvWindowPrivate { EggRecentViewGtk *recent_view; }; -static GtkTargetEntry ev_drop_types[] = { +static const GtkTargetEntry ev_drop_types[] = { { "text/uri-list", 0, 0 } }; @@ -166,6 +156,7 @@ static void ev_window_set_sizing_mode (EvWindow *ev_window, EvSizingMode sizing_mode); static void ev_window_add_recent (EvWindow *window, const char *filename); +static void ev_window_fullscreen (EvWindow *window); G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -398,44 +389,6 @@ unable_to_load (EvWindow *ev_window, gtk_widget_destroy (dialog); } -/* Would be nice to have this in gdk-pixbuf */ -static gboolean -mime_type_supported_by_gdk_pixbuf (const gchar *mime_type) -{ - GSList *formats, *list; - gboolean retval = FALSE; - - formats = gdk_pixbuf_get_formats (); - - list = formats; - while (list) { - GdkPixbufFormat *format = list->data; - int i; - gchar **mime_types; - - if (gdk_pixbuf_format_is_disabled (format)) - continue; - - mime_types = gdk_pixbuf_format_get_mime_types (format); - - for (i = 0; mime_types[i] != NULL; i++) { - if (strcmp (mime_types[i], mime_type) == 0) { - retval = TRUE; - break; - } - } - - if (retval) - break; - - list = list->next; - } - - g_slist_free (formats); - - return retval; -} - static void update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_window) { @@ -495,21 +448,6 @@ update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_windo g_free (title); } -static void -hide_sidebar_and_actions (EvWindow *ev_window) -{ - GtkAction *action; - /* Alsthough we update the hiddenness of the sidebar, we don't want to - * store the value */ - g_signal_handlers_disconnect_by_func (ev_window->priv->sidebar, - ev_window_sidebar_visibility_changed_cb, - ev_window); - gtk_widget_hide (ev_window->priv->sidebar); - action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar"); - gtk_action_set_sensitive (action, FALSE); - -} - static void find_changed_cb (EvDocument *document, int page, EvWindow *ev_window) { @@ -524,9 +462,18 @@ page_changed_cb (EvPageCache *page_cache, update_action_sensitivity (ev_window); } +static void +update_document_mode (EvWindow *window, EvDocumentMode mode) +{ + if (mode == EV_DOCUMENT_MODE_FULL_SCREEN) { + gtk_window_fullscreen (GTK_WINDOW (window)); + } +} + static void ev_window_setup_document (EvWindow *ev_window) { + EvDocumentInfo *info; EvDocument *document; EvView *view = EV_VIEW (ev_window->priv->view); EvSidebar *sidebar = EV_SIDEBAR (ev_window->priv->sidebar); @@ -549,10 +496,7 @@ ev_window_setup_document (EvWindow *ev_window) ev_window_set_page_mode (ev_window, PAGE_MODE_SINGLE_PAGE); - if (ev_sidebar_supports_document (sidebar, document)) - ev_sidebar_set_document (sidebar, document); - else - hide_sidebar_and_actions (ev_window); + ev_sidebar_set_document (sidebar, document); if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) { ev_view_set_document (view, document); @@ -562,6 +506,10 @@ ev_window_setup_document (EvWindow *ev_window) action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION); ev_page_action_set_document (EV_PAGE_ACTION (action), document); update_action_sensitivity (ev_window); + + info = ev_document_get_info (document); + update_document_mode (ev_window, info->mode); + g_free (info); } static void @@ -577,10 +525,10 @@ password_dialog_response (GtkWidget *password_dialog, password = ev_password_dialog_get_password (password_dialog); if (password) { - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); ev_document_security_set_password (EV_DOCUMENT_SECURITY (ev_window->priv->password_document), password); - g_mutex_unlock (EV_DOC_MUTEX); + ev_document_doc_mutex_unlock (); } g_free (password); @@ -709,33 +657,6 @@ start_loading_document (EvWindow *ev_window, return FALSE; } -static gboolean -is_file_supported (const gchar *mime_type) -{ - static char *supported_types [] = { - "application/pdf", - "application/postscript", - "application/x-dvi", - "image/vnd.djvu", - "application/x-gzpostscript", - "image/x-eps", - NULL - }; - gint i; - - g_return_val_if_fail (mime_type != NULL, FALSE); - - if (mime_type_supported_by_gdk_pixbuf (mime_type)) - return TRUE; - - for (i = 0; supported_types[i] != NULL; i++) { - if (g_ascii_strcasecmp (mime_type, supported_types[i]) == 0) - return TRUE; - } - - return FALSE; -} - void ev_window_open (EvWindow *ev_window, const char *uri) { @@ -749,22 +670,13 @@ ev_window_open (EvWindow *ev_window, const char *uri) if (mime_type == NULL) document = NULL; - else if (!strcmp (mime_type, "application/pdf")) - document = g_object_new (PDF_TYPE_DOCUMENT, NULL); - else if (!strcmp (mime_type, "application/postscript") || - !strcmp (mime_type, "application/x-gzpostscript") || - !strcmp (mime_type, "image/x-eps")) - document = g_object_new (PS_TYPE_DOCUMENT, NULL); -#ifdef ENABLE_DJVU - else if (!strcmp (mime_type, "image/vnd.djvu")) - document = g_object_new (DJVU_TYPE_DOCUMENT, NULL); -#endif - else if (mime_type_supported_by_gdk_pixbuf (mime_type)) - document = g_object_new (PIXBUF_TYPE_DOCUMENT, NULL); -#ifdef ENABLE_DVI - else if (!strcmp (mime_type, "application/x-dvi")) - document = g_object_new (DVI_TYPE_DOCUMENT, NULL); -#endif + else { + GType document_type = ev_document_type_lookup (mime_type); + + if (document_type!=G_TYPE_INVALID) { + document = g_object_new (document_type, NULL); + } + } if (document) { start_loading_document (ev_window, document, uri); @@ -797,7 +709,7 @@ ev_window_open_uri_list (EvWindow *ev_window, GList *uri_list) uri = gnome_vfs_uri_to_string (list->data, GNOME_VFS_URI_HIDE_NONE); mime_type = gnome_vfs_get_mime_type (uri); - if (is_file_supported (mime_type)) { + if (ev_document_type_lookup (mime_type)!=G_TYPE_INVALID) { if (ev_window_is_empty (EV_WINDOW (ev_window))) { ev_window_open (ev_window, uri); @@ -994,9 +906,9 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) continue; */ - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); success = ev_document_save (ev_window->priv->document, uri, NULL); - g_mutex_unlock (EV_DOC_MUTEX); + ev_document_doc_mutex_unlock (); if (success) break; @@ -1459,22 +1371,29 @@ ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window) } static gboolean -ev_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, EvWindow *window) +ev_window_state_event (GtkWidget *widget, GdkEventWindowState *event) { - if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) - { + EvWindow *window = EV_WINDOW (widget); + + if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) { + gboolean show; + + show = (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) == 0; + + gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (window->priv->statusbar), + show); + } + + if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { GtkActionGroup *action_group; GtkAction *action; gboolean fullscreen; fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; - if (fullscreen) - { + if (fullscreen) { ev_window_fullscreen (window); - } - else - { + } else { ev_window_unfullscreen (window); } @@ -1486,7 +1405,6 @@ ev_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, EvWindo gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen); g_signal_handlers_unblock_by_func (action, G_CALLBACK (ev_window_cmd_view_fullscreen), window); - } return FALSE; @@ -2007,16 +1925,16 @@ find_bar_search_changed_cb (EggFindBar *find_bar, if (ev_window->priv->document && EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { if (visible && search_string && search_string[0]) { - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document), ev_page_cache_get_current_page (ev_window->priv->page_cache), search_string, case_sensitive); - g_mutex_unlock (EV_DOC_MUTEX); + ev_document_doc_mutex_unlock (); } else { - g_mutex_lock (EV_DOC_MUTEX); + ev_document_doc_mutex_lock (); ev_document_find_cancel (EV_DOCUMENT_FIND (ev_window->priv->document)); - g_mutex_unlock (EV_DOC_MUTEX); + ev_document_doc_mutex_unlock (); egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar), NULL); @@ -2087,6 +2005,7 @@ ev_window_class_init (EvWindowClass *ev_window_class) g_object_class->dispose = ev_window_dispose; + widget_class->window_state_event = ev_window_state_event; widget_class->focus_in_event = ev_window_focus_in_event; widget_class->focus_out_event = ev_window_focus_out_event; @@ -2094,7 +2013,7 @@ ev_window_class_init (EvWindowClass *ev_window_class) } /* Normal items */ -static GtkActionEntry entries[] = { +static const GtkActionEntry entries[] = { { "File", NULL, N_("_File") }, { "Edit", NULL, N_("_Edit") }, { "View", NULL, N_("_View") }, @@ -2176,7 +2095,7 @@ static GtkActionEntry entries[] = { }; /* Toggle items */ -static GtkToggleActionEntry toggle_entries[] = { +static const GtkToggleActionEntry toggle_entries[] = { /* View Menu */ { "ViewToolbar", NULL, N_("_Toolbar"), "T", N_("Show or hide the toolbar"), @@ -2198,7 +2117,7 @@ static GtkToggleActionEntry toggle_entries[] = { G_CALLBACK (ev_window_cmd_view_page_width) }, }; -static GtkRadioActionEntry page_view_entries[] = { +static const GtkRadioActionEntry page_view_entries[] = { { "SinglePage", GTK_STOCK_DND, N_("Single"), NULL, N_("Show the document one page at a time"), PAGE_MODE_SINGLE_PAGE }, @@ -2483,16 +2402,12 @@ ev_window_init (EvWindow *ev_window) ev_window); gtk_widget_show (sidebar_widget); ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar), - "index", - _("Index"), sidebar_widget); - ev_window->priv->thumbs_sidebar = ev_sidebar_thumbnails_new (); - gtk_widget_show (ev_window->priv->thumbs_sidebar); + sidebar_widget = ev_sidebar_thumbnails_new (); + gtk_widget_show (sidebar_widget); ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar), - "thumbnails", - _("Thumbnails"), - ev_window->priv->thumbs_sidebar); + sidebar_widget); ev_window->priv->scrolled_window = GTK_WIDGET (g_object_new (GTK_TYPE_SCROLLED_WINDOW, @@ -2581,10 +2496,6 @@ ev_window_init (EvWindow *ev_window) G_CALLBACK (find_bar_search_changed_cb), ev_window); - g_signal_connect (ev_window, "window-state-event", - G_CALLBACK (ev_window_state_event_cb), - ev_window); - /* Give focus to the scrolled window */ gtk_widget_grab_focus (ev_window->priv->scrolled_window);