X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Fui%2Fgui%2Fpspp-sheet-view.c;h=a5439e854a1998107b4af782c05208507be540d4;hb=838cd359986e2b974e2908ca9bb5b40f0cad3f72;hp=ae5a179b5c87b83c5546548fa98e24ecb912caf6;hpb=a2a6ca0624eab7af45150086b4653aff61daf1eb;p=pspp diff --git a/src/ui/gui/pspp-sheet-view.c b/src/ui/gui/pspp-sheet-view.c index ae5a179b5c..a5439e854a 100644 --- a/src/ui/gui/pspp-sheet-view.c +++ b/src/ui/gui/pspp-sheet-view.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include "ui/gui/psppire-marshal.h" @@ -1476,10 +1477,9 @@ pspp_sheet_view_realize (GtkWidget *widget) attributes.height = allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK; - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; gtk_widget_set_window (widget, gdk_window_new (gtk_widget_get_parent_window (widget), @@ -1524,7 +1524,6 @@ pspp_sheet_view_realize (GtkWidget *widget) /* Add them all up. */ gtk_widget_set_style (widget, gtk_style_attach (gtk_widget_get_style (widget), gtk_widget_get_window (widget))); - gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE); gdk_window_set_background (tree_view->priv->bin_window, >k_widget_get_style (widget)->base[gtk_widget_get_state (widget)]); gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL); @@ -3524,14 +3523,16 @@ pspp_sheet_view_update_rubber_band_selection (PsppSheetView *tree_view) tree_view->priv->rubber_band_end_node = end_node; } +#define GDK_RECTANGLE_PTR(X) ((GdkRectangle *)(X)) + static void pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view) { gint x, y; - GdkRectangle old_area; - GdkRectangle new_area; - GdkRectangle common; - GdkRegion *invalid_region; + cairo_rectangle_int_t old_area; + cairo_rectangle_int_t new_area; + cairo_rectangle_int_t common; + cairo_region_t *invalid_region; PsppSheetViewColumn *column; old_area.x = MIN (tree_view->priv->press_start_x, tree_view->priv->rubber_band_x); @@ -3549,13 +3550,14 @@ pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view) new_area.width = ABS (x - tree_view->priv->press_start_x) + 1; new_area.height = ABS (y - tree_view->priv->press_start_y) + 1; - invalid_region = gdk_region_rectangle (&old_area); - gdk_region_union_with_rect (invalid_region, &new_area); + invalid_region = cairo_region_create_rectangle (&old_area); + cairo_region_union_rectangle (invalid_region, &new_area); - gdk_rectangle_intersect (&old_area, &new_area, &common); + gdk_rectangle_intersect (GDK_RECTANGLE_PTR (&old_area), + GDK_RECTANGLE_PTR (&new_area), GDK_RECTANGLE_PTR (&common)); if (common.width > 2 && common.height > 2) { - GdkRegion *common_region; + cairo_region_t *common_region; /* make sure the border is invalidated */ common.x += 1; @@ -3563,15 +3565,26 @@ pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view) common.width -= 2; common.height -= 2; - common_region = gdk_region_rectangle (&common); + common_region = cairo_region_create_rectangle (&common); - gdk_region_subtract (invalid_region, common_region); - gdk_region_destroy (common_region); + cairo_region_subtract (invalid_region, common_region); + cairo_region_destroy (common_region); } - gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE); +#if GTK_MAJOR_VERSION == 3 + gdk_window_invalidate_region (tree_view->priv->bin_window, invalid_region, TRUE); +#else + { + cairo_rectangle_int_t extents; + GdkRegion *ereg; + cairo_region_get_extents (invalid_region, &extents); + ereg = gdk_region_rectangle (GDK_RECTANGLE_PTR (&extents)); + gdk_window_invalidate_region (tree_view->priv->bin_window, ereg, TRUE); + gdk_region_destroy (ereg); + } +#endif - gdk_region_destroy (invalid_region); + cairo_region_destroy (invalid_region); tree_view->priv->rubber_band_x = x; tree_view->priv->rubber_band_y = y; @@ -3587,6 +3600,7 @@ pspp_sheet_view_update_rubber_band (PsppSheetView *tree_view) pspp_sheet_view_update_rubber_band_selection (tree_view); } +#if GTK3_TRANSITION static void pspp_sheet_view_paint_rubber_band (PsppSheetView *tree_view, GdkRectangle *area) @@ -3631,6 +3645,8 @@ pspp_sheet_view_paint_rubber_band (PsppSheetView *tree_view, cairo_destroy (cr); } +#endif + static gboolean pspp_sheet_view_motion_bin_window (GtkWidget *widget, @@ -3758,10 +3774,10 @@ draw_empty_focus (PsppSheetView *tree_view, GdkRectangle *clip_area) static void pspp_sheet_view_draw_vertical_grid_lines (PsppSheetView *tree_view, - GdkEventExpose *event, - gint n_visible_columns, - gint min_y, - gint max_y) + cairo_t *cr, + gint n_visible_columns, + gint min_y, + gint max_y) { GList *list = tree_view->priv->columns; gint i = 0; @@ -3785,26 +3801,12 @@ pspp_sheet_view_draw_vertical_grid_lines (PsppSheetView *tree_view, current_x += column->width; - if (current_x - 1 >= event->area.x - && current_x - 1 < event->area.x + event->area.width) - { -#if GTK3_TRANSITION - gdk_draw_line (event->window, - tree_view->priv->grid_line_gc[GTK_WIDGET(tree_view)->state], - current_x - 1, min_y, - current_x - 1, max_y - min_y); -#else - - cairo_t *cr = gdk_cairo_create (event->window); - cairo_set_line_width (cr, 1.0); - cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); - cairo_move_to (cr, current_x - 0.5, min_y); - cairo_line_to (cr, current_x - 0.5 , max_y - min_y); - - cairo_stroke (cr); - cairo_destroy (cr); -#endif - } + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_move_to (cr, current_x - 0.5, min_y); + cairo_line_to (cr, current_x - 0.5 , max_y - min_y); + + cairo_stroke (cr); } } @@ -3847,6 +3849,15 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, gboolean row_ending_details; gboolean draw_vgrid_lines, draw_hgrid_lines; gint min_y, max_y; + cairo_t *cr = gdk_cairo_create (event->window); + GdkRectangle Zarea; + GtkAllocation allocation; + gtk_widget_get_allocation (widget, &allocation); + + Zarea.x = 0; + Zarea.y = 0; + Zarea.width = gdk_window_get_width (event->window); + Zarea.height = allocation.height; rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL); @@ -3860,17 +3871,19 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, if (tree_view->priv->row_count == 0) { - draw_empty_focus (tree_view, &event->area); + draw_empty_focus (tree_view, &Zarea); return TRUE; } +#if GTK3_TRANSITION /* clip event->area to the visible area */ - if (event->area.height < 0.5) + if (Zarea.height < 0.5) return TRUE; +#endif validate_visible_area (tree_view); - new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, event->area.y); + new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, Zarea.y); if (new_y < 0) new_y = 0; @@ -3888,7 +3901,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, event->window, gtk_widget_get_state (widget), GTK_SHADOW_NONE, - &event->area, + &Zarea, widget, "cell_even", 0, tree_view->priv->height, @@ -3970,7 +3983,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, cell_offset = 0; - background_area.y = y_offset + event->area.y; + background_area.y = y_offset + Zarea.y; background_area.height = max_height; max_y = background_area.y + max_height; @@ -4021,12 +4034,14 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, else selected_column = TRUE; - if (cell_offset > event->area.x + event->area.width || - cell_offset + column->width < event->area.x) +#if GTK3_TRANSITION + if (cell_offset > Zarea.x + Zarea.width || + cell_offset + column->width < Zarea.x) { cell_offset += column->width; continue; } +#endif if (selected && selected_column) flags |= GTK_CELL_RENDERER_SELECTED; @@ -4076,11 +4091,13 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, cell_area.height -= grid_line_width; } +#if GTK3_TRANSITION if (gdk_region_rect_in (event->region, &background_area) == GDK_OVERLAP_RECTANGLE_OUT) { cell_offset += column->width; continue; } +#endif pspp_sheet_view_column_cell_set_cell_data (column, tree_view->priv->model, @@ -4160,7 +4177,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, event->window, state, GTK_SHADOW_NONE, - &event->area, + &Zarea, widget, new_detail, background_area.x, @@ -4174,7 +4191,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, event->window, state, GTK_SHADOW_NONE, - &event->area, + &Zarea, widget, detail, background_area.x, @@ -4185,7 +4202,6 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, if (draw_hgrid_lines) { - cairo_t *cr = gdk_cairo_create (event->window); cairo_set_line_width (cr, 1.0); cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); @@ -4204,7 +4220,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, #endif } - if (y_offset + max_height >= event->area.height - 0.5) + if (y_offset + max_height >= Zarea.height - 0.5) { #if GTK3_TRANSITION gdk_draw_line (event->window, @@ -4220,14 +4236,13 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, #endif } cairo_stroke (cr); - cairo_destroy (cr); } _pspp_sheet_view_column_cell_render (column, event->window, &background_area, &cell_area, - &event->area, + &Zarea, flags); if (node == cursor && has_special_cell && @@ -4240,25 +4255,25 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, event->window, &background_area, &cell_area, - &event->area, + &Zarea, flags); } cell_offset += column->width; } - if (cell_offset < event->area.x) + if (cell_offset < Zarea.x) { gtk_paint_flat_box (gtk_widget_get_style (widget), event->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, - &event->area, + &Zarea, widget, "base", cell_offset, background_area.y, - event->area.x - cell_offset, + Zarea.x - cell_offset, background_area.height); } @@ -4294,7 +4309,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, gtk_paint_focus (gtk_widget_get_style (widget), tree_view->priv->bin_window, gtk_widget_get_state (widget), - &event->area, + &Zarea, widget, (is_first ? (is_last ? "treeview-drop-indicator" : "treeview-drop-indicator-left" ) @@ -4307,7 +4322,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, gtk_paint_focus (gtk_widget_get_style (widget), tree_view->priv->bin_window, gtk_widget_get_state (widget), - &event->area, + &Zarea, widget, "treeview-drop-indicator", 0, BACKGROUND_FIRST_PIXEL (tree_view, node) @@ -4362,7 +4377,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, gtk_paint_focus (gtk_widget_get_style (widget), tree_view->priv->bin_window, focus_rect_state, - &event->area, + &Zarea, widget, (is_first ? (is_last ? "treeview" : "treeview-left" ) @@ -4373,7 +4388,7 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, gtk_paint_focus (gtk_widget_get_style (widget), tree_view->priv->bin_window, focus_rect_state, - &event->area, + &Zarea, widget, "treeview", 0, tmp_y, @@ -4398,12 +4413,13 @@ pspp_sheet_view_bin_expose (GtkWidget *widget, } while (!done); } - while (y_offset < event->area.height); + while (y_offset < Zarea.height); done: - pspp_sheet_view_draw_vertical_grid_lines (tree_view, event, n_visible_columns, + pspp_sheet_view_draw_vertical_grid_lines (tree_view, cr, n_visible_columns, min_y, max_y); +#if GTK3_TRANSITION if (tree_view->priv->rubber_band_status == RUBBER_BAND_ACTIVE) { GdkRectangle *rectangles; @@ -4418,6 +4434,7 @@ done: g_free (rectangles); } +#endif if (cursor_path) gtk_tree_path_free (cursor_path); @@ -4433,6 +4450,7 @@ pspp_sheet_view_expose (GtkWidget *widget, GdkEventExpose *event) { PsppSheetView *tree_view = PSPP_SHEET_VIEW (widget); + cairo_t *cr = gdk_cairo_create (event->window); if (event->window == tree_view->priv->bin_window) { @@ -4495,10 +4513,10 @@ pspp_sheet_view_expose (GtkWidget *widget, n_visible_columns ++; } pspp_sheet_view_draw_vertical_grid_lines (tree_view, - event, - n_visible_columns, - event->area.y, - event->area.height); + cr, + n_visible_columns, + event->area.y, + event->area.height); } else if (event->window == tree_view->priv->drag_window) { @@ -6917,7 +6935,6 @@ pspp_sheet_view_style_set (GtkWidget *widget, if (gtk_widget_get_realized (widget)) { - gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE); gdk_window_set_background (tree_view->priv->bin_window, >k_widget_get_style (widget)->base[gtk_widget_get_state (widget)]); gtk_style_set_background (gtk_widget_get_style (widget), tree_view->priv->header_window, GTK_STATE_NORMAL); pspp_sheet_view_set_grid_lines (tree_view, tree_view->priv->grid_lines); @@ -7685,9 +7702,8 @@ _pspp_sheet_view_column_start_drag (PsppSheetView *tree_view, attributes.width = column->allocation.width; attributes.height = column->allocation.height; attributes.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view)); - attributes.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view)); attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK; - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL ; tree_view->priv->drag_window = gdk_window_new (tree_view->priv->bin_window, &attributes, @@ -12788,7 +12804,6 @@ pspp_sheet_view_state_changed (GtkWidget *widget, if (gtk_widget_get_realized (widget)) { GtkStyle *style = gtk_widget_get_style (widget); - gdk_window_set_back_pixmap (gtk_widget_get_window (widget), NULL, FALSE); gdk_window_set_background (tree_view->priv->bin_window, &style->base[gtk_widget_get_state (widget)]); }