[Xfce4-commits] <exo:stephan/gtk3> Some more gtk3 iconview work.
Nick Schermer
noreply at xfce.org
Sun May 6 10:28:01 CEST 2012
Updating branch refs/heads/stephan/gtk3
to 91a590a2d91f977d290351966b07849ba9ebe1c2 (commit)
from d87dfbfb86eeda6d25f65354305002e2a38b513b (commit)
commit 91a590a2d91f977d290351966b07849ba9ebe1c2
Author: Nick Schermer <nick at xfce.org>
Date: Sun May 6 10:26:38 2012 +0200
Some more gtk3 iconview work.
exo/exo-icon-view.c | 184 +++++++++++++++++++++++++--------------------------
1 files changed, 89 insertions(+), 95 deletions(-)
diff --git a/exo/exo-icon-view.c b/exo/exo-icon-view.c
index fd05aec..05d1b1f 100644
--- a/exo/exo-icon-view.c
+++ b/exo/exo-icon-view.c
@@ -372,7 +372,8 @@ static gboolean exo_icon_view_search_iter (ExoIconView *icon_vi
static void exo_icon_view_search_move (GtkWidget *widget,
ExoIconView *icon_view,
gboolean move_up);
-static void exo_icon_view_search_preedit_changed (GtkIMContext *im_context,
+static void exo_icon_view_search_preedit_changed (GtkEntry *entry,
+ gchar *preedit,
ExoIconView *icon_view);
static gboolean exo_icon_view_search_start (ExoIconView *icon_view,
gboolean keybinding);
@@ -1415,6 +1416,7 @@ exo_icon_view_realize (GtkWidget *widget)
ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv;
GdkWindowAttr attributes;
gint attributes_mask;
+ GdkWindow *window;
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
@@ -1429,8 +1431,9 @@ exo_icon_view_realize (GtkWidget *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;
- widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
- gdk_window_set_user_data (widget->window, widget);
+ window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
+ gtk_widget_set_window (widget, window);
+ gdk_window_set_user_data (window, widget);
/* Allocate the icons window */
attributes.x = 0;
@@ -1445,13 +1448,13 @@ exo_icon_view_realize (GtkWidget *widget)
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK
| gtk_widget_get_events (widget);
- priv->bin_window = gdk_window_new (widget->window, &attributes, attributes_mask);
+ priv->bin_window = gdk_window_new (window, &attributes, attributes_mask);
gdk_window_set_user_data (priv->bin_window, widget);
/* Attach style/background */
widget->style = gtk_style_attach (widget->style, widget->window);
gdk_window_set_background (priv->bin_window, &widget->style->base[widget->state]);
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_background (window, &widget->style->base[widget->state]);
/* map the icons window */
gdk_window_show (priv->bin_window);
@@ -1477,31 +1480,6 @@ exo_icon_view_unrealize (GtkWidget *widget)
static void
-exo_icon_view_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- const ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv;
- ExoIconViewChild *child;
- GtkRequisition child_requisition;
- GList *lp;
-
- /* well, this is easy */
- requisition->width = priv->width;
- requisition->height = priv->height;
-
- /* handle the child widgets */
- for (lp = priv->children; lp != NULL; lp = lp->next)
- {
- child = lp->data;
- if (GTK_WIDGET_VISIBLE (child->widget))
- gtk_widget_size_request (child->widget, &child_requisition);
- }
-}
-
-
-
-
-static void
exo_icon_view_get_preferred_width (GtkWidget *widget,
gint *minimal_width,
gint *natural_width)
@@ -1509,7 +1487,7 @@ exo_icon_view_get_preferred_width (GtkWidget *widget,
const ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv;
ExoIconViewChild *child;
GList *lp;
-
+
/* well, this is easy */
*minimal_width = *natural_width = priv->width;
@@ -1524,7 +1502,7 @@ exo_icon_view_get_preferred_width (GtkWidget *widget,
-static void
+static void
exo_icon_view_get_preferred_height (GtkWidget *widget,
gint *minimal_height,
gint *natural_height)
@@ -1532,7 +1510,7 @@ exo_icon_view_get_preferred_height (GtkWidget *widget,
const ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv;
ExoIconViewChild *child;
GList *lp;
-
+
/* well, this is easy */
*minimal_height = *natural_height = priv->height;
@@ -2072,7 +2050,7 @@ exo_icon_view_remove_widget (GtkCellEditable *editable,
for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next)
((ExoIconViewCellInfo *) lp->data)->editing = FALSE;
- if (GTK_WIDGET_HAS_FOCUS (editable))
+ if (gtk_widget_has_focus (GTK_WIDGET (editable)))
gtk_widget_grab_focus (GTK_WIDGET (icon_view));
g_signal_handlers_disconnect_by_func (editable, exo_icon_view_remove_widget, icon_view);
@@ -2208,7 +2186,7 @@ exo_icon_view_button_press_event (GtkWidget *widget,
if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0))
g_source_remove (icon_view->priv->single_click_timeout_id);
- if (G_UNLIKELY (!GTK_WIDGET_HAS_FOCUS (widget)))
+ if (G_UNLIKELY (!gtk_widget_has_focus (widget)))
gtk_widget_grab_focus (widget);
if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
@@ -2333,7 +2311,7 @@ exo_icon_view_button_press_event (GtkWidget *widget,
/* grab focus and stop drawing the keyboard focus indicator on single clicks */
if (G_LIKELY (event->type != GDK_2BUTTON_PRESS && event->type != GDK_3BUTTON_PRESS))
{
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
gtk_widget_grab_focus (GTK_WIDGET (icon_view));
EXO_ICON_VIEW_UNSET_FLAG (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS);
}
@@ -2415,7 +2393,7 @@ exo_icon_view_scroll_event (GtkWidget *widget,
delta = (event->direction == GDK_SCROLL_UP) ? -delta : delta;
/* apply the new adjustment value */
- value = CLAMP (gtk_adjustment_get_value (adjustment) + delta,
+ value = CLAMP (gtk_adjustment_get_value (adjustment) + delta,
gtk_adjustment_get_lower (adjustment),
gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
gtk_adjustment_set_value (adjustment, value);
@@ -2541,7 +2519,7 @@ exo_icon_view_leave_notify_event (GtkWidget *widget,
{
/* reset cursor to default */
if (gtk_widget_get_realized (widget))
- gdk_window_set_cursor (widget->window, NULL);
+ gdk_window_set_cursor (gtk_widget_get_window (widget), NULL);
/* call the parent's leave_notify_event (if any) */
if (GTK_WIDGET_CLASS (exo_icon_view_parent_class)->leave_notify_event != NULL)
@@ -2989,7 +2967,7 @@ exo_icon_view_adjustment_changed (GtkAdjustment *adjustment,
if (gtk_widget_get_realized (GTK_WIDGET (icon_view)))
{
gdk_window_move (icon_view->priv->bin_window,
- -gtk_adjustment_get_value (icon_view->priv->hadjustment),
+ -gtk_adjustment_get_value (icon_view->priv->hadjustment),
-gtk_adjustment_get_value (icon_view->priv->vadjustment));
if (G_UNLIKELY (icon_view->priv->doing_rubberband))
@@ -3619,7 +3597,7 @@ exo_icon_view_paint_item (ExoIconView *icon_view,
if (item->selected)
{
flags = GTK_CELL_RENDERER_SELECTED;
- state = GTK_WIDGET_HAS_FOCUS (icon_view) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
+ state = gtk_widget_has_focus (GTK_WIDGET (icon_view)) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
/* FIXME We hardwire background drawing behind text cell renderers
* here. This is ugly, but it's done to be consistent with GtkIconView.
@@ -4096,7 +4074,7 @@ exo_icon_view_real_move_cursor (ExoIconView *icon_view,
step == GTK_MOVEMENT_PAGES ||
step == GTK_MOVEMENT_BUFFER_ENDS, FALSE);
- if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (icon_view)))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return FALSE;
exo_icon_view_stop_editing (icon_view, FALSE);
@@ -4318,7 +4296,7 @@ exo_icon_view_move_cursor_up_down (ExoIconView *icon_view,
GtkDirectionType direction;
GtkWidget *toplevel;
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return;
direction = count < 0 ? GTK_DIR_UP : GTK_DIR_DOWN;
@@ -4427,7 +4405,7 @@ exo_icon_view_move_cursor_page_up_down (ExoIconView *icon_view,
ExoIconViewItem *item;
gboolean dirty = FALSE;
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return;
if (!icon_view->priv->cursor_item)
@@ -4486,7 +4464,7 @@ exo_icon_view_move_cursor_left_right (ExoIconView *icon_view,
GtkDirectionType direction;
GtkWidget *toplevel;
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return;
direction = count < 0 ? GTK_DIR_LEFT : GTK_DIR_RIGHT;
@@ -4600,7 +4578,7 @@ exo_icon_view_move_cursor_start_end (ExoIconView *icon_view,
gboolean dirty = FALSE;
GList *lp;
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return;
lp = (count < 0) ? icon_view->priv->items : g_list_last (icon_view->priv->items);
@@ -6692,7 +6670,7 @@ out:
{
GtkWidget *source_widget;
- *suggested_action = context->suggested_action;
+ *suggested_action = gdk_drag_context_get_suggested_action (context);
source_widget = gtk_drag_get_source_widget (context);
if (source_widget == widget)
@@ -6700,7 +6678,7 @@ out:
/* Default to MOVE, unless the user has
* pressed ctrl or shift to affect available actions
*/
- if ((context->actions & GDK_ACTION_MOVE) != 0)
+ if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0)
*suggested_action = GDK_ACTION_MOVE;
}
@@ -6825,11 +6803,11 @@ static void
exo_icon_view_drag_begin (GtkWidget *widget,
GdkDragContext *context)
{
- ExoIconView *icon_view;
+ ExoIconView *icon_view;
ExoIconViewItem *item;
cairo_surface_t *icon;
- gint x, y;
- GtkTreePath *path;
+ gint x, y;
+ GtkTreePath *path;
icon_view = EXO_ICON_VIEW (widget);
@@ -6851,14 +6829,12 @@ exo_icon_view_drag_begin (GtkWidget *widget,
path = gtk_tree_path_new_from_indices (g_list_index (icon_view->priv->items, item), -1);
icon = exo_icon_view_create_drag_icon (icon_view, path);
gtk_tree_path_free (path);
+
+ cairo_surface_set_device_offset (icon, -x, -y);
+
+ gtk_drag_set_icon_surface (context, icon);
- gtk_drag_set_icon_pixmap (context,
- gdk_drawable_get_colormap (icon),
- icon,
- NULL,
- x, y);
-
- g_object_unref (icon);
+ cairo_surface_destroy (icon);
}
static void
@@ -6905,7 +6881,7 @@ exo_icon_view_drag_data_get (GtkWidget *widget,
goto done;
/* If drag_data_get does nothing, try providing row data. */
- if (selection_data->target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
+ if (gtk_selection_data_get_target (selection_data) == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE))
gtk_tree_set_row_drag_data (selection_data,
model,
source_row);
@@ -7137,7 +7113,7 @@ exo_icon_view_drag_data_received (GtkWidget *widget,
if (dest_row == NULL)
return;
- if (selection_data->length >= 0)
+ if (gtk_selection_data_get_length (selection_data) >= 0)
{
if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model),
dest_row,
@@ -7147,7 +7123,7 @@ exo_icon_view_drag_data_received (GtkWidget *widget,
gtk_drag_finish (context,
accepted,
- (context->action == GDK_ACTION_MOVE),
+ gdk_drag_context_get_actions (context) == GDK_ACTION_MOVE,
drag_time);
gtk_tree_path_free (dest_row);
@@ -7461,12 +7437,13 @@ cairo_surface_t *
exo_icon_view_create_drag_icon (ExoIconView *icon_view,
GtkTreePath *path)
{
- GdkRectangle area;
GtkWidget *widget = GTK_WIDGET (icon_view);
- cairo_surface_t *drawable;
- GdkGC *gc;
+ cairo_surface_t *surface;
GList *lp;
- gint idx;
+ gint idx, item_idx;
+ GdkRectangle rect;
+ ExoIconViewItem *item;
+ cairo_t *cr;
g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL);
g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, NULL);
@@ -7477,33 +7454,44 @@ exo_icon_view_create_drag_icon (ExoIconView *icon_view,
idx = gtk_tree_path_get_indices (path)[0];
- for (lp = icon_view->priv->items; lp != NULL; lp = lp->next)
+ for (lp = icon_view->priv->items, item_idx = 0; lp != NULL; lp = lp->next, item_idx++)
{
- ExoIconViewItem *item = lp->data;
- if (G_UNLIKELY (idx == g_list_index (icon_view->priv->items, item)))
+ if (G_UNLIKELY (idx == item_idx))
{
- drawable = gdk_pixmap_new (icon_view->priv->bin_window,
- item->area.width + 2,
- item->area.height + 2,
- -1);
+ item = lp->data;
+
+ rect.x = item->area.x;
+ rect.y = item->area.y;
+ rect.width = item->area.width;
+ rect.height = item->area.height;
+
+ surface = gdk_window_create_similar_surface (icon_view->priv->bin_window,
+ CAIRO_CONTENT_COLOR,
+ rect.width + 2,
+ rect.height + 2);
+
+ cr = cairo_create (surface);
+ cairo_set_line_width (cr, 1.);
+
+ gtk_render_background (context, cr, 0, 0,
+ rect.width + 2, rect.height + 2);
+
+ cairo_save (cr);
- gc = gdk_gc_new (drawable);
- gdk_gc_set_rgb_fg_color (gc, &widget->style->base[GTK_WIDGET_STATE (widget)]);
- gdk_draw_rectangle (drawable, gc, TRUE, 0, 0, item->area.width + 2, item->area.height + 2);
+ cairo_rectangle (cr, 1, 1, rect.width, rect.height);
+ cairo_clip (cr);
- area.x = 0;
- area.y = 0;
- area.width = item->area.width;
- area.height = item->area.height;
+ exo_icon_view_paint_item (icon_view, cr, item, 1, 1, FALSE);
- exo_icon_view_paint_item (icon_view, item, &area, drawable, 1, 1, FALSE);
+ cairo_restore (cr);
- gdk_gc_set_rgb_fg_color (gc, &widget->style->black);
- gdk_draw_rectangle (drawable, gc, FALSE, 1, 1, item->area.width + 1, item->area.height + 1);
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
+ cairo_rectangle (cr, 0.5, 0.5, rect.width + 1, rect.height + 1);
+ cairo_stroke (cr);
- g_object_unref (G_OBJECT (gc));
+ cairo_destroy (cr);
- return drawable;
+ return surface;
}
}
@@ -7710,7 +7698,9 @@ exo_icon_view_single_click_timeout (gpointer user_data)
GDK_THREADS_ENTER ();
/* verify that we are in single-click mode, have focus and a prelit item */
- if (GTK_WIDGET_HAS_FOCUS (icon_view) && icon_view->priv->single_click && icon_view->priv->prelit_item != NULL)
+ if (gtk_widget_has_focus (GTK_WIDGET (icon_view))
+ && icon_view->priv->single_click
+ && icon_view->priv->prelit_item != NULL)
{
/* work on the prelit item */
item = icon_view->priv->prelit_item;
@@ -8054,9 +8044,10 @@ exo_icon_view_search_dialog_hide (GtkWidget *search_dialog,
static void
exo_icon_view_search_ensure_directory (ExoIconView *icon_view)
{
- GtkWidget *toplevel;
- GtkWidget *frame;
- GtkWidget *vbox;
+ GtkWidget *toplevel;
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWindowGroup *group;
/* determine the toplevel window */
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (icon_view));
@@ -8080,8 +8071,9 @@ exo_icon_view_search_ensure_directory (ExoIconView *icon_view)
/* allocate a new search window */
icon_view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP);
- if (GTK_WINDOW (toplevel)->group != NULL)
- gtk_window_group_add_window (GTK_WINDOW (toplevel)->group, GTK_WINDOW (icon_view->priv->search_window));
+ group = gtk_window_get_group (GTK_WINDOW (toplevel));
+ if (group != NULL)
+ gtk_window_group_add_window (group, GTK_WINDOW (icon_view->priv->search_window));
gtk_window_set_modal (GTK_WINDOW (icon_view->priv->search_window), TRUE);
gtk_window_set_screen (GTK_WINDOW (icon_view->priv->search_window), gtk_widget_get_screen (GTK_WIDGET (icon_view)));
@@ -8104,7 +8096,7 @@ exo_icon_view_search_ensure_directory (ExoIconView *icon_view)
/* allocate the search entry widget */
icon_view->priv->search_entry = gtk_entry_new ();
g_signal_connect (G_OBJECT (icon_view->priv->search_entry), "activate", G_CALLBACK (exo_icon_view_search_activate), icon_view);
- g_signal_connect (G_OBJECT (GTK_ENTRY (icon_view->priv->search_entry)->im_context), "preedit-changed",
+ g_signal_connect (G_OBJECT (GTK_ENTRY (icon_view->priv->search_entry)), "preedit-changed",
G_CALLBACK (exo_icon_view_search_preedit_changed), icon_view);
gtk_box_pack_start (GTK_BOX (vbox), icon_view->priv->search_entry, TRUE, TRUE, 0);
gtk_widget_realize (icon_view->priv->search_entry);
@@ -8270,7 +8262,8 @@ exo_icon_view_search_move (GtkWidget *widget,
static void
-exo_icon_view_search_preedit_changed (GtkIMContext *im_context,
+exo_icon_view_search_preedit_changed (GtkEntry *entry,
+ gchar *preedit,
ExoIconView *icon_view)
{
icon_view->priv->search_imcontext_changed = TRUE;
@@ -8298,14 +8291,15 @@ exo_icon_view_search_start (ExoIconView *icon_view,
return FALSE;
/* check if we already display the search window */
- if (icon_view->priv->search_window != NULL && GTK_WIDGET_VISIBLE (icon_view->priv->search_window))
+ if (icon_view->priv->search_window != NULL
+ && gtk_widget_get_visible (icon_view->priv->search_window))
return TRUE;
/* we only start interactive search if we have focus,
* we don't want to start interactive search if one of
* our children has the focus.
*/
- if (!GTK_WIDGET_HAS_FOCUS (icon_view))
+ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view)))
return FALSE;
/* verify that we have a search column */
@@ -8424,8 +8418,8 @@ exo_icon_view_search_position_func (ExoIconView *icon_view,
{
GtkRequisition requisition;
GdkRectangle monitor;
- GdkWindow *view_window = GTK_WIDGET (icon_view)->window;
- GdkScreen *screen = gdk_drawable_get_screen (view_window);
+ GdkWindow *view_window = gtk_widget_get_window (GTK_WIDGET (icon_view));
+ GdkScreen *screen = gdk_window_get_screen (view_window);
gint view_width, view_height;
gint view_x, view_y;
gint monitor_num;
More information about the Xfce4-commits
mailing list