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=0a11ce1cb5f6a95495e851d74fdef4e338d4a009;hb=a90e38bd4aab8013c402e55753275f5b3408e103;hp=e033f12f14ed9d14909664f6440d98b6d1159347;hpb=f020f9ced6dfd3efadab6add9665066a4bd03a5f;p=evince.git diff --git a/libview/ev-view-presentation.c b/libview/ev-view-presentation.c index e033f12f..0a11ce1c 100644 --- a/libview/ev-view-presentation.c +++ b/libview/ev-view-presentation.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" @@ -30,13 +30,13 @@ #include "ev-transition-animation.h" #include "ev-view-cursor.h" #include "ev-page-cache.h" -#include "ev-mapping.h" enum { PROP_0, PROP_DOCUMENT, PROP_CURRENT_PAGE, - PROP_ROTATION + PROP_ROTATION, + PROP_INVERTED_COLORS }; enum { @@ -60,6 +60,7 @@ struct _EvViewPresentation cairo_surface_t *current_surface; EvDocument *document; guint rotation; + gboolean inverted_colors; EvPresentationState state; gdouble scale; gint monitor_width; @@ -114,12 +115,14 @@ static void ev_view_presentation_set_normal (EvViewPresentation *pview) { GtkWidget *widget = GTK_WIDGET (pview); + GtkStyle *style; if (pview->state == EV_PRESENTATION_NORMAL) return; pview->state = EV_PRESENTATION_NORMAL; - gdk_window_set_background (widget->window, &widget->style->black); + style = gtk_widget_get_style (widget); + gdk_window_set_background (gtk_widget_get_window (widget), &style->black); gtk_widget_queue_draw (widget); } @@ -127,12 +130,14 @@ static void ev_view_presentation_set_black (EvViewPresentation *pview) { GtkWidget *widget = GTK_WIDGET (pview); + GtkStyle *style; if (pview->state == EV_PRESENTATION_BLACK) return; pview->state = EV_PRESENTATION_BLACK; - gdk_window_set_background (widget->window, &widget->style->black); + style = gtk_widget_get_style (widget); + gdk_window_set_background (gtk_widget_get_window (widget), &style->black); gtk_widget_queue_draw (widget); } @@ -140,12 +145,14 @@ static void ev_view_presentation_set_white (EvViewPresentation *pview) { GtkWidget *widget = GTK_WIDGET (pview); + GtkStyle *style; if (pview->state == EV_PRESENTATION_WHITE) return; pview->state = EV_PRESENTATION_WHITE; - gdk_window_set_background (widget->window, &widget->style->white); + style = gtk_widget_get_style (widget); + gdk_window_set_background (gtk_widget_get_window (widget), &style->white); gtk_widget_queue_draw (widget); } @@ -186,10 +193,11 @@ static void ev_view_presentation_get_page_area (EvViewPresentation *pview, GdkRectangle *area) { - GtkWidget *widget = GTK_WIDGET (pview); - gdouble doc_width, doc_height; - gint view_width, view_height; - gdouble scale; + GtkWidget *widget = GTK_WIDGET (pview); + GtkAllocation allocation; + gdouble doc_width, doc_height; + gint view_width, view_height; + gdouble scale; ev_document_get_page_size (pview->document, pview->current_page, @@ -204,8 +212,10 @@ ev_view_presentation_get_page_area (EvViewPresentation *pview, view_height = (gint)((doc_height * scale) + 0.5); } - area->x = (MAX (0, widget->allocation.width - view_width)) / 2; - area->y = (MAX (0, widget->allocation.height - view_height)) / 2; + gtk_widget_get_allocation (widget, &allocation); + + area->x = (MAX (0, allocation.width - view_width)) / 2; + area->y = (MAX (0, allocation.height - view_height)) / 2; area->width = view_width; area->height = view_height; } @@ -293,16 +303,16 @@ ev_view_presentation_animation_start (EvViewPresentation *pview, pview->animation = ev_transition_animation_new (effect); - surface = EV_JOB_RENDER (pview->curr_job)->surface; + surface = pview->curr_job ? EV_JOB_RENDER (pview->curr_job)->surface : NULL; ev_transition_animation_set_origin_surface (pview->animation, surface != NULL ? surface : pview->current_surface); jump = new_page - pview->current_page; if (jump == -1) - surface = EV_JOB_RENDER (pview->prev_job)->surface; + surface = pview->prev_job ? EV_JOB_RENDER (pview->prev_job)->surface : NULL; else if (jump == 1) - surface = EV_JOB_RENDER (pview->next_job)->surface; + surface = pview->next_job ? EV_JOB_RENDER (pview->next_job)->surface : NULL; else surface = NULL; if (surface) @@ -323,6 +333,9 @@ job_finished_cb (EvJob *job, { EvJobRender *job_render = EV_JOB_RENDER (job); + if (pview->inverted_colors) + ev_document_misc_invert_surface (job_render->surface); + if (job != pview->curr_job) return; @@ -530,22 +543,14 @@ send_focus_change (GtkWidget *widget, { GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE); - g_object_ref (widget); - - if (in) - GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS); - else - GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); - fevent->focus_change.type = GDK_FOCUS_CHANGE; - fevent->focus_change.window = g_object_ref (widget->window); + fevent->focus_change.window = gtk_widget_get_window (widget); fevent->focus_change.in = in; + if (fevent->focus_change.window) + g_object_ref (fevent->focus_change.window); - gtk_widget_event (widget, fevent); + gtk_widget_send_focus_change (widget, fevent); - g_object_notify (G_OBJECT (widget), "has-focus"); - - g_object_unref (widget); gdk_event_free (fevent); } @@ -621,29 +626,28 @@ ev_view_presentation_goto_entry_activate (GtkEntry *entry, static void ev_view_presentation_goto_window_create (EvViewPresentation *pview) { - GtkWidget *frame, *hbox, *toplevel, *label; + GtkWidget *frame, *hbox, *label; + GtkWindow *toplevel, *goto_window; - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (pview)); + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pview))); + goto_window = GTK_WINDOW (pview->goto_window); if (pview->goto_window) { - if (GTK_WINDOW (toplevel)->group) - gtk_window_group_add_window (GTK_WINDOW (toplevel)->group, - GTK_WINDOW (pview->goto_window)); - else if (GTK_WINDOW (pview->goto_window)->group) - gtk_window_group_remove_window (GTK_WINDOW (pview->goto_window)->group, - GTK_WINDOW (pview->goto_window)); + if (gtk_window_has_group (toplevel)) + gtk_window_group_add_window (gtk_window_get_group (toplevel), goto_window); + else if (gtk_window_has_group (goto_window)) + gtk_window_group_remove_window (gtk_window_get_group (goto_window), goto_window); + return; } pview->goto_window = gtk_window_new (GTK_WINDOW_POPUP); - gtk_window_set_screen (GTK_WINDOW (pview->goto_window), - gtk_widget_get_screen (GTK_WIDGET (pview))); + gtk_window_set_screen (goto_window, gtk_widget_get_screen (GTK_WIDGET (pview))); - if (GTK_WINDOW (toplevel)->group) - gtk_window_group_add_window (GTK_WINDOW (toplevel)->group, - GTK_WINDOW (pview->goto_window)); + if (gtk_window_has_group (toplevel)) + gtk_window_group_add_window (gtk_window_get_group (toplevel), goto_window); - gtk_window_set_modal (GTK_WINDOW (pview->goto_window), TRUE); + gtk_window_set_modal (goto_window, TRUE); g_signal_connect (pview->goto_window, "delete_event", G_CALLBACK (ev_view_presentation_goto_window_delete_event), @@ -706,7 +710,9 @@ ev_view_presentation_goto_window_send_key_event (EvViewPresentation *pview, new_event = (GdkEventKey *) gdk_event_copy (event); g_object_unref (new_event->window); - new_event->window = g_object_ref (pview->goto_window->window); + new_event->window = gtk_widget_get_window (pview->goto_window); + if (new_event->window) + g_object_ref (new_event->window); gtk_widget_realize (pview->goto_window); gtk_widget_event (pview->goto_window, (GdkEvent *)new_event); @@ -742,12 +748,12 @@ ev_view_presentation_get_link_at_location (EvViewPresentation *pview, gdouble x, gdouble y) { - GdkRectangle page_area; - GList *link_mapping; - EvLink *link; - gdouble width, height; - gdouble new_x, new_y; - gdouble scale; + GdkRectangle page_area; + EvMappingList *link_mapping; + EvLink *link; + gdouble width, height; + gdouble new_x, new_y; + gdouble scale; if (!pview->page_cache) return NULL; @@ -837,7 +843,7 @@ ev_view_presentation_set_cursor (EvViewPresentation *pview, pview->cursor = view_cursor; cursor = ev_view_cursor_new (gtk_widget_get_display (widget), view_cursor); - gdk_window_set_cursor (widget->window, cursor); + gdk_window_set_cursor (gtk_widget_get_window (widget), cursor); gdk_flush (); if (cursor) gdk_cursor_unref (cursor); @@ -950,15 +956,6 @@ ev_view_presentation_size_request (GtkWidget *widget, requisition->height = 0; } -static void -ev_view_presentation_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GTK_WIDGET_CLASS (ev_view_presentation_parent_class)->size_allocate (widget, allocation); - - widget->allocation = *allocation; -} - static void ev_view_presentation_draw_end_page (EvViewPresentation *pview) { @@ -966,6 +963,7 @@ ev_view_presentation_draw_end_page (EvViewPresentation *pview) PangoLayout *layout; PangoFontDescription *font_desc; gchar *markup; + GtkAllocation allocation; GdkRectangle area = {0}; const gchar *text = _("End of presentation. Click to exit."); @@ -981,12 +979,13 @@ ev_view_presentation_draw_end_page (EvViewPresentation *pview) pango_font_description_set_size (font_desc, 16 * PANGO_SCALE); pango_layout_set_font_description (layout, font_desc); - area.width = widget->allocation.width; - area.height = widget->allocation.height; + gtk_widget_get_allocation (widget, &allocation); + area.width = allocation.width; + area.height = allocation.height; - gtk_paint_layout (widget->style, - widget->window, - GTK_WIDGET_STATE (widget), + gtk_paint_layout (gtk_widget_get_style (widget), + gtk_widget_get_window (widget), + gtk_widget_get_state (widget), FALSE, &area, widget, @@ -1024,7 +1023,7 @@ ev_view_presentation_expose_event (GtkWidget *widget, if (ev_transition_animation_ready (pview->animation)) { ev_view_presentation_get_page_area (pview, &page_area); - cr = gdk_cairo_create (widget->window); + cr = gdk_cairo_create (gtk_widget_get_window (widget)); /* normalize to x=0, y=0 */ cairo_translate (cr, page_area.x, page_area.y); @@ -1051,7 +1050,7 @@ ev_view_presentation_expose_event (GtkWidget *widget, ev_view_presentation_get_page_area (pview, &page_area); if (gdk_rectangle_intersect (&page_area, &(event->area), &overlap)) { - cr = gdk_cairo_create (widget->window); + cr = gdk_cairo_create (gtk_widget_get_window (widget)); /* Try to fix rounding errors. See bug #438760 */ if (overlap.width == page_area.width) @@ -1199,7 +1198,7 @@ init_presentation (GtkWidget *widget) GdkRectangle monitor; gint monitor_num; - monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window); + monitor_num = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget)); gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); pview->monitor_width = monitor.width; pview->monitor_height = monitor.height; @@ -1213,19 +1212,23 @@ init_presentation (GtkWidget *widget) static void ev_view_presentation_realize (GtkWidget *widget) { + GdkWindow *window; + GtkStyle *style; GdkWindowAttr attributes; + GtkAllocation allocation; - GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + gtk_widget_set_realized (widget, TRUE); attributes.window_type = GDK_WINDOW_CHILD; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; + gtk_widget_get_allocation (widget, &allocation); + attributes.x = allocation.x; + attributes.y = allocation.y; + attributes.width = allocation.width; + attributes.height = allocation.height; attributes.event_mask = GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | @@ -1236,15 +1239,18 @@ ev_view_presentation_realize (GtkWidget *widget) GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK; - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, - GDK_WA_X | GDK_WA_Y | - GDK_WA_COLORMAP | - GDK_WA_VISUAL); - gdk_window_set_user_data (widget->window, widget); - widget->style = gtk_style_attach (widget->style, widget->window); + window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_COLORMAP | + GDK_WA_VISUAL); + + gdk_window_set_user_data (window, widget); + gtk_widget_set_window (widget, window); - gdk_window_set_background (widget->window, &widget->style->black); + gtk_widget_style_attach (widget); + style = gtk_widget_get_style (widget); + gdk_window_set_background (window, &style->black); g_idle_add ((GSourceFunc)init_presentation, widget); } @@ -1326,6 +1332,9 @@ ev_view_presentation_set_property (GObject *object, case PROP_ROTATION: pview->rotation = g_value_get_uint (value); break; + case PROP_INVERTED_COLORS: + pview->inverted_colors = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -1362,7 +1371,6 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass) klass->change_page = ev_view_presentation_change_page; - widget_class->size_allocate = ev_view_presentation_size_allocate; widget_class->size_request = ev_view_presentation_size_request; widget_class->realize = ev_view_presentation_realize; widget_class->expose_event = ev_view_presentation_expose_event; @@ -1401,6 +1409,14 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass) 0, 360, 0, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (gobject_class, + PROP_INVERTED_COLORS, + g_param_spec_boolean ("inverted_colors", + "Inverted Colors", + "Whether presentation is displayed with inverted colors", + FALSE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY)); signals[CHANGE_PAGE] = g_signal_new ("change_page", @@ -1455,13 +1471,14 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass) static void ev_view_presentation_init (EvViewPresentation *pview) { - GTK_WIDGET_SET_FLAGS (pview, GTK_CAN_FOCUS); + gtk_widget_set_can_focus (GTK_WIDGET (pview), TRUE); } GtkWidget * ev_view_presentation_new (EvDocument *document, guint current_page, - guint rotation) + guint rotation, + gboolean inverted_colors) { g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL); g_return_val_if_fail (current_page < ev_document_get_n_pages (document), NULL); @@ -1470,6 +1487,7 @@ ev_view_presentation_new (EvDocument *document, "document", document, "current_page", current_page, "rotation", rotation, + "inverted_colors", inverted_colors, NULL)); }