diff options
author | florian.weigelt <florian.weigelt@mailbox.tu-dresden.de> | 2017-02-01 17:04:07 +0100 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2017-03-03 19:13:45 +0300 |
commit | 7b76bb74c0b4956007f699507ec9a9c1a704c863 (patch) | |
tree | 17f8c9c6f90bfe5a83b560e504fef5a18138db86 /src/xfdesktop-icon-view.c | |
parent | 24e61f6d8759ae9b400fc1be3c1666c79d61b2c9 (diff) | |
download | xfdesktop-7b76bb74c0b4956007f699507ec9a9c1a704c863.tar.gz |
Initial porting to Gtk 3
Diffstat (limited to 'src/xfdesktop-icon-view.c')
-rw-r--r-- | src/xfdesktop-icon-view.c | 101 |
1 files changed, 54 insertions, 47 deletions
diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 0148bf6b..d7b20d7d 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -236,12 +236,11 @@ static gboolean xfdesktop_icon_view_motion_notify(GtkWidget *widget, static gboolean xfdesktop_icon_view_leave_notify(GtkWidget *widget, GdkEventCrossing *evt, gpointer user_data); -static void xfdesktop_icon_view_style_set(GtkWidget *widget, - GtkStyle *previous_style); +static void xfdesktop_icon_view_style_updated(GtkWidget *widget); static void xfdesktop_icon_view_realize(GtkWidget *widget); static void xfdesktop_icon_view_unrealize(GtkWidget *widget); -static gboolean xfdesktop_icon_view_expose(GtkWidget *widget, - GdkEventExpose *evt); +static gboolean xfdesktop_icon_view_draw(GtkWidget *widget, + cairo_t *cr); static void xfdesktop_icon_view_drag_begin(GtkWidget *widget, GdkDragContext *contest); static gboolean xfdesktop_icon_view_drag_motion(GtkWidget *widget, @@ -416,10 +415,10 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) gobject_class->set_property = xfce_icon_view_set_property; gobject_class->get_property = xfce_icon_view_get_property; - widget_class->style_set = xfdesktop_icon_view_style_set; + widget_class->style_updated = xfdesktop_icon_view_style_updated; widget_class->realize = xfdesktop_icon_view_realize; widget_class->unrealize = xfdesktop_icon_view_unrealize; - widget_class->expose_event = xfdesktop_icon_view_expose; + widget_class->draw = xfdesktop_icon_view_draw; widget_class->drag_begin = xfdesktop_icon_view_drag_begin; widget_class->drag_motion = xfdesktop_icon_view_drag_motion; widget_class->drag_drop = xfdesktop_icon_view_drag_drop; @@ -689,7 +688,7 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Home, 0, GTK_MOVEMENT_BUFFER_ENDS, -1); - xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Home, 0, + xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Home, 0, GTK_MOVEMENT_BUFFER_ENDS, -1); xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_End, 0, @@ -962,7 +961,7 @@ xfdesktop_icon_view_button_press(GtkWidget *widget, /* Since we're not over any icons this won't be the start of a * drag so we can pop up menu */ if(evt->button == 3 || (evt->button == 1 && (evt->state & GDK_SHIFT_MASK))) { - xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt->button, evt->time); + xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt); return TRUE; } } @@ -1068,8 +1067,10 @@ xfdesktop_icon_view_button_release(GtkWidget *widget, * now. * We pass 0 as the button because the docs say that you must use 0 * for pop ups other than button press events. */ - if(icon_l && (icon = icon_l->data)) - xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), 0, evt->time); + if(icon_l && (icon = icon_l->data)) { + evt->button = 0; + xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt); + } } if(evt->button == 1 && evt->state & GDK_CONTROL_MASK @@ -1119,7 +1120,7 @@ xfdesktop_icon_view_key_press(GtkWidget *widget, /* since we're NO_WINDOW, events don't get delivered to us normally, * so we have to activate the bindings manually */ - return gtk_bindings_activate_event(GTK_OBJECT(icon_view), evt); + return gtk_bindings_activate_event(G_OBJECT(icon_view), evt); } static gboolean @@ -1266,7 +1267,7 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget, || icon_view->priv->definitely_rubber_banding)) { GdkRectangle old_rect, *new_rect, intersect; - GdkRegion *region; + cairo_region_t *region; GList *l; /* we're dragging with no icon under the cursor -> rubber band start @@ -1287,13 +1288,13 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget, new_rect->width = ABS(evt->x - icon_view->priv->press_start_x) + 1; new_rect->height = ABS(evt->y - icon_view->priv->press_start_y) + 1; - region = gdk_region_rectangle(&old_rect); - gdk_region_union_with_rect(region, new_rect); + region = cairo_region_create_rectangle(&old_rect); + cairo_region_union_rectangle(region, new_rect); if(gdk_rectangle_intersect(&old_rect, new_rect, &intersect) && intersect.width > 2 && intersect.height > 2) { - GdkRegion *region_intersect; + cairo_region_t *region_intersect; /* invalidate border too */ intersect.x += 1; @@ -1301,13 +1302,13 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget, intersect.y += 1; intersect.height -= 2; - region_intersect = gdk_region_rectangle(&intersect); - gdk_region_subtract(region, region_intersect); - gdk_region_destroy(region_intersect); + region_intersect = cairo_region_create_rectangle(&intersect); + cairo_region_subtract(region, region_intersect); + cairo_region_destroy(region_intersect); } gdk_window_invalidate_region(gtk_widget_get_window(widget), region, TRUE); - gdk_region_destroy(region); + cairo_region_destroy(region); /* update list of selected icons */ @@ -1912,8 +1913,7 @@ xfdesktop_icon_view_icon_theme_changed(GtkIconTheme *icon_theme, } static void -xfdesktop_icon_view_style_set(GtkWidget *widget, - GtkStyle *previous_style) +xfdesktop_icon_view_style_updated(GtkWidget *widget) { XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget); GtkWidget *dummy; @@ -2009,8 +2009,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget, NULL); gtk_widget_destroy(dummy); - GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_set(widget, - previous_style); + GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_updated(widget); /* do this after we're sure we have a style set */ if(!icon_view->priv->selection_box_color) { @@ -2034,7 +2033,10 @@ xfdesktop_icon_view_realize(GtkWidget *widget) gtk_widget_set_style(widget, gtk_style_attach(gtk_widget_get_style(widget), gtk_widget_get_window(widget))); - + /* we need this call here to initalize some members of icon_view->priv, + * those depend on custom style properties */ + xfdesktop_icon_view_style_updated(widget); + /* there's no reason to start up the manager before we're realized, * but we do NOT shut it down if we unrealize, since there may not be * a reason to do so. shutdown occurs in finalize. */ @@ -2058,7 +2060,7 @@ xfdesktop_icon_view_realize(GtkWidget *widget) xfdesktop_setup_grids(icon_view); /* unfortunately GTK_NO_WINDOW widgets don't receive events, with the - * exception of expose events. */ + * exception of draw events. */ gtk_widget_add_events(icon_view->priv->parent_window, GDK_POINTER_MOTION_HINT_MASK | GDK_KEY_PRESS_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -2177,29 +2179,31 @@ xfdesktop_icon_view_unrealize(GtkWidget *widget) } static gboolean -xfdesktop_icon_view_expose(GtkWidget *widget, - GdkEventExpose *evt) +xfdesktop_icon_view_draw(GtkWidget *widget, + cairo_t *cr) { XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget); - GdkRectangle *rects = NULL; + cairo_rectangle_list_t *rects; + cairo_rectangle_int_t temp; GdkRectangle clipbox; - gint n_rects = 0, i; + gint i; /*TRACE("entering");*/ - if(evt->count != 0) + rects = cairo_copy_clip_rectangle_list(cr); + + if(rects->status != CAIRO_STATUS_SUCCESS) { + cairo_rectangle_list_destroy (rects); return FALSE; + } - gdk_region_get_rectangles(evt->region, &rects, &n_rects); - gdk_region_get_clipbox(evt->region, &clipbox); + gdk_cairo_get_clip_rectangle(cr, &clipbox); xfdesktop_icon_view_repaint_icons(icon_view, &clipbox); if(icon_view->priv->definitely_rubber_banding) { GdkRectangle intersect; - cairo_t *cr; - cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget))); cairo_set_line_width(cr, 1); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba(cr, @@ -2210,10 +2214,16 @@ xfdesktop_icon_view_expose(GtkWidget *widget, /* paint each rectangle in the expose region with the rubber * band color, semi-transparently */ - for(i = 0; i < n_rects; ++i) { - if(!gdk_rectangle_intersect(&rects[i], - &icon_view->priv->band_rect, - &intersect)) + for(i = 0; i < rects->num_rectangles; ++i) { + /* rects only contains cairo_rectangle_t's (with double values) which we + cannot use in gdk_rectangle_intersect, so copy those values to temp. + If there is a better way please update this part */ + temp.x = rects->rectangles[i].x; + temp.y = rects->rectangles[i].y; + temp.width = rects->rectangles[i].width; + temp.height = rects->rectangles[i].height; + + if (!gdk_rectangle_intersect(&temp, &icon_view->priv->band_rect, &intersect)) { continue; } @@ -2237,11 +2247,9 @@ xfdesktop_icon_view_expose(GtkWidget *widget, cairo_restore(cr); } - - cairo_destroy(cr); } - g_free(rects); + cairo_rectangle_list_destroy(rects); return FALSE; } @@ -2745,7 +2753,7 @@ xfdesktop_setup_grids(XfdesktopIconView *icon_view) new_size = (guint)icon_view->priv->nrows * icon_view->priv->ncols * sizeof(XfdesktopIcon *); - if(old_size == new_size) { + if(old_size == new_size && icon_view->priv->grid_layout != NULL) { DBG("old_size == new_size exiting"); return; } @@ -3138,7 +3146,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view, playout = icon_view->priv->playout; - cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget))); + cr = gdk_cairo_create(gtk_widget_get_window(widget)); if(!xfdesktop_icon_get_extents(icon, &pixbuf_extents, &text_extents, &total_extents)) @@ -3228,9 +3236,8 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view, text_extents.width, text_extents.height, text_extents.x, text_extents.y); - gtk_paint_layout(gtk_widget_get_style(widget), gtk_widget_get_window(widget), - state, FALSE, area, widget, "label", - text_extents.x, text_extents.y, playout); + gtk_render_layout(gtk_widget_get_style_context(widget), cr, + text_extents.x, text_extents.y, playout); } @@ -3575,7 +3582,7 @@ xfdesktop_get_workarea_single(XfdesktopIconView *icon_view, break; } while(bytes_after > 0); - gdk_error_trap_pop(); + gdk_error_trap_pop_ignored(); return ret; } |