X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libview%2Fev-view-presentation.c;h=b32a0bbba4e2ed6900b72580f24d3305455ade33;hb=1e63533e4d2fe74b17883a51f984ecacb9138231;hp=bbbfd4f9435737518b17078540e6e8cf4bf6e035;hpb=f3731bd3bdbcdc18c53e0f74bdaac93311046352;p=evince.git diff --git a/libview/ev-view-presentation.c b/libview/ev-view-presentation.c index bbbfd4f9..b32a0bbb 100644 --- a/libview/ev-view-presentation.c +++ b/libview/ev-view-presentation.c @@ -30,18 +30,19 @@ #include "ev-transition-animation.h" #include "ev-view-cursor.h" #include "ev-page-cache.h" -#include "ev-view-marshal.h" + + enum { PROP_0, PROP_DOCUMENT, PROP_CURRENT_PAGE, + PROP_PAGE, PROP_ROTATION, PROP_INVERTED_COLORS }; enum { - PAGE_CHANGED, CHANGE_PAGE, FINISHED, SIGNAL_EXTERNAL_LINK, @@ -99,9 +100,6 @@ struct _EvViewPresentationClass GtkWidgetClass base_class; /* signals */ - void (* page_changed) (EvViewPresentation *pview, - gint old_page, - gint new_page); void (* change_page) (EvViewPresentation *pview, GtkScrollType scroll); void (* finished) (EvViewPresentation *pview); @@ -493,9 +491,8 @@ ev_view_presentation_update_current_page (EvViewPresentation *pview, } } - g_signal_emit (pview, signals[PAGE_CHANGED], 0, pview->current_page); - pview->current_page = page; + g_object_notify (G_OBJECT(pview), "page"); if (pview->page_cache) ev_page_cache_set_page_range (pview->page_cache, page, page); @@ -514,13 +511,13 @@ ev_view_presentation_update_current_page (EvViewPresentation *pview, void ev_view_presentation_set_page (EvViewPresentation *pview, gint new_page) { - guint n_pages; + guint n_pages; n_pages = ev_document_get_n_pages (pview->document); if (new_page >= n_pages) ev_view_presentation_set_end (pview); - else + else if (new_page != pview->current_page) ev_view_presentation_update_current_page (pview, new_page); } @@ -1238,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); @@ -1372,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; @@ -1392,6 +1433,9 @@ ev_view_presentation_get_property (GObject *object, EvViewPresentation *pview = EV_VIEW_PRESENTATION (object); switch (prop_id) { + case PROP_PAGE: + g_value_set_uint (value, ev_view_presentation_get_current_page (pview)); + break; case PROP_ROTATION: g_value_set_uint (value, ev_view_presentation_get_rotation (pview)); break; @@ -1434,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; @@ -1456,13 +1501,20 @@ 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_WRITABLE | + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (gobject_class, PROP_ROTATION, @@ -1490,15 +1542,7 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass) g_cclosure_marshal_VOID__ENUM, G_TYPE_NONE, 1, GTK_TYPE_SCROLL_TYPE); - signals [PAGE_CHANGED] = - g_signal_new ("page-changed", - EV_TYPE_VIEW_PRESENTATION, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvViewPresentationClass, page_changed), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_INT); + signals[FINISHED] = g_signal_new ("finished", G_OBJECT_CLASS_TYPE (gobject_class),