X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-view.c;h=0a7622368601ff4442320a2e8de341e2856a7485;hb=5bde54f8810020217366ec3e9a64b44b4f6ee3c6;hp=2033962ae1842ebb88f0341ece27bf8ea4c543d0;hpb=a601c252dae06def4379c838ed176955903b34c9;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 2033962a..0a762236 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -57,7 +57,8 @@ static const GtkTargetEntry targets[] = { typedef enum { EV_VIEW_CURSOR_NORMAL, - EV_VIEW_CURSOR_HAND + EV_VIEW_CURSOR_LINK, + EV_VIEW_CURSOR_WAIT } EvViewCursor; struct _EvView { @@ -76,6 +77,7 @@ struct _EvView { gboolean pressed_button; gboolean has_selection; + GdkPoint selection_start; GdkRectangle selection; EvViewCursor cursor; @@ -222,6 +224,9 @@ ev_view_size_request (GtkWidget *widget, requisition->width = 10; requisition->height = 10; } + + requisition->width += 2; + requisition->height += 2; } } @@ -244,17 +249,6 @@ ev_view_size_allocate (GtkWidget *widget, } } -static void -update_window_backgrounds (EvView *view) -{ - GtkWidget *widget = GTK_WIDGET (view); - - if (GTK_WIDGET_REALIZED (view)) { - gdk_window_set_background (view->bin_window, - &widget->style->base[GTK_WIDGET_STATE (widget)]); - } -} - static void ev_view_realize (GtkWidget *widget) { @@ -301,6 +295,9 @@ ev_view_realize (GtkWidget *widget) gdk_window_set_user_data (view->bin_window, widget); gdk_window_show (view->bin_window); + widget->style = gtk_style_attach (widget->style, view->bin_window); + gdk_window_set_background (view->bin_window, &widget->style->mid[widget->state]); + if (view->document) { ev_document_set_target (view->document, view->bin_window); @@ -311,8 +308,6 @@ ev_view_realize (GtkWidget *widget) */ gtk_widget_queue_resize (widget); } - - update_window_backgrounds (view); } static void @@ -330,20 +325,6 @@ ev_view_unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (ev_view_parent_class)->unrealize (widget); } -static void -ev_view_style_set (GtkWidget *widget, - GtkStyle *previous_style) -{ - update_window_backgrounds (EV_VIEW (widget)); -} - -static void -ev_view_state_changed (GtkWidget *widget, - GtkStateType previous_state) -{ - update_window_backgrounds (EV_VIEW (widget)); -} - static guint32 ev_gdk_color_to_rgb (const GdkColor *color) { @@ -394,13 +375,29 @@ expose_bin_window (GtkWidget *widget, GdkEventExpose *event) { EvView *view = EV_VIEW (widget); - int i; - int current_page; + int i, current_page; + int x_offset, y_offset; const EvFindResult *results; if (view->document == NULL) return; - + + x_offset = MAX (0, (widget->allocation.width - + widget->requisition.width) / 2); + y_offset = MAX (0, (widget->allocation.height - + widget->requisition.height) / 2); + gdk_draw_rectangle (view->bin_window, + widget->style->black_gc, + FALSE, + x_offset, + y_offset, + widget->requisition.width - 1, + widget->requisition.height - 1); + + ev_document_set_page_offset (view->document, + x_offset + 1, + y_offset + 1); + ev_document_render (view->document, event->area.x, event->area.y, event->area.width, event->area.height); @@ -417,9 +414,16 @@ expose_bin_window (GtkWidget *widget, results[i].highlight_area.width, results[i].highlight_area.height); #endif - if (results[i].page_num == current_page) + if (results[i].page_num == current_page) { + GdkRectangle highlight_area_fixed; + highlight_area_fixed.x = results[i].highlight_area.x + x_offset + 1; + highlight_area_fixed.y = results[i].highlight_area.y + y_offset + 1; + highlight_area_fixed.width = results[i].highlight_area.width; + highlight_area_fixed.height = results[i].highlight_area.height; + draw_rubberband (widget, view->bin_window, - &results[i].highlight_area); + &highlight_area_fixed); + } ++i; } @@ -533,10 +537,8 @@ ev_view_button_press_event (GtkWidget *widget, gtk_widget_queue_draw (widget); } - view->selection.x = event->x; - view->selection.y = event->y; - view->selection.width = 0; - view->selection.height = 0; + view->selection_start.x = event->x; + view->selection_start.y = event->y; break; } @@ -595,26 +597,35 @@ ev_view_set_find_status (EvView *view, const char *message) static void ev_view_set_cursor (EvView *view, EvViewCursor new_cursor) { - GdkCursor *cursor; - GtkWidget *widget = GTK_WIDGET (view); + GdkCursor *cursor = NULL; + GdkDisplay *display; + GtkWidget *widget; if (view->cursor == new_cursor) { return; } + widget = gtk_widget_get_toplevel (GTK_WIDGET (view)); + display = gtk_widget_get_display (widget); + view->cursor = new_cursor; + switch (new_cursor) { case EV_VIEW_CURSOR_NORMAL: gdk_window_set_cursor (widget->window, NULL); break; - case EV_VIEW_CURSOR_HAND: - cursor = gdk_cursor_new_for_display - (gdk_display_get_default(), GDK_HAND2); - gdk_window_set_cursor (widget->window, cursor); - gdk_cursor_unref (cursor); + case EV_VIEW_CURSOR_LINK: + cursor = gdk_cursor_new_for_display (display, GDK_HAND2); + break; + case EV_VIEW_CURSOR_WAIT: + cursor = gdk_cursor_new_for_display (display, GDK_WATCH); break; } - view->cursor = new_cursor; + if (cursor) { + gdk_window_set_cursor (widget->window, cursor); + gdk_cursor_unref (cursor); + gdk_flush(); + } } static gboolean @@ -625,10 +636,10 @@ ev_view_motion_notify_event (GtkWidget *widget, if (view->pressed_button > 0) { view->has_selection = TRUE; - view->selection.x = MIN (view->selection.x, event->x); - view->selection.y = MIN (view->selection.y, event->y); - view->selection.width = ABS (view->selection.x - event->x) + 1; - view->selection.height = ABS (view->selection.y - event->y) + 1; + view->selection.x = MIN (view->selection_start.x, event->x); + view->selection.y = MIN (view->selection_start.y, event->y); + view->selection.width = ABS (view->selection_start.x - event->x) + 1; + view->selection.height = ABS (view->selection_start.y - event->y) + 1; } else if (view->document) { EvLink *link; @@ -638,13 +649,15 @@ ev_view_motion_notify_event (GtkWidget *widget, msg = status_message_from_link (link); ev_view_set_status (view, msg); - ev_view_set_cursor (view, EV_VIEW_CURSOR_HAND); + ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); g_free (msg); g_object_unref (link); } else { ev_view_set_status (view, NULL); - ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + if (view->cursor == EV_VIEW_CURSOR_LINK) { + ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + } } } @@ -838,8 +851,6 @@ ev_view_class_init (EvViewClass *class) widget_class->size_allocate = ev_view_size_allocate; widget_class->realize = ev_view_realize; widget_class->unrealize = ev_view_unrealize; - widget_class->style_set = ev_view_style_set; - widget_class->state_changed = ev_view_state_changed; gtk_object_class->destroy = ev_view_destroy; class->set_scroll_adjustments = ev_view_set_scroll_adjustments; @@ -902,16 +913,12 @@ ev_view_class_init (EvViewClass *class) static void ev_view_init (EvView *view) { - static const GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; - GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS); view->scale = 1.0; view->pressed_button = -1; view->cursor = EV_VIEW_CURSOR_NORMAL; - gtk_widget_modify_bg (GTK_WIDGET (view), GTK_STATE_NORMAL, &white); - view->find_results = g_array_new (FALSE, FALSE, sizeof (EvFindResult)); @@ -1038,6 +1045,14 @@ found_results_callback (EvDocument *document, gtk_widget_queue_draw (GTK_WIDGET (view)); } +static void +document_changed_callback (EvDocument *document, + EvView *view) +{ + gtk_widget_queue_draw (GTK_WIDGET (view)); + ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); +} + /*** Public API ***/ GtkWidget* @@ -1046,13 +1061,6 @@ ev_view_new (void) return g_object_new (EV_TYPE_VIEW, NULL); } -static void -document_changed_callback (EvDocument *document, - EvView *view) -{ - gtk_widget_queue_draw (GTK_WIDGET (view)); -} - void ev_view_set_document (EvView *view, EvDocument *document) @@ -1100,11 +1108,27 @@ set_document_page (EvView *view, int page) { if (view->document) { int old_page = ev_document_get_page (view->document); - if (old_page != page) + int old_width, old_height; + + ev_document_get_page_size (view->document, + &old_width, &old_height); + + if (old_page != page) { + ev_view_set_cursor (view, EV_VIEW_CURSOR_WAIT); ev_document_set_page (view->document, page); + } + if (old_page != ev_document_get_page (view->document)) { + int width, height; + g_signal_emit (view, page_changed_signal, 0); + view->has_selection = FALSE; + ev_document_get_page_size (view->document, + &width, &height); + if (width != old_width || height != old_height) + gtk_widget_queue_resize (GTK_WIDGET (view)); + view->find_percent_complete = 0.0; update_find_results (view); }