]> www.fi.muni.cz Git - evince.git/blobdiff - libview/ev-view-presentation.c
[dualscreen] in short "Disziplin ist Macht."
[evince.git] / libview / ev-view-presentation.c
index 49c9c976185da139b051849b87e18399dd6511c5..c3e40bf5787c557535f623470f65c010a0a70a6d 100644 (file)
@@ -37,6 +37,7 @@ enum {
        PROP_0,
        PROP_DOCUMENT,
        PROP_CURRENT_PAGE,
+       PROP_PAGE,
        PROP_ROTATION,
        PROP_INVERTED_COLORS
 };
@@ -491,7 +492,7 @@ ev_view_presentation_update_current_page (EvViewPresentation *pview,
        }
 
        pview->current_page = page;
-       g_object_notify (G_OBJECT(pview), "current_page");
+       g_object_notify (G_OBJECT(pview), "page");
 
        if (pview->page_cache)
                ev_page_cache_set_page_range (pview->page_cache, page, page);
@@ -1234,19 +1235,60 @@ ev_view_presentation_motion_notify_event (GtkWidget      *widget,
        return FALSE;
 }
 
-static gboolean
-init_presentation (GtkWidget *widget)
+static GdkRectangle
+ev_view_presentation_get_monitor_geometry (EvViewPresentation *pview)
 {
-       EvViewPresentation *pview = EV_VIEW_PRESENTATION (widget);
-       GdkScreen          *screen = gtk_widget_get_screen (widget);
+       GdkScreen                  *screen = gtk_widget_get_screen (GTK_WIDGET(pview));
        GdkRectangle        monitor;
        gint                monitor_num;
 
-       monitor_num = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget));
+       monitor_num = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (GTK_WIDGET(pview)));
        gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
+
+       return monitor;
+}
+
+static void
+ev_view_presentation_update_scale (EvViewPresentation *pview)
+{
+       GdkRectangle monitor = ev_view_presentation_get_monitor_geometry (pview);
+
+       if((pview->monitor_width != monitor.width)||(pview->monitor_height != monitor.height)) {
+               pview->monitor_width = monitor.width;
+               pview->monitor_height = monitor.height;
+
+               pview->scale = 0;
+       ev_view_presentation_reset_jobs (pview);
+       ev_view_presentation_update_current_page (pview, pview->current_page);
+       }
+}
+
+static void
+ev_view_presentation_size_allocate (GtkWidget *widget,
+                                                                       GtkAllocation *allocation)
+{
+       gtk_widget_set_allocation (widget, allocation);
+    if (gtk_widget_get_realized (widget))
+       gdk_window_move_resize (gtk_widget_get_window (widget),
+                                allocation->x,
+                                allocation->y,
+                                allocation->width,
+                                allocation->height);
+       ev_view_presentation_update_scale (EV_VIEW_PRESENTATION (widget));
+}
+
+static gboolean
+init_presentation (GtkWidget *widget)
+{
+       EvViewPresentation *pview = EV_VIEW_PRESENTATION (widget);
+       GdkRectangle monitor = ev_view_presentation_get_monitor_geometry (pview);
+
        pview->monitor_width = monitor.width;
        pview->monitor_height = monitor.height;
 
+       g_signal_connect_swapped (G_OBJECT (widget), "screen-changed",
+                      G_CALLBACK (ev_view_presentation_update_scale), pview);
+
        ev_view_presentation_update_current_page (pview, pview->current_page);
        ev_view_presentation_hide_cursor_timeout_start (pview);
 
@@ -1368,6 +1410,9 @@ ev_view_presentation_set_property (GObject      *object,
        case PROP_CURRENT_PAGE:
                pview->current_page = g_value_get_uint (value);
                break;
+       case PROP_PAGE:
+               pview->current_page = g_value_get_uint (value);
+               break;
        case PROP_ROTATION:
                 ev_view_presentation_set_rotation (pview, g_value_get_uint (value));
                break;
@@ -1388,7 +1433,7 @@ ev_view_presentation_get_property (GObject    *object,
         EvViewPresentation *pview = EV_VIEW_PRESENTATION (object);
 
         switch (prop_id) {
-               case PROP_CURRENT_PAGE:
+               case PROP_PAGE:
                                g_value_set_uint (value, ev_view_presentation_get_current_page (pview));
                                break;
         case PROP_ROTATION:
@@ -1433,6 +1478,7 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass)
 
         gobject_class->dispose = ev_view_presentation_dispose;
 
+       widget_class->size_allocate = ev_view_presentation_size_allocate;
        widget_class->get_preferred_width = ev_view_presentation_get_preferred_width;
        widget_class->get_preferred_height = ev_view_presentation_get_preferred_height;
        widget_class->realize = ev_view_presentation_realize;
@@ -1455,13 +1501,21 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass)
                                                              EV_TYPE_DOCUMENT,
                                                              G_PARAM_WRITABLE |
                                                              G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (gobject_class,
+                                        PROP_PAGE,
+                                        g_param_spec_uint ("page",
+                                                           "Current Page",
+                                                           "The current page",
+                                                           0, G_MAXUINT, 0,
+                                                               G_PARAM_READWRITE));
        g_object_class_install_property (gobject_class,
                                         PROP_CURRENT_PAGE,
                                         g_param_spec_uint ("current_page",
                                                            "Current Page",
                                                            "The current page",
                                                            0, G_MAXUINT, 0,
-                                                           G_PARAM_READWRITE));
+                                                               G_PARAM_WRITABLE |
+                                                           G_PARAM_CONSTRUCT_ONLY));
        g_object_class_install_property (gobject_class,
                                         PROP_ROTATION,
                                         g_param_spec_uint ("rotation",