From 68540f68316d14931fb5b895270e5b7b7aad1bed Mon Sep 17 00:00:00 2001 From: xbezdick <255993@mail.muni.cz> Date: Thu, 5 May 2011 18:34:08 +0200 Subject: [PATCH] [shell] fix Issues #2 #3 #4 --- shell/ev-dualscreen.c | 67 +++++++++++++++++++++++++++++++++++-------- shell/ev-dualscreen.h | 10 ++++--- shell/ev-window.c | 3 +- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/shell/ev-dualscreen.c b/shell/ev-dualscreen.c index 91c4a407..1802963c 100644 --- a/shell/ev-dualscreen.c +++ b/shell/ev-dualscreen.c @@ -30,9 +30,7 @@ #include #include "ev-dualscreen.h" -#include "ev-window.h" #include "ev-view.h" -#include "ev-view-presentation.h" #include "ev-utils.h" #include "ev-sidebar.h" #include "ev-sidebar-thumbnails.h" @@ -53,9 +51,11 @@ struct _EvDSCWindowPrivate { EvDocumentModel *notes_model; EvDocument *presentation_document; EvDocument *notes_document; - + EvMetadata *metadata; EvViewPresentation *presentation_view; + gint moveback_monitor; + gint presentation_monitor; guint page; }; @@ -76,6 +76,22 @@ ev_dscwindow_get_presentation_window_monitor (EvDSCWindow *ev_dscwindow) return work_monitor; } +static void +ev_dscwindow_setup_from_metadata (EvDSCWindow *ev_dscwindow) +{ + if (!ev_dscwindow->priv->metadata) + return; + gint int_value; + gdouble double_value; + if (ev_metadata_get_double (ev_dscwindow->priv->metadata, "presentation-time", &double_value)) + gtk_spin_button_set_value (GTK_SPIN_BUTTON (ev_dscwindow->priv->spinner),double_value); + if (ev_metadata_get_int (ev_dscwindow->priv->metadata, "presentation-monitor", &int_value)) { + ev_dscwindow->priv->presentation_monitor = int_value; + } else { + ev_dscwindow->priv->presentation_monitor = (ev_dscwindow->priv->moveback_monitor + 1) % 2; + } +} + static gboolean ev_dscwindow_windows_placement (EvDSCWindow *ev_dscwindow) { @@ -86,15 +102,14 @@ ev_dscwindow_windows_placement (EvDSCWindow *ev_dscwindow) if (num_monitors == 2) { GdkRectangle coords; GdkScreen *screen = gtk_window_get_screen (GTK_WINDOW (ev_dscwindow)); - gint presentation_monitor = ev_dscwindow_get_presentation_window_monitor(ev_dscwindow); - gint control_monitor = presentation_monitor; + gint presentation_monitor = ev_dscwindow->priv->presentation_monitor; + gint control_monitor = (presentation_monitor + 1) % 2; gdk_screen_get_monitor_geometry (screen, control_monitor, &coords); gtk_window_unmaximize (GTK_WINDOW (ev_dscwindow)); gtk_window_move (GTK_WINDOW (ev_dscwindow), coords.x, coords.y); gtk_window_maximize (GTK_WINDOW (ev_dscwindow)); - presentation_monitor = (control_monitor + 1) % 2; gdk_screen_get_monitor_geometry (screen, presentation_monitor,&coords); gtk_window_move (GTK_WINDOW (ev_dscwindow->priv->presentation_window), coords.x, coords.y); @@ -103,6 +118,19 @@ ev_dscwindow_windows_placement (EvDSCWindow *ev_dscwindow) return FALSE; } +static void +ev_dscwindow_switch_monitors (EvDSCWindow *ev_dscwindow) +{ + gint num_monitors = get_num_monitors (GTK_WINDOW (ev_dscwindow)); + if (num_monitors == 2) { + ev_dscwindow->priv->presentation_monitor = (ev_dscwindow->priv->presentation_monitor + 1) % 2; + if (ev_dscwindow->priv->metadata) + ev_metadata_set_int (ev_dscwindow->priv->metadata, + "presentation-monitor", ev_dscwindow->priv->presentation_monitor); + } + ev_dscwindow_windows_placement (ev_dscwindow); +} + static void ev_dscwindow_sidebar_visibility_cb (GtkWidget *sidebar) { @@ -131,6 +159,8 @@ ev_dscwindow_presentation_time_cb (EvDSCWindow *ev_dscwindow) { gint time = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (ev_dscwindow->priv->spinner)); ev_presentation_timer_set_time (EV_PRESENTATION_TIMER (ev_dscwindow->priv->timer),time); + if (ev_dscwindow->priv->metadata) + ev_metadata_set_double (ev_dscwindow->priv->metadata, "presentation-time", time); } static void @@ -165,10 +195,14 @@ ev_dscwindow_notes_interaction (GtkContainer *container, EvDSCWindow *ev_dscwind ev_document_factory_add_filters (dialog, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), FALSE); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), TRUE); + char *uri; + if (ev_dscwindow->priv->metadata && + ev_metadata_get_string (ev_dscwindow->priv->metadata, "notes-uri", &uri)) + gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (dialog),uri); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { - char * uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); GError * error = NULL; ev_view_set_loading (EV_VIEW (ev_dscwindow->priv->notesview), TRUE); @@ -178,8 +212,10 @@ ev_dscwindow_notes_interaction (GtkContainer *container, EvDSCWindow *ev_dscwind ev_dscwindow->priv->notes_document = ev_document_factory_get_document (uri, &error); } - g_free (uri); if (error == NULL){ + if (ev_dscwindow->priv->metadata) + ev_metadata_set_string (ev_dscwindow->priv->metadata, + "notes-uri", uri); ev_dscwindow->priv->notes_model = ev_document_model_new (); ev_document_model_set_document (ev_dscwindow->priv->notes_model, ev_dscwindow->priv->notes_document); @@ -199,6 +235,7 @@ ev_dscwindow_notes_interaction (GtkContainer *container, EvDSCWindow *ev_dscwind ev_dscwindow); } } + g_free (uri); gtk_widget_destroy (dialog); return TRUE; @@ -217,10 +254,14 @@ ev_dscwindow_get_control (void) } void -ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, - EvWindow *presentation_window, EvDocument *document, EvViewPresentation *pview) +ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, + EvWindow *presentation_window, + EvDocument *document, + EvViewPresentation *pview, + EvMetadata *metadata) { - if (!EV_IS_WINDOW (presentation_window)) + if (!EV_IS_WINDOW (presentation_window) || !EV_IS_DSCWINDOW (ev_dscwindow) || + !EV_IS_VIEW_PRESENTATION (pview) || !EV_IS_DOCUMENT (document) ) return; ev_dscwindow->priv->presentation_window = GTK_WIDGET(presentation_window); @@ -228,6 +269,7 @@ ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, ev_dscwindow->priv->presentation_view = EV_VIEW_PRESENTATION(pview); ev_dscwindow->priv->page = ev_view_presentation_get_current_page (pview); ev_dscwindow->priv->moveback_monitor = ev_dscwindow_get_presentation_window_monitor (ev_dscwindow); + ev_dscwindow->priv->metadata = metadata; ev_document_model_set_document(ev_dscwindow->priv->model, document); ev_document_model_set_page(ev_dscwindow->priv->model, ev_dscwindow->priv->page); @@ -250,6 +292,7 @@ ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, while(gtk_events_pending()) gtk_main_iteration(); /* something like http://mail.gnome.org/archives/gtk-list/2008-June/msg00061.html */ + ev_dscwindow_setup_from_metadata (ev_dscwindow); ev_dscwindow_windows_placement (ev_dscwindow); } @@ -321,7 +364,7 @@ ev_dscwindow_init (EvDSCWindow *ev_dscwindow) gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (b_switch), "object-flip-horizontal"); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), b_switch, -1); g_signal_connect_swapped (b_switch, "clicked", - G_CALLBACK (ev_dscwindow_windows_placement), ev_dscwindow); + G_CALLBACK (ev_dscwindow_switch_monitors), ev_dscwindow); GtkToolItem *b_notes = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN); gtk_tool_button_set_label (GTK_TOOL_BUTTON(b_notes), _("Load notes...")); diff --git a/shell/ev-dualscreen.h b/shell/ev-dualscreen.h index 6317430f..77b55ec5 100644 --- a/shell/ev-dualscreen.h +++ b/shell/ev-dualscreen.h @@ -27,6 +27,7 @@ #include "ev-window.h" #include "ev-view-presentation.h" +#include "ev-metadata.h" G_BEGIN_DECLS @@ -52,10 +53,11 @@ struct _EvDSCWindow { GType ev_dscwindow_get_type (void); GtkWidget *ev_dscwindow_new (void); -void ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, - EvWindow *presentation_window, - EvDocument *document, - EvViewPresentation *pview); +void ev_dscwindow_set_presentation (EvDSCWindow *ev_dscwindow, + EvWindow *presentation_window, + EvDocument *document, + EvViewPresentation *pview, + EvMetadata *metadata); EvDSCWindow* ev_dscwindow_get_control (void); G_END_DECLS diff --git a/shell/ev-window.c b/shell/ev-window.c index ef6f0b16..7905185e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -4058,7 +4058,8 @@ ev_window_run_presentation (EvWindow *window) gtk_window_present (GTK_WINDOW (control)); ev_dscwindow_set_presentation (control, window, window->priv->document, - EV_VIEW_PRESENTATION(window->priv->presentation_view)); + EV_VIEW_PRESENTATION(window->priv->presentation_view), + window->priv->metadata); } } -- 2.39.3