diff options
author | Carlos Soriano <csoriano@gnome.org> | 2016-08-29 18:24:05 +0200 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2016-08-29 18:37:10 +0200 |
commit | 52d960542b4d5fdf2bd06735d0dbf7934cf2ec12 (patch) | |
tree | 5e000d5ed40b52b003c02b597e51ae0b87ff22ac /src/nautilus-canvas-item.c | |
parent | 4cafccd82859a4ee0bdfad3e31a310f2d94c0485 (diff) | |
download | nautilus-52d960542b4d5fdf2bd06735d0dbf7934cf2ec12.tar.gz |
general: run uncrustify
And make the style of Nautilus the same for all files.
Hopefully we can fix all the style issues we can find in the next days,
so expect a little of movement on this.
https://bugzilla.gnome.org/show_bug.cgi?id=770564
Diffstat (limited to 'src/nautilus-canvas-item.c')
-rw-r--r-- | src/nautilus-canvas-item.c | 4186 |
1 files changed, 2237 insertions, 1949 deletions
diff --git a/src/nautilus-canvas-item.c b/src/nautilus-canvas-item.c index 9205af4d5..a103d34a4 100644 --- a/src/nautilus-canvas-item.c +++ b/src/nautilus-canvas-item.c @@ -1,4 +1,3 @@ - /* Nautilus - Canvas item class for canvas container. * * Copyright (C) 2000 Eazel, Inc @@ -62,7 +61,7 @@ * each item has three text height variables: * + text_height: actual height of the displayed (i.e. on-screen) PangoLayout. * + text_height_for_layout: height used in canvas grid layout algorithms. - * “sane amount” of text. + * “sane amount” of text. * “sane amount“ as of * + hard-coded to three lines in text-below-icon mode. * @@ -75,106 +74,109 @@ */ /* Private part of the NautilusCanvasItem structure. */ -struct NautilusCanvasItemDetails { - /* The image, text, font. */ - double x, y; - GdkPixbuf *pixbuf; - cairo_surface_t *rendered_surface; - char *editable_text; /* Text that can be modified by a renaming function */ - char *additional_text; /* Text that cannot be modifed, such as file size, etc. */ - - /* Size of the text at current font. */ - int text_dx; - int text_width; - - /* actual size required for rendering the text to display */ - int text_height; - /* actual size that would be required for rendering the entire text if it wasn't ellipsized */ - int text_height_for_entire_text; - /* actual size needed for rendering a “sane amount” of text */ - int text_height_for_layout; - - int editable_text_height; - - /* whether the entire text must always be visible. In that case, - * text_height_for_layout will always be equal to text_height. - * Used for the last line of a line-wise icon layout. */ - guint entire_text : 1; - - /* Highlight state. */ - guint is_highlighted_for_selection : 1; - guint is_highlighted_as_keyboard_focus: 1; - guint is_highlighted_for_drop : 1; - guint is_highlighted_for_clipboard : 1; - guint show_stretch_handles : 1; - guint is_prelit : 1; - - guint rendered_is_highlighted_for_selection : 1; - guint rendered_is_highlighted_for_drop : 1; - guint rendered_is_highlighted_for_clipboard : 1; - guint rendered_is_prelit : 1; - guint rendered_is_focused : 1; - - guint bounds_cached : 1; - - guint is_visible : 1; - - /* Cached PangoLayouts. Only used if the icon is visible */ - PangoLayout *editable_text_layout; - PangoLayout *additional_text_layout; - - /* Cached rectangle in canvas coordinates */ - EelIRect icon_rect; - EelIRect text_rect; - - EelIRect bounds_cache; - EelIRect bounds_cache_for_layout; - EelIRect bounds_cache_for_entire_item; - - GdkWindow *cursor_window; - - /* Accessibility bits */ - GailTextUtil *text_util; +struct NautilusCanvasItemDetails +{ + /* The image, text, font. */ + double x, y; + GdkPixbuf *pixbuf; + cairo_surface_t *rendered_surface; + char *editable_text; /* Text that can be modified by a renaming function */ + char *additional_text; /* Text that cannot be modifed, such as file size, etc. */ + + /* Size of the text at current font. */ + int text_dx; + int text_width; + + /* actual size required for rendering the text to display */ + int text_height; + /* actual size that would be required for rendering the entire text if it wasn't ellipsized */ + int text_height_for_entire_text; + /* actual size needed for rendering a “sane amount” of text */ + int text_height_for_layout; + + int editable_text_height; + + /* whether the entire text must always be visible. In that case, + * text_height_for_layout will always be equal to text_height. + * Used for the last line of a line-wise icon layout. */ + guint entire_text : 1; + + /* Highlight state. */ + guint is_highlighted_for_selection : 1; + guint is_highlighted_as_keyboard_focus : 1; + guint is_highlighted_for_drop : 1; + guint is_highlighted_for_clipboard : 1; + guint show_stretch_handles : 1; + guint is_prelit : 1; + + guint rendered_is_highlighted_for_selection : 1; + guint rendered_is_highlighted_for_drop : 1; + guint rendered_is_highlighted_for_clipboard : 1; + guint rendered_is_prelit : 1; + guint rendered_is_focused : 1; + + guint bounds_cached : 1; + + guint is_visible : 1; + + /* Cached PangoLayouts. Only used if the icon is visible */ + PangoLayout *editable_text_layout; + PangoLayout *additional_text_layout; + + /* Cached rectangle in canvas coordinates */ + EelIRect icon_rect; + EelIRect text_rect; + + EelIRect bounds_cache; + EelIRect bounds_cache_for_layout; + EelIRect bounds_cache_for_entire_item; + + GdkWindow *cursor_window; + + /* Accessibility bits */ + GailTextUtil *text_util; }; /* Object argument IDs. */ -enum { - PROP_0, - PROP_EDITABLE_TEXT, - PROP_ADDITIONAL_TEXT, - PROP_HIGHLIGHTED_FOR_SELECTION, - PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS, - PROP_HIGHLIGHTED_FOR_DROP, - PROP_HIGHLIGHTED_FOR_CLIPBOARD +enum +{ + PROP_0, + PROP_EDITABLE_TEXT, + PROP_ADDITIONAL_TEXT, + PROP_HIGHLIGHTED_FOR_SELECTION, + PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS, + PROP_HIGHLIGHTED_FOR_DROP, + PROP_HIGHLIGHTED_FOR_CLIPBOARD }; -typedef enum { - RIGHT_SIDE, - BOTTOM_SIDE, - LEFT_SIDE, - TOP_SIDE +typedef enum +{ + RIGHT_SIDE, + BOTTOM_SIDE, + LEFT_SIDE, + TOP_SIDE } RectangleSide; static void nautilus_canvas_item_text_interface_init (EelAccessibleTextIface *iface); static GType nautilus_canvas_item_accessible_factory_get_type (void); G_DEFINE_TYPE_WITH_CODE (NautilusCanvasItem, nautilus_canvas_item, EEL_TYPE_CANVAS_ITEM, - G_IMPLEMENT_INTERFACE (EEL_TYPE_ACCESSIBLE_TEXT, - nautilus_canvas_item_text_interface_init)); + G_IMPLEMENT_INTERFACE (EEL_TYPE_ACCESSIBLE_TEXT, + nautilus_canvas_item_text_interface_init)); /* private */ -static void get_icon_rectangle (NautilusCanvasItem *item, - EelIRect *rect); -static void draw_pixbuf (GdkPixbuf *pixbuf, - cairo_t *cr, - int x, - int y); -static PangoLayout *get_label_layout (PangoLayout **layout, - NautilusCanvasItem *item, - const char *text); -static gboolean hit_test_stretch_handle (NautilusCanvasItem *item, - EelIRect icon_rect, - GtkCornerType *corner); +static void get_icon_rectangle (NautilusCanvasItem *item, + EelIRect *rect); +static void draw_pixbuf (GdkPixbuf *pixbuf, + cairo_t *cr, + int x, + int y); +static PangoLayout *get_label_layout (PangoLayout **layout, + NautilusCanvasItem *item, + const char *text); +static gboolean hit_test_stretch_handle (NautilusCanvasItem *item, + EelIRect icon_rect, + GtkCornerType *corner); ; static void nautilus_canvas_item_ensure_bounds_up_to_date (NautilusCanvasItem *canvas_item); @@ -183,50 +185,56 @@ static void nautilus_canvas_item_ensure_bounds_up_to_date (NautilusCanvasI static void nautilus_canvas_item_init (NautilusCanvasItem *canvas_item) { - canvas_item->details = G_TYPE_INSTANCE_GET_PRIVATE ((canvas_item), NAUTILUS_TYPE_CANVAS_ITEM, NautilusCanvasItemDetails); - nautilus_canvas_item_invalidate_label_size (canvas_item); + canvas_item->details = G_TYPE_INSTANCE_GET_PRIVATE ((canvas_item), NAUTILUS_TYPE_CANVAS_ITEM, NautilusCanvasItemDetails); + nautilus_canvas_item_invalidate_label_size (canvas_item); } static void nautilus_canvas_item_finalize (GObject *object) { - NautilusCanvasItemDetails *details; + NautilusCanvasItemDetails *details; + + g_assert (NAUTILUS_IS_CANVAS_ITEM (object)); - g_assert (NAUTILUS_IS_CANVAS_ITEM (object)); + details = NAUTILUS_CANVAS_ITEM (object)->details; - details = NAUTILUS_CANVAS_ITEM (object)->details; + if (details->cursor_window != NULL) + { + gdk_window_set_cursor (details->cursor_window, NULL); + g_object_unref (details->cursor_window); + } - if (details->cursor_window != NULL) { - gdk_window_set_cursor (details->cursor_window, NULL); - g_object_unref (details->cursor_window); - } + if (details->pixbuf != NULL) + { + g_object_unref (details->pixbuf); + } - if (details->pixbuf != NULL) { - g_object_unref (details->pixbuf); - } - - if (details->text_util != NULL) { - g_object_unref (details->text_util); - } + if (details->text_util != NULL) + { + g_object_unref (details->text_util); + } - g_free (details->editable_text); - g_free (details->additional_text); + g_free (details->editable_text); + g_free (details->additional_text); - if (details->rendered_surface != NULL) { - cairo_surface_destroy (details->rendered_surface); - } + if (details->rendered_surface != NULL) + { + cairo_surface_destroy (details->rendered_surface); + } - if (details->editable_text_layout != NULL) { - g_object_unref (details->editable_text_layout); - } + if (details->editable_text_layout != NULL) + { + g_object_unref (details->editable_text_layout); + } - if (details->additional_text_layout != NULL) { - g_object_unref (details->additional_text_layout); - } + if (details->additional_text_layout != NULL) + { + g_object_unref (details->additional_text_layout); + } - G_OBJECT_CLASS (nautilus_canvas_item_parent_class)->finalize (object); + G_OBJECT_CLASS (nautilus_canvas_item_parent_class)->finalize (object); } - + /* Currently we require pixbufs in this format (for hit testing). * Perhaps gdk-pixbuf will be changed so it can do the hit testing * and we won't have this requirement any more. @@ -234,229 +242,274 @@ nautilus_canvas_item_finalize (GObject *object) static gboolean pixbuf_is_acceptable (GdkPixbuf *pixbuf) { - return gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB - && ((!gdk_pixbuf_get_has_alpha (pixbuf) - && gdk_pixbuf_get_n_channels (pixbuf) == 3) - || (gdk_pixbuf_get_has_alpha (pixbuf) - && gdk_pixbuf_get_n_channels (pixbuf) == 4)) - && gdk_pixbuf_get_bits_per_sample (pixbuf) == 8; + return gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB + && ((!gdk_pixbuf_get_has_alpha (pixbuf) + && gdk_pixbuf_get_n_channels (pixbuf) == 3) + || (gdk_pixbuf_get_has_alpha (pixbuf) + && gdk_pixbuf_get_n_channels (pixbuf) == 4)) + && gdk_pixbuf_get_bits_per_sample (pixbuf) == 8; } static void nautilus_canvas_item_invalidate_bounds_cache (NautilusCanvasItem *item) { - item->details->bounds_cached = FALSE; + item->details->bounds_cached = FALSE; } /* invalidate the text width and height cached in the item details. */ void nautilus_canvas_item_invalidate_label_size (NautilusCanvasItem *item) { - if (item->details->editable_text_layout != NULL) { - pango_layout_context_changed (item->details->editable_text_layout); - } - if (item->details->additional_text_layout != NULL) { - pango_layout_context_changed (item->details->additional_text_layout); - } - nautilus_canvas_item_invalidate_bounds_cache (item); - item->details->text_width = -1; - item->details->text_height = -1; - item->details->text_height_for_layout = -1; - item->details->text_height_for_entire_text = -1; - item->details->editable_text_height = -1; + if (item->details->editable_text_layout != NULL) + { + pango_layout_context_changed (item->details->editable_text_layout); + } + if (item->details->additional_text_layout != NULL) + { + pango_layout_context_changed (item->details->additional_text_layout); + } + nautilus_canvas_item_invalidate_bounds_cache (item); + item->details->text_width = -1; + item->details->text_height = -1; + item->details->text_height_for_layout = -1; + item->details->text_height_for_entire_text = -1; + item->details->editable_text_height = -1; } /* Set property handler for the canvas item. */ static void -nautilus_canvas_item_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - NautilusCanvasItem *item; - NautilusCanvasItemDetails *details; - AtkObject *accessible; - - item = NAUTILUS_CANVAS_ITEM (object); - accessible = atk_gobject_accessible_for_object (G_OBJECT (item)); - details = item->details; - - switch (property_id) { - - case PROP_EDITABLE_TEXT: - if (g_strcmp0 (details->editable_text, - g_value_get_string (value)) == 0) { - return; - } - - g_free (details->editable_text); - details->editable_text = g_strdup (g_value_get_string (value)); - if (details->text_util) { - gail_text_util_text_setup (details->text_util, - details->editable_text); - g_object_notify (G_OBJECT(accessible), "accessible-name"); - } - - nautilus_canvas_item_invalidate_label_size (item); - if (details->editable_text_layout) { - g_object_unref (details->editable_text_layout); - details->editable_text_layout = NULL; - } - break; - - case PROP_ADDITIONAL_TEXT: - if (g_strcmp0 (details->additional_text, - g_value_get_string (value)) == 0) { - return; - } - - g_free (details->additional_text); - details->additional_text = g_strdup (g_value_get_string (value)); - - nautilus_canvas_item_invalidate_label_size (item); - if (details->additional_text_layout) { - g_object_unref (details->additional_text_layout); - details->additional_text_layout = NULL; - } - break; - - case PROP_HIGHLIGHTED_FOR_SELECTION: - if (!details->is_highlighted_for_selection == !g_value_get_boolean (value)) { - return; - } - details->is_highlighted_for_selection = g_value_get_boolean (value); - nautilus_canvas_item_invalidate_label_size (item); - - atk_object_notify_state_change (accessible, ATK_STATE_SELECTED, - details->is_highlighted_for_selection); - - break; - +nautilus_canvas_item_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + NautilusCanvasItem *item; + NautilusCanvasItemDetails *details; + AtkObject *accessible; + + item = NAUTILUS_CANVAS_ITEM (object); + accessible = atk_gobject_accessible_for_object (G_OBJECT (item)); + details = item->details; + + switch (property_id) + { + case PROP_EDITABLE_TEXT: + { + if (g_strcmp0 (details->editable_text, + g_value_get_string (value)) == 0) + { + return; + } + + g_free (details->editable_text); + details->editable_text = g_strdup (g_value_get_string (value)); + if (details->text_util) + { + gail_text_util_text_setup (details->text_util, + details->editable_text); + g_object_notify (G_OBJECT (accessible), "accessible-name"); + } + + nautilus_canvas_item_invalidate_label_size (item); + if (details->editable_text_layout) + { + g_object_unref (details->editable_text_layout); + details->editable_text_layout = NULL; + } + } + break; + + case PROP_ADDITIONAL_TEXT: + { + if (g_strcmp0 (details->additional_text, + g_value_get_string (value)) == 0) + { + return; + } + + g_free (details->additional_text); + details->additional_text = g_strdup (g_value_get_string (value)); + + nautilus_canvas_item_invalidate_label_size (item); + if (details->additional_text_layout) + { + g_object_unref (details->additional_text_layout); + details->additional_text_layout = NULL; + } + } + break; + + case PROP_HIGHLIGHTED_FOR_SELECTION: + { + if (!details->is_highlighted_for_selection == !g_value_get_boolean (value)) + { + return; + } + details->is_highlighted_for_selection = g_value_get_boolean (value); + nautilus_canvas_item_invalidate_label_size (item); + + atk_object_notify_state_change (accessible, ATK_STATE_SELECTED, + details->is_highlighted_for_selection); + } + break; + case PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS: - if (!details->is_highlighted_as_keyboard_focus == !g_value_get_boolean (value)) { - return; - } - details->is_highlighted_as_keyboard_focus = g_value_get_boolean (value); - - atk_object_notify_state_change (accessible, ATK_STATE_FOCUSED, - details->is_highlighted_as_keyboard_focus); - break; - + { + if (!details->is_highlighted_as_keyboard_focus == !g_value_get_boolean (value)) + { + return; + } + details->is_highlighted_as_keyboard_focus = g_value_get_boolean (value); + + atk_object_notify_state_change (accessible, ATK_STATE_FOCUSED, + details->is_highlighted_as_keyboard_focus); + } + break; + case PROP_HIGHLIGHTED_FOR_DROP: - if (!details->is_highlighted_for_drop == !g_value_get_boolean (value)) { - return; - } - details->is_highlighted_for_drop = g_value_get_boolean (value); - break; - - case PROP_HIGHLIGHTED_FOR_CLIPBOARD: - if (!details->is_highlighted_for_clipboard == !g_value_get_boolean (value)) { - return; - } - details->is_highlighted_for_clipboard = g_value_get_boolean (value); - break; - - default: - g_warning ("nautilus_canvas_item_set_property on unknown argument"); - return; - } - - eel_canvas_item_request_update (EEL_CANVAS_ITEM (object)); + { + if (!details->is_highlighted_for_drop == !g_value_get_boolean (value)) + { + return; + } + details->is_highlighted_for_drop = g_value_get_boolean (value); + } + break; + + case PROP_HIGHLIGHTED_FOR_CLIPBOARD: + { + if (!details->is_highlighted_for_clipboard == !g_value_get_boolean (value)) + { + return; + } + details->is_highlighted_for_clipboard = g_value_get_boolean (value); + } + break; + + default: + g_warning ("nautilus_canvas_item_set_property on unknown argument"); + return; + } + + eel_canvas_item_request_update (EEL_CANVAS_ITEM (object)); } /* Get property handler for the canvas item */ static void -nautilus_canvas_item_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - NautilusCanvasItemDetails *details; - - details = NAUTILUS_CANVAS_ITEM (object)->details; - - switch (property_id) { - - case PROP_EDITABLE_TEXT: - g_value_set_string (value, details->editable_text); - break; - - case PROP_ADDITIONAL_TEXT: - g_value_set_string (value, details->additional_text); - break; - +nautilus_canvas_item_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + NautilusCanvasItemDetails *details; + + details = NAUTILUS_CANVAS_ITEM (object)->details; + + switch (property_id) + { + case PROP_EDITABLE_TEXT: + { + g_value_set_string (value, details->editable_text); + } + break; + + case PROP_ADDITIONAL_TEXT: + { + g_value_set_string (value, details->additional_text); + } + break; + case PROP_HIGHLIGHTED_FOR_SELECTION: - g_value_set_boolean (value, details->is_highlighted_for_selection); - break; - + { + g_value_set_boolean (value, details->is_highlighted_for_selection); + } + break; + case PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS: - g_value_set_boolean (value, details->is_highlighted_as_keyboard_focus); - break; - + { + g_value_set_boolean (value, details->is_highlighted_as_keyboard_focus); + } + break; + case PROP_HIGHLIGHTED_FOR_DROP: - g_value_set_boolean (value, details->is_highlighted_for_drop); - break; + { + g_value_set_boolean (value, details->is_highlighted_for_drop); + } + break; - case PROP_HIGHLIGHTED_FOR_CLIPBOARD: - g_value_set_boolean (value, details->is_highlighted_for_clipboard); - break; + case PROP_HIGHLIGHTED_FOR_CLIPBOARD: + { + g_value_set_boolean (value, details->is_highlighted_for_clipboard); + } + break; default: - g_warning ("invalid property %d", property_id); - break; - } + { + g_warning ("invalid property %d", property_id); + } + break; + } } static void get_scaled_icon_size (NautilusCanvasItem *item, - gint *width, - gint *height) -{ - EelCanvas *canvas; - GdkPixbuf *pixbuf = NULL; - gint scale; - - if (item != NULL) { - canvas = EEL_CANVAS_ITEM (item)->canvas; - scale = gtk_widget_get_scale_factor (GTK_WIDGET (canvas)); - pixbuf = item->details->pixbuf; - } - - if (width) - *width = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_width (pixbuf) / scale); - if (height) - *height = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_height (pixbuf) / scale); + gint *width, + gint *height) +{ + EelCanvas *canvas; + GdkPixbuf *pixbuf = NULL; + gint scale; + + if (item != NULL) + { + canvas = EEL_CANVAS_ITEM (item)->canvas; + scale = gtk_widget_get_scale_factor (GTK_WIDGET (canvas)); + pixbuf = item->details->pixbuf; + } + + if (width) + { + *width = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_width (pixbuf) / scale); + } + if (height) + { + *height = (pixbuf == NULL) ? 0 : (gdk_pixbuf_get_height (pixbuf) / scale); + } } void nautilus_canvas_item_set_image (NautilusCanvasItem *item, - GdkPixbuf *image) -{ - NautilusCanvasItemDetails *details; - - g_return_if_fail (NAUTILUS_IS_CANVAS_ITEM (item)); - g_return_if_fail (image == NULL || pixbuf_is_acceptable (image)); - - details = item->details; - if (details->pixbuf == image) { - return; - } - - if (image != NULL) { - g_object_ref (image); - } - if (details->pixbuf != NULL) { - g_object_unref (details->pixbuf); - } - if (details->rendered_surface != NULL) { - cairo_surface_destroy (details->rendered_surface); - details->rendered_surface = NULL; - } - - details->pixbuf = image; - - nautilus_canvas_item_invalidate_bounds_cache (item); - eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); + GdkPixbuf *image) +{ + NautilusCanvasItemDetails *details; + + g_return_if_fail (NAUTILUS_IS_CANVAS_ITEM (item)); + g_return_if_fail (image == NULL || pixbuf_is_acceptable (image)); + + details = item->details; + if (details->pixbuf == image) + { + return; + } + + if (image != NULL) + { + g_object_ref (image); + } + if (details->pixbuf != NULL) + { + g_object_unref (details->pixbuf); + } + if (details->rendered_surface != NULL) + { + cairo_surface_destroy (details->rendered_surface); + details->rendered_surface = NULL; + } + + details->pixbuf = image; + + nautilus_canvas_item_invalidate_bounds_cache (item); + eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); } /* Recomputes the bounding box of a canvas item. @@ -465,152 +518,166 @@ nautilus_canvas_item_set_image (NautilusCanvasItem *item, */ static void recompute_bounding_box (NautilusCanvasItem *canvas_item, - double i2w_dx, double i2w_dy) + double i2w_dx, + double i2w_dy) { - /* The bounds stored in the item is the same as what get_bounds - * returns, except it's in canvas coordinates instead of the item's - * parent's coordinates. - */ + /* The bounds stored in the item is the same as what get_bounds + * returns, except it's in canvas coordinates instead of the item's + * parent's coordinates. + */ - EelCanvasItem *item; - EelDRect bounds_rect; + EelCanvasItem *item; + EelDRect bounds_rect; - item = EEL_CANVAS_ITEM (canvas_item); + item = EEL_CANVAS_ITEM (canvas_item); - eel_canvas_item_get_bounds (item, - &bounds_rect.x0, &bounds_rect.y0, - &bounds_rect.x1, &bounds_rect.y1); + eel_canvas_item_get_bounds (item, + &bounds_rect.x0, &bounds_rect.y0, + &bounds_rect.x1, &bounds_rect.y1); - bounds_rect.x0 += i2w_dx; - bounds_rect.y0 += i2w_dy; - bounds_rect.x1 += i2w_dx; - bounds_rect.y1 += i2w_dy; - eel_canvas_w2c_d (item->canvas, - bounds_rect.x0, bounds_rect.y0, - &item->x1, &item->y1); - eel_canvas_w2c_d (item->canvas, - bounds_rect.x1, bounds_rect.y1, - &item->x2, &item->y2); + bounds_rect.x0 += i2w_dx; + bounds_rect.y0 += i2w_dy; + bounds_rect.x1 += i2w_dx; + bounds_rect.y1 += i2w_dy; + eel_canvas_w2c_d (item->canvas, + bounds_rect.x0, bounds_rect.y0, + &item->x1, &item->y1); + eel_canvas_w2c_d (item->canvas, + bounds_rect.x1, bounds_rect.y1, + &item->x2, &item->y2); } static EelIRect -compute_text_rectangle (const NautilusCanvasItem *item, - EelIRect icon_rectangle, - gboolean canvas_coords, - NautilusCanvasItemBoundsUsage usage) -{ - EelIRect text_rectangle; - double pixels_per_unit; - double text_width, text_height, text_height_for_layout, text_height_for_entire_text, real_text_height; - - pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; - if (canvas_coords) { - text_width = item->details->text_width; - text_height = item->details->text_height; - text_height_for_layout = item->details->text_height_for_layout; - text_height_for_entire_text = item->details->text_height_for_entire_text; - } else { - text_width = item->details->text_width / pixels_per_unit; - text_height = item->details->text_height / pixels_per_unit; - text_height_for_layout = item->details->text_height_for_layout / pixels_per_unit; - text_height_for_entire_text = item->details->text_height_for_entire_text / pixels_per_unit; - } - - text_rectangle.x0 = (icon_rectangle.x0 + icon_rectangle.x1) / 2 - (int) text_width / 2; - text_rectangle.y0 = icon_rectangle.y1; - text_rectangle.x1 = text_rectangle.x0 + text_width; - - if (usage == BOUNDS_USAGE_FOR_LAYOUT) { - real_text_height = text_height_for_layout; - } else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) { - real_text_height = text_height_for_entire_text; - } else if (usage == BOUNDS_USAGE_FOR_DISPLAY) { - real_text_height = text_height; - } else { - g_assert_not_reached (); - } - - text_rectangle.y1 = text_rectangle.y0 + real_text_height + LABEL_OFFSET / pixels_per_unit; - - return text_rectangle; +compute_text_rectangle (const NautilusCanvasItem *item, + EelIRect icon_rectangle, + gboolean canvas_coords, + NautilusCanvasItemBoundsUsage usage) +{ + EelIRect text_rectangle; + double pixels_per_unit; + double text_width, text_height, text_height_for_layout, text_height_for_entire_text, real_text_height; + + pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; + if (canvas_coords) + { + text_width = item->details->text_width; + text_height = item->details->text_height; + text_height_for_layout = item->details->text_height_for_layout; + text_height_for_entire_text = item->details->text_height_for_entire_text; + } + else + { + text_width = item->details->text_width / pixels_per_unit; + text_height = item->details->text_height / pixels_per_unit; + text_height_for_layout = item->details->text_height_for_layout / pixels_per_unit; + text_height_for_entire_text = item->details->text_height_for_entire_text / pixels_per_unit; + } + + text_rectangle.x0 = (icon_rectangle.x0 + icon_rectangle.x1) / 2 - (int) text_width / 2; + text_rectangle.y0 = icon_rectangle.y1; + text_rectangle.x1 = text_rectangle.x0 + text_width; + + if (usage == BOUNDS_USAGE_FOR_LAYOUT) + { + real_text_height = text_height_for_layout; + } + else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) + { + real_text_height = text_height_for_entire_text; + } + else if (usage == BOUNDS_USAGE_FOR_DISPLAY) + { + real_text_height = text_height; + } + else + { + g_assert_not_reached (); + } + + text_rectangle.y1 = text_rectangle.y0 + real_text_height + LABEL_OFFSET / pixels_per_unit; + + return text_rectangle; } static EelIRect get_current_canvas_bounds (EelCanvasItem *item) { - EelIRect bounds; + EelIRect bounds; - g_assert (EEL_IS_CANVAS_ITEM (item)); + g_assert (EEL_IS_CANVAS_ITEM (item)); - bounds.x0 = item->x1; - bounds.y0 = item->y1; - bounds.x1 = item->x2; - bounds.y1 = item->y2; + bounds.x0 = item->x1; + bounds.y0 = item->y1; + bounds.x1 = item->x2; + bounds.y1 = item->y2; - return bounds; + return bounds; } void nautilus_canvas_item_update_bounds (NautilusCanvasItem *item, - double i2w_dx, double i2w_dy) -{ - EelIRect before, after; - EelCanvasItem *canvas_item; - - canvas_item = EEL_CANVAS_ITEM (item); - - /* Compute new bounds. */ - before = get_current_canvas_bounds (canvas_item); - recompute_bounding_box (item, i2w_dx, i2w_dy); - after = get_current_canvas_bounds (canvas_item); - - /* If the bounds didn't change, we are done. */ - if (eel_irect_equal (before, after)) { - return; - } - - /* Update canvas and text rect cache */ - get_icon_rectangle (item, &item->details->icon_rect); - item->details->text_rect = compute_text_rectangle (item, item->details->icon_rect, - TRUE, BOUNDS_USAGE_FOR_DISPLAY); - - /* queue a redraw. */ - eel_canvas_request_redraw (canvas_item->canvas, - before.x0, before.y0, - before.x1 + 1, before.y1 + 1); + double i2w_dx, + double i2w_dy) +{ + EelIRect before, after; + EelCanvasItem *canvas_item; + + canvas_item = EEL_CANVAS_ITEM (item); + + /* Compute new bounds. */ + before = get_current_canvas_bounds (canvas_item); + recompute_bounding_box (item, i2w_dx, i2w_dy); + after = get_current_canvas_bounds (canvas_item); + + /* If the bounds didn't change, we are done. */ + if (eel_irect_equal (before, after)) + { + return; + } + + /* Update canvas and text rect cache */ + get_icon_rectangle (item, &item->details->icon_rect); + item->details->text_rect = compute_text_rectangle (item, item->details->icon_rect, + TRUE, BOUNDS_USAGE_FOR_DISPLAY); + + /* queue a redraw. */ + eel_canvas_request_redraw (canvas_item->canvas, + before.x0, before.y0, + before.x1 + 1, before.y1 + 1); } /* Update handler for the canvas canvas item. */ static void nautilus_canvas_item_update (EelCanvasItem *item, - double i2w_dx, double i2w_dy, - gint flags) + double i2w_dx, + double i2w_dy, + gint flags) { - nautilus_canvas_item_update_bounds (NAUTILUS_CANVAS_ITEM (item), i2w_dx, i2w_dy); + nautilus_canvas_item_update_bounds (NAUTILUS_CANVAS_ITEM (item), i2w_dx, i2w_dy); - eel_canvas_item_request_redraw (EEL_CANVAS_ITEM (item)); + eel_canvas_item_request_redraw (EEL_CANVAS_ITEM (item)); - EEL_CANVAS_ITEM_CLASS (nautilus_canvas_item_parent_class)->update (item, i2w_dx, i2w_dy, flags); + EEL_CANVAS_ITEM_CLASS (nautilus_canvas_item_parent_class)->update (item, i2w_dx, i2w_dy, flags); } /* Rendering */ static gboolean in_single_click_mode (void) { - int click_policy; + int click_policy; - click_policy = g_settings_get_enum (nautilus_preferences, - NAUTILUS_PREFERENCES_CLICK_POLICY); + click_policy = g_settings_get_enum (nautilus_preferences, + NAUTILUS_PREFERENCES_CLICK_POLICY); - return click_policy == NAUTILUS_CLICK_POLICY_SINGLE; + return click_policy == NAUTILUS_CLICK_POLICY_SINGLE; } /* Keep these for a bit while we work on performance of draw_or_measure_label_text. */ /* - #define PERFORMANCE_TEST_DRAW_DISABLE - #define PERFORMANCE_TEST_MEASURE_DISABLE -*/ + #define PERFORMANCE_TEST_DRAW_DISABLE + #define PERFORMANCE_TEST_MEASURE_DISABLE + */ /* This gets the size of the layout from the position of the layout. * This means that if the layout is right aligned we get the full width @@ -618,1183 +685,1315 @@ in_single_click_mode (void) */ static void layout_get_full_size (PangoLayout *layout, - int *width, - int *height, - int *dx) + int *width, + int *height, + int *dx) { - PangoRectangle logical_rect; - int the_width, total_width; - - pango_layout_get_extents (layout, NULL, &logical_rect); - the_width = (logical_rect.width + PANGO_SCALE / 2) / PANGO_SCALE; - total_width = (logical_rect.x + logical_rect.width + PANGO_SCALE / 2) / PANGO_SCALE; + PangoRectangle logical_rect; + int the_width, total_width; + + pango_layout_get_extents (layout, NULL, &logical_rect); + the_width = (logical_rect.width + PANGO_SCALE / 2) / PANGO_SCALE; + total_width = (logical_rect.x + logical_rect.width + PANGO_SCALE / 2) / PANGO_SCALE; - if (width != NULL) { - *width = the_width; - } + if (width != NULL) + { + *width = the_width; + } - if (height != NULL) { - *height = (logical_rect.height + PANGO_SCALE / 2) / PANGO_SCALE; - } + if (height != NULL) + { + *height = (logical_rect.height + PANGO_SCALE / 2) / PANGO_SCALE; + } - if (dx != NULL) { - *dx = total_width - the_width; - } + if (dx != NULL) + { + *dx = total_width - the_width; + } } static void layout_get_size_for_layout (PangoLayout *layout, - int max_layout_line_count, - int height_for_entire_text, - int *height_for_layout) -{ - PangoLayoutIter *iter; - PangoRectangle logical_rect; - int i; - - /* only use the first max_layout_line_count lines for the gridded auto layout */ - if (pango_layout_get_line_count (layout) <= max_layout_line_count) { - *height_for_layout = height_for_entire_text; - } else { - *height_for_layout = 0; - iter = pango_layout_get_iter (layout); - for (i = 0; i < max_layout_line_count; i++) { - pango_layout_iter_get_line_extents (iter, NULL, &logical_rect); - *height_for_layout += (logical_rect.height + PANGO_SCALE / 2) / PANGO_SCALE; - - if (!pango_layout_iter_next_line (iter)) { - break; - } - - *height_for_layout += pango_layout_get_spacing (layout); - } - pango_layout_iter_free (iter); - } + int max_layout_line_count, + int height_for_entire_text, + int *height_for_layout) +{ + PangoLayoutIter *iter; + PangoRectangle logical_rect; + int i; + + /* only use the first max_layout_line_count lines for the gridded auto layout */ + if (pango_layout_get_line_count (layout) <= max_layout_line_count) + { + *height_for_layout = height_for_entire_text; + } + else + { + *height_for_layout = 0; + iter = pango_layout_get_iter (layout); + for (i = 0; i < max_layout_line_count; i++) + { + pango_layout_iter_get_line_extents (iter, NULL, &logical_rect); + *height_for_layout += (logical_rect.height + PANGO_SCALE / 2) / PANGO_SCALE; + + if (!pango_layout_iter_next_line (iter)) + { + break; + } + + *height_for_layout += pango_layout_get_spacing (layout); + } + pango_layout_iter_free (iter); + } } static double nautilus_canvas_item_get_max_text_width (NautilusCanvasItem *item) { - EelCanvasItem *canvas_item; - NautilusCanvasContainer *container; - guint max_text_width; + EelCanvasItem *canvas_item; + NautilusCanvasContainer *container; + guint max_text_width; + + + canvas_item = EEL_CANVAS_ITEM (item); + container = NAUTILUS_CANVAS_CONTAINER (canvas_item->canvas); + + switch (nautilus_canvas_container_get_zoom_level (container)) + { + case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: + { + max_text_width = MAX_TEXT_WIDTH_SMALL; + } + break; + + case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: + { + max_text_width = MAX_TEXT_WIDTH_STANDARD; + } + break; + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: + { + max_text_width = MAX_TEXT_WIDTH_LARGE; + } + break; - canvas_item = EEL_CANVAS_ITEM (item); - container = NAUTILUS_CANVAS_CONTAINER (canvas_item->canvas); + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: + { + max_text_width = MAX_TEXT_WIDTH_LARGER; + } + break; - switch (nautilus_canvas_container_get_zoom_level (container)) { - case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: - max_text_width = MAX_TEXT_WIDTH_SMALL; - break; - case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: - max_text_width = MAX_TEXT_WIDTH_STANDARD; - break; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: - max_text_width = MAX_TEXT_WIDTH_LARGE; - break; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: - max_text_width = MAX_TEXT_WIDTH_LARGER; - break; - default: - g_warning ("Zoom level not valid. This may incur in missaligned grid"); - max_text_width = MAX_TEXT_WIDTH_STANDARD; - } + default: + g_warning ("Zoom level not valid. This may incur in missaligned grid"); + max_text_width = MAX_TEXT_WIDTH_STANDARD; + } - return max_text_width * canvas_item->canvas->pixels_per_unit - 2 * TEXT_BACK_PADDING_X; + return max_text_width * canvas_item->canvas->pixels_per_unit - 2 * TEXT_BACK_PADDING_X; } static void prepare_pango_layout_width (NautilusCanvasItem *item, - PangoLayout *layout) + PangoLayout *layout) { - pango_layout_set_width (layout, floor (nautilus_canvas_item_get_max_text_width (item)) * PANGO_SCALE); - pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); + pango_layout_set_width (layout, floor (nautilus_canvas_item_get_max_text_width (item)) * PANGO_SCALE); + pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); } static void prepare_pango_layout_for_measure_entire_text (NautilusCanvasItem *item, - PangoLayout *layout) + PangoLayout *layout) { - prepare_pango_layout_width (item, layout); - pango_layout_set_height (layout, G_MININT); + prepare_pango_layout_width (item, layout); + pango_layout_set_height (layout, G_MININT); } static void prepare_pango_layout_for_draw (NautilusCanvasItem *item, - PangoLayout *layout) + PangoLayout *layout) { - NautilusCanvasItemDetails *details; - NautilusCanvasContainer *container; - gboolean needs_highlight; + NautilusCanvasItemDetails *details; + NautilusCanvasContainer *container; + gboolean needs_highlight; - prepare_pango_layout_width (item, layout); + prepare_pango_layout_width (item, layout); - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - details = item->details; + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + details = item->details; - needs_highlight = details->is_highlighted_for_selection || details->is_highlighted_for_drop; + needs_highlight = details->is_highlighted_for_selection || details->is_highlighted_for_drop; - if (needs_highlight || - details->is_highlighted_as_keyboard_focus || - details->entire_text) { - /* VOODOO-TODO, cf. compute_text_rectangle() */ - pango_layout_set_height (layout, G_MININT); - } else { - /* TODO? we might save some resources, when the re-layout is not neccessary in case - * the layout height already fits into max. layout lines. But pango should figure this - * out itself (which it doesn't ATM). - */ - pango_layout_set_height (layout, - nautilus_canvas_container_get_max_layout_lines_for_pango (container)); - } + if (needs_highlight || + details->is_highlighted_as_keyboard_focus || + details->entire_text) + { + /* VOODOO-TODO, cf. compute_text_rectangle() */ + pango_layout_set_height (layout, G_MININT); + } + else + { + /* TODO? we might save some resources, when the re-layout is not neccessary in case + * the layout height already fits into max. layout lines. But pango should figure this + * out itself (which it doesn't ATM). + */ + pango_layout_set_height (layout, + nautilus_canvas_container_get_max_layout_lines_for_pango (container)); + } } static void measure_label_text (NautilusCanvasItem *item) { - NautilusCanvasItemDetails *details; - NautilusCanvasContainer *container; - gint editable_height, editable_height_for_layout, editable_height_for_entire_text, editable_width, editable_dx; - gint additional_height, additional_width, additional_dx; - PangoLayout *editable_layout; - PangoLayout *additional_layout; - gboolean have_editable, have_additional; - - /* check to see if the cached values are still valid; if so, there's - * no work necessary - */ - - if (item->details->text_width >= 0 && item->details->text_height >= 0) { - return; - } - - details = item->details; - - have_editable = details->editable_text != NULL && details->editable_text[0] != '\0'; - have_additional = details->additional_text != NULL && details->additional_text[0] != '\0'; - - /* No font or no text, then do no work. */ - if (!have_editable && !have_additional) { - details->text_height = 0; - details->text_height_for_layout = 0; - details->text_height_for_entire_text = 0; - details->text_width = 0; - return; - } + NautilusCanvasItemDetails *details; + NautilusCanvasContainer *container; + gint editable_height, editable_height_for_layout, editable_height_for_entire_text, editable_width, editable_dx; + gint additional_height, additional_width, additional_dx; + PangoLayout *editable_layout; + PangoLayout *additional_layout; + gboolean have_editable, have_additional; + + /* check to see if the cached values are still valid; if so, there's + * no work necessary + */ + + if (item->details->text_width >= 0 && item->details->text_height >= 0) + { + return; + } + + details = item->details; + + have_editable = details->editable_text != NULL && details->editable_text[0] != '\0'; + have_additional = details->additional_text != NULL && details->additional_text[0] != '\0'; + + /* No font or no text, then do no work. */ + if (!have_editable && !have_additional) + { + details->text_height = 0; + details->text_height_for_layout = 0; + details->text_height_for_entire_text = 0; + details->text_width = 0; + return; + } #ifdef PERFORMANCE_TEST_MEASURE_DISABLE - /* fake out the width */ - details->text_width = 80; - details->text_height = 20; - details->text_height_for_layout = 20; - details->text_height_for_entire_text = 20; - return; + /* fake out the width */ + details->text_width = 80; + details->text_height = 20; + details->text_height_for_layout = 20; + details->text_height_for_entire_text = 20; + return; #endif - editable_width = 0; - editable_height = 0; - editable_height_for_layout = 0; - editable_height_for_entire_text = 0; - editable_dx = 0; - additional_width = 0; - additional_height = 0; - additional_dx = 0; - - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - editable_layout = NULL; - additional_layout = NULL; - - if (have_editable) { - /* first, measure required text height: editable_height_for_entire_text - * then, measure text height applicable for layout: editable_height_for_layout - * next, measure actually displayed height: editable_height - */ - editable_layout = get_label_layout (&details->editable_text_layout, item, details->editable_text); - - prepare_pango_layout_for_measure_entire_text (item, editable_layout); - layout_get_full_size (editable_layout, - NULL, - &editable_height_for_entire_text, - NULL); - layout_get_size_for_layout (editable_layout, - nautilus_canvas_container_get_max_layout_lines (container), - editable_height_for_entire_text, - &editable_height_for_layout); - - prepare_pango_layout_for_draw (item, editable_layout); - layout_get_full_size (editable_layout, - &editable_width, - &editable_height, - &editable_dx); - } - - if (have_additional) { - additional_layout = get_label_layout (&details->additional_text_layout, item, details->additional_text); - prepare_pango_layout_for_draw (item, additional_layout); - layout_get_full_size (additional_layout, - &additional_width, &additional_height, &additional_dx); - } - - details->editable_text_height = editable_height; - - if (editable_width > additional_width) { - details->text_width = editable_width; - details->text_dx = editable_dx; - } else { - details->text_width = additional_width; - details->text_dx = additional_dx; - } - - if (have_additional) { - details->text_height = editable_height + LABEL_LINE_SPACING + additional_height; - details->text_height_for_layout = editable_height_for_layout + LABEL_LINE_SPACING + additional_height; - details->text_height_for_entire_text = editable_height_for_entire_text + LABEL_LINE_SPACING + additional_height; - } else { - details->text_height = editable_height; - details->text_height_for_layout = editable_height_for_layout; - details->text_height_for_entire_text = editable_height_for_entire_text; - } - - /* add some extra space for highlighting even when we don't highlight so things won't move */ - - /* extra slop for nicer highlighting */ - details->text_height += TEXT_BACK_PADDING_Y*2; - details->text_height_for_layout += TEXT_BACK_PADDING_Y*2; - details->text_height_for_entire_text += TEXT_BACK_PADDING_Y*2; - details->editable_text_height += TEXT_BACK_PADDING_Y*2; - - /* extra to make it look nicer */ - details->text_width += TEXT_BACK_PADDING_X*2; - - if (editable_layout) { - g_object_unref (editable_layout); - } - - if (additional_layout) { - g_object_unref (additional_layout); - } + editable_width = 0; + editable_height = 0; + editable_height_for_layout = 0; + editable_height_for_entire_text = 0; + editable_dx = 0; + additional_width = 0; + additional_height = 0; + additional_dx = 0; + + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + editable_layout = NULL; + additional_layout = NULL; + + if (have_editable) + { + /* first, measure required text height: editable_height_for_entire_text + * then, measure text height applicable for layout: editable_height_for_layout + * next, measure actually displayed height: editable_height + */ + editable_layout = get_label_layout (&details->editable_text_layout, item, details->editable_text); + + prepare_pango_layout_for_measure_entire_text (item, editable_layout); + layout_get_full_size (editable_layout, + NULL, + &editable_height_for_entire_text, + NULL); + layout_get_size_for_layout (editable_layout, + nautilus_canvas_container_get_max_layout_lines (container), + editable_height_for_entire_text, + &editable_height_for_layout); + + prepare_pango_layout_for_draw (item, editable_layout); + layout_get_full_size (editable_layout, + &editable_width, + &editable_height, + &editable_dx); + } + + if (have_additional) + { + additional_layout = get_label_layout (&details->additional_text_layout, item, details->additional_text); + prepare_pango_layout_for_draw (item, additional_layout); + layout_get_full_size (additional_layout, + &additional_width, &additional_height, &additional_dx); + } + + details->editable_text_height = editable_height; + + if (editable_width > additional_width) + { + details->text_width = editable_width; + details->text_dx = editable_dx; + } + else + { + details->text_width = additional_width; + details->text_dx = additional_dx; + } + + if (have_additional) + { + details->text_height = editable_height + LABEL_LINE_SPACING + additional_height; + details->text_height_for_layout = editable_height_for_layout + LABEL_LINE_SPACING + additional_height; + details->text_height_for_entire_text = editable_height_for_entire_text + LABEL_LINE_SPACING + additional_height; + } + else + { + details->text_height = editable_height; + details->text_height_for_layout = editable_height_for_layout; + details->text_height_for_entire_text = editable_height_for_entire_text; + } + + /* add some extra space for highlighting even when we don't highlight so things won't move */ + + /* extra slop for nicer highlighting */ + details->text_height += TEXT_BACK_PADDING_Y * 2; + details->text_height_for_layout += TEXT_BACK_PADDING_Y * 2; + details->text_height_for_entire_text += TEXT_BACK_PADDING_Y * 2; + details->editable_text_height += TEXT_BACK_PADDING_Y * 2; + + /* extra to make it look nicer */ + details->text_width += TEXT_BACK_PADDING_X * 2; + + if (editable_layout) + { + g_object_unref (editable_layout); + } + + if (additional_layout) + { + g_object_unref (additional_layout); + } } static void draw_label_text (NautilusCanvasItem *item, - cairo_t *cr, - EelIRect icon_rect) -{ - NautilusCanvasItemDetails *details; - NautilusCanvasContainer *container; - PangoLayout *editable_layout; - PangoLayout *additional_layout; - GtkStyleContext *context; - GtkStateFlags state, base_state; - gboolean have_editable, have_additional; - gboolean needs_highlight, prelight_label; - EelIRect text_rect; - int x; - int max_text_width; - gdouble frame_w, frame_h, frame_x, frame_y; - gboolean draw_frame = TRUE; + cairo_t *cr, + EelIRect icon_rect) +{ + NautilusCanvasItemDetails *details; + NautilusCanvasContainer *container; + PangoLayout *editable_layout; + PangoLayout *additional_layout; + GtkStyleContext *context; + GtkStateFlags state, base_state; + gboolean have_editable, have_additional; + gboolean needs_highlight, prelight_label; + EelIRect text_rect; + int x; + int max_text_width; + gdouble frame_w, frame_h, frame_x, frame_y; + gboolean draw_frame = TRUE; #ifdef PERFORMANCE_TEST_DRAW_DISABLE - return; + return; #endif - details = item->details; - - measure_label_text (item); - if (details->text_height == 0 || - details->text_width == 0) { - return; - } - - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - context = gtk_widget_get_style_context (GTK_WIDGET (container)); - - text_rect = compute_text_rectangle (item, icon_rect, TRUE, BOUNDS_USAGE_FOR_DISPLAY); - - needs_highlight = details->is_highlighted_for_selection || details->is_highlighted_for_drop; - - editable_layout = NULL; - additional_layout = NULL; - - have_editable = details->editable_text != NULL && details->editable_text[0] != '\0'; - have_additional = details->additional_text != NULL && details->additional_text[0] != '\0'; - g_assert (have_editable || have_additional); - - max_text_width = floor (nautilus_canvas_item_get_max_text_width (item)); - - base_state = gtk_widget_get_state_flags (GTK_WIDGET (container)); - base_state &= ~(GTK_STATE_FLAG_SELECTED | - GTK_STATE_FLAG_PRELIGHT); - state = base_state; - - gtk_widget_style_get (GTK_WIDGET (container), - "activate_prelight_icon_label", &prelight_label, - NULL); - - /* if the canvas is highlighted, do some set-up */ - if (needs_highlight) { - state |= GTK_STATE_FLAG_SELECTED; - - frame_x = text_rect.x0; - frame_y = text_rect.y0; - frame_w = text_rect.x1 - text_rect.x0; - frame_h = text_rect.y1 - text_rect.y0; - } else if (!needs_highlight && have_editable && - details->text_width > 0 && details->text_height > 0 && - prelight_label && item->details->is_prelit) { - state |= GTK_STATE_FLAG_PRELIGHT; - - frame_x = text_rect.x0; - frame_y = text_rect.y0; - frame_w = text_rect.x1 - text_rect.x0; - frame_h = text_rect.y1 - text_rect.y0; - } else { - draw_frame = FALSE; - } + details = item->details; + + measure_label_text (item); + if (details->text_height == 0 || + details->text_width == 0) + { + return; + } + + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + context = gtk_widget_get_style_context (GTK_WIDGET (container)); + + text_rect = compute_text_rectangle (item, icon_rect, TRUE, BOUNDS_USAGE_FOR_DISPLAY); + + needs_highlight = details->is_highlighted_for_selection || details->is_highlighted_for_drop; + + editable_layout = NULL; + additional_layout = NULL; + + have_editable = details->editable_text != NULL && details->editable_text[0] != '\0'; + have_additional = details->additional_text != NULL && details->additional_text[0] != '\0'; + g_assert (have_editable || have_additional); + + max_text_width = floor (nautilus_canvas_item_get_max_text_width (item)); + + base_state = gtk_widget_get_state_flags (GTK_WIDGET (container)); + base_state &= ~(GTK_STATE_FLAG_SELECTED | + GTK_STATE_FLAG_PRELIGHT); + state = base_state; + + gtk_widget_style_get (GTK_WIDGET (container), + "activate_prelight_icon_label", &prelight_label, + NULL); + + /* if the canvas is highlighted, do some set-up */ + if (needs_highlight) + { + state |= GTK_STATE_FLAG_SELECTED; + + frame_x = text_rect.x0; + frame_y = text_rect.y0; + frame_w = text_rect.x1 - text_rect.x0; + frame_h = text_rect.y1 - text_rect.y0; + } + else if (!needs_highlight && have_editable && + details->text_width > 0 && details->text_height > 0 && + prelight_label && item->details->is_prelit) + { + state |= GTK_STATE_FLAG_PRELIGHT; + + frame_x = text_rect.x0; + frame_y = text_rect.y0; + frame_w = text_rect.x1 - text_rect.x0; + frame_h = text_rect.y1 - text_rect.y0; + } + else + { + draw_frame = FALSE; + } + + if (draw_frame) + { + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); + + gtk_render_frame (context, cr, + frame_x, frame_y, + frame_w, frame_h); + gtk_render_background (context, cr, + frame_x, frame_y, + frame_w, frame_h); + + gtk_style_context_restore (context); + } + + x = text_rect.x0 + ((text_rect.x1 - text_rect.x0) - max_text_width) / 2; + + if (have_editable) + { + state = base_state; + + if (prelight_label && item->details->is_prelit) + { + state |= GTK_STATE_FLAG_PRELIGHT; + } - if (draw_frame) { - gtk_style_context_save (context); - gtk_style_context_set_state (context, state); + if (needs_highlight) + { + state |= GTK_STATE_FLAG_SELECTED; + } - gtk_render_frame (context, cr, - frame_x, frame_y, - frame_w, frame_h); - gtk_render_background (context, cr, - frame_x, frame_y, - frame_w, frame_h); + editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); + prepare_pango_layout_for_draw (item, editable_layout); - gtk_style_context_restore (context); - } + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); - x = text_rect.x0 + ((text_rect.x1 - text_rect.x0) - max_text_width) / 2; + gtk_render_layout (context, cr, + x, text_rect.y0 + TEXT_BACK_PADDING_Y, + editable_layout); - if (have_editable) { - state = base_state; + gtk_style_context_restore (context); + } - if (prelight_label && item->details->is_prelit) { - state |= GTK_STATE_FLAG_PRELIGHT; - } + if (have_additional) + { + state = base_state; - if (needs_highlight) { - state |= GTK_STATE_FLAG_SELECTED; - } + if (needs_highlight) + { + state |= GTK_STATE_FLAG_SELECTED; + } - editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); - prepare_pango_layout_for_draw (item, editable_layout); + additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); + prepare_pango_layout_for_draw (item, additional_layout); - gtk_style_context_save (context); - gtk_style_context_set_state (context, state); + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); + gtk_style_context_add_class (context, "dim-label"); - gtk_render_layout (context, cr, - x, text_rect.y0 + TEXT_BACK_PADDING_Y, - editable_layout); + gtk_render_layout (context, cr, + x, text_rect.y0 + details->editable_text_height + LABEL_LINE_SPACING + TEXT_BACK_PADDING_Y, + additional_layout); - gtk_style_context_restore (context); - } + gtk_style_context_restore (context); + } - if (have_additional) { - state = base_state; + if (item->details->is_highlighted_as_keyboard_focus) + { + if (needs_highlight) + { + state = GTK_STATE_FLAG_SELECTED; + } - if (needs_highlight) { - state |= GTK_STATE_FLAG_SELECTED; - } + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); - additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); - prepare_pango_layout_for_draw (item, additional_layout); + gtk_render_focus (context, + cr, + text_rect.x0, + text_rect.y0, + text_rect.x1 - text_rect.x0, + text_rect.y1 - text_rect.y0); - gtk_style_context_save (context); - gtk_style_context_set_state (context, state); - gtk_style_context_add_class (context, "dim-label"); + gtk_style_context_restore (context); + } - gtk_render_layout (context, cr, - x, text_rect.y0 + details->editable_text_height + LABEL_LINE_SPACING + TEXT_BACK_PADDING_Y, - additional_layout); + if (editable_layout != NULL) + { + g_object_unref (editable_layout); + } - gtk_style_context_restore (context); - } - - if (item->details->is_highlighted_as_keyboard_focus) { - if (needs_highlight) { - state = GTK_STATE_FLAG_SELECTED; - } - - gtk_style_context_save (context); - gtk_style_context_set_state (context, state); - - gtk_render_focus (context, - cr, - text_rect.x0, - text_rect.y0, - text_rect.x1 - text_rect.x0, - text_rect.y1 - text_rect.y0); - - gtk_style_context_restore (context); - } - - if (editable_layout != NULL) { - g_object_unref (editable_layout); - } - - if (additional_layout != NULL) { - g_object_unref (additional_layout); - } + if (additional_layout != NULL) + { + g_object_unref (additional_layout); + } } void -nautilus_canvas_item_set_is_visible (NautilusCanvasItem *item, - gboolean visible) +nautilus_canvas_item_set_is_visible (NautilusCanvasItem *item, + gboolean visible) { - if (item->details->is_visible == visible) - return; - - item->details->is_visible = visible; + if (item->details->is_visible == visible) + { + return; + } - if (!visible) { - nautilus_canvas_item_invalidate_label (item); - } + item->details->is_visible = visible; + + if (!visible) + { + nautilus_canvas_item_invalidate_label (item); + } } void -nautilus_canvas_item_invalidate_label (NautilusCanvasItem *item) +nautilus_canvas_item_invalidate_label (NautilusCanvasItem *item) { - nautilus_canvas_item_invalidate_label_size (item); + nautilus_canvas_item_invalidate_label_size (item); - if (item->details->editable_text_layout) { - g_object_unref (item->details->editable_text_layout); - item->details->editable_text_layout = NULL; - } + if (item->details->editable_text_layout) + { + g_object_unref (item->details->editable_text_layout); + item->details->editable_text_layout = NULL; + } - if (item->details->additional_text_layout) { - g_object_unref (item->details->additional_text_layout); - item->details->additional_text_layout = NULL; - } + if (item->details->additional_text_layout) + { + g_object_unref (item->details->additional_text_layout); + item->details->additional_text_layout = NULL; + } } static GdkPixbuf * get_knob_pixbuf (void) { - GdkPixbuf *knob_pixbuf = NULL; - GInputStream *stream = g_resources_open_stream ("/org/gnome/nautilus/icons/knob.png", 0, NULL); + GdkPixbuf *knob_pixbuf = NULL; + GInputStream *stream = g_resources_open_stream ("/org/gnome/nautilus/icons/knob.png", 0, NULL); - if (stream != NULL) { - knob_pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); - g_object_unref (stream); - } + if (stream != NULL) + { + knob_pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); + g_object_unref (stream); + } - return knob_pixbuf; + return knob_pixbuf; } static void draw_stretch_handles (NautilusCanvasItem *item, - cairo_t *cr, - const EelIRect *rect) -{ - GtkWidget *widget; - GdkPixbuf *knob_pixbuf; - int knob_width, knob_height; - double dash = { 2.0 }; - GtkStyleContext *style; - GdkRGBA color; - - if (!item->details->show_stretch_handles) { - return; - } - - widget = GTK_WIDGET (EEL_CANVAS_ITEM (item)->canvas); - style = gtk_widget_get_style_context (widget); - - cairo_save (cr); - knob_pixbuf = get_knob_pixbuf (); - knob_width = gdk_pixbuf_get_width (knob_pixbuf); - knob_height = gdk_pixbuf_get_height (knob_pixbuf); - - /* first draw the box */ - gtk_style_context_get_color (style, GTK_STATE_FLAG_SELECTED, &color); - gdk_cairo_set_source_rgba (cr, &color); - cairo_set_dash (cr, &dash, 1, 0); - cairo_set_line_width (cr, 1.0); - cairo_rectangle (cr, - rect->x0 + 0.5, - rect->y0 + 0.5, - rect->x1 - rect->x0 - 1, - rect->y1 - rect->y0 - 1); - cairo_stroke (cr); - - cairo_restore (cr); - - /* draw the stretch handles themselves */ - draw_pixbuf (knob_pixbuf, cr, rect->x0, rect->y0); - draw_pixbuf (knob_pixbuf, cr, rect->x0, rect->y1 - knob_height); - draw_pixbuf (knob_pixbuf, cr, rect->x1 - knob_width, rect->y0); - draw_pixbuf (knob_pixbuf, cr, rect->x1 - knob_width, rect->y1 - knob_height); - - g_object_unref (knob_pixbuf); + cairo_t *cr, + const EelIRect *rect) +{ + GtkWidget *widget; + GdkPixbuf *knob_pixbuf; + int knob_width, knob_height; + double dash = { 2.0 }; + GtkStyleContext *style; + GdkRGBA color; + + if (!item->details->show_stretch_handles) + { + return; + } + + widget = GTK_WIDGET (EEL_CANVAS_ITEM (item)->canvas); + style = gtk_widget_get_style_context (widget); + + cairo_save (cr); + knob_pixbuf = get_knob_pixbuf (); + knob_width = gdk_pixbuf_get_width (knob_pixbuf); + knob_height = gdk_pixbuf_get_height (knob_pixbuf); + + /* first draw the box */ + gtk_style_context_get_color (style, GTK_STATE_FLAG_SELECTED, &color); + gdk_cairo_set_source_rgba (cr, &color); + cairo_set_dash (cr, &dash, 1, 0); + cairo_set_line_width (cr, 1.0); + cairo_rectangle (cr, + rect->x0 + 0.5, + rect->y0 + 0.5, + rect->x1 - rect->x0 - 1, + rect->y1 - rect->y0 - 1); + cairo_stroke (cr); + + cairo_restore (cr); + + /* draw the stretch handles themselves */ + draw_pixbuf (knob_pixbuf, cr, rect->x0, rect->y0); + draw_pixbuf (knob_pixbuf, cr, rect->x0, rect->y1 - knob_height); + draw_pixbuf (knob_pixbuf, cr, rect->x1 - knob_width, rect->y0); + draw_pixbuf (knob_pixbuf, cr, rect->x1 - knob_width, rect->y1 - knob_height); + + g_object_unref (knob_pixbuf); } static void draw_pixbuf (GdkPixbuf *pixbuf, - cairo_t *cr, - int x, int y) + cairo_t *cr, + int x, + int y) { - cairo_save (cr); - gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y); - cairo_paint (cr); - cairo_restore (cr); + cairo_save (cr); + gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y); + cairo_paint (cr); + cairo_restore (cr); } /* shared code to highlight or dim the passed-in pixbuf */ static cairo_surface_t * real_map_surface (NautilusCanvasItem *canvas_item) { - EelCanvas *canvas; - GdkPixbuf *temp_pixbuf, *old_pixbuf; - GtkStyleContext *style; - GdkRGBA color; - cairo_surface_t *surface; - - temp_pixbuf = canvas_item->details->pixbuf; - canvas = EEL_CANVAS_ITEM(canvas_item)->canvas; + EelCanvas *canvas; + GdkPixbuf *temp_pixbuf, *old_pixbuf; + GtkStyleContext *style; + GdkRGBA color; + cairo_surface_t *surface; - g_object_ref (temp_pixbuf); + temp_pixbuf = canvas_item->details->pixbuf; + canvas = EEL_CANVAS_ITEM (canvas_item)->canvas; - if (canvas_item->details->is_prelit || - canvas_item->details->is_highlighted_for_clipboard) { - old_pixbuf = temp_pixbuf; + g_object_ref (temp_pixbuf); - temp_pixbuf = eel_create_spotlight_pixbuf (temp_pixbuf); - g_object_unref (old_pixbuf); - } + if (canvas_item->details->is_prelit || + canvas_item->details->is_highlighted_for_clipboard) + { + old_pixbuf = temp_pixbuf; - if (canvas_item->details->is_highlighted_for_selection - || canvas_item->details->is_highlighted_for_drop) { - style = gtk_widget_get_style_context (GTK_WIDGET (canvas)); + temp_pixbuf = eel_create_spotlight_pixbuf (temp_pixbuf); + g_object_unref (old_pixbuf); + } - if (gtk_widget_has_focus (GTK_WIDGET (canvas))) { - gtk_style_context_get_background_color (style, GTK_STATE_FLAG_SELECTED, &color); - } else { - gtk_style_context_get_background_color (style, GTK_STATE_FLAG_ACTIVE, &color); - } + if (canvas_item->details->is_highlighted_for_selection + || canvas_item->details->is_highlighted_for_drop) + { + style = gtk_widget_get_style_context (GTK_WIDGET (canvas)); - old_pixbuf = temp_pixbuf; - temp_pixbuf = eel_create_colorized_pixbuf (temp_pixbuf, &color); + if (gtk_widget_has_focus (GTK_WIDGET (canvas))) + { + gtk_style_context_get_background_color (style, GTK_STATE_FLAG_SELECTED, &color); + } + else + { + gtk_style_context_get_background_color (style, GTK_STATE_FLAG_ACTIVE, &color); + } - g_object_unref (old_pixbuf); - } + old_pixbuf = temp_pixbuf; + temp_pixbuf = eel_create_colorized_pixbuf (temp_pixbuf, &color); - surface = gdk_cairo_surface_create_from_pixbuf (temp_pixbuf, - gtk_widget_get_scale_factor (GTK_WIDGET (canvas)), - gtk_widget_get_window (GTK_WIDGET (canvas))); - g_object_unref (temp_pixbuf); + g_object_unref (old_pixbuf); + } - return surface; + surface = gdk_cairo_surface_create_from_pixbuf (temp_pixbuf, + gtk_widget_get_scale_factor (GTK_WIDGET (canvas)), + gtk_widget_get_window (GTK_WIDGET (canvas))); + g_object_unref (temp_pixbuf); + + return surface; } static cairo_surface_t * map_surface (NautilusCanvasItem *canvas_item) { - if (!(canvas_item->details->rendered_surface != NULL - && canvas_item->details->rendered_is_prelit == canvas_item->details->is_prelit - && canvas_item->details->rendered_is_highlighted_for_selection == canvas_item->details->is_highlighted_for_selection - && canvas_item->details->rendered_is_highlighted_for_drop == canvas_item->details->is_highlighted_for_drop - && canvas_item->details->rendered_is_highlighted_for_clipboard == canvas_item->details->is_highlighted_for_clipboard - && (canvas_item->details->is_highlighted_for_selection && canvas_item->details->rendered_is_focused == gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (canvas_item)->canvas))))) { - if (canvas_item->details->rendered_surface != NULL) { - cairo_surface_destroy (canvas_item->details->rendered_surface); - } - canvas_item->details->rendered_surface = real_map_surface (canvas_item); - canvas_item->details->rendered_is_prelit = canvas_item->details->is_prelit; - canvas_item->details->rendered_is_highlighted_for_selection = canvas_item->details->is_highlighted_for_selection; - canvas_item->details->rendered_is_highlighted_for_drop = canvas_item->details->is_highlighted_for_drop; - canvas_item->details->rendered_is_highlighted_for_clipboard = canvas_item->details->is_highlighted_for_clipboard; - canvas_item->details->rendered_is_focused = gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (canvas_item)->canvas)); - } + if (!(canvas_item->details->rendered_surface != NULL + && canvas_item->details->rendered_is_prelit == canvas_item->details->is_prelit + && canvas_item->details->rendered_is_highlighted_for_selection == canvas_item->details->is_highlighted_for_selection + && canvas_item->details->rendered_is_highlighted_for_drop == canvas_item->details->is_highlighted_for_drop + && canvas_item->details->rendered_is_highlighted_for_clipboard == canvas_item->details->is_highlighted_for_clipboard + && (canvas_item->details->is_highlighted_for_selection && canvas_item->details->rendered_is_focused == gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (canvas_item)->canvas))))) + { + if (canvas_item->details->rendered_surface != NULL) + { + cairo_surface_destroy (canvas_item->details->rendered_surface); + } + canvas_item->details->rendered_surface = real_map_surface (canvas_item); + canvas_item->details->rendered_is_prelit = canvas_item->details->is_prelit; + canvas_item->details->rendered_is_highlighted_for_selection = canvas_item->details->is_highlighted_for_selection; + canvas_item->details->rendered_is_highlighted_for_drop = canvas_item->details->is_highlighted_for_drop; + canvas_item->details->rendered_is_highlighted_for_clipboard = canvas_item->details->is_highlighted_for_clipboard; + canvas_item->details->rendered_is_focused = gtk_widget_has_focus (GTK_WIDGET (EEL_CANVAS_ITEM (canvas_item)->canvas)); + } - cairo_surface_reference (canvas_item->details->rendered_surface); + cairo_surface_reference (canvas_item->details->rendered_surface); - return canvas_item->details->rendered_surface; + return canvas_item->details->rendered_surface; } cairo_surface_t * nautilus_canvas_item_get_drag_surface (NautilusCanvasItem *item) { - cairo_surface_t *surface; - EelCanvas *canvas; - int width, height; - int pix_width, pix_height; - int item_offset_x, item_offset_y; - EelIRect icon_rect; - double item_x, item_y; - cairo_t *cr; - GtkStyleContext *context; - cairo_surface_t *drag_surface; + cairo_surface_t *surface; + EelCanvas *canvas; + int width, height; + int pix_width, pix_height; + int item_offset_x, item_offset_y; + EelIRect icon_rect; + double item_x, item_y; + cairo_t *cr; + GtkStyleContext *context; + cairo_surface_t *drag_surface; - g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), NULL); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), NULL); - canvas = EEL_CANVAS_ITEM (item)->canvas; - context = gtk_widget_get_style_context (GTK_WIDGET (canvas)); + canvas = EEL_CANVAS_ITEM (item)->canvas; + context = gtk_widget_get_style_context (GTK_WIDGET (canvas)); - gtk_style_context_save (context); - gtk_style_context_add_class (context, "nautilus-canvas-item"); + gtk_style_context_save (context); + gtk_style_context_add_class (context, "nautilus-canvas-item"); - /* Assume we're updated so canvas item data is right */ + /* Assume we're updated so canvas item data is right */ - /* Calculate the offset from the top-left corner of the - new image to the item position (where the pixmap is placed) */ - eel_canvas_world_to_window (canvas, - item->details->x, item->details->y, - &item_x, &item_y); + /* Calculate the offset from the top-left corner of the + * new image to the item position (where the pixmap is placed) */ + eel_canvas_world_to_window (canvas, + item->details->x, item->details->y, + &item_x, &item_y); - item_offset_x = item_x - EEL_CANVAS_ITEM (item)->x1; - item_offset_y = item_y - EEL_CANVAS_ITEM (item)->y1; + item_offset_x = item_x - EEL_CANVAS_ITEM (item)->x1; + item_offset_y = item_y - EEL_CANVAS_ITEM (item)->y1; - /* Calculate the width of the item */ - width = EEL_CANVAS_ITEM (item)->x2 - EEL_CANVAS_ITEM (item)->x1; - height = EEL_CANVAS_ITEM (item)->y2 - EEL_CANVAS_ITEM (item)->y1; + /* Calculate the width of the item */ + width = EEL_CANVAS_ITEM (item)->x2 - EEL_CANVAS_ITEM (item)->x1; + height = EEL_CANVAS_ITEM (item)->y2 - EEL_CANVAS_ITEM (item)->y1; - surface = gdk_window_create_similar_surface (gtk_widget_get_window (GTK_WIDGET (canvas)), - CAIRO_CONTENT_COLOR_ALPHA, - width, height); - cr = cairo_create (surface); + surface = gdk_window_create_similar_surface (gtk_widget_get_window (GTK_WIDGET (canvas)), + CAIRO_CONTENT_COLOR_ALPHA, + width, height); + cr = cairo_create (surface); - drag_surface = map_surface (item); - gtk_render_icon_surface (context, cr, drag_surface, - item_offset_x, item_offset_y); - cairo_surface_destroy (drag_surface); + drag_surface = map_surface (item); + gtk_render_icon_surface (context, cr, drag_surface, + item_offset_x, item_offset_y); + cairo_surface_destroy (drag_surface); - get_scaled_icon_size (item, &pix_width, &pix_height); + get_scaled_icon_size (item, &pix_width, &pix_height); - icon_rect.x0 = item_offset_x; - icon_rect.y0 = item_offset_y; - icon_rect.x1 = item_offset_x + pix_width; - icon_rect.y1 = item_offset_y + pix_height; + icon_rect.x0 = item_offset_x; + icon_rect.y0 = item_offset_y; + icon_rect.x1 = item_offset_x + pix_width; + icon_rect.y1 = item_offset_y + pix_height; - draw_label_text (item, cr, icon_rect); - cairo_destroy (cr); + draw_label_text (item, cr, icon_rect); + cairo_destroy (cr); - gtk_style_context_restore (context); + gtk_style_context_restore (context); - return surface; + return surface; } /* Draw the canvas item for non-anti-aliased mode. */ static void -nautilus_canvas_item_draw (EelCanvasItem *item, - cairo_t *cr, - cairo_region_t *region) +nautilus_canvas_item_draw (EelCanvasItem *item, + cairo_t *cr, + cairo_region_t *region) { - NautilusCanvasContainer *container; - NautilusCanvasItem *canvas_item; - NautilusCanvasItemDetails *details; - EelIRect icon_rect; - cairo_surface_t *temp_surface; - GtkStyleContext *context; + NautilusCanvasContainer *container; + NautilusCanvasItem *canvas_item; + NautilusCanvasItemDetails *details; + EelIRect icon_rect; + cairo_surface_t *temp_surface; + GtkStyleContext *context; - container = NAUTILUS_CANVAS_CONTAINER (item->canvas); - canvas_item = NAUTILUS_CANVAS_ITEM (item); - details = canvas_item->details; + container = NAUTILUS_CANVAS_CONTAINER (item->canvas); + canvas_item = NAUTILUS_CANVAS_ITEM (item); + details = canvas_item->details; - /* Draw the pixbuf. */ - if (details->pixbuf == NULL) { - return; - } + /* Draw the pixbuf. */ + if (details->pixbuf == NULL) + { + return; + } - context = gtk_widget_get_style_context (GTK_WIDGET (container)); - gtk_style_context_save (context); - gtk_style_context_add_class (context, "nautilus-canvas-item"); + context = gtk_widget_get_style_context (GTK_WIDGET (container)); + gtk_style_context_save (context); + gtk_style_context_add_class (context, "nautilus-canvas-item"); - icon_rect = canvas_item->details->icon_rect; - temp_surface = map_surface (canvas_item); + icon_rect = canvas_item->details->icon_rect; + temp_surface = map_surface (canvas_item); - gtk_render_icon_surface (context, cr, - temp_surface, - icon_rect.x0, icon_rect.y0); - cairo_surface_destroy (temp_surface); + gtk_render_icon_surface (context, cr, + temp_surface, + icon_rect.x0, icon_rect.y0); + cairo_surface_destroy (temp_surface); - /* Draw stretching handles (if necessary). */ - draw_stretch_handles (canvas_item, cr, &icon_rect); - - /* Draw the label text. */ - draw_label_text (canvas_item, cr, icon_rect); + /* Draw stretching handles (if necessary). */ + draw_stretch_handles (canvas_item, cr, &icon_rect); - gtk_style_context_restore (context); + /* Draw the label text. */ + draw_label_text (canvas_item, cr, icon_rect); + + gtk_style_context_restore (context); } #define ZERO_WIDTH_SPACE "\xE2\x80\x8B" -#define ZERO_OR_THREE_DIGITS(p) \ - (!g_ascii_isdigit (*(p)) || \ - (g_ascii_isdigit (*(p+1)) && \ - g_ascii_isdigit (*(p+2)))) +#define ZERO_OR_THREE_DIGITS(p) \ + (!g_ascii_isdigit (*(p)) || \ + (g_ascii_isdigit (*(p + 1)) && \ + g_ascii_isdigit (*(p + 2)))) static PangoLayout * create_label_layout (NautilusCanvasItem *item, - const char *text) -{ - PangoLayout *layout; - PangoContext *context; - PangoFontDescription *desc; - NautilusCanvasContainer *container; - EelCanvasItem *canvas_item; - GString *str; - char *zeroified_text; - const char *p; - - canvas_item = EEL_CANVAS_ITEM (item); - - container = NAUTILUS_CANVAS_CONTAINER (canvas_item->canvas); - context = gtk_widget_get_pango_context (GTK_WIDGET (canvas_item->canvas)); - layout = pango_layout_new (context); - - zeroified_text = NULL; - - if (text != NULL) { - str = g_string_new (NULL); - - for (p = text; *p != '\0'; p++) { - str = g_string_append_c (str, *p); - - if (*p == '_' || *p == '-' || (*p == '.' && ZERO_OR_THREE_DIGITS (p+1))) { - /* Ensure that we allow to break after '_' or '.' characters, - * if they are not likely to be part of a version information, to - * not break wrapping of foobar-0.0.1. - * Wrap before IPs and long numbers, though. */ - str = g_string_append (str, ZERO_WIDTH_SPACE); - } - } - - zeroified_text = g_string_free (str, FALSE); - } - - pango_layout_set_text (layout, zeroified_text, -1); - pango_layout_set_auto_dir (layout, FALSE); - pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); - - pango_layout_set_spacing (layout, LABEL_LINE_SPACING); - pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); - - /* Create a font description */ - if (container->details->font) { - desc = pango_font_description_from_string (container->details->font); - } else { - desc = pango_font_description_copy (pango_context_get_font_description (context)); - } - pango_layout_set_font_description (layout, desc); - pango_font_description_free (desc); - g_free (zeroified_text); - - return layout; + const char *text) +{ + PangoLayout *layout; + PangoContext *context; + PangoFontDescription *desc; + NautilusCanvasContainer *container; + EelCanvasItem *canvas_item; + GString *str; + char *zeroified_text; + const char *p; + + canvas_item = EEL_CANVAS_ITEM (item); + + container = NAUTILUS_CANVAS_CONTAINER (canvas_item->canvas); + context = gtk_widget_get_pango_context (GTK_WIDGET (canvas_item->canvas)); + layout = pango_layout_new (context); + + zeroified_text = NULL; + + if (text != NULL) + { + str = g_string_new (NULL); + + for (p = text; *p != '\0'; p++) + { + str = g_string_append_c (str, *p); + + if (*p == '_' || *p == '-' || (*p == '.' && ZERO_OR_THREE_DIGITS (p + 1))) + { + /* Ensure that we allow to break after '_' or '.' characters, + * if they are not likely to be part of a version information, to + * not break wrapping of foobar-0.0.1. + * Wrap before IPs and long numbers, though. */ + str = g_string_append (str, ZERO_WIDTH_SPACE); + } + } + + zeroified_text = g_string_free (str, FALSE); + } + + pango_layout_set_text (layout, zeroified_text, -1); + pango_layout_set_auto_dir (layout, FALSE); + pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); + + pango_layout_set_spacing (layout, LABEL_LINE_SPACING); + pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); + + /* Create a font description */ + if (container->details->font) + { + desc = pango_font_description_from_string (container->details->font); + } + else + { + desc = pango_font_description_copy (pango_context_get_font_description (context)); + } + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + g_free (zeroified_text); + + return layout; } static PangoLayout * -get_label_layout (PangoLayout **layout_cache, - NautilusCanvasItem *item, - const char *text) +get_label_layout (PangoLayout **layout_cache, + NautilusCanvasItem *item, + const char *text) { - PangoLayout *layout; + PangoLayout *layout; + + if (*layout_cache != NULL) + { + return g_object_ref (*layout_cache); + } - if (*layout_cache != NULL) { - return g_object_ref (*layout_cache); - } + layout = create_label_layout (item, text); - layout = create_label_layout (item, text); + if (item->details->is_visible) + { + *layout_cache = g_object_ref (layout); + } - if (item->details->is_visible) { - *layout_cache = g_object_ref (layout); - } - - return layout; + return layout; } /* handle events */ static int -nautilus_canvas_item_event (EelCanvasItem *item, GdkEvent *event) -{ - NautilusCanvasItem *canvas_item; - GdkCursor *cursor; - GdkWindow *cursor_window; - - canvas_item = NAUTILUS_CANVAS_ITEM (item); - cursor_window = ((GdkEventAny *)event)->window; - - switch (event->type) { - case GDK_ENTER_NOTIFY: - if (!canvas_item->details->is_prelit) { - canvas_item->details->is_prelit = TRUE; - nautilus_canvas_item_invalidate_label_size (canvas_item); - eel_canvas_item_request_update (item); - eel_canvas_item_send_behind (item, - NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle); - - /* show a hand cursor */ - if (in_single_click_mode ()) { - cursor = gdk_cursor_new_for_display (gdk_display_get_default(), - GDK_HAND2); - gdk_window_set_cursor (cursor_window, cursor); - g_object_unref (cursor); - - canvas_item->details->cursor_window = g_object_ref (cursor_window); - } - } - return TRUE; - - case GDK_LEAVE_NOTIFY: - if (canvas_item->details->is_prelit - || canvas_item->details->is_highlighted_for_drop) { - /* When leaving, turn of the prelight state and the - * higlighted for drop. The latter gets turned on - * by the drag&drop motion callback. - */ - canvas_item->details->is_prelit = FALSE; - canvas_item->details->is_highlighted_for_drop = FALSE; - nautilus_canvas_item_invalidate_label_size (canvas_item); - eel_canvas_item_request_update (item); - - /* show default cursor */ - gdk_window_set_cursor (cursor_window, NULL); - g_clear_object (&canvas_item->details->cursor_window); - } - return TRUE; - - default: - /* Don't eat up other events; canvas container might use them. */ - return FALSE; - } +nautilus_canvas_item_event (EelCanvasItem *item, + GdkEvent *event) +{ + NautilusCanvasItem *canvas_item; + GdkCursor *cursor; + GdkWindow *cursor_window; + + canvas_item = NAUTILUS_CANVAS_ITEM (item); + cursor_window = ((GdkEventAny *) event)->window; + + switch (event->type) + { + case GDK_ENTER_NOTIFY: + { + if (!canvas_item->details->is_prelit) + { + canvas_item->details->is_prelit = TRUE; + nautilus_canvas_item_invalidate_label_size (canvas_item); + eel_canvas_item_request_update (item); + eel_canvas_item_send_behind (item, + NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle); + + /* show a hand cursor */ + if (in_single_click_mode ()) + { + cursor = gdk_cursor_new_for_display (gdk_display_get_default (), + GDK_HAND2); + gdk_window_set_cursor (cursor_window, cursor); + g_object_unref (cursor); + + canvas_item->details->cursor_window = g_object_ref (cursor_window); + } + } + return TRUE; + } + + case GDK_LEAVE_NOTIFY: + { + if (canvas_item->details->is_prelit + || canvas_item->details->is_highlighted_for_drop) + { + /* When leaving, turn of the prelight state and the + * higlighted for drop. The latter gets turned on + * by the drag&drop motion callback. + */ + canvas_item->details->is_prelit = FALSE; + canvas_item->details->is_highlighted_for_drop = FALSE; + nautilus_canvas_item_invalidate_label_size (canvas_item); + eel_canvas_item_request_update (item); + + /* show default cursor */ + gdk_window_set_cursor (cursor_window, NULL); + g_clear_object (&canvas_item->details->cursor_window); + } + return TRUE; + } + + default: + /* Don't eat up other events; canvas container might use them. */ + return FALSE; + } } static gboolean -hit_test (NautilusCanvasItem *canvas_item, EelIRect icon_rect) -{ - NautilusCanvasItemDetails *details; - - details = canvas_item->details; - - /* Quick check to see if the rect hits the canvas or text at all. */ - if (!eel_irect_hits_irect (canvas_item->details->icon_rect, icon_rect) - && (!eel_irect_hits_irect (details->text_rect, icon_rect))) { - return FALSE; - } - - /* Check for hits in the stretch handles. */ - if (hit_test_stretch_handle (canvas_item, icon_rect, NULL)) { - return TRUE; - } - - /* Check for hit in the canvas. */ - if (eel_irect_hits_irect (canvas_item->details->icon_rect, icon_rect)) { - return TRUE; - } - - /* Check for hit in the text. */ - if (eel_irect_hits_irect (details->text_rect, icon_rect)) { - return TRUE; - } - - return FALSE; +hit_test (NautilusCanvasItem *canvas_item, + EelIRect icon_rect) +{ + NautilusCanvasItemDetails *details; + + details = canvas_item->details; + + /* Quick check to see if the rect hits the canvas or text at all. */ + if (!eel_irect_hits_irect (canvas_item->details->icon_rect, icon_rect) + && (!eel_irect_hits_irect (details->text_rect, icon_rect))) + { + return FALSE; + } + + /* Check for hits in the stretch handles. */ + if (hit_test_stretch_handle (canvas_item, icon_rect, NULL)) + { + return TRUE; + } + + /* Check for hit in the canvas. */ + if (eel_irect_hits_irect (canvas_item->details->icon_rect, icon_rect)) + { + return TRUE; + } + + /* Check for hit in the text. */ + if (eel_irect_hits_irect (details->text_rect, icon_rect)) + { + return TRUE; + } + + return FALSE; } /* Point handler for the canvas canvas item. */ static double -nautilus_canvas_item_point (EelCanvasItem *item, double x, double y, int cx, int cy, - EelCanvasItem **actual_item) -{ - EelIRect icon_rect; - - *actual_item = item; - icon_rect.x0 = cx; - icon_rect.y0 = cy; - icon_rect.x1 = cx + 1; - icon_rect.y1 = cy + 1; - if (hit_test (NAUTILUS_CANVAS_ITEM (item), icon_rect)) { - return 0.0; - } else { - /* This value means not hit. - * It's kind of arbitrary. Can we do better? - */ - return item->canvas->pixels_per_unit * 2 + 10; - } +nautilus_canvas_item_point (EelCanvasItem *item, + double x, + double y, + int cx, + int cy, + EelCanvasItem **actual_item) +{ + EelIRect icon_rect; + + *actual_item = item; + icon_rect.x0 = cx; + icon_rect.y0 = cy; + icon_rect.x1 = cx + 1; + icon_rect.y1 = cy + 1; + if (hit_test (NAUTILUS_CANVAS_ITEM (item), icon_rect)) + { + return 0.0; + } + else + { + /* This value means not hit. + * It's kind of arbitrary. Can we do better? + */ + return item->canvas->pixels_per_unit * 2 + 10; + } } static void -nautilus_canvas_item_translate (EelCanvasItem *item, double dx, double dy) +nautilus_canvas_item_translate (EelCanvasItem *item, + double dx, + double dy) { - NautilusCanvasItem *canvas_item; - NautilusCanvasItemDetails *details; - - canvas_item = NAUTILUS_CANVAS_ITEM (item); - details = canvas_item->details; + NautilusCanvasItem *canvas_item; + NautilusCanvasItemDetails *details; - details->x += dx; - details->y += dy; + canvas_item = NAUTILUS_CANVAS_ITEM (item); + details = canvas_item->details; + + details->x += dx; + details->y += dy; } void nautilus_canvas_item_get_bounds_for_layout (NautilusCanvasItem *canvas_item, - double *x1, double *y1, double *x2, double *y2) -{ - NautilusCanvasItemDetails *details; - EelIRect *total_rect; - - details = canvas_item->details; - - nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); - g_assert (details->bounds_cached); - - total_rect = &details->bounds_cache_for_layout; - - /* Return the result. */ - if (x1 != NULL) { - *x1 = (int)details->x + total_rect->x0; - } - if (y1 != NULL) { - *y1 = (int)details->y + total_rect->y0; - } - if (x2 != NULL) { - *x2 = (int)details->x + total_rect->x1 + 1; - } - if (y2 != NULL) { - *y2 = (int)details->y + total_rect->y1 + 1; - } + double *x1, + double *y1, + double *x2, + double *y2) +{ + NautilusCanvasItemDetails *details; + EelIRect *total_rect; + + details = canvas_item->details; + + nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); + g_assert (details->bounds_cached); + + total_rect = &details->bounds_cache_for_layout; + + /* Return the result. */ + if (x1 != NULL) + { + *x1 = (int) details->x + total_rect->x0; + } + if (y1 != NULL) + { + *y1 = (int) details->y + total_rect->y0; + } + if (x2 != NULL) + { + *x2 = (int) details->x + total_rect->x1 + 1; + } + if (y2 != NULL) + { + *y2 = (int) details->y + total_rect->y1 + 1; + } } void nautilus_canvas_item_get_bounds_for_entire_item (NautilusCanvasItem *canvas_item, - double *x1, double *y1, double *x2, double *y2) -{ - NautilusCanvasItemDetails *details; - EelIRect *total_rect; - - details = canvas_item->details; - - nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); - g_assert (details->bounds_cached); - - total_rect = &details->bounds_cache_for_entire_item; - - /* Return the result. */ - if (x1 != NULL) { - *x1 = (int)details->x + total_rect->x0; - } - if (y1 != NULL) { - *y1 = (int)details->y + total_rect->y0; - } - if (x2 != NULL) { - *x2 = (int)details->x + total_rect->x1 + 1; - } - if (y2 != NULL) { - *y2 = (int)details->y + total_rect->y1 + 1; - } + double *x1, + double *y1, + double *x2, + double *y2) +{ + NautilusCanvasItemDetails *details; + EelIRect *total_rect; + + details = canvas_item->details; + + nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); + g_assert (details->bounds_cached); + + total_rect = &details->bounds_cache_for_entire_item; + + /* Return the result. */ + if (x1 != NULL) + { + *x1 = (int) details->x + total_rect->x0; + } + if (y1 != NULL) + { + *y1 = (int) details->y + total_rect->y0; + } + if (x2 != NULL) + { + *x2 = (int) details->x + total_rect->x1 + 1; + } + if (y2 != NULL) + { + *y2 = (int) details->y + total_rect->y1 + 1; + } } - + /* Bounds handler for the canvas canvas item. */ static void nautilus_canvas_item_bounds (EelCanvasItem *item, - double *x1, double *y1, double *x2, double *y2) + double *x1, + double *y1, + double *x2, + double *y2) { - NautilusCanvasItem *canvas_item; - NautilusCanvasItemDetails *details; - EelIRect *total_rect; + NautilusCanvasItem *canvas_item; + NautilusCanvasItemDetails *details; + EelIRect *total_rect; - canvas_item = NAUTILUS_CANVAS_ITEM (item); - details = canvas_item->details; + canvas_item = NAUTILUS_CANVAS_ITEM (item); + details = canvas_item->details; - g_assert (x1 != NULL); - g_assert (y1 != NULL); - g_assert (x2 != NULL); - g_assert (y2 != NULL); + g_assert (x1 != NULL); + g_assert (y1 != NULL); + g_assert (x2 != NULL); + g_assert (y2 != NULL); - nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); - g_assert (details->bounds_cached); + nautilus_canvas_item_ensure_bounds_up_to_date (canvas_item); + g_assert (details->bounds_cached); - total_rect = &details->bounds_cache; + total_rect = &details->bounds_cache; - /* Return the result. */ - *x1 = (int)details->x + total_rect->x0; - *y1 = (int)details->y + total_rect->y0; - *x2 = (int)details->x + total_rect->x1 + 1; - *y2 = (int)details->y + total_rect->y1 + 1; + /* Return the result. */ + *x1 = (int) details->x + total_rect->x0; + *y1 = (int) details->y + total_rect->y0; + *x2 = (int) details->x + total_rect->x1 + 1; + *y2 = (int) details->y + total_rect->y1 + 1; } static void nautilus_canvas_item_ensure_bounds_up_to_date (NautilusCanvasItem *canvas_item) { - NautilusCanvasItemDetails *details; - EelIRect icon_rect; - EelIRect text_rect, text_rect_for_layout, text_rect_for_entire_text; - EelIRect total_rect, total_rect_for_layout, total_rect_for_entire_text; - EelCanvasItem *item; - double pixels_per_unit; - gint width, height; - - details = canvas_item->details; - item = EEL_CANVAS_ITEM (canvas_item); + NautilusCanvasItemDetails *details; + EelIRect icon_rect; + EelIRect text_rect, text_rect_for_layout, text_rect_for_entire_text; + EelIRect total_rect, total_rect_for_layout, total_rect_for_entire_text; + EelCanvasItem *item; + double pixels_per_unit; + gint width, height; + + details = canvas_item->details; + item = EEL_CANVAS_ITEM (canvas_item); - if (!details->bounds_cached) { - measure_label_text (canvas_item); + if (!details->bounds_cached) + { + measure_label_text (canvas_item); - pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; + pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; - /* Compute scaled canvas rectangle. */ - icon_rect.x0 = 0; - icon_rect.y0 = 0; + /* Compute scaled canvas rectangle. */ + icon_rect.x0 = 0; + icon_rect.y0 = 0; - get_scaled_icon_size (canvas_item, &width, &height); + get_scaled_icon_size (canvas_item, &width, &height); - icon_rect.x1 = width / pixels_per_unit; - icon_rect.y1 = height / pixels_per_unit; + icon_rect.x1 = width / pixels_per_unit; + icon_rect.y1 = height / pixels_per_unit; - /* Compute text rectangle. */ - text_rect = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_DISPLAY); - text_rect_for_layout = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_LAYOUT); - text_rect_for_entire_text = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_ENTIRE_ITEM); + /* Compute text rectangle. */ + text_rect = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_DISPLAY); + text_rect_for_layout = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_LAYOUT); + text_rect_for_entire_text = compute_text_rectangle (canvas_item, icon_rect, FALSE, BOUNDS_USAGE_FOR_ENTIRE_ITEM); - /* Compute total rectangle */ - eel_irect_union (&total_rect, &icon_rect, &text_rect); - eel_irect_union (&total_rect_for_layout, &icon_rect, &text_rect_for_layout); - eel_irect_union (&total_rect_for_entire_text, &icon_rect, &text_rect_for_entire_text); + /* Compute total rectangle */ + eel_irect_union (&total_rect, &icon_rect, &text_rect); + eel_irect_union (&total_rect_for_layout, &icon_rect, &text_rect_for_layout); + eel_irect_union (&total_rect_for_entire_text, &icon_rect, &text_rect_for_entire_text); - details->bounds_cache = total_rect; - details->bounds_cache_for_layout = total_rect_for_layout; - details->bounds_cache_for_entire_item = total_rect_for_entire_text; - details->bounds_cached = TRUE; - } + details->bounds_cache = total_rect; + details->bounds_cache_for_layout = total_rect_for_layout; + details->bounds_cache_for_entire_item = total_rect_for_entire_text; + details->bounds_cached = TRUE; + } } /* Get the rectangle of the canvas only, in world coordinates. */ EelDRect nautilus_canvas_item_get_icon_rectangle (const NautilusCanvasItem *item) { - EelDRect rectangle; - double pixels_per_unit; - gint width, height; - - g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), eel_drect_empty); + EelDRect rectangle; + double pixels_per_unit; + gint width, height; + + g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), eel_drect_empty); + + rectangle.x0 = item->details->x; + rectangle.y0 = item->details->y; - rectangle.x0 = item->details->x; - rectangle.y0 = item->details->y; - - pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; - get_scaled_icon_size (NAUTILUS_CANVAS_ITEM (item), &width, &height); - rectangle.x1 = rectangle.x0 + width / pixels_per_unit; - rectangle.y1 = rectangle.y0 + height / pixels_per_unit; + pixels_per_unit = EEL_CANVAS_ITEM (item)->canvas->pixels_per_unit; + get_scaled_icon_size (NAUTILUS_CANVAS_ITEM (item), &width, &height); + rectangle.x1 = rectangle.x0 + width / pixels_per_unit; + rectangle.y1 = rectangle.y0 + height / pixels_per_unit; - eel_canvas_item_i2w (EEL_CANVAS_ITEM (item), - &rectangle.x0, - &rectangle.y0); - eel_canvas_item_i2w (EEL_CANVAS_ITEM (item), - &rectangle.x1, - &rectangle.y1); + eel_canvas_item_i2w (EEL_CANVAS_ITEM (item), + &rectangle.x0, + &rectangle.y0); + eel_canvas_item_i2w (EEL_CANVAS_ITEM (item), + &rectangle.x1, + &rectangle.y1); - return rectangle; + return rectangle; } /* Get the rectangle of the icon only, in canvas coordinates. */ static void get_icon_rectangle (NautilusCanvasItem *item, - EelIRect *rect) + EelIRect *rect) { - gint width, height; + gint width, height; - g_assert (NAUTILUS_IS_CANVAS_ITEM (item)); - g_assert (rect != NULL); + g_assert (NAUTILUS_IS_CANVAS_ITEM (item)); + g_assert (rect != NULL); - eel_canvas_w2c (EEL_CANVAS_ITEM (item)->canvas, - item->details->x, - item->details->y, - &rect->x0, - &rect->y0); - - get_scaled_icon_size (item, &width, &height); - - rect->x1 = rect->x0 + width; - rect->y1 = rect->y0 + height; + eel_canvas_w2c (EEL_CANVAS_ITEM (item)->canvas, + item->details->x, + item->details->y, + &rect->x0, + &rect->y0); + + get_scaled_icon_size (item, &width, &height); + + rect->x1 = rect->x0 + width; + rect->y1 = rect->y0 + height; } void nautilus_canvas_item_set_show_stretch_handles (NautilusCanvasItem *item, - gboolean show_stretch_handles) + gboolean show_stretch_handles) { - g_return_if_fail (NAUTILUS_IS_CANVAS_ITEM (item)); - g_return_if_fail (show_stretch_handles == FALSE || show_stretch_handles == TRUE); - - if (!item->details->show_stretch_handles == !show_stretch_handles) { - return; - } + g_return_if_fail (NAUTILUS_IS_CANVAS_ITEM (item)); + g_return_if_fail (show_stretch_handles == FALSE || show_stretch_handles == TRUE); + + if (!item->details->show_stretch_handles == !show_stretch_handles) + { + return; + } - item->details->show_stretch_handles = show_stretch_handles; - eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); + item->details->show_stretch_handles = show_stretch_handles; + eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); } /* Check if one of the stretch handles was hit. */ static gboolean hit_test_stretch_handle (NautilusCanvasItem *item, - EelIRect probe_icon_rect, - GtkCornerType *corner) -{ - EelIRect icon_rect; - GdkPixbuf *knob_pixbuf; - int knob_width, knob_height; - int hit_corner; - - g_assert (NAUTILUS_IS_CANVAS_ITEM (item)); - - /* Make sure there are handles to hit. */ - if (!item->details->show_stretch_handles) { - return FALSE; - } - - /* Quick check to see if the rect hits the canvas at all. */ - icon_rect = item->details->icon_rect; - if (!eel_irect_hits_irect (probe_icon_rect, icon_rect)) { - return FALSE; - } - - knob_pixbuf = get_knob_pixbuf (); - knob_width = gdk_pixbuf_get_width (knob_pixbuf); - knob_height = gdk_pixbuf_get_height (knob_pixbuf); - g_object_unref (knob_pixbuf); - - /* Check for hits in the stretch handles. */ - hit_corner = -1; - if (probe_icon_rect.x0 < icon_rect.x0 + knob_width) { - if (probe_icon_rect.y0 < icon_rect.y0 + knob_height) - hit_corner = GTK_CORNER_TOP_LEFT; - else if (probe_icon_rect.y1 >= icon_rect.y1 - knob_height) - hit_corner = GTK_CORNER_BOTTOM_LEFT; - } - else if (probe_icon_rect.x1 >= icon_rect.x1 - knob_width) { - if (probe_icon_rect.y0 < icon_rect.y0 + knob_height) - hit_corner = GTK_CORNER_TOP_RIGHT; - else if (probe_icon_rect.y1 >= icon_rect.y1 - knob_height) - hit_corner = GTK_CORNER_BOTTOM_RIGHT; - } - if (corner) - *corner = hit_corner; - - return hit_corner != -1; + EelIRect probe_icon_rect, + GtkCornerType *corner) +{ + EelIRect icon_rect; + GdkPixbuf *knob_pixbuf; + int knob_width, knob_height; + int hit_corner; + + g_assert (NAUTILUS_IS_CANVAS_ITEM (item)); + + /* Make sure there are handles to hit. */ + if (!item->details->show_stretch_handles) + { + return FALSE; + } + + /* Quick check to see if the rect hits the canvas at all. */ + icon_rect = item->details->icon_rect; + if (!eel_irect_hits_irect (probe_icon_rect, icon_rect)) + { + return FALSE; + } + + knob_pixbuf = get_knob_pixbuf (); + knob_width = gdk_pixbuf_get_width (knob_pixbuf); + knob_height = gdk_pixbuf_get_height (knob_pixbuf); + g_object_unref (knob_pixbuf); + + /* Check for hits in the stretch handles. */ + hit_corner = -1; + if (probe_icon_rect.x0 < icon_rect.x0 + knob_width) + { + if (probe_icon_rect.y0 < icon_rect.y0 + knob_height) + { + hit_corner = GTK_CORNER_TOP_LEFT; + } + else if (probe_icon_rect.y1 >= icon_rect.y1 - knob_height) + { + hit_corner = GTK_CORNER_BOTTOM_LEFT; + } + } + else if (probe_icon_rect.x1 >= icon_rect.x1 - knob_width) + { + if (probe_icon_rect.y0 < icon_rect.y0 + knob_height) + { + hit_corner = GTK_CORNER_TOP_RIGHT; + } + else if (probe_icon_rect.y1 >= icon_rect.y1 - knob_height) + { + hit_corner = GTK_CORNER_BOTTOM_RIGHT; + } + } + if (corner) + { + *corner = hit_corner; + } + + return hit_corner != -1; } gboolean nautilus_canvas_item_hit_test_stretch_handles (NautilusCanvasItem *item, - gdouble world_x, - gdouble world_y, - GtkCornerType *corner) + gdouble world_x, + gdouble world_y, + GtkCornerType *corner) { - EelIRect icon_rect; + EelIRect icon_rect; - g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), FALSE); - - eel_canvas_w2c (EEL_CANVAS_ITEM (item)->canvas, - world_x, - world_y, - &icon_rect.x0, - &icon_rect.y0); - icon_rect.x1 = icon_rect.x0 + 1; - icon_rect.y1 = icon_rect.y0 + 1; - return hit_test_stretch_handle (item, icon_rect, corner); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), FALSE); + + eel_canvas_w2c (EEL_CANVAS_ITEM (item)->canvas, + world_x, + world_y, + &icon_rect.x0, + &icon_rect.y0); + icon_rect.x1 = icon_rect.x0 + 1; + icon_rect.y1 = icon_rect.y0 + 1; + return hit_test_stretch_handle (item, icon_rect, corner); } /* nautilus_canvas_item_hit_test_rectangle @@ -1803,152 +2002,161 @@ nautilus_canvas_item_hit_test_stretch_handles (NautilusCanvasItem *item, * canvas rect. */ gboolean -nautilus_canvas_item_hit_test_rectangle (NautilusCanvasItem *item, EelIRect icon_rect) +nautilus_canvas_item_hit_test_rectangle (NautilusCanvasItem *item, + EelIRect icon_rect) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_ITEM (item), FALSE); - return hit_test (item, icon_rect); + return hit_test (item, icon_rect); } void -nautilus_canvas_item_set_entire_text (NautilusCanvasItem *item, - gboolean entire_text) +nautilus_canvas_item_set_entire_text (NautilusCanvasItem *item, + gboolean entire_text) { - if (item->details->entire_text != entire_text) { - item->details->entire_text = entire_text; + if (item->details->entire_text != entire_text) + { + item->details->entire_text = entire_text; - nautilus_canvas_item_invalidate_label_size (item); - eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); - } + nautilus_canvas_item_invalidate_label_size (item); + eel_canvas_item_request_update (EEL_CANVAS_ITEM (item)); + } } /* Class initialization function for the canvas canvas item. */ static void nautilus_canvas_item_class_init (NautilusCanvasItemClass *class) { - GObjectClass *object_class; - EelCanvasItemClass *item_class; - - object_class = G_OBJECT_CLASS (class); - item_class = EEL_CANVAS_ITEM_CLASS (class); - - object_class->finalize = nautilus_canvas_item_finalize; - object_class->set_property = nautilus_canvas_item_set_property; - object_class->get_property = nautilus_canvas_item_get_property; - - g_object_class_install_property ( - object_class, - PROP_EDITABLE_TEXT, - g_param_spec_string ("editable_text", - "editable text", - "the editable label", - "", G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_ADDITIONAL_TEXT, - g_param_spec_string ("additional_text", - "additional text", - "some more text", - "", G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHTED_FOR_SELECTION, - g_param_spec_boolean ("highlighted_for_selection", - "highlighted for selection", - "whether we are highlighted for a selection", - FALSE, G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS, - g_param_spec_boolean ("highlighted_as_keyboard_focus", - "highlighted as keyboard focus", - "whether we are highlighted to render keyboard focus", - FALSE, G_PARAM_READWRITE)); - - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHTED_FOR_DROP, - g_param_spec_boolean ("highlighted_for_drop", - "highlighted for drop", - "whether we are highlighted for a D&D drop", - FALSE, G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHTED_FOR_CLIPBOARD, - g_param_spec_boolean ("highlighted_for_clipboard", - "highlighted for clipboard", - "whether we are highlighted for a clipboard paste (after we have been cut)", - FALSE, G_PARAM_READWRITE)); - - item_class->update = nautilus_canvas_item_update; - item_class->draw = nautilus_canvas_item_draw; - item_class->point = nautilus_canvas_item_point; - item_class->translate = nautilus_canvas_item_translate; - item_class->bounds = nautilus_canvas_item_bounds; - item_class->event = nautilus_canvas_item_event; - - atk_registry_set_factory_type (atk_get_default_registry (), - NAUTILUS_TYPE_CANVAS_ITEM, - nautilus_canvas_item_accessible_factory_get_type ()); - - g_type_class_add_private (class, sizeof (NautilusCanvasItemDetails)); + GObjectClass *object_class; + EelCanvasItemClass *item_class; + + object_class = G_OBJECT_CLASS (class); + item_class = EEL_CANVAS_ITEM_CLASS (class); + + object_class->finalize = nautilus_canvas_item_finalize; + object_class->set_property = nautilus_canvas_item_set_property; + object_class->get_property = nautilus_canvas_item_get_property; + + g_object_class_install_property ( + object_class, + PROP_EDITABLE_TEXT, + g_param_spec_string ("editable_text", + "editable text", + "the editable label", + "", G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_ADDITIONAL_TEXT, + g_param_spec_string ("additional_text", + "additional text", + "some more text", + "", G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHTED_FOR_SELECTION, + g_param_spec_boolean ("highlighted_for_selection", + "highlighted for selection", + "whether we are highlighted for a selection", + FALSE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHTED_AS_KEYBOARD_FOCUS, + g_param_spec_boolean ("highlighted_as_keyboard_focus", + "highlighted as keyboard focus", + "whether we are highlighted to render keyboard focus", + FALSE, G_PARAM_READWRITE)); + + + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHTED_FOR_DROP, + g_param_spec_boolean ("highlighted_for_drop", + "highlighted for drop", + "whether we are highlighted for a D&D drop", + FALSE, G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHTED_FOR_CLIPBOARD, + g_param_spec_boolean ("highlighted_for_clipboard", + "highlighted for clipboard", + "whether we are highlighted for a clipboard paste (after we have been cut)", + FALSE, G_PARAM_READWRITE)); + + item_class->update = nautilus_canvas_item_update; + item_class->draw = nautilus_canvas_item_draw; + item_class->point = nautilus_canvas_item_point; + item_class->translate = nautilus_canvas_item_translate; + item_class->bounds = nautilus_canvas_item_bounds; + item_class->event = nautilus_canvas_item_event; + + atk_registry_set_factory_type (atk_get_default_registry (), + NAUTILUS_TYPE_CANVAS_ITEM, + nautilus_canvas_item_accessible_factory_get_type ()); + + g_type_class_add_private (class, sizeof (NautilusCanvasItemDetails)); } static GailTextUtil * nautilus_canvas_item_get_text (GObject *text) { - return NAUTILUS_CANVAS_ITEM (text)->details->text_util; + return NAUTILUS_CANVAS_ITEM (text)->details->text_util; } static void nautilus_canvas_item_text_interface_init (EelAccessibleTextIface *iface) { - iface->get_text = nautilus_canvas_item_get_text; + iface->get_text = nautilus_canvas_item_get_text; } /* ============================= a11y interfaces =========================== */ -static const char *nautilus_canvas_item_accessible_action_names[] = { - "open", - "menu", - NULL +static const char *nautilus_canvas_item_accessible_action_names[] = +{ + "open", + "menu", + NULL }; -static const char *nautilus_canvas_item_accessible_action_descriptions[] = { - "Open item", - "Popup context menu", - NULL +static const char *nautilus_canvas_item_accessible_action_descriptions[] = +{ + "Open item", + "Popup context menu", + NULL }; -enum { - ACTION_OPEN, - ACTION_MENU, - LAST_ACTION +enum +{ + ACTION_OPEN, + ACTION_MENU, + LAST_ACTION }; -typedef struct { - char *action_descriptions[LAST_ACTION]; - char *image_description; - char *description; +typedef struct +{ + char *action_descriptions[LAST_ACTION]; + char *image_description; + char *description; } NautilusCanvasItemAccessiblePrivate; -typedef struct { - NautilusCanvasItem *item; - gint action_number; +typedef struct +{ + NautilusCanvasItem *item; + gint action_number; } NautilusCanvasItemAccessibleActionContext; -typedef struct { - EelCanvasItemAccessible parent; - NautilusCanvasItemAccessiblePrivate *priv; +typedef struct +{ + EelCanvasItemAccessible parent; + NautilusCanvasItemAccessiblePrivate *priv; } NautilusCanvasItemAccessible; -typedef struct { - EelCanvasItemAccessibleClass parent_class; +typedef struct +{ + EelCanvasItemAccessibleClass parent_class; } NautilusCanvasItemAccessibleClass; #define GET_ACCESSIBLE_PRIV(o) ((NautilusCanvasItemAccessible *) o)->priv; @@ -1957,668 +2165,748 @@ typedef struct { static gboolean nautilus_canvas_item_accessible_idle_do_action (gpointer data) { - NautilusCanvasItem *item; - NautilusCanvasItemAccessibleActionContext *ctx; - NautilusCanvasIcon *icon; - NautilusCanvasContainer *container; - GList* selection; - GList file_list; - GdkEventButton button_event = { 0 }; - gint action_number; - - container = NAUTILUS_CANVAS_CONTAINER (data); - container->details->a11y_item_action_idle_handler = 0; - while (!g_queue_is_empty (container->details->a11y_item_action_queue)) { - ctx = g_queue_pop_head (container->details->a11y_item_action_queue); - action_number = ctx->action_number; - item = ctx->item; - g_free (ctx); - icon = item->user_data; - - switch (action_number) { - case ACTION_OPEN: - file_list.data = icon->data; - file_list.next = NULL; - file_list.prev = NULL; - g_signal_emit_by_name (container, "activate", &file_list); - break; - case ACTION_MENU: - selection = nautilus_canvas_container_get_selection (container); - if (selection == NULL || - g_list_length (selection) != 1 || - selection->data != icon->data) { - g_list_free (selection); - return FALSE; - } - g_list_free (selection); - g_signal_emit_by_name (container, "context-click-selection", &button_event); - break; - default : - g_assert_not_reached (); - break; - } - } - return FALSE; + NautilusCanvasItem *item; + NautilusCanvasItemAccessibleActionContext *ctx; + NautilusCanvasIcon *icon; + NautilusCanvasContainer *container; + GList *selection; + GList file_list; + GdkEventButton button_event = { 0 }; + gint action_number; + + container = NAUTILUS_CANVAS_CONTAINER (data); + container->details->a11y_item_action_idle_handler = 0; + while (!g_queue_is_empty (container->details->a11y_item_action_queue)) + { + ctx = g_queue_pop_head (container->details->a11y_item_action_queue); + action_number = ctx->action_number; + item = ctx->item; + g_free (ctx); + icon = item->user_data; + + switch (action_number) + { + case ACTION_OPEN: + { + file_list.data = icon->data; + file_list.next = NULL; + file_list.prev = NULL; + g_signal_emit_by_name (container, "activate", &file_list); + } + break; + + case ACTION_MENU: + { + selection = nautilus_canvas_container_get_selection (container); + if (selection == NULL || + g_list_length (selection) != 1 || + selection->data != icon->data) + { + g_list_free (selection); + return FALSE; + } + g_list_free (selection); + g_signal_emit_by_name (container, "context-click-selection", &button_event); + } + break; + + default: + { + g_assert_not_reached (); + } + break; + } + } + return FALSE; } static gboolean nautilus_canvas_item_accessible_do_action (AtkAction *accessible, - int i) -{ - NautilusCanvasItem *item; - NautilusCanvasItemAccessibleActionContext *ctx; - NautilusCanvasContainer *container; - - g_assert (i < LAST_ACTION); - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - return FALSE; - } - - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - switch (i) { - case ACTION_OPEN: - case ACTION_MENU: - if (container->details->a11y_item_action_queue == NULL) { - container->details->a11y_item_action_queue = g_queue_new (); - } - ctx = g_new (NautilusCanvasItemAccessibleActionContext, 1); - ctx->action_number = i; - ctx->item = item; - g_queue_push_head (container->details->a11y_item_action_queue, ctx); - if (container->details->a11y_item_action_idle_handler == 0) { - container->details->a11y_item_action_idle_handler = g_idle_add (nautilus_canvas_item_accessible_idle_do_action, container); - } - break; - default : - g_warning ("Invalid action passed to NautilusCanvasItemAccessible::do_action"); - return FALSE; + int i) +{ + NautilusCanvasItem *item; + NautilusCanvasItemAccessibleActionContext *ctx; + NautilusCanvasContainer *container; + + g_assert (i < LAST_ACTION); + + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + return FALSE; + } + + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + switch (i) + { + case ACTION_OPEN: + case ACTION_MENU: + { + if (container->details->a11y_item_action_queue == NULL) + { + container->details->a11y_item_action_queue = g_queue_new (); + } + ctx = g_new (NautilusCanvasItemAccessibleActionContext, 1); + ctx->action_number = i; + ctx->item = item; + g_queue_push_head (container->details->a11y_item_action_queue, ctx); + if (container->details->a11y_item_action_idle_handler == 0) + { + container->details->a11y_item_action_idle_handler = g_idle_add (nautilus_canvas_item_accessible_idle_do_action, container); + } } + break; - return TRUE; + default: + g_warning ("Invalid action passed to NautilusCanvasItemAccessible::do_action"); + return FALSE; + } + + return TRUE; } static int nautilus_canvas_item_accessible_get_n_actions (AtkAction *accessible) { - return LAST_ACTION; + return LAST_ACTION; } static const char * nautilus_canvas_item_accessible_action_get_description (AtkAction *accessible, - int i) + int i) { - NautilusCanvasItemAccessiblePrivate *priv; + NautilusCanvasItemAccessiblePrivate *priv; - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - priv = GET_ACCESSIBLE_PRIV (accessible); + priv = GET_ACCESSIBLE_PRIV (accessible); - if (priv->action_descriptions[i]) { - return priv->action_descriptions[i]; - } else { - return nautilus_canvas_item_accessible_action_descriptions[i]; - } + if (priv->action_descriptions[i]) + { + return priv->action_descriptions[i]; + } + else + { + return nautilus_canvas_item_accessible_action_descriptions[i]; + } } static const char * -nautilus_canvas_item_accessible_action_get_name (AtkAction *accessible, int i) +nautilus_canvas_item_accessible_action_get_name (AtkAction *accessible, + int i) { - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - return nautilus_canvas_item_accessible_action_names[i]; + return nautilus_canvas_item_accessible_action_names[i]; } static const char * nautilus_canvas_item_accessible_action_get_keybinding (AtkAction *accessible, - int i) + int i) { - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - return NULL; + return NULL; } static gboolean -nautilus_canvas_item_accessible_action_set_description (AtkAction *accessible, - int i, - const char *description) +nautilus_canvas_item_accessible_action_set_description (AtkAction *accessible, + int i, + const char *description) { - NautilusCanvasItemAccessiblePrivate *priv; + NautilusCanvasItemAccessiblePrivate *priv; - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - priv = GET_ACCESSIBLE_PRIV (accessible); + priv = GET_ACCESSIBLE_PRIV (accessible); - if (priv->action_descriptions[i]) { - g_free (priv->action_descriptions[i]); - } - priv->action_descriptions[i] = g_strdup (description); + if (priv->action_descriptions[i]) + { + g_free (priv->action_descriptions[i]); + } + priv->action_descriptions[i] = g_strdup (description); - return TRUE; + return TRUE; } static void nautilus_canvas_item_accessible_action_interface_init (AtkActionIface *iface) { - iface->do_action = nautilus_canvas_item_accessible_do_action; - iface->get_n_actions = nautilus_canvas_item_accessible_get_n_actions; - iface->get_description = nautilus_canvas_item_accessible_action_get_description; - iface->get_keybinding = nautilus_canvas_item_accessible_action_get_keybinding; - iface->get_name = nautilus_canvas_item_accessible_action_get_name; - iface->set_description = nautilus_canvas_item_accessible_action_set_description; + iface->do_action = nautilus_canvas_item_accessible_do_action; + iface->get_n_actions = nautilus_canvas_item_accessible_get_n_actions; + iface->get_description = nautilus_canvas_item_accessible_action_get_description; + iface->get_keybinding = nautilus_canvas_item_accessible_action_get_keybinding; + iface->get_name = nautilus_canvas_item_accessible_action_get_name; + iface->set_description = nautilus_canvas_item_accessible_action_set_description; } static const gchar * nautilus_canvas_item_accessible_get_name (AtkObject *accessible) { - NautilusCanvasItem *item; + NautilusCanvasItem *item; - if (accessible->name) { - return accessible->name; - } + if (accessible->name) + { + return accessible->name; + } - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - return NULL; - } - return item->details->editable_text; + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + return NULL; + } + return item->details->editable_text; } -static const gchar* +static const gchar * nautilus_canvas_item_accessible_get_description (AtkObject *accessible) { - NautilusCanvasItem *item; + NautilusCanvasItem *item; - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - return NULL; - } + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + return NULL; + } - return item->details->additional_text; + return item->details->additional_text; } static AtkObject * nautilus_canvas_item_accessible_get_parent (AtkObject *accessible) { - NautilusCanvasItem *item; - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - return NULL; - } + NautilusCanvasItem *item; - return gtk_widget_get_accessible (GTK_WIDGET (EEL_CANVAS_ITEM (item)->canvas)); + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + return NULL; + } + + return gtk_widget_get_accessible (GTK_WIDGET (EEL_CANVAS_ITEM (item)->canvas)); } static int nautilus_canvas_item_accessible_get_index_in_parent (AtkObject *accessible) { - NautilusCanvasItem *item; - NautilusCanvasContainer *container; - GList *l; - NautilusCanvasIcon *icon; - int i; - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - return -1; - } - - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - - l = container->details->icons; - i = 0; - while (l) { - icon = l->data; - - if (icon->item == item) { - return i; - } - - i++; - l = l->next; - } - - return -1; + NautilusCanvasItem *item; + NautilusCanvasContainer *container; + GList *l; + NautilusCanvasIcon *icon; + int i; + + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + return -1; + } + + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + + l = container->details->icons; + i = 0; + while (l) + { + icon = l->data; + + if (icon->item == item) + { + return i; + } + + i++; + l = l->next; + } + + return -1; } static const gchar * nautilus_canvas_item_accessible_get_image_description (AtkImage *image) { - NautilusCanvasItemAccessiblePrivate *priv; - NautilusCanvasItem *item; - NautilusCanvasIcon *icon; - NautilusCanvasContainer *container; - char *description; - - priv = GET_ACCESSIBLE_PRIV (image); - - if (priv->image_description) { - return priv->image_description; - } else { - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); - if (item == NULL) { - return NULL; - } - icon = item->user_data; - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - description = nautilus_canvas_container_get_icon_description (container, icon->data); - g_free (priv->description); - priv->description = description; - return priv->description; - } + NautilusCanvasItemAccessiblePrivate *priv; + NautilusCanvasItem *item; + NautilusCanvasIcon *icon; + NautilusCanvasContainer *container; + char *description; + + priv = GET_ACCESSIBLE_PRIV (image); + + if (priv->image_description) + { + return priv->image_description; + } + else + { + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); + if (item == NULL) + { + return NULL; + } + icon = item->user_data; + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + description = nautilus_canvas_container_get_icon_description (container, icon->data); + g_free (priv->description); + priv->description = description; + return priv->description; + } } static void -nautilus_canvas_item_accessible_get_image_size -(AtkImage *image, - gint *width, - gint *height) +nautilus_canvas_item_accessible_get_image_size (AtkImage *image, + gint *width, + gint *height) { - NautilusCanvasItem *item; + NautilusCanvasItem *item; - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); - get_scaled_icon_size (item, width, height); + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); + get_scaled_icon_size (item, width, height); } static void -nautilus_canvas_item_accessible_get_image_position -(AtkImage *image, - gint *x, - gint *y, - AtkCoordType coord_type) -{ - NautilusCanvasItem *item; - gint x_offset, y_offset, itmp; - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); - if (!item) { - return; - } - if (!item->details->icon_rect.x0 && !item->details->icon_rect.x1) { - return; - } else { - x_offset = 0; - y_offset = 0; - if (item->details->text_width) { - itmp = item->details->icon_rect.x0 - - item->details->text_rect.x0; - if (itmp > x_offset) { - x_offset = itmp; - } - itmp = item->details->icon_rect.y0 - - item->details->text_rect.y0; - if (itmp > y_offset) { - y_offset = itmp; - } - } - } - atk_component_get_extents (ATK_COMPONENT (image), x, y, NULL, NULL, coord_type); - *x += x_offset; - *y += y_offset; +nautilus_canvas_item_accessible_get_image_position (AtkImage *image, + gint *x, + gint *y, + AtkCoordType coord_type) +{ + NautilusCanvasItem *item; + gint x_offset, y_offset, itmp; + + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (image))); + if (!item) + { + return; + } + if (!item->details->icon_rect.x0 && !item->details->icon_rect.x1) + { + return; + } + else + { + x_offset = 0; + y_offset = 0; + if (item->details->text_width) + { + itmp = item->details->icon_rect.x0 - + item->details->text_rect.x0; + if (itmp > x_offset) + { + x_offset = itmp; + } + itmp = item->details->icon_rect.y0 - + item->details->text_rect.y0; + if (itmp > y_offset) + { + y_offset = itmp; + } + } + } + atk_component_get_extents (ATK_COMPONENT (image), x, y, NULL, NULL, coord_type); + *x += x_offset; + *y += y_offset; } static gboolean nautilus_canvas_item_accessible_set_image_description (AtkImage *image, - const gchar *description) + const gchar *description) { - NautilusCanvasItemAccessiblePrivate *priv; + NautilusCanvasItemAccessiblePrivate *priv; - priv = GET_ACCESSIBLE_PRIV (image); + priv = GET_ACCESSIBLE_PRIV (image); - g_free (priv->image_description); - priv->image_description = g_strdup (description); + g_free (priv->image_description); + priv->image_description = g_strdup (description); - return TRUE; + return TRUE; } static void nautilus_canvas_item_accessible_image_interface_init (AtkImageIface *iface) { - iface->get_image_description = nautilus_canvas_item_accessible_get_image_description; - iface->set_image_description = nautilus_canvas_item_accessible_set_image_description; - iface->get_image_size = nautilus_canvas_item_accessible_get_image_size; - iface->get_image_position = nautilus_canvas_item_accessible_get_image_position; + iface->get_image_description = nautilus_canvas_item_accessible_get_image_description; + iface->set_image_description = nautilus_canvas_item_accessible_set_image_description; + iface->get_image_size = nautilus_canvas_item_accessible_get_image_size; + iface->get_image_position = nautilus_canvas_item_accessible_get_image_position; } /* accessible text interface */ static gint -nautilus_canvas_item_accessible_get_offset_at_point (AtkText *text, - gint x, - gint y, - AtkCoordType coords) -{ - gint real_x, real_y, real_width, real_height; - NautilusCanvasItem *item; - gint editable_height; - gint offset = 0; - gint index; - PangoLayout *layout, *editable_layout, *additional_layout; - PangoRectangle rect0; - char *canvas_text; - gboolean have_editable; - gboolean have_additional; - gint text_offset, height; - - atk_component_get_extents (ATK_COMPONENT (text), &real_x, &real_y, - &real_width, &real_height, coords); - - x -= real_x; - y -= real_y; - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text))); - - if (item->details->pixbuf) { - get_scaled_icon_size (item, NULL, &height); - y -= height; - } - have_editable = item->details->editable_text != NULL && - item->details->editable_text[0] != '\0'; - have_additional = item->details->additional_text != NULL &&item->details->additional_text[0] != '\0'; - - editable_layout = NULL; - additional_layout = NULL; - if (have_editable) { - editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); - prepare_pango_layout_for_draw (item, editable_layout); - pango_layout_get_pixel_size (editable_layout, NULL, &editable_height); - if (y >= editable_height && - have_additional) { - prepare_pango_layout_for_draw (item, editable_layout); - additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); - layout = additional_layout; - canvas_text = item->details->additional_text; - y -= editable_height + LABEL_LINE_SPACING; - } else { - layout = editable_layout; - canvas_text = item->details->editable_text; - } - } else if (have_additional) { - additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); - prepare_pango_layout_for_draw (item, additional_layout); - layout = additional_layout; - canvas_text = item->details->additional_text; - } else { - return 0; - } - - text_offset = 0; - if (have_editable) { - pango_layout_index_to_pos (editable_layout, 0, &rect0); - text_offset = PANGO_PIXELS (rect0.x); - } - if (have_additional) { - gint itmp; - - pango_layout_index_to_pos (additional_layout, 0, &rect0); - itmp = PANGO_PIXELS (rect0.x); - if (itmp < text_offset) { - text_offset = itmp; - } - } - pango_layout_index_to_pos (layout, 0, &rect0); - x += text_offset; - if (!pango_layout_xy_to_index (layout, - x * PANGO_SCALE, - y * PANGO_SCALE, - &index, NULL)) { - if (x < 0 || y < 0) { - index = 0; - } else { - index = -1; - } - } - if (index == -1) { - offset = g_utf8_strlen (canvas_text, -1); - } else { - offset = g_utf8_pointer_to_offset (canvas_text, canvas_text + index); - } - if (layout == additional_layout) { - offset += g_utf8_strlen (item->details->editable_text, -1); - } - - if (editable_layout != NULL) { - g_object_unref (editable_layout); - } - - if (additional_layout != NULL) { - g_object_unref (additional_layout); - } - - return offset; +nautilus_canvas_item_accessible_get_offset_at_point (AtkText *text, + gint x, + gint y, + AtkCoordType coords) +{ + gint real_x, real_y, real_width, real_height; + NautilusCanvasItem *item; + gint editable_height; + gint offset = 0; + gint index; + PangoLayout *layout, *editable_layout, *additional_layout; + PangoRectangle rect0; + char *canvas_text; + gboolean have_editable; + gboolean have_additional; + gint text_offset, height; + + atk_component_get_extents (ATK_COMPONENT (text), &real_x, &real_y, + &real_width, &real_height, coords); + + x -= real_x; + y -= real_y; + + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text))); + + if (item->details->pixbuf) + { + get_scaled_icon_size (item, NULL, &height); + y -= height; + } + have_editable = item->details->editable_text != NULL && + item->details->editable_text[0] != '\0'; + have_additional = item->details->additional_text != NULL && item->details->additional_text[0] != '\0'; + + editable_layout = NULL; + additional_layout = NULL; + if (have_editable) + { + editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); + prepare_pango_layout_for_draw (item, editable_layout); + pango_layout_get_pixel_size (editable_layout, NULL, &editable_height); + if (y >= editable_height && + have_additional) + { + prepare_pango_layout_for_draw (item, editable_layout); + additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); + layout = additional_layout; + canvas_text = item->details->additional_text; + y -= editable_height + LABEL_LINE_SPACING; + } + else + { + layout = editable_layout; + canvas_text = item->details->editable_text; + } + } + else if (have_additional) + { + additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); + prepare_pango_layout_for_draw (item, additional_layout); + layout = additional_layout; + canvas_text = item->details->additional_text; + } + else + { + return 0; + } + + text_offset = 0; + if (have_editable) + { + pango_layout_index_to_pos (editable_layout, 0, &rect0); + text_offset = PANGO_PIXELS (rect0.x); + } + if (have_additional) + { + gint itmp; + + pango_layout_index_to_pos (additional_layout, 0, &rect0); + itmp = PANGO_PIXELS (rect0.x); + if (itmp < text_offset) + { + text_offset = itmp; + } + } + pango_layout_index_to_pos (layout, 0, &rect0); + x += text_offset; + if (!pango_layout_xy_to_index (layout, + x * PANGO_SCALE, + y * PANGO_SCALE, + &index, NULL)) + { + if (x < 0 || y < 0) + { + index = 0; + } + else + { + index = -1; + } + } + if (index == -1) + { + offset = g_utf8_strlen (canvas_text, -1); + } + else + { + offset = g_utf8_pointer_to_offset (canvas_text, canvas_text + index); + } + if (layout == additional_layout) + { + offset += g_utf8_strlen (item->details->editable_text, -1); + } + + if (editable_layout != NULL) + { + g_object_unref (editable_layout); + } + + if (additional_layout != NULL) + { + g_object_unref (additional_layout); + } + + return offset; } static void -nautilus_canvas_item_accessible_get_character_extents (AtkText *text, - gint offset, - gint *x, - gint *y, - gint *width, - gint *height, - AtkCoordType coords) -{ - gint pos_x, pos_y; - gint len, byte_offset; - gint editable_height; - gchar *canvas_text; - NautilusCanvasItem *item; - PangoLayout *layout, *editable_layout, *additional_layout; - PangoRectangle rect; - PangoRectangle rect0; - gboolean have_editable; - gint text_offset, pix_height; - - atk_component_get_extents (ATK_COMPONENT (text), &pos_x, &pos_y, NULL, NULL, coords); - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text))); - - if (item->details->pixbuf) { - get_scaled_icon_size (item, NULL, &pix_height); - pos_y += pix_height; - } - - have_editable = item->details->editable_text != NULL && - item->details->editable_text[0] != '\0'; - if (have_editable) { - len = g_utf8_strlen (item->details->editable_text, -1); - } else { - len = 0; - } - - editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); - additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); - - if (offset < len) { - canvas_text = item->details->editable_text; - layout = editable_layout; - } else { - offset -= len; - canvas_text = item->details->additional_text; - layout = additional_layout; - pos_y += LABEL_LINE_SPACING; - if (have_editable) { - pango_layout_get_pixel_size (editable_layout, NULL, &editable_height); - pos_y += editable_height; - } - } - byte_offset = g_utf8_offset_to_pointer (canvas_text, offset) - canvas_text; - pango_layout_index_to_pos (layout, byte_offset, &rect); - text_offset = 0; - if (have_editable) { - pango_layout_index_to_pos (editable_layout, 0, &rect0); - text_offset = PANGO_PIXELS (rect0.x); - } - if (item->details->additional_text != NULL && - item->details->additional_text[0] != '\0') { - gint itmp; - - pango_layout_index_to_pos (additional_layout, 0, &rect0); - itmp = PANGO_PIXELS (rect0.x); - if (itmp < text_offset) { - text_offset = itmp; - } - } - - g_object_unref (editable_layout); - g_object_unref (additional_layout); - - *x = pos_x + PANGO_PIXELS (rect.x) - text_offset; - *y = pos_y + PANGO_PIXELS (rect.y); - *width = PANGO_PIXELS (rect.width); - *height = PANGO_PIXELS (rect.height); +nautilus_canvas_item_accessible_get_character_extents (AtkText *text, + gint offset, + gint *x, + gint *y, + gint *width, + gint *height, + AtkCoordType coords) +{ + gint pos_x, pos_y; + gint len, byte_offset; + gint editable_height; + gchar *canvas_text; + NautilusCanvasItem *item; + PangoLayout *layout, *editable_layout, *additional_layout; + PangoRectangle rect; + PangoRectangle rect0; + gboolean have_editable; + gint text_offset, pix_height; + + atk_component_get_extents (ATK_COMPONENT (text), &pos_x, &pos_y, NULL, NULL, coords); + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (text))); + + if (item->details->pixbuf) + { + get_scaled_icon_size (item, NULL, &pix_height); + pos_y += pix_height; + } + + have_editable = item->details->editable_text != NULL && + item->details->editable_text[0] != '\0'; + if (have_editable) + { + len = g_utf8_strlen (item->details->editable_text, -1); + } + else + { + len = 0; + } + + editable_layout = get_label_layout (&item->details->editable_text_layout, item, item->details->editable_text); + additional_layout = get_label_layout (&item->details->additional_text_layout, item, item->details->additional_text); + + if (offset < len) + { + canvas_text = item->details->editable_text; + layout = editable_layout; + } + else + { + offset -= len; + canvas_text = item->details->additional_text; + layout = additional_layout; + pos_y += LABEL_LINE_SPACING; + if (have_editable) + { + pango_layout_get_pixel_size (editable_layout, NULL, &editable_height); + pos_y += editable_height; + } + } + byte_offset = g_utf8_offset_to_pointer (canvas_text, offset) - canvas_text; + pango_layout_index_to_pos (layout, byte_offset, &rect); + text_offset = 0; + if (have_editable) + { + pango_layout_index_to_pos (editable_layout, 0, &rect0); + text_offset = PANGO_PIXELS (rect0.x); + } + if (item->details->additional_text != NULL && + item->details->additional_text[0] != '\0') + { + gint itmp; + + pango_layout_index_to_pos (additional_layout, 0, &rect0); + itmp = PANGO_PIXELS (rect0.x); + if (itmp < text_offset) + { + text_offset = itmp; + } + } + + g_object_unref (editable_layout); + g_object_unref (additional_layout); + + *x = pos_x + PANGO_PIXELS (rect.x) - text_offset; + *y = pos_y + PANGO_PIXELS (rect.y); + *width = PANGO_PIXELS (rect.width); + *height = PANGO_PIXELS (rect.height); } static void nautilus_canvas_item_accessible_text_interface_init (AtkTextIface *iface) { - iface->get_text = eel_accessibility_text_get_text; - iface->get_character_at_offset = eel_accessibility_text_get_character_at_offset; - iface->get_text_before_offset = eel_accessibility_text_get_text_before_offset; - iface->get_text_at_offset = eel_accessibility_text_get_text_at_offset; - iface->get_text_after_offset = eel_accessibility_text_get_text_after_offset; - iface->get_character_count = eel_accessibility_text_get_character_count; - iface->get_character_extents = nautilus_canvas_item_accessible_get_character_extents; - iface->get_offset_at_point = nautilus_canvas_item_accessible_get_offset_at_point; + iface->get_text = eel_accessibility_text_get_text; + iface->get_character_at_offset = eel_accessibility_text_get_character_at_offset; + iface->get_text_before_offset = eel_accessibility_text_get_text_before_offset; + iface->get_text_at_offset = eel_accessibility_text_get_text_at_offset; + iface->get_text_after_offset = eel_accessibility_text_get_text_after_offset; + iface->get_character_count = eel_accessibility_text_get_character_count; + iface->get_character_extents = nautilus_canvas_item_accessible_get_character_extents; + iface->get_offset_at_point = nautilus_canvas_item_accessible_get_offset_at_point; } static GType nautilus_canvas_item_accessible_get_type (void); G_DEFINE_TYPE_WITH_CODE (NautilusCanvasItemAccessible, - nautilus_canvas_item_accessible, - eel_canvas_item_accessible_get_type (), - G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE, - nautilus_canvas_item_accessible_image_interface_init) - G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, - nautilus_canvas_item_accessible_text_interface_init) - G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, - nautilus_canvas_item_accessible_action_interface_init)); - -static AtkStateSet* + nautilus_canvas_item_accessible, + eel_canvas_item_accessible_get_type (), + G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE, + nautilus_canvas_item_accessible_image_interface_init) + G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, + nautilus_canvas_item_accessible_text_interface_init) + G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, + nautilus_canvas_item_accessible_action_interface_init)); + +static AtkStateSet * nautilus_canvas_item_accessible_ref_state_set (AtkObject *accessible) { - AtkStateSet *state_set; - NautilusCanvasItem *item; - NautilusCanvasContainer *container; - GList *selection; - gboolean one_item_selected; - - state_set = ATK_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->ref_state_set (accessible); - - item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); - if (!item) { - atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT); - return state_set; - } - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); - if (item->details->is_highlighted_as_keyboard_focus) { - atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); - } else if (!container->details->keyboard_focus) { - selection = nautilus_canvas_container_get_selection (container); - one_item_selected = (g_list_length (selection) == 1) && - item->details->is_highlighted_for_selection; - - if (one_item_selected) { - atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); - } + AtkStateSet *state_set; + NautilusCanvasItem *item; + NautilusCanvasContainer *container; + GList *selection; + gboolean one_item_selected; + + state_set = ATK_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->ref_state_set (accessible); + + item = NAUTILUS_CANVAS_ITEM (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (accessible))); + if (!item) + { + atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT); + return state_set; + } + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (item)->canvas); + if (item->details->is_highlighted_as_keyboard_focus) + { + atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); + } + else if (!container->details->keyboard_focus) + { + selection = nautilus_canvas_container_get_selection (container); + one_item_selected = (g_list_length (selection) == 1) && + item->details->is_highlighted_for_selection; + + if (one_item_selected) + { + atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); + } - g_list_free (selection); - } + g_list_free (selection); + } - return state_set; + return state_set; } static void nautilus_canvas_item_accessible_finalize (GObject *object) { - NautilusCanvasItemAccessiblePrivate *priv; - int i; + NautilusCanvasItemAccessiblePrivate *priv; + int i; - priv = GET_ACCESSIBLE_PRIV (object); + priv = GET_ACCESSIBLE_PRIV (object); - for (i = 0; i < LAST_ACTION; i++) { - g_free (priv->action_descriptions[i]); - } - g_free (priv->image_description); - g_free (priv->description); + for (i = 0; i < LAST_ACTION; i++) + { + g_free (priv->action_descriptions[i]); + } + g_free (priv->image_description); + g_free (priv->description); - G_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->finalize (object); + G_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->finalize (object); } static void nautilus_canvas_item_accessible_initialize (AtkObject *accessible, - gpointer widget) + gpointer widget) { - ATK_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->initialize (accessible, widget); + ATK_OBJECT_CLASS (nautilus_canvas_item_accessible_parent_class)->initialize (accessible, widget); - atk_object_set_role (accessible, ATK_ROLE_CANVAS); + atk_object_set_role (accessible, ATK_ROLE_CANVAS); } static void nautilus_canvas_item_accessible_class_init (NautilusCanvasItemAccessibleClass *klass) { - AtkObjectClass *aclass = ATK_OBJECT_CLASS (klass); - GObjectClass *oclass = G_OBJECT_CLASS (klass); + AtkObjectClass *aclass = ATK_OBJECT_CLASS (klass); + GObjectClass *oclass = G_OBJECT_CLASS (klass); - oclass->finalize = nautilus_canvas_item_accessible_finalize; + oclass->finalize = nautilus_canvas_item_accessible_finalize; - aclass->initialize = nautilus_canvas_item_accessible_initialize; + aclass->initialize = nautilus_canvas_item_accessible_initialize; - aclass->get_name = nautilus_canvas_item_accessible_get_name; - aclass->get_description = nautilus_canvas_item_accessible_get_description; - aclass->get_parent = nautilus_canvas_item_accessible_get_parent; - aclass->get_index_in_parent = nautilus_canvas_item_accessible_get_index_in_parent; - aclass->ref_state_set = nautilus_canvas_item_accessible_ref_state_set; + aclass->get_name = nautilus_canvas_item_accessible_get_name; + aclass->get_description = nautilus_canvas_item_accessible_get_description; + aclass->get_parent = nautilus_canvas_item_accessible_get_parent; + aclass->get_index_in_parent = nautilus_canvas_item_accessible_get_index_in_parent; + aclass->ref_state_set = nautilus_canvas_item_accessible_ref_state_set; - g_type_class_add_private (klass, sizeof (NautilusCanvasItemAccessiblePrivate)); + g_type_class_add_private (klass, sizeof (NautilusCanvasItemAccessiblePrivate)); } static void nautilus_canvas_item_accessible_init (NautilusCanvasItemAccessible *self) { - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_canvas_item_accessible_get_type (), - NautilusCanvasItemAccessiblePrivate); + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_canvas_item_accessible_get_type (), + NautilusCanvasItemAccessiblePrivate); } /* dummy typedef */ -typedef AtkObjectFactory NautilusCanvasItemAccessibleFactory; +typedef AtkObjectFactory NautilusCanvasItemAccessibleFactory; typedef AtkObjectFactoryClass NautilusCanvasItemAccessibleFactoryClass; G_DEFINE_TYPE (NautilusCanvasItemAccessibleFactory, nautilus_canvas_item_accessible_factory, - ATK_TYPE_OBJECT_FACTORY); + ATK_TYPE_OBJECT_FACTORY); static AtkObject * nautilus_canvas_item_accessible_factory_create_accessible (GObject *for_object) { - AtkObject *accessible; - NautilusCanvasItem *item; - GString *item_text; + AtkObject *accessible; + NautilusCanvasItem *item; + GString *item_text; - item = NAUTILUS_CANVAS_ITEM (for_object); - g_assert (item != NULL); + item = NAUTILUS_CANVAS_ITEM (for_object); + g_assert (item != NULL); - item_text = g_string_new (NULL); - if (item->details->editable_text) { - g_string_append (item_text, item->details->editable_text); - } - if (item->details->additional_text) { - g_string_append (item_text, item->details->additional_text); - } + item_text = g_string_new (NULL); + if (item->details->editable_text) + { + g_string_append (item_text, item->details->editable_text); + } + if (item->details->additional_text) + { + g_string_append (item_text, item->details->additional_text); + } - item->details->text_util = gail_text_util_new (); - gail_text_util_text_setup (item->details->text_util, - item_text->str); - g_string_free (item_text, TRUE); + item->details->text_util = gail_text_util_new (); + gail_text_util_text_setup (item->details->text_util, + item_text->str); + g_string_free (item_text, TRUE); - accessible = g_object_new (nautilus_canvas_item_accessible_get_type (), NULL); - atk_object_initialize (accessible, for_object); + accessible = g_object_new (nautilus_canvas_item_accessible_get_type (), NULL); + atk_object_initialize (accessible, for_object); - return accessible; + return accessible; } static GType nautilus_canvas_item_accessible_factory_get_accessible_type (void) { - return nautilus_canvas_item_accessible_get_type (); + return nautilus_canvas_item_accessible_get_type (); } static void @@ -2629,6 +2917,6 @@ nautilus_canvas_item_accessible_factory_init (NautilusCanvasItemAccessibleFactor static void nautilus_canvas_item_accessible_factory_class_init (NautilusCanvasItemAccessibleFactoryClass *klass) { - klass->create_accessible = nautilus_canvas_item_accessible_factory_create_accessible; - klass->get_accessible_type = nautilus_canvas_item_accessible_factory_get_accessible_type; + klass->create_accessible = nautilus_canvas_item_accessible_factory_create_accessible; + klass->get_accessible_type = nautilus_canvas_item_accessible_factory_get_accessible_type; } |