diff options
Diffstat (limited to 'src/nautilus-canvas-container.c')
-rw-r--r-- | src/nautilus-canvas-container.c | 12804 |
1 files changed, 6828 insertions, 5976 deletions
diff --git a/src/nautilus-canvas-container.c b/src/nautilus-canvas-container.c index 3da17a0c6..610225efa 100644 --- a/src/nautilus-canvas-container.c +++ b/src/nautilus-canvas-container.c @@ -1,27 +1,26 @@ - /* nautilus-canvas-container.c - Canvas container widget. - - Copyright (C) 1999, 2000 Free Software Foundation - Copyright (C) 2000, 2001 Eazel, Inc. - Copyright (C) 2002, 2003 Red Hat, Inc. - - The Gnome Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Authors: Ettore Perazzoli <ettore@gnu.org>, - Darin Adler <darin@bentspoon.com> -*/ + * + * Copyright (C) 1999, 2000 Free Software Foundation + * Copyright (C) 2000, 2001 Eazel, Inc. + * Copyright (C) 2002, 2003 Red Hat, Inc. + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * see <http://www.gnu.org/licenses/>. + * + * Authors: Ettore Perazzoli <ettore@gnu.org>, + * Darin Adler <darin@bentspoon.com> + */ #include <config.h> #include <X11/Xlib.h> @@ -104,13 +103,13 @@ #define LARGER_ICON_GRID_WIDTH 128 /* Desktop layout mode defines */ -#define DESKTOP_PAD_HORIZONTAL 10 -#define DESKTOP_PAD_VERTICAL 10 -#define SNAP_SIZE_X 78 -#define SNAP_SIZE_Y 20 +#define DESKTOP_PAD_HORIZONTAL 10 +#define DESKTOP_PAD_VERTICAL 10 +#define SNAP_SIZE_X 78 +#define SNAP_SIZE_Y 20 -#define SNAP_HORIZONTAL(func,x) ((func ((double)((x) - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X) * SNAP_SIZE_X) + DESKTOP_PAD_HORIZONTAL) -#define SNAP_VERTICAL(func, y) ((func ((double)((y) - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y) * SNAP_SIZE_Y) + DESKTOP_PAD_VERTICAL) +#define SNAP_HORIZONTAL(func, x) ((func ((double) ((x) - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X) * SNAP_SIZE_X) + DESKTOP_PAD_HORIZONTAL) +#define SNAP_VERTICAL(func, y) ((func ((double) ((y) - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y) * SNAP_SIZE_Y) + DESKTOP_PAD_VERTICAL) #define SNAP_NEAREST_HORIZONTAL(x) SNAP_HORIZONTAL (floor, x + SNAP_SIZE_X / 2) #define SNAP_NEAREST_VERTICAL(y) SNAP_VERTICAL (floor, y + SNAP_SIZE_Y / 2) @@ -124,123 +123,129 @@ /* Copied from NautilusFile */ #define UNDEFINED_TIME ((time_t) (-1)) -enum { - ACTION_ACTIVATE, - ACTION_MENU, - LAST_ACTION +enum +{ + ACTION_ACTIVATE, + ACTION_MENU, + LAST_ACTION }; -typedef struct { - GList *selection; - char *action_descriptions[LAST_ACTION]; +typedef struct +{ + GList *selection; + char *action_descriptions[LAST_ACTION]; } NautilusCanvasContainerAccessiblePrivate; -static GType nautilus_canvas_container_accessible_get_type (void); -static void preview_selected_items (NautilusCanvasContainer *container); -static void activate_selected_items (NautilusCanvasContainer *container); -static void activate_selected_items_alternate (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon); -static void compute_stretch (StretchState *start, - StretchState *current); -static NautilusCanvasIcon *get_first_selected_icon (NautilusCanvasContainer *container); -static NautilusCanvasIcon *get_nth_selected_icon (NautilusCanvasContainer *container, - int index); -static gboolean has_multiple_selection (NautilusCanvasContainer *container); -static gboolean all_selected (NautilusCanvasContainer *container); -static gboolean has_selection (NautilusCanvasContainer *container); -static void icon_destroy (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon); -static gboolean finish_adding_new_icons (NautilusCanvasContainer *container); -static inline void icon_get_bounding_box (NautilusCanvasIcon *icon, - int *x1_return, - int *y1_return, - int *x2_return, - int *y2_return, - NautilusCanvasItemBoundsUsage usage); -static void handle_hadjustment_changed (GtkAdjustment *adjustment, - NautilusCanvasContainer *container); -static void handle_vadjustment_changed (GtkAdjustment *adjustment, - NautilusCanvasContainer *container); -static GList * nautilus_canvas_container_get_selected_icons (NautilusCanvasContainer *container); -static void nautilus_canvas_container_update_visible_icons (NautilusCanvasContainer *container); -static void reveal_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon); - -static void nautilus_canvas_container_set_rtl_positions (NautilusCanvasContainer *container); -static double get_mirror_x_position (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - double x); -static void text_ellipsis_limit_changed_container_callback (gpointer callback_data); +static GType nautilus_canvas_container_accessible_get_type (void); +static void preview_selected_items (NautilusCanvasContainer *container); +static void activate_selected_items (NautilusCanvasContainer *container); +static void activate_selected_items_alternate (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon); +static void compute_stretch (StretchState *start, + StretchState *current); +static NautilusCanvasIcon *get_first_selected_icon (NautilusCanvasContainer *container); +static NautilusCanvasIcon *get_nth_selected_icon (NautilusCanvasContainer *container, + int index); +static gboolean has_multiple_selection (NautilusCanvasContainer *container); +static gboolean all_selected (NautilusCanvasContainer *container); +static gboolean has_selection (NautilusCanvasContainer *container); +static void icon_destroy (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon); +static gboolean finish_adding_new_icons (NautilusCanvasContainer *container); +static inline void icon_get_bounding_box (NautilusCanvasIcon *icon, + int *x1_return, + int *y1_return, + int *x2_return, + int *y2_return, + NautilusCanvasItemBoundsUsage usage); +static void handle_hadjustment_changed (GtkAdjustment *adjustment, + NautilusCanvasContainer *container); +static void handle_vadjustment_changed (GtkAdjustment *adjustment, + NautilusCanvasContainer *container); +static GList *nautilus_canvas_container_get_selected_icons (NautilusCanvasContainer *container); +static void nautilus_canvas_container_update_visible_icons (NautilusCanvasContainer *container); +static void reveal_icon (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon); + +static void nautilus_canvas_container_set_rtl_positions (NautilusCanvasContainer *container); +static double get_mirror_x_position (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon, + double x); +static void text_ellipsis_limit_changed_container_callback (gpointer callback_data); static int compare_icons_horizontal (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b); + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b); static int compare_icons_vertical (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b); + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b); static void store_layout_timestamps_now (NautilusCanvasContainer *container); static void schedule_redo_layout (NautilusCanvasContainer *container); -static const char *nautilus_canvas_container_accessible_action_names[] = { - "activate", - "menu", - NULL +static const char *nautilus_canvas_container_accessible_action_names[] = +{ + "activate", + "menu", + NULL }; -static const char *nautilus_canvas_container_accessible_action_descriptions[] = { - "Activate selected items", - "Popup context menu", - NULL +static const char *nautilus_canvas_container_accessible_action_descriptions[] = +{ + "Activate selected items", + "Popup context menu", + NULL }; G_DEFINE_TYPE (NautilusCanvasContainer, nautilus_canvas_container, EEL_TYPE_CANVAS); /* The NautilusCanvasContainer signals. */ -enum { - ACTIVATE, - ACTIVATE_ALTERNATE, - ACTIVATE_PREVIEWER, - BAND_SELECT_STARTED, - BAND_SELECT_ENDED, - BUTTON_PRESS, - CAN_ACCEPT_ITEM, - CONTEXT_CLICK_BACKGROUND, - CONTEXT_CLICK_SELECTION, - MIDDLE_CLICK, - GET_CONTAINER_URI, - GET_ICON_URI, - GET_ICON_ACTIVATION_URI, - GET_ICON_DROP_TARGET_URI, - GET_STORED_ICON_POSITION, - ICON_POSITION_CHANGED, - GET_STORED_LAYOUT_TIMESTAMP, - STORE_LAYOUT_TIMESTAMP, - ICON_RENAME_STARTED, - ICON_RENAME_ENDED, - ICON_STRETCH_STARTED, - ICON_STRETCH_ENDED, - LAYOUT_CHANGED, - MOVE_COPY_ITEMS, - HANDLE_NETSCAPE_URL, - HANDLE_URI_LIST, - HANDLE_TEXT, - HANDLE_RAW, - HANDLE_HOVER, - SELECTION_CHANGED, - ICON_ADDED, - ICON_REMOVED, - CLEARED, - LAST_SIGNAL +enum +{ + ACTIVATE, + ACTIVATE_ALTERNATE, + ACTIVATE_PREVIEWER, + BAND_SELECT_STARTED, + BAND_SELECT_ENDED, + BUTTON_PRESS, + CAN_ACCEPT_ITEM, + CONTEXT_CLICK_BACKGROUND, + CONTEXT_CLICK_SELECTION, + MIDDLE_CLICK, + GET_CONTAINER_URI, + GET_ICON_URI, + GET_ICON_ACTIVATION_URI, + GET_ICON_DROP_TARGET_URI, + GET_STORED_ICON_POSITION, + ICON_POSITION_CHANGED, + GET_STORED_LAYOUT_TIMESTAMP, + STORE_LAYOUT_TIMESTAMP, + ICON_RENAME_STARTED, + ICON_RENAME_ENDED, + ICON_STRETCH_STARTED, + ICON_STRETCH_ENDED, + LAYOUT_CHANGED, + MOVE_COPY_ITEMS, + HANDLE_NETSCAPE_URL, + HANDLE_URI_LIST, + HANDLE_TEXT, + HANDLE_RAW, + HANDLE_HOVER, + SELECTION_CHANGED, + ICON_ADDED, + ICON_REMOVED, + CLEARED, + LAST_SIGNAL }; -typedef struct { - int **icon_grid; - int *grid_memory; - int num_rows; - int num_columns; - gboolean tight; +typedef struct +{ + int **icon_grid; + int *grid_memory; + int num_rows; + int num_columns; + gboolean tight; } PlacementGrid; static guint signals[LAST_SIGNAL]; @@ -250,144 +255,170 @@ static guint signals[LAST_SIGNAL]; static void icon_free (NautilusCanvasIcon *icon) { - /* Destroy this icon item; the parent will unref it. */ - eel_canvas_item_destroy (EEL_CANVAS_ITEM (icon->item)); - g_free (icon); + /* Destroy this icon item; the parent will unref it. */ + eel_canvas_item_destroy (EEL_CANVAS_ITEM (icon->item)); + g_free (icon); } static gboolean icon_is_positioned (const NautilusCanvasIcon *icon) { - return icon->x != ICON_UNPOSITIONED_VALUE && icon->y != ICON_UNPOSITIONED_VALUE; + return icon->x != ICON_UNPOSITIONED_VALUE && icon->y != ICON_UNPOSITIONED_VALUE; } /* x, y are the top-left coordinates of the icon. */ static void icon_set_position (NautilusCanvasIcon *icon, - double x, double y) -{ - NautilusCanvasContainer *container; - double pixels_per_unit; - int container_left, container_top, container_right, container_bottom; - int x1, x2, y1, y2; - int container_x, container_y, container_width, container_height; - EelDRect icon_bounds; - int item_width, item_height; - int height_above, width_left; - int min_x, max_x, min_y, max_y; - - if (icon->x == x && icon->y == y) { - return; - } - - container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (icon->item)->canvas); - - if (nautilus_canvas_container_get_is_fixed_size (container)) { - /* FIXME: This should be: - - container_x = GTK_WIDGET (container)->allocation.x; - container_y = GTK_WIDGET (container)->allocation.y; - container_width = GTK_WIDGET (container)->allocation.width; - container_height = GTK_WIDGET (container)->allocation.height; - - But for some reason the widget allocation is sometimes not done - at startup, and the allocation is then only 45x60. which is - really bad. - - For now, we have a cheesy workaround: - */ - container_x = 0; - container_y = 0; - container_width = gdk_screen_width () - container_x - - container->details->left_margin - - container->details->right_margin; - container_height = gdk_screen_height () - container_y - - container->details->top_margin - - container->details->bottom_margin; - pixels_per_unit = EEL_CANVAS (container)->pixels_per_unit; - /* Clip the position of the icon within our desktop bounds */ - container_left = container_x / pixels_per_unit; - container_top = container_y / pixels_per_unit; - container_right = container_left + container_width / pixels_per_unit; - container_bottom = container_top + container_height / pixels_per_unit; - - icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_ENTIRE_ITEM); - item_width = x2 - x1; - item_height = y2 - y1; - - icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); - - /* determine icon rectangle relative to item rectangle */ - height_above = icon_bounds.y0 - y1; - width_left = icon_bounds.x0 - x1; - - min_x = container_left + DESKTOP_PAD_HORIZONTAL + width_left; - max_x = container_right - DESKTOP_PAD_HORIZONTAL - item_width + width_left; - x = CLAMP (x, min_x, max_x); - - min_y = container_top + height_above + DESKTOP_PAD_VERTICAL; - max_y = container_bottom - DESKTOP_PAD_VERTICAL - item_height + height_above; - y = CLAMP (y, min_y, max_y); - } - - if (icon->x == ICON_UNPOSITIONED_VALUE) { - icon->x = 0; - } - if (icon->y == ICON_UNPOSITIONED_VALUE) { - icon->y = 0; - } - - eel_canvas_item_move (EEL_CANVAS_ITEM (icon->item), - x - icon->x, - y - icon->y); - - icon->x = x; - icon->y = y; + double x, + double y) +{ + NautilusCanvasContainer *container; + double pixels_per_unit; + int container_left, container_top, container_right, container_bottom; + int x1, x2, y1, y2; + int container_x, container_y, container_width, container_height; + EelDRect icon_bounds; + int item_width, item_height; + int height_above, width_left; + int min_x, max_x, min_y, max_y; + + if (icon->x == x && icon->y == y) + { + return; + } + + container = NAUTILUS_CANVAS_CONTAINER (EEL_CANVAS_ITEM (icon->item)->canvas); + + if (nautilus_canvas_container_get_is_fixed_size (container)) + { + /* FIXME: This should be: + * + * container_x = GTK_WIDGET (container)->allocation.x; + * container_y = GTK_WIDGET (container)->allocation.y; + * container_width = GTK_WIDGET (container)->allocation.width; + * container_height = GTK_WIDGET (container)->allocation.height; + * + * But for some reason the widget allocation is sometimes not done + * at startup, and the allocation is then only 45x60. which is + * really bad. + * + * For now, we have a cheesy workaround: + */ + container_x = 0; + container_y = 0; + container_width = gdk_screen_width () - container_x + - container->details->left_margin + - container->details->right_margin; + container_height = gdk_screen_height () - container_y + - container->details->top_margin + - container->details->bottom_margin; + pixels_per_unit = EEL_CANVAS (container)->pixels_per_unit; + /* Clip the position of the icon within our desktop bounds */ + container_left = container_x / pixels_per_unit; + container_top = container_y / pixels_per_unit; + container_right = container_left + container_width / pixels_per_unit; + container_bottom = container_top + container_height / pixels_per_unit; + + icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_ENTIRE_ITEM); + item_width = x2 - x1; + item_height = y2 - y1; + + icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); + + /* determine icon rectangle relative to item rectangle */ + height_above = icon_bounds.y0 - y1; + width_left = icon_bounds.x0 - x1; + + min_x = container_left + DESKTOP_PAD_HORIZONTAL + width_left; + max_x = container_right - DESKTOP_PAD_HORIZONTAL - item_width + width_left; + x = CLAMP (x, min_x, max_x); + + min_y = container_top + height_above + DESKTOP_PAD_VERTICAL; + max_y = container_bottom - DESKTOP_PAD_VERTICAL - item_height + height_above; + y = CLAMP (y, min_y, max_y); + } + + if (icon->x == ICON_UNPOSITIONED_VALUE) + { + icon->x = 0; + } + if (icon->y == ICON_UNPOSITIONED_VALUE) + { + icon->y = 0; + } + + eel_canvas_item_move (EEL_CANVAS_ITEM (icon->item), + x - icon->x, + y - icon->y); + + icon->x = x; + icon->y = y; } static guint nautilus_canvas_container_get_grid_size_for_zoom_level (NautilusCanvasZoomLevel zoom_level) { - switch (zoom_level) { - case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: - return SMALL_ICON_GRID_WIDTH; - case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: - return STANDARD_ICON_GRID_WIDTH; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: - return LARGE_ICON_GRID_WIDTH; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: - return LARGER_ICON_GRID_WIDTH; - } - g_return_val_if_reached (STANDARD_ICON_GRID_WIDTH); + switch (zoom_level) + { + case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: + { + return SMALL_ICON_GRID_WIDTH; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: + { + return STANDARD_ICON_GRID_WIDTH; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: + { + return LARGE_ICON_GRID_WIDTH; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: + return LARGER_ICON_GRID_WIDTH; + } + g_return_val_if_reached (STANDARD_ICON_GRID_WIDTH); } guint nautilus_canvas_container_get_icon_size_for_zoom_level (NautilusCanvasZoomLevel zoom_level) { - switch (zoom_level) { - case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: - return NAUTILUS_CANVAS_ICON_SIZE_SMALL; - case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: - return NAUTILUS_CANVAS_ICON_SIZE_STANDARD; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: - return NAUTILUS_CANVAS_ICON_SIZE_LARGE; - case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: - return NAUTILUS_CANVAS_ICON_SIZE_LARGER; - } - g_return_val_if_reached (NAUTILUS_CANVAS_ICON_SIZE_STANDARD); + switch (zoom_level) + { + case NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL: + { + return NAUTILUS_CANVAS_ICON_SIZE_SMALL; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD: + { + return NAUTILUS_CANVAS_ICON_SIZE_STANDARD; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGE: + { + return NAUTILUS_CANVAS_ICON_SIZE_LARGE; + } + + case NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER: + return NAUTILUS_CANVAS_ICON_SIZE_LARGER; + } + g_return_val_if_reached (NAUTILUS_CANVAS_ICON_SIZE_STANDARD); } static void icon_get_size (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - guint *size) + NautilusCanvasIcon *icon, + guint *size) { - if (size != NULL) { - *size = MAX (nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) - * icon->scale, NAUTILUS_CANVAS_ICON_SIZE_SMALL); - } + if (size != NULL) + { + *size = MAX (nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) + * icon->scale, NAUTILUS_CANVAS_ICON_SIZE_SMALL); + } } /* The icon_set_size function is used by the stretching user @@ -397,462 +428,513 @@ icon_get_size (NautilusCanvasContainer *container, */ static void icon_set_size (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - guint icon_size, - gboolean snap, - gboolean update_position) + NautilusCanvasIcon *icon, + guint icon_size, + gboolean snap, + gboolean update_position) { - guint old_size; - double scale; + guint old_size; + double scale; - icon_get_size (container, icon, &old_size); - if (icon_size == old_size) { - return; - } + icon_get_size (container, icon, &old_size); + if (icon_size == old_size) + { + return; + } - scale = (double) icon_size / - nautilus_canvas_container_get_icon_size_for_zoom_level - (container->details->zoom_level); - nautilus_canvas_container_move_icon (container, icon, - icon->x, icon->y, - scale, FALSE, - snap, update_position); + scale = (double) icon_size / + nautilus_canvas_container_get_icon_size_for_zoom_level + (container->details->zoom_level); + nautilus_canvas_container_move_icon (container, icon, + icon->x, icon->y, + scale, FALSE, + snap, update_position); } static void icon_raise (NautilusCanvasIcon *icon) { - EelCanvasItem *item, *band; - - item = EEL_CANVAS_ITEM (icon->item); - band = NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle; - - eel_canvas_item_send_behind (item, band); + EelCanvasItem *item, *band; + + item = EEL_CANVAS_ITEM (icon->item); + band = NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle; + + eel_canvas_item_send_behind (item, band); } static void -emit_stretch_started (NautilusCanvasContainer *container, NautilusCanvasIcon *icon) +emit_stretch_started (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon) { - g_signal_emit (container, - signals[ICON_STRETCH_STARTED], 0, - icon->data); + g_signal_emit (container, + signals[ICON_STRETCH_STARTED], 0, + icon->data); } static void -emit_stretch_ended (NautilusCanvasContainer *container, NautilusCanvasIcon *icon) +emit_stretch_ended (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon) { - g_signal_emit (container, - signals[ICON_STRETCH_ENDED], 0, - icon->data); + g_signal_emit (container, + signals[ICON_STRETCH_ENDED], 0, + icon->data); } static void icon_toggle_selected (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) -{ - icon->is_selected = !icon->is_selected; - if (icon->is_selected) { - container->details->selection = g_list_prepend (container->details->selection, icon->data); - container->details->selection_needs_resort = TRUE; - } else { - container->details->selection = g_list_remove (container->details->selection, icon->data); - } - - eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), - "highlighted_for_selection", (gboolean) icon->is_selected, - NULL); - - /* If the icon is deselected, then get rid of the stretch handles. - * No harm in doing the same if the item is newly selected. - */ - if (icon == container->details->stretch_icon) { - container->details->stretch_icon = NULL; - nautilus_canvas_item_set_show_stretch_handles (icon->item, FALSE); - /* snap the icon if necessary */ - if (container->details->keep_aligned) { - nautilus_canvas_container_move_icon (container, - icon, - icon->x, icon->y, - icon->scale, - FALSE, TRUE, TRUE); - } - - emit_stretch_ended (container, icon); - } - - /* Raise each newly-selected icon to the front as it is selected. */ - if (icon->is_selected) { - icon_raise (icon); - } + NautilusCanvasIcon *icon) +{ + icon->is_selected = !icon->is_selected; + if (icon->is_selected) + { + container->details->selection = g_list_prepend (container->details->selection, icon->data); + container->details->selection_needs_resort = TRUE; + } + else + { + container->details->selection = g_list_remove (container->details->selection, icon->data); + } + + eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), + "highlighted_for_selection", (gboolean) icon->is_selected, + NULL); + + /* If the icon is deselected, then get rid of the stretch handles. + * No harm in doing the same if the item is newly selected. + */ + if (icon == container->details->stretch_icon) + { + container->details->stretch_icon = NULL; + nautilus_canvas_item_set_show_stretch_handles (icon->item, FALSE); + /* snap the icon if necessary */ + if (container->details->keep_aligned) + { + nautilus_canvas_container_move_icon (container, + icon, + icon->x, icon->y, + icon->scale, + FALSE, TRUE, TRUE); + } + + emit_stretch_ended (container, icon); + } + + /* Raise each newly-selected icon to the front as it is selected. */ + if (icon->is_selected) + { + icon_raise (icon); + } } /* Select an icon. Return TRUE if selection has changed. */ static gboolean icon_set_selected (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - gboolean select) + NautilusCanvasIcon *icon, + gboolean select) { - g_assert (select == FALSE || select == TRUE); - g_assert (icon->is_selected == FALSE || icon->is_selected == TRUE); + g_assert (select == FALSE || select == TRUE); + g_assert (icon->is_selected == FALSE || icon->is_selected == TRUE); - if (select == icon->is_selected) { - return FALSE; - } + if (select == icon->is_selected) + { + return FALSE; + } - icon_toggle_selected (container, icon); - g_assert (select == icon->is_selected); - return TRUE; + icon_toggle_selected (container, icon); + g_assert (select == icon->is_selected); + return TRUE; } static inline void -icon_get_bounding_box (NautilusCanvasIcon *icon, - int *x1_return, int *y1_return, - int *x2_return, int *y2_return, - NautilusCanvasItemBoundsUsage usage) -{ - double x1, y1, x2, y2; - - if (usage == BOUNDS_USAGE_FOR_DISPLAY) { - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), - &x1, &y1, &x2, &y2); - } else if (usage == BOUNDS_USAGE_FOR_LAYOUT) { - nautilus_canvas_item_get_bounds_for_layout (icon->item, - &x1, &y1, &x2, &y2); - } else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) { - nautilus_canvas_item_get_bounds_for_entire_item (icon->item, - &x1, &y1, &x2, &y2); - } else { - g_assert_not_reached (); - } - - if (x1_return != NULL) { - *x1_return = x1; - } - - if (y1_return != NULL) { - *y1_return = y1; - } - - if (x2_return != NULL) { - *x2_return = x2; - } - - if (y2_return != NULL) { - *y2_return = y2; - } +icon_get_bounding_box (NautilusCanvasIcon *icon, + int *x1_return, + int *y1_return, + int *x2_return, + int *y2_return, + NautilusCanvasItemBoundsUsage usage) +{ + double x1, y1, x2, y2; + + if (usage == BOUNDS_USAGE_FOR_DISPLAY) + { + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), + &x1, &y1, &x2, &y2); + } + else if (usage == BOUNDS_USAGE_FOR_LAYOUT) + { + nautilus_canvas_item_get_bounds_for_layout (icon->item, + &x1, &y1, &x2, &y2); + } + else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) + { + nautilus_canvas_item_get_bounds_for_entire_item (icon->item, + &x1, &y1, &x2, &y2); + } + else + { + g_assert_not_reached (); + } + + if (x1_return != NULL) + { + *x1_return = x1; + } + + if (y1_return != NULL) + { + *y1_return = y1; + } + + if (x2_return != NULL) + { + *x2_return = x2; + } + + if (y2_return != NULL) + { + *y2_return = y2; + } } /* Utility functions for NautilusCanvasContainer. */ gboolean nautilus_canvas_container_scroll (NautilusCanvasContainer *container, - int delta_x, int delta_y) + int delta_x, + int delta_y) { - GtkAdjustment *hadj, *vadj; - int old_h_value, old_v_value; + GtkAdjustment *hadj, *vadj; + int old_h_value, old_v_value; + + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); + /* Store the old ajustment values so we can tell if we + * ended up actually scrolling. We may not have in a case + * where the resulting value got pinned to the adjustment + * min or max. + */ + old_h_value = gtk_adjustment_get_value (hadj); + old_v_value = gtk_adjustment_get_value (vadj); - /* Store the old ajustment values so we can tell if we - * ended up actually scrolling. We may not have in a case - * where the resulting value got pinned to the adjustment - * min or max. - */ - old_h_value = gtk_adjustment_get_value (hadj); - old_v_value = gtk_adjustment_get_value (vadj); - - gtk_adjustment_set_value (hadj, gtk_adjustment_get_value (hadj) + delta_x); - gtk_adjustment_set_value (vadj, gtk_adjustment_get_value (vadj) + delta_y); + gtk_adjustment_set_value (hadj, gtk_adjustment_get_value (hadj) + delta_x); + gtk_adjustment_set_value (vadj, gtk_adjustment_get_value (vadj) + delta_y); - /* return TRUE if we did scroll */ - return gtk_adjustment_get_value (hadj) != old_h_value || gtk_adjustment_get_value (vadj) != old_v_value; + /* return TRUE if we did scroll */ + return gtk_adjustment_get_value (hadj) != old_h_value || gtk_adjustment_get_value (vadj) != old_v_value; } static void -pending_icon_to_reveal_destroy_callback (NautilusCanvasItem *item, - NautilusCanvasContainer *container) +pending_icon_to_reveal_destroy_callback (NautilusCanvasItem *item, + NautilusCanvasContainer *container) { - g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_assert (container->details->pending_icon_to_reveal != NULL); - g_assert (container->details->pending_icon_to_reveal->item == item); + g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_assert (container->details->pending_icon_to_reveal != NULL); + g_assert (container->details->pending_icon_to_reveal->item == item); - container->details->pending_icon_to_reveal = NULL; + container->details->pending_icon_to_reveal = NULL; } static NautilusCanvasIcon * get_pending_icon_to_reveal (NautilusCanvasContainer *container) { - return container->details->pending_icon_to_reveal; + return container->details->pending_icon_to_reveal; } static void -set_pending_icon_to_reveal (NautilusCanvasContainer *container, NautilusCanvasIcon *icon) -{ - NautilusCanvasIcon *old_icon; - - old_icon = container->details->pending_icon_to_reveal; - - if (icon == old_icon) { - return; - } - - if (old_icon != NULL) { - g_signal_handlers_disconnect_by_func - (old_icon->item, - G_CALLBACK (pending_icon_to_reveal_destroy_callback), - container); - } - - if (icon != NULL) { - g_signal_connect (icon->item, "destroy", - G_CALLBACK (pending_icon_to_reveal_destroy_callback), - container); - } - - container->details->pending_icon_to_reveal = icon; +set_pending_icon_to_reveal (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon) +{ + NautilusCanvasIcon *old_icon; + + old_icon = container->details->pending_icon_to_reveal; + + if (icon == old_icon) + { + return; + } + + if (old_icon != NULL) + { + g_signal_handlers_disconnect_by_func + (old_icon->item, + G_CALLBACK (pending_icon_to_reveal_destroy_callback), + container); + } + + if (icon != NULL) + { + g_signal_connect (icon->item, "destroy", + G_CALLBACK (pending_icon_to_reveal_destroy_callback), + container); + } + + container->details->pending_icon_to_reveal = icon; } static void item_get_canvas_bounds (EelCanvasItem *item, - EelIRect *bounds) -{ - EelDRect world_rect; - - eel_canvas_item_get_bounds (item, - &world_rect.x0, - &world_rect.y0, - &world_rect.x1, - &world_rect.y1); - eel_canvas_item_i2w (item->parent, - &world_rect.x0, - &world_rect.y0); - eel_canvas_item_i2w (item->parent, - &world_rect.x1, - &world_rect.y1); - - world_rect.x0 -= ICON_PAD_LEFT + ICON_PAD_RIGHT; - world_rect.x1 += ICON_PAD_LEFT + ICON_PAD_RIGHT; - - world_rect.y0 -= ICON_PAD_TOP + ICON_PAD_BOTTOM; - world_rect.y1 += ICON_PAD_TOP + ICON_PAD_BOTTOM; - - eel_canvas_w2c (item->canvas, - world_rect.x0, - world_rect.y0, - &bounds->x0, - &bounds->y0); - eel_canvas_w2c (item->canvas, - world_rect.x1, - world_rect.y1, - &bounds->x1, - &bounds->y1); + EelIRect *bounds) +{ + EelDRect world_rect; + + eel_canvas_item_get_bounds (item, + &world_rect.x0, + &world_rect.y0, + &world_rect.x1, + &world_rect.y1); + eel_canvas_item_i2w (item->parent, + &world_rect.x0, + &world_rect.y0); + eel_canvas_item_i2w (item->parent, + &world_rect.x1, + &world_rect.y1); + + world_rect.x0 -= ICON_PAD_LEFT + ICON_PAD_RIGHT; + world_rect.x1 += ICON_PAD_LEFT + ICON_PAD_RIGHT; + + world_rect.y0 -= ICON_PAD_TOP + ICON_PAD_BOTTOM; + world_rect.y1 += ICON_PAD_TOP + ICON_PAD_BOTTOM; + + eel_canvas_w2c (item->canvas, + world_rect.x0, + world_rect.y0, + &bounds->x0, + &bounds->y0); + eel_canvas_w2c (item->canvas, + world_rect.x1, + world_rect.y1, + &bounds->x1, + &bounds->y1); } static void icon_get_row_and_column_bounds (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - EelIRect *bounds) + NautilusCanvasIcon *icon, + EelIRect *bounds) { - GList *p; - NautilusCanvasIcon *one_icon; - EelIRect one_bounds; - - item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), bounds); + GList *p; + NautilusCanvasIcon *one_icon; + EelIRect one_bounds; - for (p = container->details->icons; p != NULL; p = p->next) { - one_icon = p->data; + item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), bounds); - if (icon == one_icon) { - continue; - } + for (p = container->details->icons; p != NULL; p = p->next) + { + one_icon = p->data; - if (compare_icons_horizontal (container, icon, one_icon) == 0) { - item_get_canvas_bounds (EEL_CANVAS_ITEM (one_icon->item), &one_bounds); - bounds->x0 = MIN (bounds->x0, one_bounds.x0); - bounds->x1 = MAX (bounds->x1, one_bounds.x1); - } - - if (compare_icons_vertical (container, icon, one_icon) == 0) { - item_get_canvas_bounds (EEL_CANVAS_ITEM (one_icon->item), &one_bounds); - bounds->y0 = MIN (bounds->y0, one_bounds.y0); - bounds->y1 = MAX (bounds->y1, one_bounds.y1); - } - } + if (icon == one_icon) + { + continue; + } + if (compare_icons_horizontal (container, icon, one_icon) == 0) + { + item_get_canvas_bounds (EEL_CANVAS_ITEM (one_icon->item), &one_bounds); + bounds->x0 = MIN (bounds->x0, one_bounds.x0); + bounds->x1 = MAX (bounds->x1, one_bounds.x1); + } + if (compare_icons_vertical (container, icon, one_icon) == 0) + { + item_get_canvas_bounds (EEL_CANVAS_ITEM (one_icon->item), &one_bounds); + bounds->y0 = MIN (bounds->y0, one_bounds.y0); + bounds->y1 = MAX (bounds->y1, one_bounds.y1); + } + } } static void reveal_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) -{ - GtkAllocation allocation; - GtkAdjustment *hadj, *vadj; - EelIRect bounds; - - if (!icon_is_positioned (icon)) { - set_pending_icon_to_reveal (container, icon); - return; - } - - set_pending_icon_to_reveal (container, NULL); - - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); - - if (nautilus_canvas_container_is_auto_layout (container)) { - /* ensure that we reveal the entire row/column */ - icon_get_row_and_column_bounds (container, icon, &bounds); - } else { - item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), &bounds); - } - if (bounds.y0 < gtk_adjustment_get_value (vadj)) { - gtk_adjustment_set_value (vadj, bounds.y0); - } else if (bounds.y1 > gtk_adjustment_get_value (vadj) + allocation.height) { - gtk_adjustment_set_value - (vadj, bounds.y1 - allocation.height); - } - - if (bounds.x0 < gtk_adjustment_get_value (hadj)) { - gtk_adjustment_set_value (hadj, bounds.x0); - } else if (bounds.x1 > gtk_adjustment_get_value (hadj) + allocation.width) { - gtk_adjustment_set_value - (hadj, bounds.x1 - allocation.width); - } + NautilusCanvasIcon *icon) +{ + GtkAllocation allocation; + GtkAdjustment *hadj, *vadj; + EelIRect bounds; + + if (!icon_is_positioned (icon)) + { + set_pending_icon_to_reveal (container, icon); + return; + } + + set_pending_icon_to_reveal (container, NULL); + + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); + + if (nautilus_canvas_container_is_auto_layout (container)) + { + /* ensure that we reveal the entire row/column */ + icon_get_row_and_column_bounds (container, icon, &bounds); + } + else + { + item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), &bounds); + } + if (bounds.y0 < gtk_adjustment_get_value (vadj)) + { + gtk_adjustment_set_value (vadj, bounds.y0); + } + else if (bounds.y1 > gtk_adjustment_get_value (vadj) + allocation.height) + { + gtk_adjustment_set_value + (vadj, bounds.y1 - allocation.height); + } + + if (bounds.x0 < gtk_adjustment_get_value (hadj)) + { + gtk_adjustment_set_value (hadj, bounds.x0); + } + else if (bounds.x1 > gtk_adjustment_get_value (hadj) + allocation.width) + { + gtk_adjustment_set_value + (hadj, bounds.x1 - allocation.width); + } } static void process_pending_icon_to_reveal (NautilusCanvasContainer *container) { - NautilusCanvasIcon *pending_icon_to_reveal; - - pending_icon_to_reveal = get_pending_icon_to_reveal (container); - - if (pending_icon_to_reveal != NULL) { - reveal_icon (container, pending_icon_to_reveal); - } + NautilusCanvasIcon *pending_icon_to_reveal; + + pending_icon_to_reveal = get_pending_icon_to_reveal (container); + + if (pending_icon_to_reveal != NULL) + { + reveal_icon (container, pending_icon_to_reveal); + } } static gboolean keyboard_icon_reveal_timeout_callback (gpointer data) { - NautilusCanvasContainer *container; - NautilusCanvasIcon *icon; + NautilusCanvasContainer *container; + NautilusCanvasIcon *icon; - container = NAUTILUS_CANVAS_CONTAINER (data); - icon = container->details->keyboard_icon_to_reveal; + container = NAUTILUS_CANVAS_CONTAINER (data); + icon = container->details->keyboard_icon_to_reveal; - g_assert (icon != NULL); + g_assert (icon != NULL); - /* Only reveal the icon if it's still the keyboard focus or if - * it's still selected. Someone originally thought we should - * cancel this reveal if the user manages to sneak a direct - * scroll in before the timeout fires, but we later realized - * this wouldn't actually be an improvement - * (see bugzilla.gnome.org 40612). - */ - if (icon == container->details->focus - || icon->is_selected) { - reveal_icon (container, icon); - } - container->details->keyboard_icon_reveal_timer_id = 0; + /* Only reveal the icon if it's still the keyboard focus or if + * it's still selected. Someone originally thought we should + * cancel this reveal if the user manages to sneak a direct + * scroll in before the timeout fires, but we later realized + * this wouldn't actually be an improvement + * (see bugzilla.gnome.org 40612). + */ + if (icon == container->details->focus + || icon->is_selected) + { + reveal_icon (container, icon); + } + container->details->keyboard_icon_reveal_timer_id = 0; - return FALSE; + return FALSE; } static void unschedule_keyboard_icon_reveal (NautilusCanvasContainer *container) { - NautilusCanvasContainerDetails *details; + NautilusCanvasContainerDetails *details; - details = container->details; + details = container->details; - if (details->keyboard_icon_reveal_timer_id != 0) { - g_source_remove (details->keyboard_icon_reveal_timer_id); - } + if (details->keyboard_icon_reveal_timer_id != 0) + { + g_source_remove (details->keyboard_icon_reveal_timer_id); + } } static void schedule_keyboard_icon_reveal (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - NautilusCanvasContainerDetails *details; + NautilusCanvasContainerDetails *details; - details = container->details; + details = container->details; - unschedule_keyboard_icon_reveal (container); + unschedule_keyboard_icon_reveal (container); - details->keyboard_icon_to_reveal = icon; - details->keyboard_icon_reveal_timer_id - = g_timeout_add (KEYBOARD_ICON_REVEAL_TIMEOUT, - keyboard_icon_reveal_timeout_callback, - container); + details->keyboard_icon_to_reveal = icon; + details->keyboard_icon_reveal_timer_id + = g_timeout_add (KEYBOARD_ICON_REVEAL_TIMEOUT, + keyboard_icon_reveal_timeout_callback, + container); } static void inline emit_atk_object_notify_focused (NautilusCanvasIcon *icon, - gboolean focused) + gboolean focused) { - AtkObject *atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); - atk_object_notify_state_change (atk_object, ATK_STATE_FOCUSED, focused); + AtkObject *atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); + atk_object_notify_state_change (atk_object, ATK_STATE_FOCUSED, focused); } static void clear_focus (NautilusCanvasContainer *container) { - if (container->details->focus != NULL) { - if (container->details->keyboard_focus) { - eel_canvas_item_set (EEL_CANVAS_ITEM (container->details->focus->item), - "highlighted_as_keyboard_focus", 0, - NULL); - } else { - emit_atk_object_notify_focused (container->details->focus, FALSE); - } - } + if (container->details->focus != NULL) + { + if (container->details->keyboard_focus) + { + eel_canvas_item_set (EEL_CANVAS_ITEM (container->details->focus->item), + "highlighted_as_keyboard_focus", 0, + NULL); + } + else + { + emit_atk_object_notify_focused (container->details->focus, FALSE); + } + } - container->details->focus = NULL; + container->details->focus = NULL; } /* Set @icon as the icon currently focused for accessibility. */ static void set_focus (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - gboolean keyboard_focus) + NautilusCanvasIcon *icon, + gboolean keyboard_focus) { - g_assert (icon != NULL); + g_assert (icon != NULL); - if (icon == container->details->focus) { - return; - } + if (icon == container->details->focus) + { + return; + } - clear_focus (container); + clear_focus (container); - container->details->focus = icon; - container->details->keyboard_focus = keyboard_focus; + container->details->focus = icon; + container->details->keyboard_focus = keyboard_focus; - if (keyboard_focus) { - eel_canvas_item_set (EEL_CANVAS_ITEM (container->details->focus->item), - "highlighted_as_keyboard_focus", 1, - NULL); - } else { - emit_atk_object_notify_focused (container->details->focus, TRUE); - } + if (keyboard_focus) + { + eel_canvas_item_set (EEL_CANVAS_ITEM (container->details->focus->item), + "highlighted_as_keyboard_focus", 1, + NULL); + } + else + { + emit_atk_object_notify_focused (container->details->focus, TRUE); + } } static void set_keyboard_rubberband_start (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - container->details->keyboard_rubberband_start = icon; + container->details->keyboard_rubberband_start = icon; } static void clear_keyboard_rubberband_start (NautilusCanvasContainer *container) { - container->details->keyboard_rubberband_start = NULL; + container->details->keyboard_rubberband_start = NULL; } /* carbon-copy of eel_canvas_group_bounds(), but @@ -860,132 +942,171 @@ clear_keyboard_rubberband_start (NautilusCanvasContainer *container) * bounds for the “entire item”. */ static void -get_icon_bounds_for_canvas_bounds (EelCanvasGroup *group, - double *x1, double *y1, - double *x2, double *y2, - NautilusCanvasItemBoundsUsage usage) -{ - EelCanvasItem *child; - GList *list; - double tx1, ty1, tx2, ty2; - double minx, miny, maxx, maxy; - int set; - - /* Get the bounds of the first visible item */ - - child = NULL; /* Unnecessary but eliminates a warning. */ - - set = FALSE; - - for (list = group->item_list; list; list = list->next) { - child = list->data; - - if (!NAUTILUS_IS_CANVAS_ITEM (child)) { - continue; - } - - if (child->flags & EEL_CANVAS_ITEM_VISIBLE) { - set = TRUE; - if (!NAUTILUS_IS_CANVAS_ITEM (child) || - usage == BOUNDS_USAGE_FOR_DISPLAY) { - eel_canvas_item_get_bounds (child, &minx, &miny, &maxx, &maxy); - } else if (usage == BOUNDS_USAGE_FOR_LAYOUT) { - nautilus_canvas_item_get_bounds_for_layout (NAUTILUS_CANVAS_ITEM (child), - &minx, &miny, &maxx, &maxy); - } else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) { - nautilus_canvas_item_get_bounds_for_entire_item (NAUTILUS_CANVAS_ITEM (child), - &minx, &miny, &maxx, &maxy); - } else { - g_assert_not_reached (); - } - break; - } - } - - /* If there were no visible items, return an empty bounding box */ - - if (!set) { - *x1 = *y1 = *x2 = *y2 = 0.0; - return; - } - - /* Now we can grow the bounds using the rest of the items */ - - list = list->next; - - for (; list; list = list->next) { - child = list->data; - - if (!NAUTILUS_IS_CANVAS_ITEM (child)) { - continue; - } - - if (!(child->flags & EEL_CANVAS_ITEM_VISIBLE)) - continue; - - if (!NAUTILUS_IS_CANVAS_ITEM (child) || - usage == BOUNDS_USAGE_FOR_DISPLAY) { - eel_canvas_item_get_bounds (child, &tx1, &ty1, &tx2, &ty2); - } else if (usage == BOUNDS_USAGE_FOR_LAYOUT) { - nautilus_canvas_item_get_bounds_for_layout (NAUTILUS_CANVAS_ITEM (child), - &tx1, &ty1, &tx2, &ty2); - } else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) { - nautilus_canvas_item_get_bounds_for_entire_item (NAUTILUS_CANVAS_ITEM (child), - &tx1, &ty1, &tx2, &ty2); - } else { - g_assert_not_reached (); - } - - if (tx1 < minx) - minx = tx1; - - if (ty1 < miny) - miny = ty1; - - if (tx2 > maxx) - maxx = tx2; - - if (ty2 > maxy) - maxy = ty2; - } - - /* Make the bounds be relative to our parent's coordinate system */ - - if (EEL_CANVAS_ITEM (group)->parent) { - minx += group->xpos; - miny += group->ypos; - maxx += group->xpos; - maxy += group->ypos; - } - - if (x1 != NULL) { - *x1 = minx; - } - - if (y1 != NULL) { - *y1 = miny; - } - - if (x2 != NULL) { - *x2 = maxx; - } - - if (y2 != NULL) { - *y2 = maxy; - } +get_icon_bounds_for_canvas_bounds (EelCanvasGroup *group, + double *x1, + double *y1, + double *x2, + double *y2, + NautilusCanvasItemBoundsUsage usage) +{ + EelCanvasItem *child; + GList *list; + double tx1, ty1, tx2, ty2; + double minx, miny, maxx, maxy; + int set; + + /* Get the bounds of the first visible item */ + + child = NULL; /* Unnecessary but eliminates a warning. */ + + set = FALSE; + + for (list = group->item_list; list; list = list->next) + { + child = list->data; + + if (!NAUTILUS_IS_CANVAS_ITEM (child)) + { + continue; + } + + if (child->flags & EEL_CANVAS_ITEM_VISIBLE) + { + set = TRUE; + if (!NAUTILUS_IS_CANVAS_ITEM (child) || + usage == BOUNDS_USAGE_FOR_DISPLAY) + { + eel_canvas_item_get_bounds (child, &minx, &miny, &maxx, &maxy); + } + else if (usage == BOUNDS_USAGE_FOR_LAYOUT) + { + nautilus_canvas_item_get_bounds_for_layout (NAUTILUS_CANVAS_ITEM (child), + &minx, &miny, &maxx, &maxy); + } + else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) + { + nautilus_canvas_item_get_bounds_for_entire_item (NAUTILUS_CANVAS_ITEM (child), + &minx, &miny, &maxx, &maxy); + } + else + { + g_assert_not_reached (); + } + break; + } + } + + /* If there were no visible items, return an empty bounding box */ + + if (!set) + { + *x1 = *y1 = *x2 = *y2 = 0.0; + return; + } + + /* Now we can grow the bounds using the rest of the items */ + + list = list->next; + + for (; list; list = list->next) + { + child = list->data; + + if (!NAUTILUS_IS_CANVAS_ITEM (child)) + { + continue; + } + + if (!(child->flags & EEL_CANVAS_ITEM_VISIBLE)) + { + continue; + } + + if (!NAUTILUS_IS_CANVAS_ITEM (child) || + usage == BOUNDS_USAGE_FOR_DISPLAY) + { + eel_canvas_item_get_bounds (child, &tx1, &ty1, &tx2, &ty2); + } + else if (usage == BOUNDS_USAGE_FOR_LAYOUT) + { + nautilus_canvas_item_get_bounds_for_layout (NAUTILUS_CANVAS_ITEM (child), + &tx1, &ty1, &tx2, &ty2); + } + else if (usage == BOUNDS_USAGE_FOR_ENTIRE_ITEM) + { + nautilus_canvas_item_get_bounds_for_entire_item (NAUTILUS_CANVAS_ITEM (child), + &tx1, &ty1, &tx2, &ty2); + } + else + { + g_assert_not_reached (); + } + + if (tx1 < minx) + { + minx = tx1; + } + + if (ty1 < miny) + { + miny = ty1; + } + + if (tx2 > maxx) + { + maxx = tx2; + } + + if (ty2 > maxy) + { + maxy = ty2; + } + } + + /* Make the bounds be relative to our parent's coordinate system */ + + if (EEL_CANVAS_ITEM (group)->parent) + { + minx += group->xpos; + miny += group->ypos; + maxx += group->xpos; + maxy += group->ypos; + } + + if (x1 != NULL) + { + *x1 = minx; + } + + if (y1 != NULL) + { + *y1 = miny; + } + + if (x2 != NULL) + { + *x2 = maxx; + } + + if (y2 != NULL) + { + *y2 = maxy; + } } static void -get_all_icon_bounds (NautilusCanvasContainer *container, - double *x1, double *y1, - double *x2, double *y2, - NautilusCanvasItemBoundsUsage usage) +get_all_icon_bounds (NautilusCanvasContainer *container, + double *x1, + double *y1, + double *x2, + double *y2, + NautilusCanvasItemBoundsUsage usage) { - /* FIXME bugzilla.gnome.org 42477: Do we have to do something about the rubberband - * here? Any other non-icon items? - */ - get_icon_bounds_for_canvas_bounds (EEL_CANVAS_GROUP (EEL_CANVAS (container)->root), - x1, y1, x2, y2, usage); + /* FIXME bugzilla.gnome.org 42477: Do we have to do something about the rubberband + * here? Any other non-icon items? + */ + get_icon_bounds_for_canvas_bounds (EEL_CANVAS_GROUP (EEL_CANVAS (container)->root), + x1, y1, x2, y2, usage); } /* Don't preserve visible white space the next time the scroll region @@ -993,1052 +1114,1160 @@ get_all_icon_bounds (NautilusCanvasContainer *container, void nautilus_canvas_container_reset_scroll_region (NautilusCanvasContainer *container) { - container->details->reset_scroll_region_trigger = TRUE; + container->details->reset_scroll_region_trigger = TRUE; } /* Set a new scroll region without eliminating any of the currently-visible area. */ static void canvas_set_scroll_region_include_visible_area (EelCanvas *canvas, - double x1, double y1, - double x2, double y2) + double x1, + double y1, + double x2, + double y2) { - double old_x1, old_y1, old_x2, old_y2; - double old_scroll_x, old_scroll_y; - double height, width; - GtkAllocation allocation; - - eel_canvas_get_scroll_region (canvas, &old_x1, &old_y1, &old_x2, &old_y2); - gtk_widget_get_allocation (GTK_WIDGET (canvas), &allocation); + double old_x1, old_y1, old_x2, old_y2; + double old_scroll_x, old_scroll_y; + double height, width; + GtkAllocation allocation; + + eel_canvas_get_scroll_region (canvas, &old_x1, &old_y1, &old_x2, &old_y2); + gtk_widget_get_allocation (GTK_WIDGET (canvas), &allocation); - width = (allocation.width) / canvas->pixels_per_unit; - height = (allocation.height) / canvas->pixels_per_unit; + width = (allocation.width) / canvas->pixels_per_unit; + height = (allocation.height) / canvas->pixels_per_unit; - old_scroll_x = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (canvas))); - old_scroll_y = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (canvas))); + old_scroll_x = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (canvas))); + old_scroll_y = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (canvas))); - x1 = MIN (x1, old_x1 + old_scroll_x); - y1 = MIN (y1, old_y1 + old_scroll_y); - x2 = MAX (x2, old_x1 + old_scroll_x + width); - y2 = MAX (y2, old_y1 + old_scroll_y + height); + x1 = MIN (x1, old_x1 + old_scroll_x); + y1 = MIN (y1, old_y1 + old_scroll_y); + x2 = MAX (x2, old_x1 + old_scroll_x + width); + y2 = MAX (y2, old_y1 + old_scroll_y + height); - eel_canvas_set_scroll_region - (canvas, x1, y1, x2, y2); + eel_canvas_set_scroll_region + (canvas, x1, y1, x2, y2); } void nautilus_canvas_container_update_scroll_region (NautilusCanvasContainer *container) { - double x1, y1, x2, y2; - double pixels_per_unit; - GtkAdjustment *hadj, *vadj; - float step_increment; - gboolean reset_scroll_region; - GtkAllocation allocation; - - pixels_per_unit = EEL_CANVAS (container)->pixels_per_unit; - - if (nautilus_canvas_container_get_is_fixed_size (container)) { - /* Set the scroll region to the size of the container allocation */ - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - eel_canvas_set_scroll_region - (EEL_CANVAS (container), - (double) - container->details->left_margin / pixels_per_unit, - (double) - container->details->top_margin / pixels_per_unit, - ((double) (allocation.width - 1) - - container->details->left_margin - - container->details->right_margin) - / pixels_per_unit, - ((double) (allocation.height - 1) - - container->details->top_margin - - container->details->bottom_margin) - / pixels_per_unit); - return; - } - - reset_scroll_region = container->details->reset_scroll_region_trigger - || nautilus_canvas_container_is_empty (container) - || nautilus_canvas_container_is_auto_layout (container); - - /* The trigger is only cleared when container is non-empty, so - * callers can reliably reset the scroll region when an item - * is added even if extraneous relayouts are called when the - * window is still empty. - */ - if (!nautilus_canvas_container_is_empty (container)) { - container->details->reset_scroll_region_trigger = FALSE; - } - - get_all_icon_bounds (container, &x1, &y1, &x2, &y2, BOUNDS_USAGE_FOR_ENTIRE_ITEM); - - /* Add border at the "end"of the layout (i.e. after the icons), to - * ensure we get some space when scrolled to the end. - * For horizontal layouts, we add a bottom border. - * Vertical layout is used by the compact view so the end - * depends on the RTL setting. - */ - if (nautilus_canvas_container_is_layout_vertical (container)) { - if (nautilus_canvas_container_is_layout_rtl (container)) { - x1 -= ICON_PAD_LEFT + CONTAINER_PAD_LEFT; - } else { - x2 += ICON_PAD_RIGHT + CONTAINER_PAD_RIGHT; - } - } else { - y2 += ICON_PAD_BOTTOM + CONTAINER_PAD_BOTTOM; - } - - /* Auto-layout assumes a 0, 0 scroll origin and at least allocation->width. - * Then we lay out to the right or to the left, so - * x can be < 0 and > allocation */ - if (nautilus_canvas_container_is_auto_layout (container)) { - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - x1 = MIN (x1, 0); - x2 = MAX (x2, allocation.width / pixels_per_unit); - y1 = 0; - } else { - /* Otherwise we add the padding that is at the start of the - layout */ - if (nautilus_canvas_container_is_layout_rtl (container)) { - x2 += ICON_PAD_RIGHT + CONTAINER_PAD_RIGHT; - } else { - x1 -= ICON_PAD_LEFT + CONTAINER_PAD_LEFT; - } - y1 -= ICON_PAD_TOP + CONTAINER_PAD_TOP; - } - - x2 -= 1; - x2 = MAX(x1, x2); - - y2 -= 1; - y2 = MAX(y1, y2); - - if (reset_scroll_region) { - eel_canvas_set_scroll_region - (EEL_CANVAS (container), - x1, y1, x2, y2); - } else { - canvas_set_scroll_region_include_visible_area - (EEL_CANVAS (container), - x1, y1, x2, y2); - } - - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); - - /* Scroll by 1/4 icon each time you click. */ - step_increment = nautilus_canvas_container_get_icon_size_for_zoom_level - (container->details->zoom_level) / 4; - if (gtk_adjustment_get_step_increment (hadj) != step_increment) { - gtk_adjustment_set_step_increment (hadj, step_increment); - } - if (gtk_adjustment_get_step_increment (vadj) != step_increment) { - gtk_adjustment_set_step_increment (vadj, step_increment); - } + double x1, y1, x2, y2; + double pixels_per_unit; + GtkAdjustment *hadj, *vadj; + float step_increment; + gboolean reset_scroll_region; + GtkAllocation allocation; + + pixels_per_unit = EEL_CANVAS (container)->pixels_per_unit; + + if (nautilus_canvas_container_get_is_fixed_size (container)) + { + /* Set the scroll region to the size of the container allocation */ + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + eel_canvas_set_scroll_region + (EEL_CANVAS (container), + (double) -container->details->left_margin / pixels_per_unit, + (double) -container->details->top_margin / pixels_per_unit, + ((double) (allocation.width - 1) + - container->details->left_margin + - container->details->right_margin) + / pixels_per_unit, + ((double) (allocation.height - 1) + - container->details->top_margin + - container->details->bottom_margin) + / pixels_per_unit); + return; + } + + reset_scroll_region = container->details->reset_scroll_region_trigger + || nautilus_canvas_container_is_empty (container) + || nautilus_canvas_container_is_auto_layout (container); + + /* The trigger is only cleared when container is non-empty, so + * callers can reliably reset the scroll region when an item + * is added even if extraneous relayouts are called when the + * window is still empty. + */ + if (!nautilus_canvas_container_is_empty (container)) + { + container->details->reset_scroll_region_trigger = FALSE; + } + + get_all_icon_bounds (container, &x1, &y1, &x2, &y2, BOUNDS_USAGE_FOR_ENTIRE_ITEM); + + /* Add border at the "end"of the layout (i.e. after the icons), to + * ensure we get some space when scrolled to the end. + * For horizontal layouts, we add a bottom border. + * Vertical layout is used by the compact view so the end + * depends on the RTL setting. + */ + if (nautilus_canvas_container_is_layout_vertical (container)) + { + if (nautilus_canvas_container_is_layout_rtl (container)) + { + x1 -= ICON_PAD_LEFT + CONTAINER_PAD_LEFT; + } + else + { + x2 += ICON_PAD_RIGHT + CONTAINER_PAD_RIGHT; + } + } + else + { + y2 += ICON_PAD_BOTTOM + CONTAINER_PAD_BOTTOM; + } + + /* Auto-layout assumes a 0, 0 scroll origin and at least allocation->width. + * Then we lay out to the right or to the left, so + * x can be < 0 and > allocation */ + if (nautilus_canvas_container_is_auto_layout (container)) + { + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + x1 = MIN (x1, 0); + x2 = MAX (x2, allocation.width / pixels_per_unit); + y1 = 0; + } + else + { + /* Otherwise we add the padding that is at the start of the + * layout */ + if (nautilus_canvas_container_is_layout_rtl (container)) + { + x2 += ICON_PAD_RIGHT + CONTAINER_PAD_RIGHT; + } + else + { + x1 -= ICON_PAD_LEFT + CONTAINER_PAD_LEFT; + } + y1 -= ICON_PAD_TOP + CONTAINER_PAD_TOP; + } + + x2 -= 1; + x2 = MAX (x1, x2); + + y2 -= 1; + y2 = MAX (y1, y2); + + if (reset_scroll_region) + { + eel_canvas_set_scroll_region + (EEL_CANVAS (container), + x1, y1, x2, y2); + } + else + { + canvas_set_scroll_region_include_visible_area + (EEL_CANVAS (container), + x1, y1, x2, y2); + } + + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); + + /* Scroll by 1/4 icon each time you click. */ + step_increment = nautilus_canvas_container_get_icon_size_for_zoom_level + (container->details->zoom_level) / 4; + if (gtk_adjustment_get_step_increment (hadj) != step_increment) + { + gtk_adjustment_set_step_increment (hadj, step_increment); + } + if (gtk_adjustment_get_step_increment (vadj) != step_increment) + { + gtk_adjustment_set_step_increment (vadj, step_increment); + } } static void cache_icon_positions (NautilusCanvasContainer *container) { - GList *l; - gint idx; - NautilusCanvasIcon *icon; + GList *l; + gint idx; + NautilusCanvasIcon *icon; - for (l = container->details->icons, idx = 0; l != NULL; l = l ->next) { - icon = l->data; - icon->position = idx++; - } + for (l = container->details->icons, idx = 0; l != NULL; l = l->next) + { + icon = l->data; + icon->position = idx++; + } } static int -compare_icons_data (gconstpointer a, gconstpointer b, gpointer canvas_container) +compare_icons_data (gconstpointer a, + gconstpointer b, + gpointer canvas_container) { - NautilusCanvasContainerClass *klass; - NautilusCanvasIconData *data_a, *data_b; + NautilusCanvasContainerClass *klass; + NautilusCanvasIconData *data_a, *data_b; - data_a = (NautilusCanvasIconData *) a; - data_b = (NautilusCanvasIconData *) b; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (canvas_container); + data_a = (NautilusCanvasIconData *) a; + data_b = (NautilusCanvasIconData *) b; + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (canvas_container); - return klass->compare_icons (canvas_container, data_a, data_b); + return klass->compare_icons (canvas_container, data_a, data_b); } static int -compare_icons (gconstpointer a, gconstpointer b, gpointer canvas_container) +compare_icons (gconstpointer a, + gconstpointer b, + gpointer canvas_container) { - NautilusCanvasContainerClass *klass; - const NautilusCanvasIcon *icon_a, *icon_b; + NautilusCanvasContainerClass *klass; + const NautilusCanvasIcon *icon_a, *icon_b; - icon_a = a; - icon_b = b; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (canvas_container); + icon_a = a; + icon_b = b; + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (canvas_container); - return klass->compare_icons (canvas_container, icon_a->data, icon_b->data); + return klass->compare_icons (canvas_container, icon_a->data, icon_b->data); } static void sort_selection (NautilusCanvasContainer *container) { - container->details->selection = g_list_sort_with_data (container->details->selection, - compare_icons_data, - container); - container->details->selection_needs_resort = FALSE; + container->details->selection = g_list_sort_with_data (container->details->selection, + compare_icons_data, + container); + container->details->selection_needs_resort = FALSE; } static void -sort_icons (NautilusCanvasContainer *container, - GList **icons) +sort_icons (NautilusCanvasContainer *container, + GList **icons) { - NautilusCanvasContainerClass *klass; + NautilusCanvasContainerClass *klass; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); - g_assert (klass->compare_icons != NULL); + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); + g_assert (klass->compare_icons != NULL); - *icons = g_list_sort_with_data (*icons, compare_icons, container); + *icons = g_list_sort_with_data (*icons, compare_icons, container); } static void resort (NautilusCanvasContainer *container) { - sort_icons (container, &container->details->icons); - sort_selection (container); - cache_icon_positions (container); + sort_icons (container, &container->details->icons); + sort_selection (container); + cache_icon_positions (container); } -typedef struct { - double width; - double height; - double x_offset; - double y_offset; +typedef struct +{ + double width; + double height; + double x_offset; + double y_offset; } IconPositions; static void lay_down_one_line (NautilusCanvasContainer *container, - GList *line_start, - GList *line_end, - double y, - double max_height, - GArray *positions, - gboolean whole_text) + GList *line_start, + GList *line_end, + double y, + double max_height, + GArray *positions, + gboolean whole_text) { - GList *p; - NautilusCanvasIcon *icon; - double x, y_offset; - IconPositions *position; - int i; - gboolean is_rtl; + GList *p; + NautilusCanvasIcon *icon; + double x, y_offset; + IconPositions *position; + int i; + gboolean is_rtl; - is_rtl = nautilus_canvas_container_is_layout_rtl (container); + is_rtl = nautilus_canvas_container_is_layout_rtl (container); - /* Lay out the icons along the baseline. */ - x = ICON_PAD_LEFT; - i = 0; - for (p = line_start; p != line_end; p = p->next) { - icon = p->data; + /* Lay out the icons along the baseline. */ + x = ICON_PAD_LEFT; + i = 0; + for (p = line_start; p != line_end; p = p->next) + { + icon = p->data; - position = &g_array_index (positions, IconPositions, i++); - y_offset = position->y_offset; + position = &g_array_index (positions, IconPositions, i++); + y_offset = position->y_offset; - icon_set_position - (icon, - is_rtl ? get_mirror_x_position (container, icon, x + position->x_offset) : x + position->x_offset, - y + y_offset); - nautilus_canvas_item_set_entire_text (icon->item, whole_text); + icon_set_position + (icon, + is_rtl ? get_mirror_x_position (container, icon, x + position->x_offset) : x + position->x_offset, + y + y_offset); + nautilus_canvas_item_set_entire_text (icon->item, whole_text); - icon->saved_ltr_x = is_rtl ? get_mirror_x_position (container, icon, icon->x) : icon->x; + icon->saved_ltr_x = is_rtl ? get_mirror_x_position (container, icon, icon->x) : icon->x; - x += position->width; - } + x += position->width; + } } static void lay_down_icons_horizontal (NautilusCanvasContainer *container, - GList *icons, - double start_y) -{ - GList *p, *line_start; - NautilusCanvasIcon *icon; - double canvas_width, y; - GArray *positions; - IconPositions *position; - EelDRect bounds; - EelDRect icon_bounds; - double max_height_above, max_height_below; - double height_above, height_below; - double line_width; - double grid_width; - int icon_width, icon_size; - int i; - GtkAllocation allocation; - - g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); - - if (icons == NULL) { - return; - } - - positions = g_array_new (FALSE, FALSE, sizeof (IconPositions)); - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - - /* Lay out icons a line at a time. */ - canvas_width = CANVAS_WIDTH(container, allocation); - - grid_width = nautilus_canvas_container_get_grid_size_for_zoom_level (container->details->zoom_level); - icon_size = nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level); - - line_width = 0; - line_start = icons; - y = start_y + CONTAINER_PAD_TOP; - i = 0; - - max_height_above = 0; - max_height_below = 0; - for (p = icons; p != NULL; p = p->next) { - icon = p->data; - - /* Assume it's only one level hierarchy to avoid costly affine calculations */ - nautilus_canvas_item_get_bounds_for_layout (icon->item, - &bounds.x0, &bounds.y0, - &bounds.x1, &bounds.y1); - - /* Normalize the icon width to the grid unit. - * Use the icon size for this zoom level too in the calculation, since - * the actual bounds might be smaller - e.g. because we have a very - * narrow thumbnail. - */ - icon_width = ceil (MAX ((bounds.x1 - bounds.x0), icon_size) / grid_width) * grid_width; - - /* Calculate size above/below baseline */ - icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); - height_above = icon_bounds.y1 - bounds.y0; - height_below = bounds.y1 - icon_bounds.y1; - - /* If this icon doesn't fit, it's time to lay out the line that's queued up. */ - if (line_start != p && line_width + icon_width >= canvas_width ) { - /* Advance to the baseline. */ - y += ICON_PAD_TOP + max_height_above; - - lay_down_one_line (container, line_start, p, y, max_height_above, positions, FALSE); - - /* Advance to next line. */ - y += max_height_below + ICON_PAD_BOTTOM; - - line_width = 0; - line_start = p; - i = 0; - - max_height_above = height_above; - max_height_below = height_below; - } else { - if (height_above > max_height_above) { - max_height_above = height_above; - } - if (height_below > max_height_below) { - max_height_below = height_below; - } - } - - g_array_set_size (positions, i + 1); - position = &g_array_index (positions, IconPositions, i++); - position->width = icon_width; - position->height = icon_bounds.y1 - icon_bounds.y0; - - position->x_offset = (icon_width - (icon_bounds.x1 - icon_bounds.x0)) / 2; - position->y_offset = icon_bounds.y0 - icon_bounds.y1; - - /* Add this icon. */ - line_width += icon_width; - } - - /* Lay down that last line of icons. */ - if (line_start != NULL) { - /* Advance to the baseline. */ - y += ICON_PAD_TOP + max_height_above; - - lay_down_one_line (container, line_start, NULL, y, max_height_above, positions, TRUE); - } - - g_array_free (positions, TRUE); + GList *icons, + double start_y) +{ + GList *p, *line_start; + NautilusCanvasIcon *icon; + double canvas_width, y; + GArray *positions; + IconPositions *position; + EelDRect bounds; + EelDRect icon_bounds; + double max_height_above, max_height_below; + double height_above, height_below; + double line_width; + double grid_width; + int icon_width, icon_size; + int i; + GtkAllocation allocation; + + g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); + + if (icons == NULL) + { + return; + } + + positions = g_array_new (FALSE, FALSE, sizeof (IconPositions)); + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + + /* Lay out icons a line at a time. */ + canvas_width = CANVAS_WIDTH (container, allocation); + + grid_width = nautilus_canvas_container_get_grid_size_for_zoom_level (container->details->zoom_level); + icon_size = nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level); + + line_width = 0; + line_start = icons; + y = start_y + CONTAINER_PAD_TOP; + i = 0; + + max_height_above = 0; + max_height_below = 0; + for (p = icons; p != NULL; p = p->next) + { + icon = p->data; + + /* Assume it's only one level hierarchy to avoid costly affine calculations */ + nautilus_canvas_item_get_bounds_for_layout (icon->item, + &bounds.x0, &bounds.y0, + &bounds.x1, &bounds.y1); + + /* Normalize the icon width to the grid unit. + * Use the icon size for this zoom level too in the calculation, since + * the actual bounds might be smaller - e.g. because we have a very + * narrow thumbnail. + */ + icon_width = ceil (MAX ((bounds.x1 - bounds.x0), icon_size) / grid_width) * grid_width; + + /* Calculate size above/below baseline */ + icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); + height_above = icon_bounds.y1 - bounds.y0; + height_below = bounds.y1 - icon_bounds.y1; + + /* If this icon doesn't fit, it's time to lay out the line that's queued up. */ + if (line_start != p && line_width + icon_width >= canvas_width) + { + /* Advance to the baseline. */ + y += ICON_PAD_TOP + max_height_above; + + lay_down_one_line (container, line_start, p, y, max_height_above, positions, FALSE); + + /* Advance to next line. */ + y += max_height_below + ICON_PAD_BOTTOM; + + line_width = 0; + line_start = p; + i = 0; + + max_height_above = height_above; + max_height_below = height_below; + } + else + { + if (height_above > max_height_above) + { + max_height_above = height_above; + } + if (height_below > max_height_below) + { + max_height_below = height_below; + } + } + + g_array_set_size (positions, i + 1); + position = &g_array_index (positions, IconPositions, i++); + position->width = icon_width; + position->height = icon_bounds.y1 - icon_bounds.y0; + + position->x_offset = (icon_width - (icon_bounds.x1 - icon_bounds.x0)) / 2; + position->y_offset = icon_bounds.y0 - icon_bounds.y1; + + /* Add this icon. */ + line_width += icon_width; + } + + /* Lay down that last line of icons. */ + if (line_start != NULL) + { + /* Advance to the baseline. */ + y += ICON_PAD_TOP + max_height_above; + + lay_down_one_line (container, line_start, NULL, y, max_height_above, positions, TRUE); + } + + g_array_free (positions, TRUE); } static void snap_position (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - int *x, int *y) -{ - int center_x; - int baseline_y; - int icon_width; - int icon_height; - int total_width; - int total_height; - EelDRect canvas_position; - GtkAllocation allocation; - - canvas_position = nautilus_canvas_item_get_icon_rectangle (icon->item); - icon_width = canvas_position.x1 - canvas_position.x0; - icon_height = canvas_position.y1 - canvas_position.y0; - - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - total_width = CANVAS_WIDTH (container, allocation); - total_height = CANVAS_HEIGHT (container, allocation); - - if (nautilus_canvas_container_is_layout_rtl (container)) - *x = get_mirror_x_position (container, icon, *x); - - if (*x + icon_width / 2 < DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X) { - *x = DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X - icon_width / 2; - } - - if (*x + icon_width / 2 > total_width - (DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X)) { - *x = total_width - (DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X + (icon_width / 2)); - } - - if (*y + icon_height < DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y) { - *y = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - icon_height; - } - - if (*y + icon_height > total_height - (DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y)) { - *y = total_height - (DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y + (icon_height / 2)); - } - - center_x = *x + icon_width / 2; - *x = SNAP_NEAREST_HORIZONTAL (center_x) - (icon_width / 2); - if (nautilus_canvas_container_is_layout_rtl (container)) { - *x = get_mirror_x_position (container, icon, *x); - } - - - /* Find the grid position vertically and place on the proper baseline */ - baseline_y = *y + icon_height; - baseline_y = SNAP_NEAREST_VERTICAL (baseline_y); - *y = baseline_y - icon_height; + NautilusCanvasIcon *icon, + int *x, + int *y) +{ + int center_x; + int baseline_y; + int icon_width; + int icon_height; + int total_width; + int total_height; + EelDRect canvas_position; + GtkAllocation allocation; + + canvas_position = nautilus_canvas_item_get_icon_rectangle (icon->item); + icon_width = canvas_position.x1 - canvas_position.x0; + icon_height = canvas_position.y1 - canvas_position.y0; + + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + total_width = CANVAS_WIDTH (container, allocation); + total_height = CANVAS_HEIGHT (container, allocation); + + if (nautilus_canvas_container_is_layout_rtl (container)) + { + *x = get_mirror_x_position (container, icon, *x); + } + + if (*x + icon_width / 2 < DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X) + { + *x = DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X - icon_width / 2; + } + + if (*x + icon_width / 2 > total_width - (DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X)) + { + *x = total_width - (DESKTOP_PAD_HORIZONTAL + SNAP_SIZE_X + (icon_width / 2)); + } + + if (*y + icon_height < DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y) + { + *y = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - icon_height; + } + + if (*y + icon_height > total_height - (DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y)) + { + *y = total_height - (DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y + (icon_height / 2)); + } + + center_x = *x + icon_width / 2; + *x = SNAP_NEAREST_HORIZONTAL (center_x) - (icon_width / 2); + if (nautilus_canvas_container_is_layout_rtl (container)) + { + *x = get_mirror_x_position (container, icon, *x); + } + + + /* Find the grid position vertically and place on the proper baseline */ + baseline_y = *y + icon_height; + baseline_y = SNAP_NEAREST_VERTICAL (baseline_y); + *y = baseline_y - icon_height; } static int -compare_icons_by_position (gconstpointer a, gconstpointer b) +compare_icons_by_position (gconstpointer a, + gconstpointer b) { - NautilusCanvasIcon *icon_a, *icon_b; - int x1, y1, x2, y2; - int center_a; - int center_b; + NautilusCanvasIcon *icon_a, *icon_b; + int x1, y1, x2, y2; + int center_a; + int center_b; - icon_a = (NautilusCanvasIcon *)a; - icon_b = (NautilusCanvasIcon *)b; + icon_a = (NautilusCanvasIcon *) a; + icon_b = (NautilusCanvasIcon *) b; - icon_get_bounding_box (icon_a, &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_DISPLAY); - center_a = x1 + (x2 - x1) / 2; - icon_get_bounding_box (icon_b, &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_DISPLAY); - center_b = x1 + (x2 - x1) / 2; + icon_get_bounding_box (icon_a, &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_DISPLAY); + center_a = x1 + (x2 - x1) / 2; + icon_get_bounding_box (icon_b, &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_DISPLAY); + center_b = x1 + (x2 - x1) / 2; - return center_a == center_b ? - icon_a->y - icon_b->y : - center_a - center_b; + return center_a == center_b ? + icon_a->y - icon_b->y : + center_a - center_b; } static PlacementGrid * -placement_grid_new (NautilusCanvasContainer *container, gboolean tight) -{ - PlacementGrid *grid; - int width, height; - int num_columns; - int num_rows; - int i; - GtkAllocation allocation; - - /* Get container dimensions */ - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - width = CANVAS_WIDTH(container, allocation); - height = CANVAS_HEIGHT(container, allocation); - - num_columns = width / SNAP_SIZE_X; - num_rows = height / SNAP_SIZE_Y; - - if (num_columns == 0 || num_rows == 0) { - return NULL; - } - - grid = g_new0 (PlacementGrid, 1); - grid->tight = tight; - grid->num_columns = num_columns; - grid->num_rows = num_rows; - - grid->grid_memory = g_new0 (int, (num_rows * num_columns)); - grid->icon_grid = g_new0 (int *, num_columns); - - for (i = 0; i < num_columns; i++) { - grid->icon_grid[i] = grid->grid_memory + (i * num_rows); - } - - return grid; +placement_grid_new (NautilusCanvasContainer *container, + gboolean tight) +{ + PlacementGrid *grid; + int width, height; + int num_columns; + int num_rows; + int i; + GtkAllocation allocation; + + /* Get container dimensions */ + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + width = CANVAS_WIDTH (container, allocation); + height = CANVAS_HEIGHT (container, allocation); + + num_columns = width / SNAP_SIZE_X; + num_rows = height / SNAP_SIZE_Y; + + if (num_columns == 0 || num_rows == 0) + { + return NULL; + } + + grid = g_new0 (PlacementGrid, 1); + grid->tight = tight; + grid->num_columns = num_columns; + grid->num_rows = num_rows; + + grid->grid_memory = g_new0 (int, (num_rows * num_columns)); + grid->icon_grid = g_new0 (int *, num_columns); + + for (i = 0; i < num_columns; i++) + { + grid->icon_grid[i] = grid->grid_memory + (i * num_rows); + } + + return grid; } static void placement_grid_free (PlacementGrid *grid) { - g_free (grid->icon_grid); - g_free (grid->grid_memory); - g_free (grid); + g_free (grid->icon_grid); + g_free (grid->grid_memory); + g_free (grid); } static gboolean -placement_grid_position_is_free (PlacementGrid *grid, EelIRect pos) -{ - int x, y; - - g_assert (pos.x0 >= 0 && pos.x0 < grid->num_columns); - g_assert (pos.y0 >= 0 && pos.y0 < grid->num_rows); - g_assert (pos.x1 >= 0 && pos.x1 < grid->num_columns); - g_assert (pos.y1 >= 0 && pos.y1 < grid->num_rows); - - for (x = pos.x0; x <= pos.x1; x++) { - for (y = pos.y0; y <= pos.y1; y++) { - if (grid->icon_grid[x][y] != 0) { - return FALSE; - } - } - } +placement_grid_position_is_free (PlacementGrid *grid, + EelIRect pos) +{ + int x, y; + + g_assert (pos.x0 >= 0 && pos.x0 < grid->num_columns); + g_assert (pos.y0 >= 0 && pos.y0 < grid->num_rows); + g_assert (pos.x1 >= 0 && pos.x1 < grid->num_columns); + g_assert (pos.y1 >= 0 && pos.y1 < grid->num_rows); + + for (x = pos.x0; x <= pos.x1; x++) + { + for (y = pos.y0; y <= pos.y1; y++) + { + if (grid->icon_grid[x][y] != 0) + { + return FALSE; + } + } + } - return TRUE; + return TRUE; } static void -placement_grid_mark (PlacementGrid *grid, EelIRect pos) +placement_grid_mark (PlacementGrid *grid, + EelIRect pos) { - int x, y; - - g_assert (pos.x0 >= 0 && pos.x0 < grid->num_columns); - g_assert (pos.y0 >= 0 && pos.y0 < grid->num_rows); - g_assert (pos.x1 >= 0 && pos.x1 < grid->num_columns); - g_assert (pos.y1 >= 0 && pos.y1 < grid->num_rows); + int x, y; + + g_assert (pos.x0 >= 0 && pos.x0 < grid->num_columns); + g_assert (pos.y0 >= 0 && pos.y0 < grid->num_rows); + g_assert (pos.x1 >= 0 && pos.x1 < grid->num_columns); + g_assert (pos.y1 >= 0 && pos.y1 < grid->num_rows); - for (x = pos.x0; x <= pos.x1; x++) { - for (y = pos.y0; y <= pos.y1; y++) { - grid->icon_grid[x][y] = 1; - } - } + for (x = pos.x0; x <= pos.x1; x++) + { + for (y = pos.y0; y <= pos.y1; y++) + { + grid->icon_grid[x][y] = 1; + } + } } static void canvas_position_to_grid_position (PlacementGrid *grid, - EelIRect canvas_position, - EelIRect *grid_position) -{ - /* The first causes minimal moving around during a snap, but - * can end up with partially overlapping icons. The second one won't - * allow any overlapping, but can cause more movement to happen - * during a snap. */ - if (grid->tight) { - grid_position->x0 = ceil ((double)(canvas_position.x0 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); - grid_position->y0 = ceil ((double)(canvas_position.y0 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); - grid_position->x1 = floor ((double)(canvas_position.x1 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); - grid_position->y1 = floor ((double)(canvas_position.y1 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); - } else { - grid_position->x0 = floor ((double)(canvas_position.x0 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); - grid_position->y0 = floor ((double)(canvas_position.y0 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); - grid_position->x1 = floor ((double)(canvas_position.x1 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); - grid_position->y1 = floor ((double)(canvas_position.y1 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); - } - - grid_position->x0 = CLAMP (grid_position->x0, 0, grid->num_columns - 1); - grid_position->y0 = CLAMP (grid_position->y0, 0, grid->num_rows - 1); - grid_position->x1 = CLAMP (grid_position->x1, grid_position->x0, grid->num_columns - 1); - grid_position->y1 = CLAMP (grid_position->y1, grid_position->y0, grid->num_rows - 1); + EelIRect canvas_position, + EelIRect *grid_position) +{ + /* The first causes minimal moving around during a snap, but + * can end up with partially overlapping icons. The second one won't + * allow any overlapping, but can cause more movement to happen + * during a snap. */ + if (grid->tight) + { + grid_position->x0 = ceil ((double) (canvas_position.x0 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); + grid_position->y0 = ceil ((double) (canvas_position.y0 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); + grid_position->x1 = floor ((double) (canvas_position.x1 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); + grid_position->y1 = floor ((double) (canvas_position.y1 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); + } + else + { + grid_position->x0 = floor ((double) (canvas_position.x0 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); + grid_position->y0 = floor ((double) (canvas_position.y0 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); + grid_position->x1 = floor ((double) (canvas_position.x1 - DESKTOP_PAD_HORIZONTAL) / SNAP_SIZE_X); + grid_position->y1 = floor ((double) (canvas_position.y1 - DESKTOP_PAD_VERTICAL) / SNAP_SIZE_Y); + } + + grid_position->x0 = CLAMP (grid_position->x0, 0, grid->num_columns - 1); + grid_position->y0 = CLAMP (grid_position->y0, 0, grid->num_rows - 1); + grid_position->x1 = CLAMP (grid_position->x1, grid_position->x0, grid->num_columns - 1); + grid_position->y1 = CLAMP (grid_position->y1, grid_position->y0, grid->num_rows - 1); } static void -placement_grid_mark_icon (PlacementGrid *grid, NautilusCanvasIcon *icon) +placement_grid_mark_icon (PlacementGrid *grid, + NautilusCanvasIcon *icon) { - EelIRect canvas_pos; - EelIRect grid_pos; - - icon_get_bounding_box (icon, - &canvas_pos.x0, &canvas_pos.y0, - &canvas_pos.x1, &canvas_pos.y1, - BOUNDS_USAGE_FOR_LAYOUT); - canvas_position_to_grid_position (grid, - canvas_pos, - &grid_pos); - placement_grid_mark (grid, grid_pos); + EelIRect canvas_pos; + EelIRect grid_pos; + + icon_get_bounding_box (icon, + &canvas_pos.x0, &canvas_pos.y0, + &canvas_pos.x1, &canvas_pos.y1, + BOUNDS_USAGE_FOR_LAYOUT); + canvas_position_to_grid_position (grid, + canvas_pos, + &grid_pos); + placement_grid_mark (grid, grid_pos); } static void find_empty_location (NautilusCanvasContainer *container, - PlacementGrid *grid, - NautilusCanvasIcon *icon, - int start_x, - int start_y, - int *x, - int *y) -{ - double icon_width, icon_height; - int canvas_width; - int canvas_height; - int height_for_bound_check; - EelIRect icon_position; - EelDRect pixbuf_rect; - gboolean collision; - GtkAllocation allocation; - - /* Get container dimensions */ - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - canvas_width = CANVAS_WIDTH(container, allocation); - canvas_height = CANVAS_HEIGHT(container, allocation); - - icon_get_bounding_box (icon, - &icon_position.x0, &icon_position.y0, - &icon_position.x1, &icon_position.y1, - BOUNDS_USAGE_FOR_LAYOUT); - icon_width = icon_position.x1 - icon_position.x0; - icon_height = icon_position.y1 - icon_position.y0; - - icon_get_bounding_box (icon, - NULL, &icon_position.y0, - NULL, &icon_position.y1, - BOUNDS_USAGE_FOR_ENTIRE_ITEM); - height_for_bound_check = icon_position.y1 - icon_position.y0; - - pixbuf_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); - - /* Start the icon on a grid location */ - snap_position (container, icon, &start_x, &start_y); - - icon_position.x0 = start_x; - icon_position.y0 = start_y; - icon_position.x1 = icon_position.x0 + icon_width; - icon_position.y1 = icon_position.y0 + icon_height; - - do { - EelIRect grid_position; - gboolean need_new_column; - - collision = FALSE; - - canvas_position_to_grid_position (grid, - icon_position, - &grid_position); - - need_new_column = icon_position.y0 + height_for_bound_check + DESKTOP_PAD_VERTICAL > canvas_height; - - if (need_new_column || - !placement_grid_position_is_free (grid, grid_position)) { - icon_position.y0 += SNAP_SIZE_Y; - icon_position.y1 = icon_position.y0 + icon_height; - - if (need_new_column) { - /* Move to the next column */ - icon_position.y0 = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - (pixbuf_rect.y1 - pixbuf_rect.y0); - while (icon_position.y0 < DESKTOP_PAD_VERTICAL) { - icon_position.y0 += SNAP_SIZE_Y; - } - icon_position.y1 = icon_position.y0 + icon_height; - - icon_position.x0 += SNAP_SIZE_X; - icon_position.x1 = icon_position.x0 + icon_width; - } - - collision = TRUE; - } - } while (collision && (icon_position.x1 < canvas_width)); - - *x = icon_position.x0; - *y = icon_position.y0; + PlacementGrid *grid, + NautilusCanvasIcon *icon, + int start_x, + int start_y, + int *x, + int *y) +{ + double icon_width, icon_height; + int canvas_width; + int canvas_height; + int height_for_bound_check; + EelIRect icon_position; + EelDRect pixbuf_rect; + gboolean collision; + GtkAllocation allocation; + + /* Get container dimensions */ + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + canvas_width = CANVAS_WIDTH (container, allocation); + canvas_height = CANVAS_HEIGHT (container, allocation); + + icon_get_bounding_box (icon, + &icon_position.x0, &icon_position.y0, + &icon_position.x1, &icon_position.y1, + BOUNDS_USAGE_FOR_LAYOUT); + icon_width = icon_position.x1 - icon_position.x0; + icon_height = icon_position.y1 - icon_position.y0; + + icon_get_bounding_box (icon, + NULL, &icon_position.y0, + NULL, &icon_position.y1, + BOUNDS_USAGE_FOR_ENTIRE_ITEM); + height_for_bound_check = icon_position.y1 - icon_position.y0; + + pixbuf_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); + + /* Start the icon on a grid location */ + snap_position (container, icon, &start_x, &start_y); + + icon_position.x0 = start_x; + icon_position.y0 = start_y; + icon_position.x1 = icon_position.x0 + icon_width; + icon_position.y1 = icon_position.y0 + icon_height; + + do + { + EelIRect grid_position; + gboolean need_new_column; + + collision = FALSE; + + canvas_position_to_grid_position (grid, + icon_position, + &grid_position); + + need_new_column = icon_position.y0 + height_for_bound_check + DESKTOP_PAD_VERTICAL > canvas_height; + + if (need_new_column || + !placement_grid_position_is_free (grid, grid_position)) + { + icon_position.y0 += SNAP_SIZE_Y; + icon_position.y1 = icon_position.y0 + icon_height; + + if (need_new_column) + { + /* Move to the next column */ + icon_position.y0 = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - (pixbuf_rect.y1 - pixbuf_rect.y0); + while (icon_position.y0 < DESKTOP_PAD_VERTICAL) + { + icon_position.y0 += SNAP_SIZE_Y; + } + icon_position.y1 = icon_position.y0 + icon_height; + + icon_position.x0 += SNAP_SIZE_X; + icon_position.x1 = icon_position.x0 + icon_width; + } + + collision = TRUE; + } + } + while (collision && (icon_position.x1 < canvas_width)); + + *x = icon_position.x0; + *y = icon_position.y0; } static void align_icons (NautilusCanvasContainer *container) { - GList *unplaced_icons; - GList *l; - PlacementGrid *grid; + GList *unplaced_icons; + GList *l; + PlacementGrid *grid; - unplaced_icons = g_list_copy (container->details->icons); - - unplaced_icons = g_list_sort (unplaced_icons, - compare_icons_by_position); + unplaced_icons = g_list_copy (container->details->icons); - if (nautilus_canvas_container_is_layout_rtl (container)) { - unplaced_icons = g_list_reverse (unplaced_icons); - } + unplaced_icons = g_list_sort (unplaced_icons, + compare_icons_by_position); - grid = placement_grid_new (container, TRUE); + if (nautilus_canvas_container_is_layout_rtl (container)) + { + unplaced_icons = g_list_reverse (unplaced_icons); + } - if (!grid) { - return; - } + grid = placement_grid_new (container, TRUE); - for (l = unplaced_icons; l != NULL; l = l->next) { - NautilusCanvasIcon *icon; - int x, y; + if (!grid) + { + return; + } + + for (l = unplaced_icons; l != NULL; l = l->next) + { + NautilusCanvasIcon *icon; + int x, y; - icon = l->data; - x = icon->saved_ltr_x; - y = icon->y; - find_empty_location (container, grid, - icon, x, y, &x, &y); + icon = l->data; + x = icon->saved_ltr_x; + y = icon->y; + find_empty_location (container, grid, + icon, x, y, &x, &y); - icon_set_position (icon, x, y); - icon->saved_ltr_x = icon->x; - placement_grid_mark_icon (grid, icon); - } + icon_set_position (icon, x, y); + icon->saved_ltr_x = icon->x; + placement_grid_mark_icon (grid, icon); + } - g_list_free (unplaced_icons); + g_list_free (unplaced_icons); - placement_grid_free (grid); + placement_grid_free (grid); - if (nautilus_canvas_container_is_layout_rtl (container)) { - nautilus_canvas_container_set_rtl_positions (container); - } + if (nautilus_canvas_container_is_layout_rtl (container)) + { + nautilus_canvas_container_set_rtl_positions (container); + } } static double -get_mirror_x_position (NautilusCanvasContainer *container, NautilusCanvasIcon *icon, double x) +get_mirror_x_position (NautilusCanvasContainer *container, + NautilusCanvasIcon *icon, + double x) { - EelDRect icon_bounds; - GtkAllocation allocation; + EelDRect icon_bounds; + GtkAllocation allocation; - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + icon_bounds = nautilus_canvas_item_get_icon_rectangle (icon->item); - return CANVAS_WIDTH(container, allocation) - x - (icon_bounds.x1 - icon_bounds.x0); + return CANVAS_WIDTH (container, allocation) - x - (icon_bounds.x1 - icon_bounds.x0); } static void nautilus_canvas_container_set_rtl_positions (NautilusCanvasContainer *container) { - GList *l; - NautilusCanvasIcon *icon; - double x; + GList *l; + NautilusCanvasIcon *icon; + double x; - if (!container->details->icons) { - return; - } + if (!container->details->icons) + { + return; + } - for (l = container->details->icons; l != NULL; l = l->next) { - icon = l->data; - x = get_mirror_x_position (container, icon, icon->saved_ltr_x); - icon_set_position (icon, x, icon->y); - } + for (l = container->details->icons; l != NULL; l = l->next) + { + icon = l->data; + x = get_mirror_x_position (container, icon, icon->saved_ltr_x); + icon_set_position (icon, x, icon->y); + } } static void -lay_down_icons_vertical_desktop (NautilusCanvasContainer *container, GList *icons) -{ - GList *p, *placed_icons, *unplaced_icons; - int total, new_length, placed; - NautilusCanvasIcon *icon; - int height, max_width, column_width, icon_width, icon_height; - int x, y, x1, x2, y1, y2; - EelDRect icon_rect; - GtkAllocation allocation; - - /* Get container dimensions */ - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - height = CANVAS_HEIGHT(container, allocation); - - /* Determine which icons have and have not been placed */ - placed_icons = NULL; - unplaced_icons = NULL; - - total = g_list_length (container->details->icons); - new_length = g_list_length (icons); - placed = total - new_length; - if (placed > 0) { - PlacementGrid *grid; - /* Add only placed icons in list */ - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - if (icon_is_positioned (icon)) { - icon_set_position(icon, icon->saved_ltr_x, icon->y); - placed_icons = g_list_prepend (placed_icons, icon); - } else { - icon->x = 0; - icon->y = 0; - unplaced_icons = g_list_prepend (unplaced_icons, icon); - } - } - placed_icons = g_list_reverse (placed_icons); - unplaced_icons = g_list_reverse (unplaced_icons); - - grid = placement_grid_new (container, FALSE); - - if (grid) { - for (p = placed_icons; p != NULL; p = p->next) { - placement_grid_mark_icon - (grid, (NautilusCanvasIcon *)p->data); - } - - /* Place unplaced icons in the best locations */ - for (p = unplaced_icons; p != NULL; p = p->next) { - icon = p->data; - - icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); - - /* Start the icon in the first column */ - x = DESKTOP_PAD_HORIZONTAL + (SNAP_SIZE_X / 2) - ((icon_rect.x1 - icon_rect.x0) / 2); - y = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - (icon_rect.y1 - icon_rect.y0); - - find_empty_location (container, - grid, - icon, - x, y, - &x, &y); - - icon_set_position (icon, x, y); - icon->saved_ltr_x = x; - placement_grid_mark_icon (grid, icon); - } - - placement_grid_free (grid); - } - - g_list_free (placed_icons); - g_list_free (unplaced_icons); - } else { - /* There are no placed icons. Just lay them down using our rules */ - x = DESKTOP_PAD_HORIZONTAL; - - while (icons != NULL) { - int center_x; - int baseline; - int icon_height_for_bound_check; - gboolean should_snap; - - should_snap = container->details->keep_aligned; - - y = DESKTOP_PAD_VERTICAL; - - max_width = 0; - - /* Calculate max width for column */ - for (p = icons; p != NULL; p = p->next) { - icon = p->data; - - icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_LAYOUT); - icon_width = x2 - x1; - icon_height = y2 - y1; - - icon_get_bounding_box (icon, NULL, &y1, NULL, &y2, - BOUNDS_USAGE_FOR_ENTIRE_ITEM); - icon_height_for_bound_check = y2 - y1; - - if (should_snap) { - /* Snap the baseline to a grid position */ - icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); - baseline = y + (icon_rect.y1 - icon_rect.y0); - baseline = SNAP_CEIL_VERTICAL (baseline); - y = baseline - (icon_rect.y1 - icon_rect.y0); - } - - /* Check and see if we need to move to a new column */ - if (y != DESKTOP_PAD_VERTICAL && y + icon_height_for_bound_check > height) { - break; - } - - if (max_width < icon_width) { - max_width = icon_width; - } - - y += icon_height + DESKTOP_PAD_VERTICAL; - } - - y = DESKTOP_PAD_VERTICAL; - - center_x = x + max_width / 2; - column_width = max_width; - if (should_snap) { - /* Find the grid column to center on */ - center_x = SNAP_CEIL_HORIZONTAL (center_x); - column_width = (center_x - x) + (max_width / 2); - } - - /* Lay out column */ - for (p = icons; p != NULL; p = p->next) { - icon = p->data; - icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_LAYOUT); - icon_height = y2 - y1; - - icon_get_bounding_box (icon, NULL, &y1, NULL, &y2, - BOUNDS_USAGE_FOR_ENTIRE_ITEM); - icon_height_for_bound_check = y2 - y1; - - icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); - - if (should_snap) { - baseline = y + (icon_rect.y1 - icon_rect.y0); - baseline = SNAP_CEIL_VERTICAL (baseline); - y = baseline - (icon_rect.y1 - icon_rect.y0); - } - - /* Check and see if we need to move to a new column */ - if (y != DESKTOP_PAD_VERTICAL && y > height - icon_height_for_bound_check && - /* Make sure we lay out at least one icon per column, to make progress */ - p != icons) { - x += column_width + DESKTOP_PAD_HORIZONTAL; - break; - } - - icon_set_position (icon, - center_x - (icon_rect.x1 - icon_rect.x0) / 2, - y); - - icon->saved_ltr_x = icon->x; - y += icon_height + DESKTOP_PAD_VERTICAL; - } - icons = p; - } - } - - /* These modes are special. We freeze all of our positions - * after we do the layout. - */ - /* FIXME bugzilla.gnome.org 42478: - * This should not be tied to the direction of layout. - * It should be a separate switch. - */ - nautilus_canvas_container_freeze_icon_positions (container); +lay_down_icons_vertical_desktop (NautilusCanvasContainer *container, + GList *icons) +{ + GList *p, *placed_icons, *unplaced_icons; + int total, new_length, placed; + NautilusCanvasIcon *icon; + int height, max_width, column_width, icon_width, icon_height; + int x, y, x1, x2, y1, y2; + EelDRect icon_rect; + GtkAllocation allocation; + + /* Get container dimensions */ + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + height = CANVAS_HEIGHT (container, allocation); + + /* Determine which icons have and have not been placed */ + placed_icons = NULL; + unplaced_icons = NULL; + + total = g_list_length (container->details->icons); + new_length = g_list_length (icons); + placed = total - new_length; + if (placed > 0) + { + PlacementGrid *grid; + /* Add only placed icons in list */ + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + if (icon_is_positioned (icon)) + { + icon_set_position (icon, icon->saved_ltr_x, icon->y); + placed_icons = g_list_prepend (placed_icons, icon); + } + else + { + icon->x = 0; + icon->y = 0; + unplaced_icons = g_list_prepend (unplaced_icons, icon); + } + } + placed_icons = g_list_reverse (placed_icons); + unplaced_icons = g_list_reverse (unplaced_icons); + + grid = placement_grid_new (container, FALSE); + + if (grid) + { + for (p = placed_icons; p != NULL; p = p->next) + { + placement_grid_mark_icon + (grid, (NautilusCanvasIcon *) p->data); + } + + /* Place unplaced icons in the best locations */ + for (p = unplaced_icons; p != NULL; p = p->next) + { + icon = p->data; + + icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); + + /* Start the icon in the first column */ + x = DESKTOP_PAD_HORIZONTAL + (SNAP_SIZE_X / 2) - ((icon_rect.x1 - icon_rect.x0) / 2); + y = DESKTOP_PAD_VERTICAL + SNAP_SIZE_Y - (icon_rect.y1 - icon_rect.y0); + + find_empty_location (container, + grid, + icon, + x, y, + &x, &y); + + icon_set_position (icon, x, y); + icon->saved_ltr_x = x; + placement_grid_mark_icon (grid, icon); + } + + placement_grid_free (grid); + } + + g_list_free (placed_icons); + g_list_free (unplaced_icons); + } + else + { + /* There are no placed icons. Just lay them down using our rules */ + x = DESKTOP_PAD_HORIZONTAL; + + while (icons != NULL) + { + int center_x; + int baseline; + int icon_height_for_bound_check; + gboolean should_snap; + + should_snap = container->details->keep_aligned; + + y = DESKTOP_PAD_VERTICAL; + + max_width = 0; + + /* Calculate max width for column */ + for (p = icons; p != NULL; p = p->next) + { + icon = p->data; + + icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_LAYOUT); + icon_width = x2 - x1; + icon_height = y2 - y1; + + icon_get_bounding_box (icon, NULL, &y1, NULL, &y2, + BOUNDS_USAGE_FOR_ENTIRE_ITEM); + icon_height_for_bound_check = y2 - y1; + + if (should_snap) + { + /* Snap the baseline to a grid position */ + icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); + baseline = y + (icon_rect.y1 - icon_rect.y0); + baseline = SNAP_CEIL_VERTICAL (baseline); + y = baseline - (icon_rect.y1 - icon_rect.y0); + } + + /* Check and see if we need to move to a new column */ + if (y != DESKTOP_PAD_VERTICAL && y + icon_height_for_bound_check > height) + { + break; + } + + if (max_width < icon_width) + { + max_width = icon_width; + } + + y += icon_height + DESKTOP_PAD_VERTICAL; + } + + y = DESKTOP_PAD_VERTICAL; + + center_x = x + max_width / 2; + column_width = max_width; + if (should_snap) + { + /* Find the grid column to center on */ + center_x = SNAP_CEIL_HORIZONTAL (center_x); + column_width = (center_x - x) + (max_width / 2); + } + + /* Lay out column */ + for (p = icons; p != NULL; p = p->next) + { + icon = p->data; + icon_get_bounding_box (icon, &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_LAYOUT); + icon_height = y2 - y1; + + icon_get_bounding_box (icon, NULL, &y1, NULL, &y2, + BOUNDS_USAGE_FOR_ENTIRE_ITEM); + icon_height_for_bound_check = y2 - y1; + + icon_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); + + if (should_snap) + { + baseline = y + (icon_rect.y1 - icon_rect.y0); + baseline = SNAP_CEIL_VERTICAL (baseline); + y = baseline - (icon_rect.y1 - icon_rect.y0); + } + + /* Check and see if we need to move to a new column */ + if (y != DESKTOP_PAD_VERTICAL && y > height - icon_height_for_bound_check && + /* Make sure we lay out at least one icon per column, to make progress */ + p != icons) + { + x += column_width + DESKTOP_PAD_HORIZONTAL; + break; + } + + icon_set_position (icon, + center_x - (icon_rect.x1 - icon_rect.x0) / 2, + y); + + icon->saved_ltr_x = icon->x; + y += icon_height + DESKTOP_PAD_VERTICAL; + } + icons = p; + } + } + + /* These modes are special. We freeze all of our positions + * after we do the layout. + */ + /* FIXME bugzilla.gnome.org 42478: + * This should not be tied to the direction of layout. + * It should be a separate switch. + */ + nautilus_canvas_container_freeze_icon_positions (container); } static void -lay_down_icons (NautilusCanvasContainer *container, GList *icons, double start_y) +lay_down_icons (NautilusCanvasContainer *container, + GList *icons, + double start_y) { - if (container->details->is_desktop) { - lay_down_icons_vertical_desktop (container, icons); - } else { - lay_down_icons_horizontal (container, icons, start_y); - } + if (container->details->is_desktop) + { + lay_down_icons_vertical_desktop (container, icons); + } + else + { + lay_down_icons_horizontal (container, icons, start_y); + } } static void redo_layout_internal (NautilusCanvasContainer *container) { - gboolean layout_possible; - - layout_possible = finish_adding_new_icons (container); - if (!layout_possible) { - schedule_redo_layout (container); - return; + gboolean layout_possible; + + layout_possible = finish_adding_new_icons (container); + if (!layout_possible) + { + schedule_redo_layout (container); + return; + } + + /* Don't do any re-laying-out during stretching. Later we + * might add smart logic that does this and leaves room for + * the stretched icon, but if we do it we want it to be fast + * and only re-lay-out when it's really needed. + */ + if (container->details->auto_layout + && container->details->drag_state != DRAG_STATE_STRETCH) + { + if (container->details->needs_resort) + { + resort (container); + container->details->needs_resort = FALSE; } + lay_down_icons (container, container->details->icons, 0); + } - /* Don't do any re-laying-out during stretching. Later we - * might add smart logic that does this and leaves room for - * the stretched icon, but if we do it we want it to be fast - * and only re-lay-out when it's really needed. - */ - if (container->details->auto_layout - && container->details->drag_state != DRAG_STATE_STRETCH) { - if (container->details->needs_resort) { - resort (container); - container->details->needs_resort = FALSE; - } - lay_down_icons (container, container->details->icons, 0); - } - - if (nautilus_canvas_container_is_layout_rtl (container)) { - nautilus_canvas_container_set_rtl_positions (container); - } + if (nautilus_canvas_container_is_layout_rtl (container)) + { + nautilus_canvas_container_set_rtl_positions (container); + } - nautilus_canvas_container_update_scroll_region (container); + nautilus_canvas_container_update_scroll_region (container); - process_pending_icon_to_reveal (container); - nautilus_canvas_container_update_visible_icons (container); + process_pending_icon_to_reveal (container); + nautilus_canvas_container_update_visible_icons (container); } static gboolean redo_layout_callback (gpointer callback_data) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (callback_data); - redo_layout_internal (container); - container->details->idle_id = 0; + container = NAUTILUS_CANVAS_CONTAINER (callback_data); + redo_layout_internal (container); + container->details->idle_id = 0; - return FALSE; + return FALSE; } static void unschedule_redo_layout (NautilusCanvasContainer *container) { - if (container->details->idle_id != 0) { - g_source_remove (container->details->idle_id); - container->details->idle_id = 0; - } + if (container->details->idle_id != 0) + { + g_source_remove (container->details->idle_id); + container->details->idle_id = 0; + } } static void schedule_redo_layout (NautilusCanvasContainer *container) { - if (container->details->idle_id == 0 - && container->details->has_been_allocated) { - container->details->idle_id = g_idle_add - (redo_layout_callback, container); - } + if (container->details->idle_id == 0 + && container->details->has_been_allocated) + { + container->details->idle_id = g_idle_add + (redo_layout_callback, container); + } } static void redo_layout (NautilusCanvasContainer *container) { - unschedule_redo_layout (container); - redo_layout_internal (container); + unschedule_redo_layout (container); + redo_layout_internal (container); } static void reload_icon_positions (NautilusCanvasContainer *container) { - GList *p, *no_position_icons; - NautilusCanvasIcon *icon; - gboolean have_stored_position; - NautilusCanvasPosition position; - EelDRect bounds; - double bottom; - EelCanvasItem *item; - - g_assert (!container->details->auto_layout); - - resort (container); - - no_position_icons = NULL; - - /* Place all the icons with positions. */ - bottom = 0; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - have_stored_position = FALSE; - g_signal_emit (container, - signals[GET_STORED_ICON_POSITION], 0, - icon->data, - &position, - &have_stored_position); - if (have_stored_position) { - icon_set_position (icon, position.x, position.y); - item = EEL_CANVAS_ITEM (icon->item); - nautilus_canvas_item_get_bounds_for_layout (icon->item, - &bounds.x0, - &bounds.y0, - &bounds.x1, - &bounds.y1); - eel_canvas_item_i2w (item->parent, - &bounds.x0, - &bounds.y0); - eel_canvas_item_i2w (item->parent, - &bounds.x1, - &bounds.y1); - if (bounds.y1 > bottom) { - bottom = bounds.y1; - } - } else { - no_position_icons = g_list_prepend (no_position_icons, icon); - } - } - no_position_icons = g_list_reverse (no_position_icons); - - /* Place all the other icons. */ - lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM); - g_list_free (no_position_icons); + GList *p, *no_position_icons; + NautilusCanvasIcon *icon; + gboolean have_stored_position; + NautilusCanvasPosition position; + EelDRect bounds; + double bottom; + EelCanvasItem *item; + + g_assert (!container->details->auto_layout); + + resort (container); + + no_position_icons = NULL; + + /* Place all the icons with positions. */ + bottom = 0; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + + have_stored_position = FALSE; + g_signal_emit (container, + signals[GET_STORED_ICON_POSITION], 0, + icon->data, + &position, + &have_stored_position); + if (have_stored_position) + { + icon_set_position (icon, position.x, position.y); + item = EEL_CANVAS_ITEM (icon->item); + nautilus_canvas_item_get_bounds_for_layout (icon->item, + &bounds.x0, + &bounds.y0, + &bounds.x1, + &bounds.y1); + eel_canvas_item_i2w (item->parent, + &bounds.x0, + &bounds.y0); + eel_canvas_item_i2w (item->parent, + &bounds.x1, + &bounds.y1); + if (bounds.y1 > bottom) + { + bottom = bounds.y1; + } + } + else + { + no_position_icons = g_list_prepend (no_position_icons, icon); + } + } + no_position_icons = g_list_reverse (no_position_icons); + + /* Place all the other icons. */ + lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM); + g_list_free (no_position_icons); } /* Container-level icon handling functions. */ @@ -2046,1731 +2275,1932 @@ reload_icon_positions (NautilusCanvasContainer *container) static gboolean button_event_modifies_selection (GdkEventButton *event) { - return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0; + return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0; } /* invalidate the cached label sizes for all the icons */ static void invalidate_label_sizes (NautilusCanvasContainer *container) { - GList *p; - NautilusCanvasIcon *icon; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; + GList *p; + NautilusCanvasIcon *icon; + + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - nautilus_canvas_item_invalidate_label_size (icon->item); - } + nautilus_canvas_item_invalidate_label_size (icon->item); + } } static gboolean select_range (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon1, - NautilusCanvasIcon *icon2, - gboolean unselect_outside_range) -{ - gboolean selection_changed; - GList *p; - NautilusCanvasIcon *icon; - NautilusCanvasIcon *unmatched_icon; - gboolean select; - - selection_changed = FALSE; - - unmatched_icon = NULL; - select = FALSE; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - if (unmatched_icon == NULL) { - if (icon == icon1) { - unmatched_icon = icon2; - select = TRUE; - } else if (icon == icon2) { - unmatched_icon = icon1; - select = TRUE; - } - } - - if (select || unselect_outside_range) { - selection_changed |= icon_set_selected - (container, icon, select); - } - - if (unmatched_icon != NULL && icon == unmatched_icon) { - select = FALSE; - } - - } - return selection_changed; + NautilusCanvasIcon *icon1, + NautilusCanvasIcon *icon2, + gboolean unselect_outside_range) +{ + gboolean selection_changed; + GList *p; + NautilusCanvasIcon *icon; + NautilusCanvasIcon *unmatched_icon; + gboolean select; + + selection_changed = FALSE; + + unmatched_icon = NULL; + select = FALSE; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + + if (unmatched_icon == NULL) + { + if (icon == icon1) + { + unmatched_icon = icon2; + select = TRUE; + } + else if (icon == icon2) + { + unmatched_icon = icon1; + select = TRUE; + } + } + + if (select || unselect_outside_range) + { + selection_changed |= icon_set_selected + (container, icon, select); + } + + if (unmatched_icon != NULL && icon == unmatched_icon) + { + select = FALSE; + } + } + return selection_changed; } static gboolean select_one_unselect_others (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_to_select) + NautilusCanvasIcon *icon_to_select) { - gboolean selection_changed; - GList *p; - NautilusCanvasIcon *icon; + gboolean selection_changed; + GList *p; + NautilusCanvasIcon *icon; + + selection_changed = FALSE; - selection_changed = FALSE; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - selection_changed |= icon_set_selected - (container, icon, icon == icon_to_select); - } - - if (selection_changed && icon_to_select != NULL) { - reveal_icon (container, icon_to_select); - } - return selection_changed; + selection_changed |= icon_set_selected + (container, icon, icon == icon_to_select); + } + + if (selection_changed && icon_to_select != NULL) + { + reveal_icon (container, icon_to_select); + } + return selection_changed; } static gboolean unselect_all (NautilusCanvasContainer *container) { - return select_one_unselect_others (container, NULL); + return select_one_unselect_others (container, NULL); } void nautilus_canvas_container_move_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - int x, int y, - double scale, - gboolean raise, - gboolean snap, - gboolean update_position) -{ - NautilusCanvasContainerDetails *details; - gboolean emit_signal; - NautilusCanvasPosition position; - - details = container->details; - - emit_signal = FALSE; - - if (scale != icon->scale) { - icon->scale = scale; - nautilus_canvas_container_update_icon (container, icon); - if (update_position) { - redo_layout (container); - emit_signal = TRUE; - } - } - - if (!details->auto_layout) { - if (details->keep_aligned && snap) { - snap_position (container, icon, &x, &y); - } - - if (x != icon->x || y != icon->y) { - icon_set_position (icon, x, y); - emit_signal = update_position; - } - - icon->saved_ltr_x = nautilus_canvas_container_is_layout_rtl (container) ? get_mirror_x_position (container, icon, icon->x) : icon->x; - } - - if (emit_signal) { - position.x = icon->saved_ltr_x; - position.y = icon->y; - position.scale = scale; - g_signal_emit (container, - signals[ICON_POSITION_CHANGED], 0, - icon->data, &position); - } - - if (raise) { - icon_raise (icon); - } - - /* FIXME bugzilla.gnome.org 42474: - * Handling of the scroll region is inconsistent here. In - * the scale-changing case, redo_layout is called, which updates the - * scroll region appropriately. In other cases, it's up to the - * caller to make sure the scroll region is updated. This could - * lead to hard-to-track-down bugs. - */ + NautilusCanvasIcon *icon, + int x, + int y, + double scale, + gboolean raise, + gboolean snap, + gboolean update_position) +{ + NautilusCanvasContainerDetails *details; + gboolean emit_signal; + NautilusCanvasPosition position; + + details = container->details; + + emit_signal = FALSE; + + if (scale != icon->scale) + { + icon->scale = scale; + nautilus_canvas_container_update_icon (container, icon); + if (update_position) + { + redo_layout (container); + emit_signal = TRUE; + } + } + + if (!details->auto_layout) + { + if (details->keep_aligned && snap) + { + snap_position (container, icon, &x, &y); + } + + if (x != icon->x || y != icon->y) + { + icon_set_position (icon, x, y); + emit_signal = update_position; + } + + icon->saved_ltr_x = nautilus_canvas_container_is_layout_rtl (container) ? get_mirror_x_position (container, icon, icon->x) : icon->x; + } + + if (emit_signal) + { + position.x = icon->saved_ltr_x; + position.y = icon->y; + position.scale = scale; + g_signal_emit (container, + signals[ICON_POSITION_CHANGED], 0, + icon->data, &position); + } + + if (raise) + { + icon_raise (icon); + } + + /* FIXME bugzilla.gnome.org 42474: + * Handling of the scroll region is inconsistent here. In + * the scale-changing case, redo_layout is called, which updates the + * scroll region appropriately. In other cases, it's up to the + * caller to make sure the scroll region is updated. This could + * lead to hard-to-track-down bugs. + */ } /* Implementation of rubberband selection. */ static void rubberband_select (NautilusCanvasContainer *container, - const EelDRect *current_rect) -{ - GList *p; - gboolean selection_changed, is_in, canvas_rect_calculated; - NautilusCanvasIcon *icon; - EelIRect canvas_rect; - EelCanvas *canvas; - - selection_changed = FALSE; - canvas_rect_calculated = FALSE; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - if (!canvas_rect_calculated) { - /* Only do this calculation once, since all the canvas items - * we are interating are in the same coordinate space - */ - canvas = EEL_CANVAS_ITEM (icon->item)->canvas; - eel_canvas_w2c (canvas, - current_rect->x0, - current_rect->y0, - &canvas_rect.x0, - &canvas_rect.y0); - eel_canvas_w2c (canvas, - current_rect->x1, - current_rect->y1, - &canvas_rect.x1, - &canvas_rect.y1); - canvas_rect_calculated = TRUE; - } - - is_in = nautilus_canvas_item_hit_test_rectangle (icon->item, canvas_rect); - - selection_changed |= icon_set_selected - (container, icon, - is_in ^ icon->was_selected_before_rubberband); - } - - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + const EelDRect *current_rect) +{ + GList *p; + gboolean selection_changed, is_in, canvas_rect_calculated; + NautilusCanvasIcon *icon; + EelIRect canvas_rect; + EelCanvas *canvas; + + selection_changed = FALSE; + canvas_rect_calculated = FALSE; + + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + + if (!canvas_rect_calculated) + { + /* Only do this calculation once, since all the canvas items + * we are interating are in the same coordinate space + */ + canvas = EEL_CANVAS_ITEM (icon->item)->canvas; + eel_canvas_w2c (canvas, + current_rect->x0, + current_rect->y0, + &canvas_rect.x0, + &canvas_rect.y0); + eel_canvas_w2c (canvas, + current_rect->x1, + current_rect->y1, + &canvas_rect.x1, + &canvas_rect.y1); + canvas_rect_calculated = TRUE; + } + + is_in = nautilus_canvas_item_hit_test_rectangle (icon->item, canvas_rect); + + selection_changed |= icon_set_selected + (container, icon, + is_in ^ icon->was_selected_before_rubberband); + } + + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } static int rubberband_timeout_callback (gpointer data) { - NautilusCanvasContainer *container; - GtkWidget *widget; - NautilusCanvasRubberbandInfo *band_info; - int x, y; - double x1, y1, x2, y2; - double world_x, world_y; - int x_scroll, y_scroll; - int adj_x, adj_y; - GdkDisplay *display; - GdkSeat *seat; - gboolean adj_changed; - GtkAllocation allocation; - - EelDRect selection_rect; - - widget = GTK_WIDGET (data); - container = NAUTILUS_CANVAS_CONTAINER (data); - band_info = &container->details->rubberband_info; - - g_assert (band_info->timer_id != 0); - - adj_changed = FALSE; - gtk_widget_get_allocation (widget, &allocation); - - adj_x = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); - if (adj_x != band_info->last_adj_x) { - band_info->last_adj_x = adj_x; - adj_changed = TRUE; - } - - adj_y = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); - if (adj_y != band_info->last_adj_y) { - band_info->last_adj_y = adj_y; - adj_changed = TRUE; - } - - display = gtk_widget_get_display (widget); - seat = gdk_display_get_default_seat (display); - - gdk_window_get_device_position (gtk_widget_get_window (widget), - gdk_seat_get_pointer (seat), - &x, &y, NULL); - - if (x < RUBBERBAND_SCROLL_THRESHOLD) { - x_scroll = x - RUBBERBAND_SCROLL_THRESHOLD; - x = 0; - } else if (x >= allocation.width - RUBBERBAND_SCROLL_THRESHOLD) { - x_scroll = x - allocation.width + RUBBERBAND_SCROLL_THRESHOLD + 1; - x = allocation.width - 1; - } else { - x_scroll = 0; - } - - if (y < RUBBERBAND_SCROLL_THRESHOLD) { - y_scroll = y - RUBBERBAND_SCROLL_THRESHOLD; - y = 0; - } else if (y >= allocation.height - RUBBERBAND_SCROLL_THRESHOLD) { - y_scroll = y - allocation.height + RUBBERBAND_SCROLL_THRESHOLD + 1; - y = allocation.height - 1; - } else { - y_scroll = 0; - } - - if (y_scroll == 0 && x_scroll == 0 - && (int) band_info->prev_x == x && (int) band_info->prev_y == y && !adj_changed) { - return TRUE; - } - - nautilus_canvas_container_scroll (container, x_scroll, y_scroll); - - /* Remember to convert from widget to scrolled window coords */ - eel_canvas_window_to_world (EEL_CANVAS (container), - x + gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))), - y + gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))), - &world_x, &world_y); - - if (world_x < band_info->start_x) { - x1 = world_x; - x2 = band_info->start_x; - } else { - x1 = band_info->start_x; - x2 = world_x; - } - - if (world_y < band_info->start_y) { - y1 = world_y; - y2 = band_info->start_y; - } else { - y1 = band_info->start_y; - y2 = world_y; - } - - /* Don't let the area of the selection rectangle be empty. - * Aside from the fact that it would be funny when the rectangle disappears, - * this also works around a crash in libart that happens sometimes when a - * zero height rectangle is passed. - */ - x2 = MAX (x1 + 1, x2); - y2 = MAX (y1 + 1, y2); - - eel_canvas_item_set - (band_info->selection_rectangle, - "x1", x1, "y1", y1, - "x2", x2, "y2", y2, - NULL); - - selection_rect.x0 = x1; - selection_rect.y0 = y1; - selection_rect.x1 = x2; - selection_rect.y1 = y2; - - rubberband_select (container, - &selection_rect); - - band_info->prev_x = x; - band_info->prev_y = y; - - return TRUE; + NautilusCanvasContainer *container; + GtkWidget *widget; + NautilusCanvasRubberbandInfo *band_info; + int x, y; + double x1, y1, x2, y2; + double world_x, world_y; + int x_scroll, y_scroll; + int adj_x, adj_y; + GdkDisplay *display; + GdkSeat *seat; + gboolean adj_changed; + GtkAllocation allocation; + + EelDRect selection_rect; + + widget = GTK_WIDGET (data); + container = NAUTILUS_CANVAS_CONTAINER (data); + band_info = &container->details->rubberband_info; + + g_assert (band_info->timer_id != 0); + + adj_changed = FALSE; + gtk_widget_get_allocation (widget, &allocation); + + adj_x = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); + if (adj_x != band_info->last_adj_x) + { + band_info->last_adj_x = adj_x; + adj_changed = TRUE; + } + + adj_y = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); + if (adj_y != band_info->last_adj_y) + { + band_info->last_adj_y = adj_y; + adj_changed = TRUE; + } + + display = gtk_widget_get_display (widget); + seat = gdk_display_get_default_seat (display); + + gdk_window_get_device_position (gtk_widget_get_window (widget), + gdk_seat_get_pointer (seat), + &x, &y, NULL); + + if (x < RUBBERBAND_SCROLL_THRESHOLD) + { + x_scroll = x - RUBBERBAND_SCROLL_THRESHOLD; + x = 0; + } + else if (x >= allocation.width - RUBBERBAND_SCROLL_THRESHOLD) + { + x_scroll = x - allocation.width + RUBBERBAND_SCROLL_THRESHOLD + 1; + x = allocation.width - 1; + } + else + { + x_scroll = 0; + } + + if (y < RUBBERBAND_SCROLL_THRESHOLD) + { + y_scroll = y - RUBBERBAND_SCROLL_THRESHOLD; + y = 0; + } + else if (y >= allocation.height - RUBBERBAND_SCROLL_THRESHOLD) + { + y_scroll = y - allocation.height + RUBBERBAND_SCROLL_THRESHOLD + 1; + y = allocation.height - 1; + } + else + { + y_scroll = 0; + } + + if (y_scroll == 0 && x_scroll == 0 + && (int) band_info->prev_x == x && (int) band_info->prev_y == y && !adj_changed) + { + return TRUE; + } + + nautilus_canvas_container_scroll (container, x_scroll, y_scroll); + + /* Remember to convert from widget to scrolled window coords */ + eel_canvas_window_to_world (EEL_CANVAS (container), + x + gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))), + y + gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))), + &world_x, &world_y); + + if (world_x < band_info->start_x) + { + x1 = world_x; + x2 = band_info->start_x; + } + else + { + x1 = band_info->start_x; + x2 = world_x; + } + + if (world_y < band_info->start_y) + { + y1 = world_y; + y2 = band_info->start_y; + } + else + { + y1 = band_info->start_y; + y2 = world_y; + } + + /* Don't let the area of the selection rectangle be empty. + * Aside from the fact that it would be funny when the rectangle disappears, + * this also works around a crash in libart that happens sometimes when a + * zero height rectangle is passed. + */ + x2 = MAX (x1 + 1, x2); + y2 = MAX (y1 + 1, y2); + + eel_canvas_item_set + (band_info->selection_rectangle, + "x1", x1, "y1", y1, + "x2", x2, "y2", y2, + NULL); + + selection_rect.x0 = x1; + selection_rect.y0 = y1; + selection_rect.x1 = x2; + selection_rect.y1 = y2; + + rubberband_select (container, + &selection_rect); + + band_info->prev_x = x; + band_info->prev_y = y; + + return TRUE; } static void get_rubber_color (NautilusCanvasContainer *container, - GdkRGBA *bgcolor, - GdkRGBA *bordercolor) -{ - Atom real_type; - gint result = -1; - gint real_format; - gulong items_read = 0; - gulong items_left = 0; - gchar *colors; - Atom representative_colors_atom; - Display *display; - - if (nautilus_canvas_container_get_is_desktop (container)) { - representative_colors_atom = gdk_x11_get_xatom_by_name ("_GNOME_BACKGROUND_REPRESENTATIVE_COLORS"); - display = gdk_x11_display_get_xdisplay (gdk_display_get_default ()); - - gdk_error_trap_push (); - result = XGetWindowProperty (display, - GDK_ROOT_WINDOW (), - representative_colors_atom, - 0L, - G_MAXLONG, - False, - XA_STRING, - &real_type, - &real_format, - &items_read, - &items_left, - (guchar **) &colors); - gdk_error_trap_pop_ignored (); - } - - if (result == Success && items_read) { - /* by treating the result as a nul-terminated string, we - * select the first colour in the list. - */ - GdkRGBA read; - gdouble shade; - - gdk_rgba_parse (&read, colors); - XFree (colors); - - /* Border - * - * We shade darker colours to be slightly lighter and - * lighter ones to be slightly darker. - */ - shade = read.green < 0.5 ? 1.1 : 0.9; - bordercolor->red = read.red * shade; - bordercolor->green = read.green * shade; - bordercolor->blue = read.blue * shade; - bordercolor->alpha = 1.0; - - /* Background */ - *bgcolor = read; - bgcolor->alpha = 0.6; - } else { - /* Fallback to the style context if we can't get the Atom */ - GtkStyleContext *context; - - context = gtk_widget_get_style_context (GTK_WIDGET (container)); - gtk_style_context_save (context); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_RUBBERBAND); - - gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, bgcolor); - gtk_style_context_get_border_color (context, GTK_STATE_FLAG_NORMAL, bordercolor); - - gtk_style_context_restore (context); - } + GdkRGBA *bgcolor, + GdkRGBA *bordercolor) +{ + Atom real_type; + gint result = -1; + gint real_format; + gulong items_read = 0; + gulong items_left = 0; + gchar *colors; + Atom representative_colors_atom; + Display *display; + + if (nautilus_canvas_container_get_is_desktop (container)) + { + representative_colors_atom = gdk_x11_get_xatom_by_name ("_GNOME_BACKGROUND_REPRESENTATIVE_COLORS"); + display = gdk_x11_display_get_xdisplay (gdk_display_get_default ()); + + gdk_error_trap_push (); + result = XGetWindowProperty (display, + GDK_ROOT_WINDOW (), + representative_colors_atom, + 0L, + G_MAXLONG, + False, + XA_STRING, + &real_type, + &real_format, + &items_read, + &items_left, + (guchar **) &colors); + gdk_error_trap_pop_ignored (); + } + + if (result == Success && items_read) + { + /* by treating the result as a nul-terminated string, we + * select the first colour in the list. + */ + GdkRGBA read; + gdouble shade; + + gdk_rgba_parse (&read, colors); + XFree (colors); + + /* Border + * + * We shade darker colours to be slightly lighter and + * lighter ones to be slightly darker. + */ + shade = read.green < 0.5 ? 1.1 : 0.9; + bordercolor->red = read.red * shade; + bordercolor->green = read.green * shade; + bordercolor->blue = read.blue * shade; + bordercolor->alpha = 1.0; + + /* Background */ + *bgcolor = read; + bgcolor->alpha = 0.6; + } + else + { + /* Fallback to the style context if we can't get the Atom */ + GtkStyleContext *context; + + context = gtk_widget_get_style_context (GTK_WIDGET (container)); + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_RUBBERBAND); + + gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, bgcolor); + gtk_style_context_get_border_color (context, GTK_STATE_FLAG_NORMAL, bordercolor); + + gtk_style_context_restore (context); + } } static void start_rubberbanding (NautilusCanvasContainer *container, - GdkEventButton *event) -{ - AtkObject *accessible; - NautilusCanvasContainerDetails *details; - NautilusCanvasRubberbandInfo *band_info; - GdkRGBA bg_color, border_color; - GList *p; - NautilusCanvasIcon *icon; - - details = container->details; - band_info = &details->rubberband_info; - - g_signal_emit (container, - signals[BAND_SELECT_STARTED], 0); - - for (p = details->icons; p != NULL; p = p->next) { - icon = p->data; - icon->was_selected_before_rubberband = icon->is_selected; - } - - eel_canvas_window_to_world - (EEL_CANVAS (container), event->x, event->y, - &band_info->start_x, &band_info->start_y); - - get_rubber_color (container, &bg_color, &border_color); - - band_info->selection_rectangle = eel_canvas_item_new - (eel_canvas_root - (EEL_CANVAS (container)), - NAUTILUS_TYPE_SELECTION_CANVAS_ITEM, - "x1", band_info->start_x, - "y1", band_info->start_y, - "x2", band_info->start_x, - "y2", band_info->start_y, - "fill_color_rgba", &bg_color, - "outline_color_rgba", &border_color, - "width_pixels", 1, - NULL); - - accessible = atk_gobject_accessible_for_object - (G_OBJECT (band_info->selection_rectangle)); - atk_object_set_name (accessible, "selection"); - atk_object_set_description (accessible, _("The selection rectangle")); - - band_info->prev_x = event->x - gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); - band_info->prev_y = event->y - gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); - - band_info->active = TRUE; - - if (band_info->timer_id == 0) { - band_info->timer_id = g_timeout_add - (RUBBERBAND_TIMEOUT_INTERVAL, - rubberband_timeout_callback, - container); - } - - eel_canvas_item_grab (band_info->selection_rectangle, - (GDK_POINTER_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_SCROLL_MASK), - NULL, - (GdkEvent *)event); + GdkEventButton *event) +{ + AtkObject *accessible; + NautilusCanvasContainerDetails *details; + NautilusCanvasRubberbandInfo *band_info; + GdkRGBA bg_color, border_color; + GList *p; + NautilusCanvasIcon *icon; + + details = container->details; + band_info = &details->rubberband_info; + + g_signal_emit (container, + signals[BAND_SELECT_STARTED], 0); + + for (p = details->icons; p != NULL; p = p->next) + { + icon = p->data; + icon->was_selected_before_rubberband = icon->is_selected; + } + + eel_canvas_window_to_world + (EEL_CANVAS (container), event->x, event->y, + &band_info->start_x, &band_info->start_y); + + get_rubber_color (container, &bg_color, &border_color); + + band_info->selection_rectangle = eel_canvas_item_new + (eel_canvas_root + (EEL_CANVAS (container)), + NAUTILUS_TYPE_SELECTION_CANVAS_ITEM, + "x1", band_info->start_x, + "y1", band_info->start_y, + "x2", band_info->start_x, + "y2", band_info->start_y, + "fill_color_rgba", &bg_color, + "outline_color_rgba", &border_color, + "width_pixels", 1, + NULL); + + accessible = atk_gobject_accessible_for_object + (G_OBJECT (band_info->selection_rectangle)); + atk_object_set_name (accessible, "selection"); + atk_object_set_description (accessible, _("The selection rectangle")); + + band_info->prev_x = event->x - gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); + band_info->prev_y = event->y - gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); + + band_info->active = TRUE; + + if (band_info->timer_id == 0) + { + band_info->timer_id = g_timeout_add + (RUBBERBAND_TIMEOUT_INTERVAL, + rubberband_timeout_callback, + container); + } + + eel_canvas_item_grab (band_info->selection_rectangle, + (GDK_POINTER_MOTION_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_SCROLL_MASK), + NULL, + (GdkEvent *) event); } static void stop_rubberbanding (NautilusCanvasContainer *container) { - NautilusCanvasRubberbandInfo *band_info; - GList *icons; - gboolean enable_animation; + NautilusCanvasRubberbandInfo *band_info; + GList *icons; + gboolean enable_animation; - band_info = &container->details->rubberband_info; + band_info = &container->details->rubberband_info; - g_assert (band_info->timer_id != 0); - g_source_remove (band_info->timer_id); - band_info->timer_id = 0; + g_assert (band_info->timer_id != 0); + g_source_remove (band_info->timer_id); + band_info->timer_id = 0; - band_info->active = FALSE; + band_info->active = FALSE; - g_object_get (gtk_settings_get_default (), "gtk-enable-animations", &enable_animation, NULL); + g_object_get (gtk_settings_get_default (), "gtk-enable-animations", &enable_animation, NULL); - /* Destroy this canvas item; the parent will unref it. */ - eel_canvas_item_ungrab (band_info->selection_rectangle); - eel_canvas_item_lower_to_bottom (band_info->selection_rectangle); - if (enable_animation) { - nautilus_selection_canvas_item_fade_out (NAUTILUS_SELECTION_CANVAS_ITEM (band_info->selection_rectangle), 150); - } else { - eel_canvas_item_destroy (band_info->selection_rectangle); - } - band_info->selection_rectangle = NULL; + /* Destroy this canvas item; the parent will unref it. */ + eel_canvas_item_ungrab (band_info->selection_rectangle); + eel_canvas_item_lower_to_bottom (band_info->selection_rectangle); + if (enable_animation) + { + nautilus_selection_canvas_item_fade_out (NAUTILUS_SELECTION_CANVAS_ITEM (band_info->selection_rectangle), 150); + } + else + { + eel_canvas_item_destroy (band_info->selection_rectangle); + } + band_info->selection_rectangle = NULL; - /* if only one item has been selected, use it as range - * selection base (cf. handle_icon_button_press) */ - icons = nautilus_canvas_container_get_selected_icons (container); - if (g_list_length (icons) == 1) { - container->details->range_selection_base_icon = icons->data; - } - g_list_free (icons); + /* if only one item has been selected, use it as range + * selection base (cf. handle_icon_button_press) */ + icons = nautilus_canvas_container_get_selected_icons (container); + if (g_list_length (icons) == 1) + { + container->details->range_selection_base_icon = icons->data; + } + g_list_free (icons); - g_signal_emit (container, - signals[BAND_SELECT_ENDED], 0); + g_signal_emit (container, + signals[BAND_SELECT_ENDED], 0); } /* Keyboard navigation. */ -typedef gboolean (* IsBetterCanvasFunction) (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data); +typedef gboolean (*IsBetterCanvasFunction) (NautilusCanvasContainer *container, + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data); static NautilusCanvasIcon * find_best_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - IsBetterCanvasFunction function, - void *data) -{ - GList *p; - NautilusCanvasIcon *best, *candidate; - - best = NULL; - for (p = container->details->icons; p != NULL; p = p->next) { - candidate = p->data; - - if (candidate != start_icon) { - if ((* function) (container, start_icon, best, candidate, data)) { - best = candidate; - } - } - } - return best; + NautilusCanvasIcon *start_icon, + IsBetterCanvasFunction function, + void *data) +{ + GList *p; + NautilusCanvasIcon *best, *candidate; + + best = NULL; + for (p = container->details->icons; p != NULL; p = p->next) + { + candidate = p->data; + + if (candidate != start_icon) + { + if ((*function)(container, start_icon, best, candidate, data)) + { + best = candidate; + } + } + } + return best; } static NautilusCanvasIcon * find_best_selected_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - IsBetterCanvasFunction function, - void *data) -{ - GList *p; - NautilusCanvasIcon *best, *candidate; - - best = NULL; - for (p = container->details->icons; p != NULL; p = p->next) { - candidate = p->data; - - if (candidate != start_icon && candidate->is_selected) { - if ((* function) (container, start_icon, best, candidate, data)) { - best = candidate; - } - } - } - return best; + NautilusCanvasIcon *start_icon, + IsBetterCanvasFunction function, + void *data) +{ + GList *p; + NautilusCanvasIcon *best, *candidate; + + best = NULL; + for (p = container->details->icons; p != NULL; p = p->next) + { + candidate = p->data; + + if (candidate != start_icon && candidate->is_selected) + { + if ((*function)(container, start_icon, best, candidate, data)) + { + best = candidate; + } + } + } + return best; } static int compare_icons_by_uri (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b) + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b) { - char *uri_a, *uri_b; - int result; + char *uri_a, *uri_b; + int result; + + g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_assert (icon_a != NULL); + g_assert (icon_b != NULL); + g_assert (icon_a != icon_b); - g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_assert (icon_a != NULL); - g_assert (icon_b != NULL); - g_assert (icon_a != icon_b); + uri_a = nautilus_canvas_container_get_icon_uri (container, icon_a); + uri_b = nautilus_canvas_container_get_icon_uri (container, icon_b); + result = strcmp (uri_a, uri_b); + g_assert (result != 0); + g_free (uri_a); + g_free (uri_b); - uri_a = nautilus_canvas_container_get_icon_uri (container, icon_a); - uri_b = nautilus_canvas_container_get_icon_uri (container, icon_b); - result = strcmp (uri_a, uri_b); - g_assert (result != 0); - g_free (uri_a); - g_free (uri_b); - - return result; + return result; } static int get_cmp_point_x (NautilusCanvasContainer *container, - EelDRect icon_rect) + EelDRect icon_rect) { - return (icon_rect.x0 + icon_rect.x1) / 2; + return (icon_rect.x0 + icon_rect.x1) / 2; } static int get_cmp_point_y (NautilusCanvasContainer *container, - EelDRect icon_rect) + EelDRect icon_rect) { - return icon_rect.y1; + return icon_rect.y1; } static int compare_icons_horizontal (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b) -{ - EelDRect world_rect; - int ax, bx; - - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &ax, - NULL); - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &bx, - NULL); - - if (ax < bx) { - return -1; - } - if (ax > bx) { - return +1; - } - return 0; + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b) +{ + EelDRect world_rect; + int ax, bx; + + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &ax, + NULL); + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &bx, + NULL); + + if (ax < bx) + { + return -1; + } + if (ax > bx) + { + return +1; + } + return 0; } static int compare_icons_vertical (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b) -{ - EelDRect world_rect; - int ay, by; - - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - NULL, - &ay); - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - NULL, - &by); - - if (ay < by) { - return -1; - } - if (ay > by) { - return +1; - } - return 0; + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b) +{ + EelDRect world_rect; + int ay, by; + + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + NULL, + &ay); + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + NULL, + &by); + + if (ay < by) + { + return -1; + } + if (ay > by) + { + return +1; + } + return 0; } static int compare_icons_horizontal_first (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b) -{ - EelDRect world_rect; - int ax, ay, bx, by; - - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &ax, - &ay); - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &bx, - &by); - - if (ax < bx) { - return -1; - } - if (ax > bx) { - return +1; - } - if (ay < by) { - return -1; - } - if (ay > by) { - return +1; - } - return compare_icons_by_uri (container, icon_a, icon_b); + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b) +{ + EelDRect world_rect; + int ax, ay, bx, by; + + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &ax, + &ay); + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &bx, + &by); + + if (ax < bx) + { + return -1; + } + if (ax > bx) + { + return +1; + } + if (ay < by) + { + return -1; + } + if (ay > by) + { + return +1; + } + return compare_icons_by_uri (container, icon_a, icon_b); } static int compare_icons_vertical_first (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon_a, - NautilusCanvasIcon *icon_b) -{ - EelDRect world_rect; - int ax, ay, bx, by; - - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &ax, - &ay); - world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &bx, - &by); - - if (ay < by) { - return -1; - } - if (ay > by) { - return +1; - } - if (ax < bx) { - return -1; - } - if (ax > bx) { - return +1; - } - return compare_icons_by_uri (container, icon_a, icon_b); + NautilusCanvasIcon *icon_a, + NautilusCanvasIcon *icon_b) +{ + EelDRect world_rect; + int ax, ay, bx, by; + + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_a->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &ax, + &ay); + world_rect = nautilus_canvas_item_get_icon_rectangle (icon_b->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &bx, + &by); + + if (ay < by) + { + return -1; + } + if (ay > by) + { + return +1; + } + if (ax < bx) + { + return -1; + } + if (ax > bx) + { + return +1; + } + return compare_icons_by_uri (container, icon_a, icon_b); } static gboolean leftmost_in_top_row (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) { - if (best_so_far == NULL) { - return TRUE; - } - return compare_icons_vertical_first (container, best_so_far, candidate) > 0; + if (best_so_far == NULL) + { + return TRUE; + } + return compare_icons_vertical_first (container, best_so_far, candidate) > 0; } static gboolean rightmost_in_top_row (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) { - if (best_so_far == NULL) { - return TRUE; - } - return compare_icons_vertical (container, best_so_far, candidate) > 0; - return compare_icons_horizontal (container, best_so_far, candidate) < 0; + if (best_so_far == NULL) + { + return TRUE; + } + return compare_icons_vertical (container, best_so_far, candidate) > 0; + return compare_icons_horizontal (container, best_so_far, candidate) < 0; } static gboolean rightmost_in_bottom_row (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) { - if (best_so_far == NULL) { - return TRUE; - } - return compare_icons_vertical_first (container, best_so_far, candidate) < 0; + if (best_so_far == NULL) + { + return TRUE; + } + return compare_icons_vertical_first (container, best_so_far, candidate) < 0; } static int compare_with_start_row (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - EelCanvasItem *item; + EelCanvasItem *item; - item = EEL_CANVAS_ITEM (icon->item); - - if (container->details->arrow_key_start_y < item->y1) { - return -1; - } - if (container->details->arrow_key_start_y > item->y2) { - return +1; - } - return 0; + item = EEL_CANVAS_ITEM (icon->item); + + if (container->details->arrow_key_start_y < item->y1) + { + return -1; + } + if (container->details->arrow_key_start_y > item->y2) + { + return +1; + } + return 0; } static int compare_with_start_column (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - EelCanvasItem *item; + EelCanvasItem *item; + + item = EEL_CANVAS_ITEM (icon->item); - item = EEL_CANVAS_ITEM (icon->item); - - if (container->details->arrow_key_start_x < item->x1) { - return -1; - } - if (container->details->arrow_key_start_x > item->x2) { - return +1; - } - return 0; + if (container->details->arrow_key_start_x < item->x1) + { + return -1; + } + if (container->details->arrow_key_start_x > item->x2) + { + return +1; + } + return 0; } static gboolean same_row_right_side_leftmost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* Candidates not on the start row do not qualify. */ - if (compare_with_start_row (container, candidate) != 0) { - return FALSE; - } - - /* Candidates that are farther right lose out. */ - if (best_so_far != NULL) { - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) < 0) { - return FALSE; - } - } - - /* Candidate to the left of the start do not qualify. */ - if (compare_icons_horizontal_first (container, - candidate, - start_icon) <= 0) { - return FALSE; - } - - return TRUE; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* Candidates not on the start row do not qualify. */ + if (compare_with_start_row (container, candidate) != 0) + { + return FALSE; + } + + /* Candidates that are farther right lose out. */ + if (best_so_far != NULL) + { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) + { + return FALSE; + } + } + + /* Candidate to the left of the start do not qualify. */ + if (compare_icons_horizontal_first (container, + candidate, + start_icon) <= 0) + { + return FALSE; + } + + return TRUE; } static gboolean same_row_left_side_rightmost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* Candidates not on the start row do not qualify. */ - if (compare_with_start_row (container, candidate) != 0) { - return FALSE; - } - - /* Candidates that are farther left lose out. */ - if (best_so_far != NULL) { - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) > 0) { - return FALSE; - } - } - - /* Candidate to the right of the start do not qualify. */ - if (compare_icons_horizontal_first (container, - candidate, - start_icon) >= 0) { - return FALSE; - } - - return TRUE; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* Candidates not on the start row do not qualify. */ + if (compare_with_start_row (container, candidate) != 0) + { + return FALSE; + } + + /* Candidates that are farther left lose out. */ + if (best_so_far != NULL) + { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) + { + return FALSE; + } + } + + /* Candidate to the right of the start do not qualify. */ + if (compare_icons_horizontal_first (container, + candidate, + start_icon) >= 0) + { + return FALSE; + } + + return TRUE; } static gboolean next_row_leftmost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not below the current row */ - if (compare_with_start_row (container, candidate) >= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_vertical_first (container, - best_so_far, - candidate) > 0) { - /* candidate is above best choice, but below the current row */ - return TRUE; - } - - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) > 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not below the current row */ + if (compare_with_start_row (container, candidate) >= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) + { + /* candidate is above best choice, but below the current row */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean next_row_rightmost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not below the current row */ - if (compare_with_start_row (container, candidate) >= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_vertical_first (container, - best_so_far, - candidate) > 0) { - /* candidate is above best choice, but below the current row */ - return TRUE; - } - - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) < 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not below the current row */ + if (compare_with_start_row (container, candidate) >= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) + { + /* candidate is above best choice, but below the current row */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean next_column_bottommost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not on the right of the current column */ - if (compare_with_start_column (container, candidate) >= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) > 0) { - /* candidate is above best choice, but below the current row */ - return TRUE; - } - - if (compare_icons_vertical_first (container, - best_so_far, - candidate) < 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not on the right of the current column */ + if (compare_with_start_column (container, candidate) >= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) + { + /* candidate is above best choice, but below the current row */ + return TRUE; + } + + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean previous_row_rightmost (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not above the current row */ - if (compare_with_start_row (container, candidate) <= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_vertical_first (container, - best_so_far, - candidate) < 0) { - /* candidate is below the best choice, but above the current row */ - return TRUE; - } - - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) < 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not above the current row */ + if (compare_with_start_row (container, candidate) <= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) + { + /* candidate is below the best choice, but above the current row */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean same_column_above_lowest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* Candidates not on the start column do not qualify. */ - if (compare_with_start_column (container, candidate) != 0) { - return FALSE; - } - - /* Candidates that are higher lose out. */ - if (best_so_far != NULL) { - if (compare_icons_vertical_first (container, - best_so_far, - candidate) > 0) { - return FALSE; - } - } - - /* Candidates below the start do not qualify. */ - if (compare_icons_vertical_first (container, - candidate, - start_icon) >= 0) { - return FALSE; - } - - return TRUE; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* Candidates not on the start column do not qualify. */ + if (compare_with_start_column (container, candidate) != 0) + { + return FALSE; + } + + /* Candidates that are higher lose out. */ + if (best_so_far != NULL) + { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) + { + return FALSE; + } + } + + /* Candidates below the start do not qualify. */ + if (compare_icons_vertical_first (container, + candidate, + start_icon) >= 0) + { + return FALSE; + } + + return TRUE; } static gboolean same_column_below_highest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* Candidates not on the start column do not qualify. */ - if (compare_with_start_column (container, candidate) != 0) { - return FALSE; - } - - /* Candidates that are lower lose out. */ - if (best_so_far != NULL) { - if (compare_icons_vertical_first (container, - best_so_far, - candidate) < 0) { - return FALSE; - } - } - - /* Candidates above the start do not qualify. */ - if (compare_icons_vertical_first (container, - candidate, - start_icon) <= 0) { - return FALSE; - } - - return TRUE; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* Candidates not on the start column do not qualify. */ + if (compare_with_start_column (container, candidate) != 0) + { + return FALSE; + } + + /* Candidates that are lower lose out. */ + if (best_so_far != NULL) + { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) + { + return FALSE; + } + } + + /* Candidates above the start do not qualify. */ + if (compare_icons_vertical_first (container, + candidate, + start_icon) <= 0) + { + return FALSE; + } + + return TRUE; } static gboolean previous_column_highest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not before the current column */ - if (compare_with_start_column (container, candidate) <= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_horizontal (container, - best_so_far, - candidate) < 0) { - /* candidate is right of the best choice, but left of the current column */ - return TRUE; - } + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not before the current column */ + if (compare_with_start_column (container, candidate) <= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_horizontal (container, + best_so_far, + candidate) < 0) + { + /* candidate is right of the best choice, but left of the current column */ + return TRUE; + } - if (compare_icons_vertical (container, - best_so_far, - candidate) > 0) { - return TRUE; - } - } + if (compare_icons_vertical (container, + best_so_far, + candidate) > 0) + { + return TRUE; + } + } - return best_so_far == NULL; + return best_so_far == NULL; } static gboolean next_column_highest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not after the current column */ - if (compare_with_start_column (container, candidate) >= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) > 0) { - /* candidate is left of the best choice, but right of the current column */ - return TRUE; - } - - if (compare_icons_vertical_first (container, - best_so_far, - candidate) > 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not after the current column */ + if (compare_with_start_column (container, candidate) >= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) + { + /* candidate is left of the best choice, but right of the current column */ + return TRUE; + } + + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean previous_column_lowest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - /* sort out icons that are not before the current column */ - if (compare_with_start_column (container, candidate) <= 0) { - return FALSE; - } - - if (best_so_far != NULL) { - if (compare_icons_horizontal_first (container, - best_so_far, - candidate) < 0) { - /* candidate is right of the best choice, but left of the current column */ - return TRUE; - } - - if (compare_icons_vertical_first (container, - best_so_far, - candidate) < 0) { - return TRUE; - } - } - - return best_so_far == NULL; + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + /* sort out icons that are not before the current column */ + if (compare_with_start_column (container, candidate) <= 0) + { + return FALSE; + } + + if (best_so_far != NULL) + { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) + { + /* candidate is right of the best choice, but left of the current column */ + return TRUE; + } + + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) + { + return TRUE; + } + } + + return best_so_far == NULL; } static gboolean last_column_lowest (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) { - if (best_so_far == NULL) { - return TRUE; - } - return compare_icons_horizontal_first (container, best_so_far, candidate) < 0; + if (best_so_far == NULL) + { + return TRUE; + } + return compare_icons_horizontal_first (container, best_so_far, candidate) < 0; } static gboolean closest_in_90_degrees (NautilusCanvasContainer *container, - NautilusCanvasIcon *start_icon, - NautilusCanvasIcon *best_so_far, - NautilusCanvasIcon *candidate, - void *data) -{ - EelDRect world_rect; - int x, y; - int dx, dy; - int dist; - int *best_dist; - - - world_rect = nautilus_canvas_item_get_icon_rectangle (candidate->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &x, - &y); - - dx = x - container->details->arrow_key_start_x; - dy = y - container->details->arrow_key_start_y; - - switch (container->details->arrow_key_direction) { - case GTK_DIR_UP: - if (dy > 0 || - ABS(dx) > ABS(dy)) { - return FALSE; - } - break; - case GTK_DIR_DOWN: - if (dy < 0 || - ABS(dx) > ABS(dy)) { - return FALSE; - } - break; - case GTK_DIR_LEFT: - if (dx > 0 || - ABS(dy) > ABS(dx)) { - return FALSE; - } - break; - case GTK_DIR_RIGHT: - if (dx < 0 || - ABS(dy) > ABS(dx)) { - return FALSE; - } - break; - default: - g_assert_not_reached(); - } - - dist = dx*dx + dy*dy; - best_dist = data; - - if (best_so_far == NULL) { - *best_dist = dist; - return TRUE; - } - - if (dist < *best_dist) { - *best_dist = dist; - return TRUE; - } - - return FALSE; -} - -static EelDRect + NautilusCanvasIcon *start_icon, + NautilusCanvasIcon *best_so_far, + NautilusCanvasIcon *candidate, + void *data) +{ + EelDRect world_rect; + int x, y; + int dx, dy; + int dist; + int *best_dist; + + + world_rect = nautilus_canvas_item_get_icon_rectangle (candidate->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &x, + &y); + + dx = x - container->details->arrow_key_start_x; + dy = y - container->details->arrow_key_start_y; + + switch (container->details->arrow_key_direction) + { + case GTK_DIR_UP: + { + if (dy > 0 || + ABS (dx) > ABS (dy)) + { + return FALSE; + } + } + break; + + case GTK_DIR_DOWN: + { + if (dy < 0 || + ABS (dx) > ABS (dy)) + { + return FALSE; + } + } + break; + + case GTK_DIR_LEFT: + { + if (dx > 0 || + ABS (dy) > ABS (dx)) + { + return FALSE; + } + } + break; + + case GTK_DIR_RIGHT: + { + if (dx < 0 || + ABS (dy) > ABS (dx)) + { + return FALSE; + } + } + break; + + default: + g_assert_not_reached (); + } + + dist = dx * dx + dy * dy; + best_dist = data; + + if (best_so_far == NULL) + { + *best_dist = dist; + return TRUE; + } + + if (dist < *best_dist) + { + *best_dist = dist; + return TRUE; + } + + return FALSE; +} + +static EelDRect get_rubberband (NautilusCanvasIcon *icon1, - NautilusCanvasIcon *icon2) + NautilusCanvasIcon *icon2) { - EelDRect rect1; - EelDRect rect2; - EelDRect ret; + EelDRect rect1; + EelDRect rect2; + EelDRect ret; - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon1->item), - &rect1.x0, &rect1.y0, - &rect1.x1, &rect1.y1); - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon2->item), - &rect2.x0, &rect2.y0, - &rect2.x1, &rect2.y1); + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon1->item), + &rect1.x0, &rect1.y0, + &rect1.x1, &rect1.y1); + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon2->item), + &rect2.x0, &rect2.y0, + &rect2.x1, &rect2.y1); - eel_drect_union (&ret, &rect1, &rect2); + eel_drect_union (&ret, &rect1, &rect2); - return ret; + return ret; } static void keyboard_move_to (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - NautilusCanvasIcon *from, - GdkEventKey *event) -{ - if (icon == NULL) { - return; - } - - set_focus (container, icon, TRUE); - - if (event != NULL && - (event->state & GDK_CONTROL_MASK) != 0 && - (event->state & GDK_SHIFT_MASK) == 0) { - clear_keyboard_rubberband_start (container); - } else if (event != NULL && - ((event->state & GDK_CONTROL_MASK) != 0 || - !container->details->auto_layout) && - (event->state & GDK_SHIFT_MASK) != 0) { - /* Do rubberband selection */ - EelDRect rect; - - if (from && !container->details->keyboard_rubberband_start) { - set_keyboard_rubberband_start (container, from); - } - - if (icon && container->details->keyboard_rubberband_start) { - rect = get_rubberband (container->details->keyboard_rubberband_start, - icon); - rubberband_select (container, &rect); - } - } else if (event != NULL && - (event->state & GDK_CONTROL_MASK) == 0 && - (event->state & GDK_SHIFT_MASK) != 0) { - /* Select range */ - NautilusCanvasIcon *start_icon; - - start_icon = container->details->range_selection_base_icon; - if (start_icon == NULL || !start_icon->is_selected) { - start_icon = icon; - container->details->range_selection_base_icon = icon; - } - - if (select_range (container, start_icon, icon, TRUE)) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } else { - /* Select icon. */ - clear_keyboard_rubberband_start (container); - - container->details->range_selection_base_icon = icon; - if (select_one_unselect_others (container, icon)) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } - schedule_keyboard_icon_reveal (container, icon); + NautilusCanvasIcon *icon, + NautilusCanvasIcon *from, + GdkEventKey *event) +{ + if (icon == NULL) + { + return; + } + + set_focus (container, icon, TRUE); + + if (event != NULL && + (event->state & GDK_CONTROL_MASK) != 0 && + (event->state & GDK_SHIFT_MASK) == 0) + { + clear_keyboard_rubberband_start (container); + } + else if (event != NULL && + ((event->state & GDK_CONTROL_MASK) != 0 || + !container->details->auto_layout) && + (event->state & GDK_SHIFT_MASK) != 0) + { + /* Do rubberband selection */ + EelDRect rect; + + if (from && !container->details->keyboard_rubberband_start) + { + set_keyboard_rubberband_start (container, from); + } + + if (icon && container->details->keyboard_rubberband_start) + { + rect = get_rubberband (container->details->keyboard_rubberband_start, + icon); + rubberband_select (container, &rect); + } + } + else if (event != NULL && + (event->state & GDK_CONTROL_MASK) == 0 && + (event->state & GDK_SHIFT_MASK) != 0) + { + /* Select range */ + NautilusCanvasIcon *start_icon; + + start_icon = container->details->range_selection_base_icon; + if (start_icon == NULL || !start_icon->is_selected) + { + start_icon = icon; + container->details->range_selection_base_icon = icon; + } + + if (select_range (container, start_icon, icon, TRUE)) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + else + { + /* Select icon. */ + clear_keyboard_rubberband_start (container); + + container->details->range_selection_base_icon = icon; + if (select_one_unselect_others (container, icon)) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + schedule_keyboard_icon_reveal (container, icon); } static void keyboard_home (NautilusCanvasContainer *container, - GdkEventKey *event) + GdkEventKey *event) { - NautilusCanvasIcon *from; - NautilusCanvasIcon *to; - - /* Home selects the first canvas. - * Control-Home sets the keyboard focus to the first canvas. - */ + NautilusCanvasIcon *from; + NautilusCanvasIcon *to; - from = find_best_selected_icon (container, NULL, - rightmost_in_bottom_row, - NULL); - to = find_best_icon (container, NULL, leftmost_in_top_row, NULL); + /* Home selects the first canvas. + * Control-Home sets the keyboard focus to the first canvas. + */ - keyboard_move_to (container, to, from, event); + from = find_best_selected_icon (container, NULL, + rightmost_in_bottom_row, + NULL); + to = find_best_icon (container, NULL, leftmost_in_top_row, NULL); + + keyboard_move_to (container, to, from, event); } static void keyboard_end (NautilusCanvasContainer *container, - GdkEventKey *event) + GdkEventKey *event) { - NautilusCanvasIcon *to; - NautilusCanvasIcon *from; + NautilusCanvasIcon *to; + NautilusCanvasIcon *from; - /* End selects the last canvas. - * Control-End sets the keyboard focus to the last canvas. - */ - from = find_best_selected_icon (container, NULL, - leftmost_in_top_row, - NULL); - to = find_best_icon (container, NULL, - nautilus_canvas_container_is_layout_vertical (container) ? - last_column_lowest : - rightmost_in_bottom_row, - NULL); + /* End selects the last canvas. + * Control-End sets the keyboard focus to the last canvas. + */ + from = find_best_selected_icon (container, NULL, + leftmost_in_top_row, + NULL); + to = find_best_icon (container, NULL, + nautilus_canvas_container_is_layout_vertical (container) ? + last_column_lowest : + rightmost_in_bottom_row, + NULL); - keyboard_move_to (container, to, from, event); + keyboard_move_to (container, to, from, event); } static void record_arrow_key_start (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - GtkDirectionType direction) + NautilusCanvasIcon *icon, + GtkDirectionType direction) { - EelDRect world_rect; + EelDRect world_rect; - world_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); - eel_canvas_w2c - (EEL_CANVAS (container), - get_cmp_point_x (container, world_rect), - get_cmp_point_y (container, world_rect), - &container->details->arrow_key_start_x, - &container->details->arrow_key_start_y); - container->details->arrow_key_direction = direction; + world_rect = nautilus_canvas_item_get_icon_rectangle (icon->item); + eel_canvas_w2c + (EEL_CANVAS (container), + get_cmp_point_x (container, world_rect), + get_cmp_point_y (container, world_rect), + &container->details->arrow_key_start_x, + &container->details->arrow_key_start_y); + container->details->arrow_key_direction = direction; } static void keyboard_arrow_key (NautilusCanvasContainer *container, - GdkEventKey *event, - GtkDirectionType direction, - IsBetterCanvasFunction better_start, - IsBetterCanvasFunction empty_start, - IsBetterCanvasFunction better_destination, - IsBetterCanvasFunction better_destination_fallback, - IsBetterCanvasFunction better_destination_fallback_fallback, - IsBetterCanvasFunction better_destination_manual) -{ - NautilusCanvasIcon *from; - NautilusCanvasIcon *to; - int data; - - /* Chose the icon to start with. - * If we have a keyboard focus, start with it. - * Otherwise, use the single selected icon. - * If there's multiple selection, use the icon farthest toward the end. - */ - - from = container->details->focus; - - if (from == NULL) { - if (has_multiple_selection (container)) { - if (all_selected (container)) { - from = find_best_selected_icon - (container, NULL, - empty_start, NULL); - } else { - from = find_best_selected_icon - (container, NULL, - better_start, NULL); - } - } else { - from = get_first_selected_icon (container); - } - } - - /* If there's no icon, select the icon farthest toward the end. - * If there is an icon, select the next icon based on the arrow direction. - */ - if (from == NULL) { - to = from = find_best_icon - (container, NULL, - empty_start, NULL); - } else { - record_arrow_key_start (container, from, direction); - - to = find_best_icon - (container, from, - container->details->auto_layout ? better_destination : better_destination_manual, - &data); - - /* Wrap around to next/previous row/column */ - if (to == NULL && - better_destination_fallback != NULL) { - to = find_best_icon - (container, from, - better_destination_fallback, - &data); - } - - /* With a layout like - * 1 2 3 - * 4 - * (horizontal layout) - * - * or - * - * 1 4 - * 2 - * 3 - * (vertical layout) - * - * * pressing down for any of 1,2,3 (horizontal layout) - * * pressing right for any of 1,2,3 (vertical layout) - * - * Should select 4. - */ - if (to == NULL && - container->details->auto_layout && - better_destination_fallback_fallback != NULL) { - to = find_best_icon - (container, from, - better_destination_fallback_fallback, - &data); - } - - if (to == NULL) { - to = from; - } - - } - - keyboard_move_to (container, to, from, event); + GdkEventKey *event, + GtkDirectionType direction, + IsBetterCanvasFunction better_start, + IsBetterCanvasFunction empty_start, + IsBetterCanvasFunction better_destination, + IsBetterCanvasFunction better_destination_fallback, + IsBetterCanvasFunction better_destination_fallback_fallback, + IsBetterCanvasFunction better_destination_manual) +{ + NautilusCanvasIcon *from; + NautilusCanvasIcon *to; + int data; + + /* Chose the icon to start with. + * If we have a keyboard focus, start with it. + * Otherwise, use the single selected icon. + * If there's multiple selection, use the icon farthest toward the end. + */ + + from = container->details->focus; + + if (from == NULL) + { + if (has_multiple_selection (container)) + { + if (all_selected (container)) + { + from = find_best_selected_icon + (container, NULL, + empty_start, NULL); + } + else + { + from = find_best_selected_icon + (container, NULL, + better_start, NULL); + } + } + else + { + from = get_first_selected_icon (container); + } + } + + /* If there's no icon, select the icon farthest toward the end. + * If there is an icon, select the next icon based on the arrow direction. + */ + if (from == NULL) + { + to = from = find_best_icon + (container, NULL, + empty_start, NULL); + } + else + { + record_arrow_key_start (container, from, direction); + + to = find_best_icon + (container, from, + container->details->auto_layout ? better_destination : better_destination_manual, + &data); + + /* Wrap around to next/previous row/column */ + if (to == NULL && + better_destination_fallback != NULL) + { + to = find_best_icon + (container, from, + better_destination_fallback, + &data); + } + + /* With a layout like + * 1 2 3 + * 4 + * (horizontal layout) + * + * or + * + * 1 4 + * 2 + * 3 + * (vertical layout) + * + * * pressing down for any of 1,2,3 (horizontal layout) + * * pressing right for any of 1,2,3 (vertical layout) + * + * Should select 4. + */ + if (to == NULL && + container->details->auto_layout && + better_destination_fallback_fallback != NULL) + { + to = find_best_icon + (container, from, + better_destination_fallback_fallback, + &data); + } + + if (to == NULL) + { + to = from; + } + } + + keyboard_move_to (container, to, from, event); } static gboolean is_rectangle_selection_event (GdkEventKey *event) { - return (event->state & GDK_CONTROL_MASK) != 0 && - (event->state & GDK_SHIFT_MASK) != 0; + return (event->state & GDK_CONTROL_MASK) != 0 && + (event->state & GDK_SHIFT_MASK) != 0; } static void keyboard_right (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - IsBetterCanvasFunction fallback; - IsBetterCanvasFunction next_column_fallback; - - fallback = NULL; - if (container->details->auto_layout && - !nautilus_canvas_container_is_layout_vertical (container) && - !is_rectangle_selection_event (event)) { - fallback = next_row_leftmost; - } - - next_column_fallback = NULL; - if (nautilus_canvas_container_is_layout_vertical (container) && - gtk_widget_get_direction (GTK_WIDGET (container)) != GTK_TEXT_DIR_RTL) { - next_column_fallback = next_column_bottommost; - } - - /* Right selects the next icon in the same row. - * Control-Right sets the keyboard focus to the next icon in the same row. - */ - keyboard_arrow_key (container, - event, - GTK_DIR_RIGHT, - rightmost_in_bottom_row, - nautilus_canvas_container_is_layout_rtl (container) ? - rightmost_in_top_row : leftmost_in_top_row, - same_row_right_side_leftmost, - fallback, - next_column_fallback, - closest_in_90_degrees); + GdkEventKey *event) +{ + IsBetterCanvasFunction fallback; + IsBetterCanvasFunction next_column_fallback; + + fallback = NULL; + if (container->details->auto_layout && + !nautilus_canvas_container_is_layout_vertical (container) && + !is_rectangle_selection_event (event)) + { + fallback = next_row_leftmost; + } + + next_column_fallback = NULL; + if (nautilus_canvas_container_is_layout_vertical (container) && + gtk_widget_get_direction (GTK_WIDGET (container)) != GTK_TEXT_DIR_RTL) + { + next_column_fallback = next_column_bottommost; + } + + /* Right selects the next icon in the same row. + * Control-Right sets the keyboard focus to the next icon in the same row. + */ + keyboard_arrow_key (container, + event, + GTK_DIR_RIGHT, + rightmost_in_bottom_row, + nautilus_canvas_container_is_layout_rtl (container) ? + rightmost_in_top_row : leftmost_in_top_row, + same_row_right_side_leftmost, + fallback, + next_column_fallback, + closest_in_90_degrees); } static void keyboard_left (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - IsBetterCanvasFunction fallback; - IsBetterCanvasFunction previous_column_fallback; - - fallback = NULL; - if (container->details->auto_layout && - !nautilus_canvas_container_is_layout_vertical (container) && - !is_rectangle_selection_event (event)) { - fallback = previous_row_rightmost; - } - - previous_column_fallback = NULL; - if (nautilus_canvas_container_is_layout_vertical (container) && - gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) { - previous_column_fallback = previous_column_lowest; - } - - /* Left selects the next icon in the same row. - * Control-Left sets the keyboard focus to the next icon in the same row. - */ - keyboard_arrow_key (container, - event, - GTK_DIR_LEFT, - rightmost_in_bottom_row, - nautilus_canvas_container_is_layout_rtl (container) ? - rightmost_in_top_row : leftmost_in_top_row, - same_row_left_side_rightmost, - fallback, - previous_column_fallback, - closest_in_90_degrees); + GdkEventKey *event) +{ + IsBetterCanvasFunction fallback; + IsBetterCanvasFunction previous_column_fallback; + + fallback = NULL; + if (container->details->auto_layout && + !nautilus_canvas_container_is_layout_vertical (container) && + !is_rectangle_selection_event (event)) + { + fallback = previous_row_rightmost; + } + + previous_column_fallback = NULL; + if (nautilus_canvas_container_is_layout_vertical (container) && + gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) + { + previous_column_fallback = previous_column_lowest; + } + + /* Left selects the next icon in the same row. + * Control-Left sets the keyboard focus to the next icon in the same row. + */ + keyboard_arrow_key (container, + event, + GTK_DIR_LEFT, + rightmost_in_bottom_row, + nautilus_canvas_container_is_layout_rtl (container) ? + rightmost_in_top_row : leftmost_in_top_row, + same_row_left_side_rightmost, + fallback, + previous_column_fallback, + closest_in_90_degrees); } static void keyboard_down (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - IsBetterCanvasFunction fallback; - IsBetterCanvasFunction next_row_fallback; - - fallback = NULL; - if (container->details->auto_layout && - nautilus_canvas_container_is_layout_vertical (container) && - !is_rectangle_selection_event (event)) { - if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) { - fallback = previous_column_highest; - } else { - fallback = next_column_highest; - } - } - - next_row_fallback = NULL; - if (!nautilus_canvas_container_is_layout_vertical (container)) { - if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) { - next_row_fallback = next_row_leftmost; - } else { - next_row_fallback = next_row_rightmost; - } - } - - /* Down selects the next icon in the same column. - * Control-Down sets the keyboard focus to the next icon in the same column. - */ - keyboard_arrow_key (container, - event, - GTK_DIR_DOWN, - rightmost_in_bottom_row, - nautilus_canvas_container_is_layout_rtl (container) ? - rightmost_in_top_row : leftmost_in_top_row, - same_column_below_highest, - fallback, - next_row_fallback, - closest_in_90_degrees); + GdkEventKey *event) +{ + IsBetterCanvasFunction fallback; + IsBetterCanvasFunction next_row_fallback; + + fallback = NULL; + if (container->details->auto_layout && + nautilus_canvas_container_is_layout_vertical (container) && + !is_rectangle_selection_event (event)) + { + if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) + { + fallback = previous_column_highest; + } + else + { + fallback = next_column_highest; + } + } + + next_row_fallback = NULL; + if (!nautilus_canvas_container_is_layout_vertical (container)) + { + if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) + { + next_row_fallback = next_row_leftmost; + } + else + { + next_row_fallback = next_row_rightmost; + } + } + + /* Down selects the next icon in the same column. + * Control-Down sets the keyboard focus to the next icon in the same column. + */ + keyboard_arrow_key (container, + event, + GTK_DIR_DOWN, + rightmost_in_bottom_row, + nautilus_canvas_container_is_layout_rtl (container) ? + rightmost_in_top_row : leftmost_in_top_row, + same_column_below_highest, + fallback, + next_row_fallback, + closest_in_90_degrees); } static void keyboard_up (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - IsBetterCanvasFunction fallback; - - fallback = NULL; - if (container->details->auto_layout && - nautilus_canvas_container_is_layout_vertical (container) && - !is_rectangle_selection_event (event)) { - if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) { - fallback = next_column_bottommost; - } else { - fallback = previous_column_lowest; - } - } - - /* Up selects the next icon in the same column. - * Control-Up sets the keyboard focus to the next icon in the same column. - */ - keyboard_arrow_key (container, - event, - GTK_DIR_UP, - rightmost_in_bottom_row, - nautilus_canvas_container_is_layout_rtl (container) ? - rightmost_in_top_row : leftmost_in_top_row, - same_column_above_lowest, - fallback, - NULL, - closest_in_90_degrees); + GdkEventKey *event) +{ + IsBetterCanvasFunction fallback; + + fallback = NULL; + if (container->details->auto_layout && + nautilus_canvas_container_is_layout_vertical (container) && + !is_rectangle_selection_event (event)) + { + if (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL) + { + fallback = next_column_bottommost; + } + else + { + fallback = previous_column_lowest; + } + } + + /* Up selects the next icon in the same column. + * Control-Up sets the keyboard focus to the next icon in the same column. + */ + keyboard_arrow_key (container, + event, + GTK_DIR_UP, + rightmost_in_bottom_row, + nautilus_canvas_container_is_layout_rtl (container) ? + rightmost_in_top_row : leftmost_in_top_row, + same_column_above_lowest, + fallback, + NULL, + closest_in_90_degrees); } static void keyboard_space (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - NautilusCanvasIcon *icon; - - if (!has_selection (container) && - container->details->focus != NULL) { - keyboard_move_to (container, - container->details->focus, - NULL, NULL); - } else if ((event->state & GDK_CONTROL_MASK) != 0 && - (event->state & GDK_SHIFT_MASK) == 0) { - /* Control-space toggles the selection state of the current icon. */ - if (container->details->focus != NULL) { - icon_toggle_selected (container, container->details->focus); - g_signal_emit (container, signals[SELECTION_CHANGED], 0); - if (container->details->focus->is_selected) { - container->details->range_selection_base_icon = container->details->focus; - } - } else { - icon = find_best_selected_icon (container, - NULL, - leftmost_in_top_row, - NULL); - if (icon == NULL) { - icon = find_best_icon (container, - NULL, - leftmost_in_top_row, - NULL); - } - if (icon != NULL) { - set_focus (container, icon, TRUE); - } - } - } else if ((event->state & GDK_SHIFT_MASK) != 0) { - activate_selected_items_alternate (container, NULL); - } else { - preview_selected_items (container); - } + GdkEventKey *event) +{ + NautilusCanvasIcon *icon; + + if (!has_selection (container) && + container->details->focus != NULL) + { + keyboard_move_to (container, + container->details->focus, + NULL, NULL); + } + else if ((event->state & GDK_CONTROL_MASK) != 0 && + (event->state & GDK_SHIFT_MASK) == 0) + { + /* Control-space toggles the selection state of the current icon. */ + if (container->details->focus != NULL) + { + icon_toggle_selected (container, container->details->focus); + g_signal_emit (container, signals[SELECTION_CHANGED], 0); + if (container->details->focus->is_selected) + { + container->details->range_selection_base_icon = container->details->focus; + } + } + else + { + icon = find_best_selected_icon (container, + NULL, + leftmost_in_top_row, + NULL); + if (icon == NULL) + { + icon = find_best_icon (container, + NULL, + leftmost_in_top_row, + NULL); + } + if (icon != NULL) + { + set_focus (container, icon, TRUE); + } + } + } + else if ((event->state & GDK_SHIFT_MASK) != 0) + { + activate_selected_items_alternate (container, NULL); + } + else + { + preview_selected_items (container); + } } static void destroy (GtkWidget *object) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (object); + container = NAUTILUS_CANVAS_CONTAINER (object); - nautilus_canvas_container_clear (container); + nautilus_canvas_container_clear (container); - if (container->details->rubberband_info.timer_id != 0) { - g_source_remove (container->details->rubberband_info.timer_id); - container->details->rubberband_info.timer_id = 0; - } + if (container->details->rubberband_info.timer_id != 0) + { + g_source_remove (container->details->rubberband_info.timer_id); + container->details->rubberband_info.timer_id = 0; + } - if (container->details->idle_id != 0) { - g_source_remove (container->details->idle_id); - container->details->idle_id = 0; - } + if (container->details->idle_id != 0) + { + g_source_remove (container->details->idle_id); + container->details->idle_id = 0; + } - if (container->details->stretch_idle_id != 0) { - g_source_remove (container->details->stretch_idle_id); - container->details->stretch_idle_id = 0; - } + if (container->details->stretch_idle_id != 0) + { + g_source_remove (container->details->stretch_idle_id); + container->details->stretch_idle_id = 0; + } - if (container->details->align_idle_id != 0) { - g_source_remove (container->details->align_idle_id); - container->details->align_idle_id = 0; - } + if (container->details->align_idle_id != 0) + { + g_source_remove (container->details->align_idle_id); + container->details->align_idle_id = 0; + } - if (container->details->selection_changed_id != 0) { - g_source_remove (container->details->selection_changed_id); - container->details->selection_changed_id = 0; - } + if (container->details->selection_changed_id != 0) + { + g_source_remove (container->details->selection_changed_id); + container->details->selection_changed_id = 0; + } - if (container->details->size_allocation_count_id != 0) { - g_source_remove (container->details->size_allocation_count_id); - container->details->size_allocation_count_id = 0; - } + if (container->details->size_allocation_count_id != 0) + { + g_source_remove (container->details->size_allocation_count_id); + container->details->size_allocation_count_id = 0; + } - GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->destroy (object); + GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->destroy (object); } static void finalize (GObject *object) { - NautilusCanvasContainerDetails *details; + NautilusCanvasContainerDetails *details; - details = NAUTILUS_CANVAS_CONTAINER (object)->details; + details = NAUTILUS_CANVAS_CONTAINER (object)->details; - g_signal_handlers_disconnect_by_func (nautilus_icon_view_preferences, - text_ellipsis_limit_changed_container_callback, - object); - g_signal_handlers_disconnect_by_func (nautilus_desktop_preferences, - text_ellipsis_limit_changed_container_callback, - object); + g_signal_handlers_disconnect_by_func (nautilus_icon_view_preferences, + text_ellipsis_limit_changed_container_callback, + object); + g_signal_handlers_disconnect_by_func (nautilus_desktop_preferences, + text_ellipsis_limit_changed_container_callback, + object); - g_hash_table_destroy (details->icon_set); - details->icon_set = NULL; + g_hash_table_destroy (details->icon_set); + details->icon_set = NULL; - g_free (details->font); + g_free (details->font); - if (details->a11y_item_action_queue != NULL) { - while (!g_queue_is_empty (details->a11y_item_action_queue)) { - g_free (g_queue_pop_head (details->a11y_item_action_queue)); - } - g_queue_free (details->a11y_item_action_queue); - } - if (details->a11y_item_action_idle_handler != 0) { - g_source_remove (details->a11y_item_action_idle_handler); - } + if (details->a11y_item_action_queue != NULL) + { + while (!g_queue_is_empty (details->a11y_item_action_queue)) + { + g_free (g_queue_pop_head (details->a11y_item_action_queue)); + } + g_queue_free (details->a11y_item_action_queue); + } + if (details->a11y_item_action_idle_handler != 0) + { + g_source_remove (details->a11y_item_action_idle_handler); + } - g_free (details); + g_free (details); - G_OBJECT_CLASS (nautilus_canvas_container_parent_class)->finalize (object); + G_OBJECT_CLASS (nautilus_canvas_container_parent_class)->finalize (object); } /* GtkWidget methods. */ @@ -3778,951 +4208,1113 @@ finalize (GObject *object) static gboolean clear_size_allocation_count (gpointer data) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (data); + container = NAUTILUS_CANVAS_CONTAINER (data); - container->details->size_allocation_count_id = 0; - container->details->size_allocation_count = 0; + container->details->size_allocation_count_id = 0; + container->details->size_allocation_count = 0; - return FALSE; + return FALSE; } static void -size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - NautilusCanvasContainer *container; - gboolean need_layout_redone; - GtkAllocation wid_allocation; - - container = NAUTILUS_CANVAS_CONTAINER (widget); - - need_layout_redone = !container->details->has_been_allocated; - gtk_widget_get_allocation (widget, &wid_allocation); - - if (allocation->width != wid_allocation.width) { - need_layout_redone = TRUE; - } - - if (allocation->height != wid_allocation.height) { - need_layout_redone = TRUE; - } - - /* Under some conditions we can end up in a loop when size allocating. - * This happens when the icons don't fit without a scrollbar, but fits - * when a scrollbar is added (bug #129963 for details). - * We keep track of this looping by increasing a counter in size_allocate - * and clearing it in a high-prio idle (the only way to detect the loop is - * done). - * When we've done at more than two iterations (with/without scrollbar) - * we terminate this looping by not redoing the layout when the width - * is wider than the current one (i.e when removing the scrollbar). - */ - if (container->details->size_allocation_count_id == 0) { - container->details->size_allocation_count_id = - g_idle_add_full (G_PRIORITY_HIGH, - clear_size_allocation_count, - container, NULL); - } - container->details->size_allocation_count++; - if (container->details->size_allocation_count > 2 && - allocation->width >= wid_allocation.width) { - need_layout_redone = FALSE; - } - - GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->size_allocate (widget, allocation); - - container->details->has_been_allocated = TRUE; - - if (need_layout_redone) { - redo_layout (container); - } +size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + NautilusCanvasContainer *container; + gboolean need_layout_redone; + GtkAllocation wid_allocation; + + container = NAUTILUS_CANVAS_CONTAINER (widget); + + need_layout_redone = !container->details->has_been_allocated; + gtk_widget_get_allocation (widget, &wid_allocation); + + if (allocation->width != wid_allocation.width) + { + need_layout_redone = TRUE; + } + + if (allocation->height != wid_allocation.height) + { + need_layout_redone = TRUE; + } + + /* Under some conditions we can end up in a loop when size allocating. + * This happens when the icons don't fit without a scrollbar, but fits + * when a scrollbar is added (bug #129963 for details). + * We keep track of this looping by increasing a counter in size_allocate + * and clearing it in a high-prio idle (the only way to detect the loop is + * done). + * When we've done at more than two iterations (with/without scrollbar) + * we terminate this looping by not redoing the layout when the width + * is wider than the current one (i.e when removing the scrollbar). + */ + if (container->details->size_allocation_count_id == 0) + { + container->details->size_allocation_count_id = + g_idle_add_full (G_PRIORITY_HIGH, + clear_size_allocation_count, + container, NULL); + } + container->details->size_allocation_count++; + if (container->details->size_allocation_count > 2 && + allocation->width >= wid_allocation.width) + { + need_layout_redone = FALSE; + } + + GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->size_allocate (widget, allocation); + + container->details->has_been_allocated = TRUE; + + if (need_layout_redone) + { + redo_layout (container); + } } static GtkSizeRequestMode get_request_mode (GtkWidget *widget) { - /* Don't trade size at all, since we get whatever we get anyway. */ - return GTK_SIZE_REQUEST_CONSTANT_SIZE; + /* Don't trade size at all, since we get whatever we get anyway. */ + return GTK_SIZE_REQUEST_CONSTANT_SIZE; } /* We need to implement these since the GtkScrolledWindow uses them - to guess whether to show scrollbars or not, and if we don't report - anything it'll tend to get it wrong causing double calls - to size_allocate (at different sizes) during its size allocation. */ + * to guess whether to show scrollbars or not, and if we don't report + * anything it'll tend to get it wrong causing double calls + * to size_allocate (at different sizes) during its size allocation. */ static void get_prefered_width (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - EelCanvasGroup *root; - double x1, x2; - int cx1, cx2; - int width; - - root = eel_canvas_root (EEL_CANVAS (widget)); - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (root), - &x1, NULL, &x2, NULL); - eel_canvas_w2c (EEL_CANVAS (widget), x1, 0, &cx1, NULL); - eel_canvas_w2c (EEL_CANVAS (widget), x2, 0, &cx2, NULL); - - width = cx2 - cx1; - if (natural_size) { - *natural_size = width; - } - if (minimum_size) { - *minimum_size = width; - } + gint *minimum_size, + gint *natural_size) +{ + EelCanvasGroup *root; + double x1, x2; + int cx1, cx2; + int width; + + root = eel_canvas_root (EEL_CANVAS (widget)); + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (root), + &x1, NULL, &x2, NULL); + eel_canvas_w2c (EEL_CANVAS (widget), x1, 0, &cx1, NULL); + eel_canvas_w2c (EEL_CANVAS (widget), x2, 0, &cx2, NULL); + + width = cx2 - cx1; + if (natural_size) + { + *natural_size = width; + } + if (minimum_size) + { + *minimum_size = width; + } } static void get_prefered_height (GtkWidget *widget, - gint *minimum_size, - gint *natural_size) -{ - EelCanvasGroup *root; - double y1, y2; - int cy1, cy2; - int height; - - root = eel_canvas_root (EEL_CANVAS (widget)); - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (root), - NULL, &y1, NULL, &y2); - eel_canvas_w2c (EEL_CANVAS (widget), 0, y1, NULL, &cy1); - eel_canvas_w2c (EEL_CANVAS (widget), 0, y2, NULL, &cy2); - - height = cy2 - cy1; - if (natural_size) { - *natural_size = height; - } - if (minimum_size) { - *minimum_size = height; - } + gint *minimum_size, + gint *natural_size) +{ + EelCanvasGroup *root; + double y1, y2; + int cy1, cy2; + int height; + + root = eel_canvas_root (EEL_CANVAS (widget)); + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (root), + NULL, &y1, NULL, &y2); + eel_canvas_w2c (EEL_CANVAS (widget), 0, y1, NULL, &cy1); + eel_canvas_w2c (EEL_CANVAS (widget), 0, y2, NULL, &cy2); + + height = cy2 - cy1; + if (natural_size) + { + *natural_size = height; + } + if (minimum_size) + { + *minimum_size = height; + } } static void realize (GtkWidget *widget) { - GtkAdjustment *vadj, *hadj; - NautilusCanvasContainer *container; + GtkAdjustment *vadj, *hadj; + NautilusCanvasContainer *container; - GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->realize (widget); + GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->realize (widget); - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - /* Set up DnD. */ - nautilus_canvas_dnd_init (container); + /* Set up DnD. */ + nautilus_canvas_dnd_init (container); - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (widget)); - g_signal_connect (hadj, "value-changed", - G_CALLBACK (handle_hadjustment_changed), widget); - - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (widget)); - g_signal_connect (vadj, "value-changed", - G_CALLBACK (handle_vadjustment_changed), widget); + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (widget)); + g_signal_connect (hadj, "value-changed", + G_CALLBACK (handle_hadjustment_changed), widget); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (widget)); + g_signal_connect (vadj, "value-changed", + G_CALLBACK (handle_vadjustment_changed), widget); } static void unrealize (GtkWidget *widget) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - nautilus_canvas_dnd_fini (container); + nautilus_canvas_dnd_fini (container); - GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->unrealize (widget); + GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->unrealize (widget); } static void nautilus_canvas_container_request_update_all_internal (NautilusCanvasContainer *container, - gboolean invalidate_labels) + gboolean invalidate_labels) { - GList *node; - NautilusCanvasIcon *icon; + GList *node; + NautilusCanvasIcon *icon; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - for (node = container->details->icons; node != NULL; node = node->next) { - icon = node->data; + for (node = container->details->icons; node != NULL; node = node->next) + { + icon = node->data; - if (invalidate_labels) { - nautilus_canvas_item_invalidate_label (icon->item); - } + if (invalidate_labels) + { + nautilus_canvas_item_invalidate_label (icon->item); + } - nautilus_canvas_container_update_icon (container, icon); - } + nautilus_canvas_container_update_icon (container, icon); + } - container->details->needs_resort = TRUE; - redo_layout (container); + container->details->needs_resort = TRUE; + redo_layout (container); } static void style_updated (GtkWidget *widget) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - /* Don't chain up to parent, if this is a desktop container, - * because that resets the background of the window. - */ - if (!nautilus_canvas_container_get_is_desktop (container)) { - GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->style_updated (widget); - } + /* Don't chain up to parent, if this is a desktop container, + * because that resets the background of the window. + */ + if (!nautilus_canvas_container_get_is_desktop (container)) + { + GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->style_updated (widget); + } - if (gtk_widget_get_realized (widget)) { - nautilus_canvas_container_request_update_all_internal (container, TRUE); - } + if (gtk_widget_get_realized (widget)) + { + nautilus_canvas_container_request_update_all_internal (container, TRUE); + } } static gboolean -button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - NautilusCanvasContainer *container; - gboolean selection_changed; - gboolean return_value; - gboolean clicked_on_icon; - - container = NAUTILUS_CANVAS_CONTAINER (widget); - container->details->button_down_time = event->time; - - /* Forget about the old keyboard selection now that we've started mousing. */ - clear_keyboard_rubberband_start (container); - - if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { - /* We use our own double-click detection. */ - return TRUE; - } - - /* Invoke the canvas event handler and see if an item picks up the event. */ - clicked_on_icon = GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->button_press_event (widget, event); - - if (!gtk_widget_has_focus (widget)) { - gtk_widget_grab_focus (widget); - } - - if (clicked_on_icon) { - return TRUE; - } - - clear_focus (container); - - if (event->button == DRAG_BUTTON && - event->type == GDK_BUTTON_PRESS) { - /* Clear the last click icon for double click */ - container->details->double_click_icon[1] = container->details->double_click_icon[0]; - container->details->double_click_icon[0] = NULL; - } - - /* Button 1 does rubber banding. */ - if (event->button == RUBBERBAND_BUTTON) { - if (! button_event_modifies_selection (event)) { - selection_changed = unselect_all (container); - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } - - start_rubberbanding (container, event); - return TRUE; - } - - /* Prevent multi-button weirdness such as bug 6181 */ - if (container->details->rubberband_info.active) { - return TRUE; - } - - /* Button 2 may be passed to the window manager. */ - if (event->button == MIDDLE_BUTTON) { - selection_changed = unselect_all (container); - if (selection_changed) { - g_signal_emit (container, signals[SELECTION_CHANGED], 0); - } - g_signal_emit (widget, signals[MIDDLE_CLICK], 0, event); - return TRUE; - } - - /* Button 3 does a contextual menu. */ - if (event->button == CONTEXTUAL_MENU_BUTTON) { - selection_changed = unselect_all (container); - if (selection_changed) { - g_signal_emit (container, signals[SELECTION_CHANGED], 0); - } - g_signal_emit (widget, signals[CONTEXT_CLICK_BACKGROUND], 0, event); - return TRUE; - } - - /* Otherwise, we emit a button_press message. */ - g_signal_emit (widget, - signals[BUTTON_PRESS], 0, event, - &return_value); - return return_value; +button_press_event (GtkWidget *widget, + GdkEventButton *event) +{ + NautilusCanvasContainer *container; + gboolean selection_changed; + gboolean return_value; + gboolean clicked_on_icon; + + container = NAUTILUS_CANVAS_CONTAINER (widget); + container->details->button_down_time = event->time; + + /* Forget about the old keyboard selection now that we've started mousing. */ + clear_keyboard_rubberband_start (container); + + if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) + { + /* We use our own double-click detection. */ + return TRUE; + } + + /* Invoke the canvas event handler and see if an item picks up the event. */ + clicked_on_icon = GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->button_press_event (widget, event); + + if (!gtk_widget_has_focus (widget)) + { + gtk_widget_grab_focus (widget); + } + + if (clicked_on_icon) + { + return TRUE; + } + + clear_focus (container); + + if (event->button == DRAG_BUTTON && + event->type == GDK_BUTTON_PRESS) + { + /* Clear the last click icon for double click */ + container->details->double_click_icon[1] = container->details->double_click_icon[0]; + container->details->double_click_icon[0] = NULL; + } + + /* Button 1 does rubber banding. */ + if (event->button == RUBBERBAND_BUTTON) + { + if (!button_event_modifies_selection (event)) + { + selection_changed = unselect_all (container); + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + + start_rubberbanding (container, event); + return TRUE; + } + + /* Prevent multi-button weirdness such as bug 6181 */ + if (container->details->rubberband_info.active) + { + return TRUE; + } + + /* Button 2 may be passed to the window manager. */ + if (event->button == MIDDLE_BUTTON) + { + selection_changed = unselect_all (container); + if (selection_changed) + { + g_signal_emit (container, signals[SELECTION_CHANGED], 0); + } + g_signal_emit (widget, signals[MIDDLE_CLICK], 0, event); + return TRUE; + } + + /* Button 3 does a contextual menu. */ + if (event->button == CONTEXTUAL_MENU_BUTTON) + { + selection_changed = unselect_all (container); + if (selection_changed) + { + g_signal_emit (container, signals[SELECTION_CHANGED], 0); + } + g_signal_emit (widget, signals[CONTEXT_CLICK_BACKGROUND], 0, event); + return TRUE; + } + + /* Otherwise, we emit a button_press message. */ + g_signal_emit (widget, + signals[BUTTON_PRESS], 0, event, + &return_value); + return return_value; } static void nautilus_canvas_container_did_not_drag (NautilusCanvasContainer *container, - GdkEventButton *event) -{ - NautilusCanvasContainerDetails *details; - gboolean selection_changed; - static gint64 last_click_time = 0; - static gint click_count = 0; - gint double_click_time; - gint64 current_time; - - details = container->details; - - if (details->icon_selected_on_button_down && - ((event->state & GDK_CONTROL_MASK) != 0 || - (event->state & GDK_SHIFT_MASK) == 0)) { - if (button_event_modifies_selection (event)) { - details->range_selection_base_icon = NULL; - icon_toggle_selected (container, details->drag_icon); - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } else { - details->range_selection_base_icon = details->drag_icon; - selection_changed = select_one_unselect_others - (container, details->drag_icon); - - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } - } - - if (details->drag_icon != NULL && - (details->single_click_mode || - event->button == MIDDLE_BUTTON)) { - /* Determine click count */ - g_object_get (G_OBJECT (gtk_widget_get_settings (GTK_WIDGET (container))), - "gtk-double-click-time", &double_click_time, - NULL); - current_time = g_get_monotonic_time (); - if (current_time - last_click_time < double_click_time * 1000) { - click_count++; - } else { - click_count = 0; - } - - /* Stash time for next compare */ - last_click_time = current_time; - - /* If single-click mode, activate the selected icons, unless modifying - * the selection or pressing for a very long time, or double clicking. - */ - - - if (click_count == 0 && - event->time - details->button_down_time < MAX_CLICK_TIME && - ! button_event_modifies_selection (event)) { - - /* It's a tricky UI issue whether this should activate - * just the clicked item (as if it were a link), or all - * the selected items (as if you were issuing an "activate - * selection" command). For now, we're trying the activate - * entire selection version to see how it feels. Note that - * NautilusList goes the other way because its "links" seem - * much more link-like. - */ - if (event->button == MIDDLE_BUTTON) { - activate_selected_items_alternate (container, NULL); - } else { - activate_selected_items (container); - } - } - } + GdkEventButton *event) +{ + NautilusCanvasContainerDetails *details; + gboolean selection_changed; + static gint64 last_click_time = 0; + static gint click_count = 0; + gint double_click_time; + gint64 current_time; + + details = container->details; + + if (details->icon_selected_on_button_down && + ((event->state & GDK_CONTROL_MASK) != 0 || + (event->state & GDK_SHIFT_MASK) == 0)) + { + if (button_event_modifies_selection (event)) + { + details->range_selection_base_icon = NULL; + icon_toggle_selected (container, details->drag_icon); + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + else + { + details->range_selection_base_icon = details->drag_icon; + selection_changed = select_one_unselect_others + (container, details->drag_icon); + + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + } + + if (details->drag_icon != NULL && + (details->single_click_mode || + event->button == MIDDLE_BUTTON)) + { + /* Determine click count */ + g_object_get (G_OBJECT (gtk_widget_get_settings (GTK_WIDGET (container))), + "gtk-double-click-time", &double_click_time, + NULL); + current_time = g_get_monotonic_time (); + if (current_time - last_click_time < double_click_time * 1000) + { + click_count++; + } + else + { + click_count = 0; + } + + /* Stash time for next compare */ + last_click_time = current_time; + + /* If single-click mode, activate the selected icons, unless modifying + * the selection or pressing for a very long time, or double clicking. + */ + + + if (click_count == 0 && + event->time - details->button_down_time < MAX_CLICK_TIME && + !button_event_modifies_selection (event)) + { + /* It's a tricky UI issue whether this should activate + * just the clicked item (as if it were a link), or all + * the selected items (as if you were issuing an "activate + * selection" command). For now, we're trying the activate + * entire selection version to see how it feels. Note that + * NautilusList goes the other way because its "links" seem + * much more link-like. + */ + if (event->button == MIDDLE_BUTTON) + { + activate_selected_items_alternate (container, NULL); + } + else + { + activate_selected_items (container); + } + } + } } static gboolean clicked_within_double_click_interval (NautilusCanvasContainer *container) { - static gint64 last_click_time = 0; - static gint click_count = 0; - gint double_click_time; - gint64 current_time; - - /* Determine click count */ - g_object_get (G_OBJECT (gtk_widget_get_settings (GTK_WIDGET (container))), - "gtk-double-click-time", &double_click_time, - NULL); - current_time = g_get_monotonic_time (); - if (current_time - last_click_time < double_click_time * 1000) { - click_count++; - } else { - click_count = 0; - } - - /* Stash time for next compare */ - last_click_time = current_time; - - /* Only allow double click */ - if (click_count == 1) { - click_count = 0; - return TRUE; - } else { - return FALSE; - } + static gint64 last_click_time = 0; + static gint click_count = 0; + gint double_click_time; + gint64 current_time; + + /* Determine click count */ + g_object_get (G_OBJECT (gtk_widget_get_settings (GTK_WIDGET (container))), + "gtk-double-click-time", &double_click_time, + NULL); + current_time = g_get_monotonic_time (); + if (current_time - last_click_time < double_click_time * 1000) + { + click_count++; + } + else + { + click_count = 0; + } + + /* Stash time for next compare */ + last_click_time = current_time; + + /* Only allow double click */ + if (click_count == 1) + { + click_count = 0; + return TRUE; + } + else + { + return FALSE; + } } static void clear_drag_state (NautilusCanvasContainer *container) { - container->details->drag_icon = NULL; - container->details->drag_state = DRAG_STATE_INITIAL; + container->details->drag_icon = NULL; + container->details->drag_state = DRAG_STATE_INITIAL; } static gboolean start_stretching (NautilusCanvasContainer *container, - GdkEvent *event) -{ - NautilusCanvasContainerDetails *details; - NautilusCanvasIcon *icon; - GtkWidget *toplevel; - GdkDisplay *display; - GtkCornerType corner; - GdkCursor *cursor; - - details = container->details; - icon = details->stretch_icon; - display = gtk_widget_get_display (GTK_WIDGET (container)); - - /* Check if we hit the stretch handles. */ - if (!nautilus_canvas_item_hit_test_stretch_handles (icon->item, - details->drag_x, details->drag_y, - &corner)) { - return FALSE; - } - - switch (corner) { - case GTK_CORNER_TOP_LEFT: - cursor = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_CORNER); - break; - case GTK_CORNER_BOTTOM_LEFT: - cursor = gdk_cursor_new_for_display (display,GDK_BOTTOM_LEFT_CORNER); - break; - case GTK_CORNER_TOP_RIGHT: - cursor = gdk_cursor_new_for_display (display,GDK_TOP_RIGHT_CORNER); - break; - case GTK_CORNER_BOTTOM_RIGHT: - cursor = gdk_cursor_new_for_display (display,GDK_BOTTOM_RIGHT_CORNER); - break; - default: - cursor = NULL; - break; - } - /* Set up the dragging. */ - details->drag_state = DRAG_STATE_STRETCH; - eel_canvas_w2c (EEL_CANVAS (container), - details->drag_x, - details->drag_y, - &details->stretch_start.pointer_x, - &details->stretch_start.pointer_y); - eel_canvas_w2c (EEL_CANVAS (container), - icon->x, icon->y, - &details->stretch_start.icon_x, - &details->stretch_start.icon_y); - icon_get_size (container, icon, - &details->stretch_start.icon_size); - - eel_canvas_item_grab (EEL_CANVAS_ITEM (icon->item), - (GDK_POINTER_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK), - cursor, - event); - if (cursor) - g_object_unref (cursor); - - /* Ensure the window itself is focused.. */ - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (container)); - if (toplevel != NULL && gtk_widget_get_realized (toplevel)) { - gdk_window_focus (gtk_widget_get_window (toplevel), GDK_CURRENT_TIME); - } - - return TRUE; + GdkEvent *event) +{ + NautilusCanvasContainerDetails *details; + NautilusCanvasIcon *icon; + GtkWidget *toplevel; + GdkDisplay *display; + GtkCornerType corner; + GdkCursor *cursor; + + details = container->details; + icon = details->stretch_icon; + display = gtk_widget_get_display (GTK_WIDGET (container)); + + /* Check if we hit the stretch handles. */ + if (!nautilus_canvas_item_hit_test_stretch_handles (icon->item, + details->drag_x, details->drag_y, + &corner)) + { + return FALSE; + } + + switch (corner) + { + case GTK_CORNER_TOP_LEFT: + { + cursor = gdk_cursor_new_for_display (display, GDK_TOP_LEFT_CORNER); + } + break; + + case GTK_CORNER_BOTTOM_LEFT: + { + cursor = gdk_cursor_new_for_display (display, GDK_BOTTOM_LEFT_CORNER); + } + break; + + case GTK_CORNER_TOP_RIGHT: + { + cursor = gdk_cursor_new_for_display (display, GDK_TOP_RIGHT_CORNER); + } + break; + + case GTK_CORNER_BOTTOM_RIGHT: + { + cursor = gdk_cursor_new_for_display (display, GDK_BOTTOM_RIGHT_CORNER); + } + break; + + default: + { + cursor = NULL; + } + break; + } + /* Set up the dragging. */ + details->drag_state = DRAG_STATE_STRETCH; + eel_canvas_w2c (EEL_CANVAS (container), + details->drag_x, + details->drag_y, + &details->stretch_start.pointer_x, + &details->stretch_start.pointer_y); + eel_canvas_w2c (EEL_CANVAS (container), + icon->x, icon->y, + &details->stretch_start.icon_x, + &details->stretch_start.icon_y); + icon_get_size (container, icon, + &details->stretch_start.icon_size); + + eel_canvas_item_grab (EEL_CANVAS_ITEM (icon->item), + (GDK_POINTER_MOTION_MASK + | GDK_BUTTON_RELEASE_MASK), + cursor, + event); + if (cursor) + { + g_object_unref (cursor); + } + + /* Ensure the window itself is focused.. */ + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (container)); + if (toplevel != NULL && gtk_widget_get_realized (toplevel)) + { + gdk_window_focus (gtk_widget_get_window (toplevel), GDK_CURRENT_TIME); + } + + return TRUE; } static gboolean update_stretch_at_idle (NautilusCanvasContainer *container) { - NautilusCanvasContainerDetails *details; - NautilusCanvasIcon *icon; - double world_x, world_y; - StretchState stretch_state; + NautilusCanvasContainerDetails *details; + NautilusCanvasIcon *icon; + double world_x, world_y; + StretchState stretch_state; - details = container->details; - icon = details->stretch_icon; + details = container->details; + icon = details->stretch_icon; - if (icon == NULL) { - container->details->stretch_idle_id = 0; - return FALSE; - } + if (icon == NULL) + { + container->details->stretch_idle_id = 0; + return FALSE; + } - eel_canvas_w2c (EEL_CANVAS (container), - details->world_x, details->world_y, - &stretch_state.pointer_x, &stretch_state.pointer_y); + eel_canvas_w2c (EEL_CANVAS (container), + details->world_x, details->world_y, + &stretch_state.pointer_x, &stretch_state.pointer_y); - compute_stretch (&details->stretch_start, - &stretch_state); + compute_stretch (&details->stretch_start, + &stretch_state); - eel_canvas_c2w (EEL_CANVAS (container), - stretch_state.icon_x, stretch_state.icon_y, - &world_x, &world_y); + eel_canvas_c2w (EEL_CANVAS (container), + stretch_state.icon_x, stretch_state.icon_y, + &world_x, &world_y); - icon_set_position (icon, world_x, world_y); - icon_set_size (container, icon, stretch_state.icon_size, FALSE, FALSE); + icon_set_position (icon, world_x, world_y); + icon_set_size (container, icon, stretch_state.icon_size, FALSE, FALSE); - container->details->stretch_idle_id = 0; + container->details->stretch_idle_id = 0; - return FALSE; -} + return FALSE; +} static void continue_stretching (NautilusCanvasContainer *container, - double world_x, double world_y) + double world_x, + double world_y) { + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - - container->details->world_x = world_x; - container->details->world_y = world_y; + container->details->world_x = world_x; + container->details->world_y = world_y; - if (container->details->stretch_idle_id == 0) { - container->details->stretch_idle_id = g_idle_add ((GSourceFunc) update_stretch_at_idle, container); - } + if (container->details->stretch_idle_id == 0) + { + container->details->stretch_idle_id = g_idle_add ((GSourceFunc) update_stretch_at_idle, container); + } } static gboolean keyboard_stretching (NautilusCanvasContainer *container, - GdkEventKey *event) -{ - NautilusCanvasIcon *icon; - guint size; - - icon = container->details->stretch_icon; - - if (icon == NULL || !icon->is_selected) { - return FALSE; - } - - icon_get_size (container, icon, &size); - - switch (event->keyval) { - case GDK_KEY_equal: - case GDK_KEY_plus: - case GDK_KEY_KP_Add: - icon_set_size (container, icon, size + 5, FALSE, FALSE); - break; - case GDK_KEY_minus: - case GDK_KEY_KP_Subtract: - icon_set_size (container, icon, size - 5, FALSE, FALSE); - break; - case GDK_KEY_0: - case GDK_KEY_KP_0: - nautilus_canvas_container_move_icon (container, icon, - icon->x, icon->y, - 1.0, - FALSE, TRUE, TRUE); - break; - } - - return TRUE; + GdkEventKey *event) +{ + NautilusCanvasIcon *icon; + guint size; + + icon = container->details->stretch_icon; + + if (icon == NULL || !icon->is_selected) + { + return FALSE; + } + + icon_get_size (container, icon, &size); + + switch (event->keyval) + { + case GDK_KEY_equal: + case GDK_KEY_plus: + case GDK_KEY_KP_Add: + { + icon_set_size (container, icon, size + 5, FALSE, FALSE); + } + break; + + case GDK_KEY_minus: + case GDK_KEY_KP_Subtract: + { + icon_set_size (container, icon, size - 5, FALSE, FALSE); + } + break; + + case GDK_KEY_0: + case GDK_KEY_KP_0: + { + nautilus_canvas_container_move_icon (container, icon, + icon->x, icon->y, + 1.0, + FALSE, TRUE, TRUE); + } + break; + } + + return TRUE; } static void ungrab_stretch_icon (NautilusCanvasContainer *container) { - eel_canvas_item_ungrab (EEL_CANVAS_ITEM (container->details->stretch_icon->item)); + eel_canvas_item_ungrab (EEL_CANVAS_ITEM (container->details->stretch_icon->item)); } static void end_stretching (NautilusCanvasContainer *container, - double world_x, double world_y) -{ - NautilusCanvasPosition position; - NautilusCanvasIcon *icon; - - continue_stretching (container, world_x, world_y); - ungrab_stretch_icon (container); - - /* now that we're done stretching, update the icon's position */ - - icon = container->details->drag_icon; - if (nautilus_canvas_container_is_layout_rtl (container)) { - position.x = icon->saved_ltr_x = get_mirror_x_position (container, icon, icon->x); - } else { - position.x = icon->x; - } - position.y = icon->y; - position.scale = icon->scale; - g_signal_emit (container, - signals[ICON_POSITION_CHANGED], 0, - icon->data, &position); - - clear_drag_state (container); - redo_layout (container); + double world_x, + double world_y) +{ + NautilusCanvasPosition position; + NautilusCanvasIcon *icon; + + continue_stretching (container, world_x, world_y); + ungrab_stretch_icon (container); + + /* now that we're done stretching, update the icon's position */ + + icon = container->details->drag_icon; + if (nautilus_canvas_container_is_layout_rtl (container)) + { + position.x = icon->saved_ltr_x = get_mirror_x_position (container, icon, icon->x); + } + else + { + position.x = icon->x; + } + position.y = icon->y; + position.scale = icon->scale; + g_signal_emit (container, + signals[ICON_POSITION_CHANGED], 0, + icon->data, &position); + + clear_drag_state (container); + redo_layout (container); } static gboolean undo_stretching (NautilusCanvasContainer *container) { - NautilusCanvasIcon *stretched_icon; - - stretched_icon = container->details->stretch_icon; - - if (stretched_icon == NULL) { - return FALSE; - } - - if (container->details->drag_state == DRAG_STATE_STRETCH) { - ungrab_stretch_icon (container); - clear_drag_state (container); - } - nautilus_canvas_item_set_show_stretch_handles - (stretched_icon->item, FALSE); - - icon_set_position (stretched_icon, - container->details->stretch_initial_x, - container->details->stretch_initial_y); - icon_set_size (container, - stretched_icon, - container->details->stretch_initial_size, - TRUE, - TRUE); - - container->details->stretch_icon = NULL; - emit_stretch_ended (container, stretched_icon); - redo_layout (container); - - return TRUE; + NautilusCanvasIcon *stretched_icon; + + stretched_icon = container->details->stretch_icon; + + if (stretched_icon == NULL) + { + return FALSE; + } + + if (container->details->drag_state == DRAG_STATE_STRETCH) + { + ungrab_stretch_icon (container); + clear_drag_state (container); + } + nautilus_canvas_item_set_show_stretch_handles + (stretched_icon->item, FALSE); + + icon_set_position (stretched_icon, + container->details->stretch_initial_x, + container->details->stretch_initial_y); + icon_set_size (container, + stretched_icon, + container->details->stretch_initial_size, + TRUE, + TRUE); + + container->details->stretch_icon = NULL; + emit_stretch_ended (container, stretched_icon); + redo_layout (container); + + return TRUE; } static gboolean -button_release_event (GtkWidget *widget, - GdkEventButton *event) -{ - NautilusCanvasContainer *container; - NautilusCanvasContainerDetails *details; - double world_x, world_y; - - container = NAUTILUS_CANVAS_CONTAINER (widget); - details = container->details; - - if (event->button == RUBBERBAND_BUTTON && details->rubberband_info.active) { - stop_rubberbanding (container); - return TRUE; - } - - if (event->button == details->drag_button) { - details->drag_button = 0; - - switch (details->drag_state) { - case DRAG_STATE_MOVE_OR_COPY: - if (!details->drag_started) { - nautilus_canvas_container_did_not_drag (container, event); - } else { - nautilus_canvas_dnd_end_drag (container); - DEBUG ("Ending drag from canvas container"); - } - break; - case DRAG_STATE_STRETCH: - eel_canvas_window_to_world - (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); - end_stretching (container, world_x, world_y); - break; - default: - break; - } - - clear_drag_state (container); - return TRUE; - } - - return GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->button_release_event (widget, event); +button_release_event (GtkWidget *widget, + GdkEventButton *event) +{ + NautilusCanvasContainer *container; + NautilusCanvasContainerDetails *details; + double world_x, world_y; + + container = NAUTILUS_CANVAS_CONTAINER (widget); + details = container->details; + + if (event->button == RUBBERBAND_BUTTON && details->rubberband_info.active) + { + stop_rubberbanding (container); + return TRUE; + } + + if (event->button == details->drag_button) + { + details->drag_button = 0; + + switch (details->drag_state) + { + case DRAG_STATE_MOVE_OR_COPY: + { + if (!details->drag_started) + { + nautilus_canvas_container_did_not_drag (container, event); + } + else + { + nautilus_canvas_dnd_end_drag (container); + DEBUG ("Ending drag from canvas container"); + } + } + break; + + case DRAG_STATE_STRETCH: + { + eel_canvas_window_to_world + (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); + end_stretching (container, world_x, world_y); + } + break; + + default: + { + } + break; + } + + clear_drag_state (container); + return TRUE; + } + + return GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->button_release_event (widget, event); } static int -motion_notify_event (GtkWidget *widget, - GdkEventMotion *event) -{ - NautilusCanvasContainer *container; - NautilusCanvasContainerDetails *details; - double world_x, world_y; - int canvas_x, canvas_y; - GdkDragAction actions; - - container = NAUTILUS_CANVAS_CONTAINER (widget); - details = container->details; - - if (details->drag_button != 0) { - switch (details->drag_state) { - case DRAG_STATE_MOVE_OR_COPY: - if (details->drag_started) { - break; - } - - eel_canvas_window_to_world - (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); - - if (gtk_drag_check_threshold (widget, - details->drag_x, - details->drag_y, - world_x, - world_y)) { - details->drag_started = TRUE; - details->drag_state = DRAG_STATE_MOVE_OR_COPY; - - eel_canvas_w2c (EEL_CANVAS (container), - details->drag_x, - details->drag_y, - &canvas_x, - &canvas_y); - - actions = GDK_ACTION_COPY - | GDK_ACTION_MOVE - | GDK_ACTION_LINK - | GDK_ACTION_ASK; - - nautilus_canvas_dnd_begin_drag (container, - actions, - details->drag_button, - event, - canvas_x, - canvas_y); - DEBUG ("Beginning drag from canvas container"); - } - break; - case DRAG_STATE_STRETCH: - eel_canvas_window_to_world - (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); - continue_stretching (container, world_x, world_y); - break; - default: - break; - } - } - - return GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->motion_notify_event (widget, event); +motion_notify_event (GtkWidget *widget, + GdkEventMotion *event) +{ + NautilusCanvasContainer *container; + NautilusCanvasContainerDetails *details; + double world_x, world_y; + int canvas_x, canvas_y; + GdkDragAction actions; + + container = NAUTILUS_CANVAS_CONTAINER (widget); + details = container->details; + + if (details->drag_button != 0) + { + switch (details->drag_state) + { + case DRAG_STATE_MOVE_OR_COPY: + { + if (details->drag_started) + { + break; + } + + eel_canvas_window_to_world + (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); + + if (gtk_drag_check_threshold (widget, + details->drag_x, + details->drag_y, + world_x, + world_y)) + { + details->drag_started = TRUE; + details->drag_state = DRAG_STATE_MOVE_OR_COPY; + + eel_canvas_w2c (EEL_CANVAS (container), + details->drag_x, + details->drag_y, + &canvas_x, + &canvas_y); + + actions = GDK_ACTION_COPY + | GDK_ACTION_MOVE + | GDK_ACTION_LINK + | GDK_ACTION_ASK; + + nautilus_canvas_dnd_begin_drag (container, + actions, + details->drag_button, + event, + canvas_x, + canvas_y); + DEBUG ("Beginning drag from canvas container"); + } + } + break; + + case DRAG_STATE_STRETCH: + { + eel_canvas_window_to_world + (EEL_CANVAS (container), event->x, event->y, &world_x, &world_y); + continue_stretching (container, world_x, world_y); + } + break; + + default: + { + } + break; + } + } + + return GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->motion_notify_event (widget, event); } static void -nautilus_canvas_container_get_icon_text (NautilusCanvasContainer *container, - NautilusCanvasIconData *data, - char **editable_text, - char **additional_text, - gboolean include_invisible) +nautilus_canvas_container_get_icon_text (NautilusCanvasContainer *container, + NautilusCanvasIconData *data, + char **editable_text, + char **additional_text, + gboolean include_invisible) { - NautilusCanvasContainerClass *klass; + NautilusCanvasContainerClass *klass; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); - g_assert (klass->get_icon_text != NULL); + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); + g_assert (klass->get_icon_text != NULL); - klass->get_icon_text (container, data, editable_text, additional_text, include_invisible); + klass->get_icon_text (container, data, editable_text, additional_text, include_invisible); } static gboolean handle_popups (NautilusCanvasContainer *container, - GdkEventKey *event, - const char *signal) + GdkEventKey *event, + const char *signal) { - GdkEventButton button_event = { 0 }; + GdkEventButton button_event = { 0 }; - /* ensure we clear the drag state before showing the menu */ - clear_drag_state (container); + /* ensure we clear the drag state before showing the menu */ + clear_drag_state (container); - g_signal_emit_by_name (container, signal, &button_event); + g_signal_emit_by_name (container, signal, &button_event); - return TRUE; + return TRUE; } static int -key_press_event (GtkWidget *widget, - GdkEventKey *event) -{ - NautilusCanvasContainer *container; - gboolean handled; - - container = NAUTILUS_CANVAS_CONTAINER (widget); - handled = FALSE; - - switch (event->keyval) { - case GDK_KEY_Home: - case GDK_KEY_KP_Home: - keyboard_home (container, event); - handled = TRUE; - break; - case GDK_KEY_End: - case GDK_KEY_KP_End: - keyboard_end (container, event); - handled = TRUE; - break; - case GDK_KEY_Left: - case GDK_KEY_KP_Left: - /* Don't eat Alt-Left, as that is used for history browsing */ - if ((event->state & GDK_MOD1_MASK) == 0) { - keyboard_left (container, event); - handled = TRUE; - } - break; - case GDK_KEY_Up: - case GDK_KEY_KP_Up: - /* Don't eat Alt-Up, as that is used for alt-shift-Up */ - if ((event->state & GDK_MOD1_MASK) == 0) { - keyboard_up (container, event); - handled = TRUE; - } - break; - case GDK_KEY_Right: - case GDK_KEY_KP_Right: - /* Don't eat Alt-Right, as that is used for history browsing */ - if ((event->state & GDK_MOD1_MASK) == 0) { - keyboard_right (container, event); - handled = TRUE; - } - break; - case GDK_KEY_Down: - case GDK_KEY_KP_Down: - /* Don't eat Alt-Down, as that is used for Open */ - if ((event->state & GDK_MOD1_MASK) == 0) { - keyboard_down (container, event); - handled = TRUE; - } - break; - case GDK_KEY_space: - keyboard_space (container, event); - handled = TRUE; - break; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - if ((event->state & GDK_SHIFT_MASK) != 0) { - activate_selected_items_alternate (container, NULL); - } else { - activate_selected_items (container); - } - - handled = TRUE; - break; - case GDK_KEY_Escape: - handled = undo_stretching (container); - break; - case GDK_KEY_plus: - case GDK_KEY_minus: - case GDK_KEY_equal: - case GDK_KEY_KP_Add: - case GDK_KEY_KP_Subtract: - case GDK_KEY_0: - case GDK_KEY_KP_0: - if (event->state & GDK_CONTROL_MASK) { - handled = keyboard_stretching (container, event); - } - break; - case GDK_KEY_F10: - /* handle Ctrl+F10 because we want to display the - * background popup even if something is selected. - * The other cases are handled by popup_menu(). - */ - if (event->state & GDK_CONTROL_MASK) { - handled = handle_popups (container, event, - "context_click_background"); - } - break; - case GDK_KEY_v: - /* Eat Control + v to not enable type ahead */ - if ((event->state & GDK_CONTROL_MASK) != 0) { - handled = TRUE; - } - break; - default: - break; - } - - if (!handled) { - handled = GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->key_press_event (widget, event); - } - - return handled; +key_press_event (GtkWidget *widget, + GdkEventKey *event) +{ + NautilusCanvasContainer *container; + gboolean handled; + + container = NAUTILUS_CANVAS_CONTAINER (widget); + handled = FALSE; + + switch (event->keyval) + { + case GDK_KEY_Home: + case GDK_KEY_KP_Home: + { + keyboard_home (container, event); + handled = TRUE; + } + break; + + case GDK_KEY_End: + case GDK_KEY_KP_End: + { + keyboard_end (container, event); + handled = TRUE; + } + break; + + case GDK_KEY_Left: + case GDK_KEY_KP_Left: + { + /* Don't eat Alt-Left, as that is used for history browsing */ + if ((event->state & GDK_MOD1_MASK) == 0) + { + keyboard_left (container, event); + handled = TRUE; + } + } + break; + + case GDK_KEY_Up: + case GDK_KEY_KP_Up: + { + /* Don't eat Alt-Up, as that is used for alt-shift-Up */ + if ((event->state & GDK_MOD1_MASK) == 0) + { + keyboard_up (container, event); + handled = TRUE; + } + } + break; + + case GDK_KEY_Right: + case GDK_KEY_KP_Right: + { + /* Don't eat Alt-Right, as that is used for history browsing */ + if ((event->state & GDK_MOD1_MASK) == 0) + { + keyboard_right (container, event); + handled = TRUE; + } + } + break; + + case GDK_KEY_Down: + case GDK_KEY_KP_Down: + { + /* Don't eat Alt-Down, as that is used for Open */ + if ((event->state & GDK_MOD1_MASK) == 0) + { + keyboard_down (container, event); + handled = TRUE; + } + } + break; + + case GDK_KEY_space: + { + keyboard_space (container, event); + handled = TRUE; + } + break; + + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: + { + if ((event->state & GDK_SHIFT_MASK) != 0) + { + activate_selected_items_alternate (container, NULL); + } + else + { + activate_selected_items (container); + } + + handled = TRUE; + } + break; + + case GDK_KEY_Escape: + { + handled = undo_stretching (container); + } + break; + + case GDK_KEY_plus: + case GDK_KEY_minus: + case GDK_KEY_equal: + case GDK_KEY_KP_Add: + case GDK_KEY_KP_Subtract: + case GDK_KEY_0: + case GDK_KEY_KP_0: + { + if (event->state & GDK_CONTROL_MASK) + { + handled = keyboard_stretching (container, event); + } + } + break; + + case GDK_KEY_F10: + { + /* handle Ctrl+F10 because we want to display the + * background popup even if something is selected. + * The other cases are handled by popup_menu(). + */ + if (event->state & GDK_CONTROL_MASK) + { + handled = handle_popups (container, event, + "context_click_background"); + } + } + break; + + case GDK_KEY_v: + { + /* Eat Control + v to not enable type ahead */ + if ((event->state & GDK_CONTROL_MASK) != 0) + { + handled = TRUE; + } + } + break; + + default: + { + } + break; + } + + if (!handled) + { + handled = GTK_WIDGET_CLASS (nautilus_canvas_container_parent_class)->key_press_event (widget, event); + } + + return handled; } static gboolean popup_menu (GtkWidget *widget) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - if (has_selection (container)) { - handle_popups (container, NULL, - "context_click_selection"); - } else { - handle_popups (container, NULL, - "context_click_background"); - } + if (has_selection (container)) + { + handle_popups (container, NULL, + "context_click_selection"); + } + else + { + handle_popups (container, NULL, + "context_click_background"); + } - return TRUE; + return TRUE; } static void -grab_notify_cb (GtkWidget *widget, - gboolean was_grabbed) +grab_notify_cb (GtkWidget *widget, + gboolean was_grabbed) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - if (container->details->rubberband_info.active && - !was_grabbed) { - /* we got a (un)grab-notify during rubberband. - * This happens when a new modal dialog shows - * up (e.g. authentication or an error). Stop - * the rubberbanding so that we can handle the - * dialog. */ - stop_rubberbanding (container); - } + if (container->details->rubberband_info.active && + !was_grabbed) + { + /* we got a (un)grab-notify during rubberband. + * This happens when a new modal dialog shows + * up (e.g. authentication or an error). Stop + * the rubberbanding so that we can handle the + * dialog. */ + stop_rubberbanding (container); + } } static void text_ellipsis_limit_changed_container_callback (gpointer callback_data) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (callback_data); - invalidate_label_sizes (container); - schedule_redo_layout (container); + container = NAUTILUS_CANVAS_CONTAINER (callback_data); + invalidate_label_sizes (container); + schedule_redo_layout (container); } -static GObject* +static GObject * nautilus_canvas_container_constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - NautilusCanvasContainer *container; - GObject *object; - - object = G_OBJECT_CLASS (nautilus_canvas_container_parent_class)->constructor - (type, - n_construct_params, - construct_params); - - container = NAUTILUS_CANVAS_CONTAINER (object); - if (nautilus_canvas_container_get_is_desktop (container)) { - g_signal_connect_swapped (nautilus_desktop_preferences, - "changed::" NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT, - G_CALLBACK (text_ellipsis_limit_changed_container_callback), - container); - } else { - g_signal_connect_swapped (nautilus_icon_view_preferences, - "changed::" NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT, - G_CALLBACK (text_ellipsis_limit_changed_container_callback), - container); - } - - return object; + guint n_construct_params, + GObjectConstructParam *construct_params) +{ + NautilusCanvasContainer *container; + GObject *object; + + object = G_OBJECT_CLASS (nautilus_canvas_container_parent_class)->constructor + (type, + n_construct_params, + construct_params); + + container = NAUTILUS_CANVAS_CONTAINER (object); + if (nautilus_canvas_container_get_is_desktop (container)) + { + g_signal_connect_swapped (nautilus_desktop_preferences, + "changed::" NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT, + G_CALLBACK (text_ellipsis_limit_changed_container_callback), + container); + } + else + { + g_signal_connect_swapped (nautilus_icon_view_preferences, + "changed::" NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT, + G_CALLBACK (text_ellipsis_limit_changed_container_callback), + container); + } + + return object; } /* Initialization. */ @@ -4730,401 +5322,407 @@ nautilus_canvas_container_constructor (GType type, static void nautilus_canvas_container_class_init (NautilusCanvasContainerClass *class) { - GtkWidgetClass *widget_class; - - G_OBJECT_CLASS (class)->constructor = nautilus_canvas_container_constructor; - G_OBJECT_CLASS (class)->finalize = finalize; - - /* Signals. */ - - signals[SELECTION_CHANGED] - = g_signal_new ("selection-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - selection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[BUTTON_PRESS] - = g_signal_new ("button-press", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - button_press), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_BOOLEAN, 1, - GDK_TYPE_EVENT); - signals[ACTIVATE] - = g_signal_new ("activate", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - activate), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[ACTIVATE_ALTERNATE] - = g_signal_new ("activate-alternate", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - activate_alternate), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[ACTIVATE_PREVIEWER] - = g_signal_new ("activate-previewer", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - activate_previewer), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 2, - G_TYPE_POINTER, G_TYPE_POINTER); - signals[CONTEXT_CLICK_SELECTION] - = g_signal_new ("context-click-selection", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - context_click_selection), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[CONTEXT_CLICK_BACKGROUND] - = g_signal_new ("context-click-background", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - context_click_background), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[MIDDLE_CLICK] - = g_signal_new ("middle-click", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - middle_click), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[ICON_POSITION_CHANGED] - = g_signal_new ("icon-position-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - icon_position_changed), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - signals[ICON_STRETCH_STARTED] - = g_signal_new ("icon-stretch-started", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - icon_stretch_started), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[ICON_STRETCH_ENDED] - = g_signal_new ("icon-stretch-ended", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - icon_stretch_ended), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[GET_ICON_URI] - = g_signal_new ("get-icon-uri", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_icon_uri), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_STRING, 1, - G_TYPE_POINTER); - signals[GET_ICON_ACTIVATION_URI] - = g_signal_new ("get-icon-activation-uri", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_icon_activation_uri), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_STRING, 1, - G_TYPE_POINTER); - signals[GET_ICON_DROP_TARGET_URI] - = g_signal_new ("get-icon-drop-target-uri", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_icon_drop_target_uri), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_STRING, 1, - G_TYPE_POINTER); - signals[MOVE_COPY_ITEMS] - = g_signal_new ("move-copy-items", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - move_copy_items), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 6, - G_TYPE_POINTER, - G_TYPE_POINTER, - G_TYPE_POINTER, - GDK_TYPE_DRAG_ACTION, - G_TYPE_INT, - G_TYPE_INT); - signals[HANDLE_NETSCAPE_URL] - = g_signal_new ("handle-netscape-url", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - handle_netscape_url), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 5, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_DRAG_ACTION, - G_TYPE_INT, - G_TYPE_INT); - signals[HANDLE_URI_LIST] - = g_signal_new ("handle-uri-list", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - handle_uri_list), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 5, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_DRAG_ACTION, - G_TYPE_INT, - G_TYPE_INT); - signals[HANDLE_TEXT] - = g_signal_new ("handle-text", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - handle_text), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 5, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_DRAG_ACTION, - G_TYPE_INT, - G_TYPE_INT); - signals[HANDLE_RAW] - = g_signal_new ("handle-raw", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - handle_raw), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 7, - G_TYPE_POINTER, - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_DRAG_ACTION, - G_TYPE_INT, - G_TYPE_INT); - signals[HANDLE_HOVER] = - g_signal_new ("handle-hover", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - handle_hover), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[GET_CONTAINER_URI] - = g_signal_new ("get-container-uri", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_container_uri), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_STRING, 0); - signals[CAN_ACCEPT_ITEM] - = g_signal_new ("can-accept-item", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - can_accept_item), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_INT, 2, - G_TYPE_POINTER, - G_TYPE_STRING); - signals[GET_STORED_ICON_POSITION] - = g_signal_new ("get-stored-icon-position", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_stored_icon_position), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_BOOLEAN, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - signals[GET_STORED_LAYOUT_TIMESTAMP] - = g_signal_new ("get-stored-layout-timestamp", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - get_stored_layout_timestamp), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_BOOLEAN, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - signals[STORE_LAYOUT_TIMESTAMP] - = g_signal_new ("store-layout-timestamp", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - store_layout_timestamp), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_BOOLEAN, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); - signals[LAYOUT_CHANGED] - = g_signal_new ("layout-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - layout_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[BAND_SELECT_STARTED] - = g_signal_new ("band-select-started", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - band_select_started), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[BAND_SELECT_ENDED] - = g_signal_new ("band-select-ended", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - band_select_ended), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[ICON_ADDED] - = g_signal_new ("icon-added", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - icon_added), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - signals[ICON_REMOVED] - = g_signal_new ("icon-removed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - icon_removed), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - signals[CLEARED] - = g_signal_new ("cleared", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusCanvasContainerClass, - cleared), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - /* GtkWidget class. */ - - widget_class = GTK_WIDGET_CLASS (class); - widget_class->destroy = destroy; - widget_class->size_allocate = size_allocate; - widget_class->get_request_mode = get_request_mode; - widget_class->get_preferred_width = get_prefered_width; - widget_class->get_preferred_height = get_prefered_height; - widget_class->realize = realize; - widget_class->unrealize = unrealize; - widget_class->button_press_event = button_press_event; - widget_class->button_release_event = button_release_event; - widget_class->motion_notify_event = motion_notify_event; - widget_class->key_press_event = key_press_event; - widget_class->popup_menu = popup_menu; - widget_class->style_updated = style_updated; - widget_class->grab_notify = grab_notify_cb; - - gtk_widget_class_set_accessible_type (widget_class, nautilus_canvas_container_accessible_get_type ()); - - gtk_widget_class_install_style_property (widget_class, - g_param_spec_boolean ("activate_prelight_icon_label", - "Activate Prelight Icon Label", - "Whether icon labels should make use of its prelight color in prelight state", - FALSE, - G_PARAM_READABLE)); + GtkWidgetClass *widget_class; + + G_OBJECT_CLASS (class)->constructor = nautilus_canvas_container_constructor; + G_OBJECT_CLASS (class)->finalize = finalize; + + /* Signals. */ + + signals[SELECTION_CHANGED] + = g_signal_new ("selection-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + selection_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[BUTTON_PRESS] + = g_signal_new ("button-press", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + button_press), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 1, + GDK_TYPE_EVENT); + signals[ACTIVATE] + = g_signal_new ("activate", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + activate), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[ACTIVATE_ALTERNATE] + = g_signal_new ("activate-alternate", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + activate_alternate), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[ACTIVATE_PREVIEWER] + = g_signal_new ("activate-previewer", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + activate_previewer), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 2, + G_TYPE_POINTER, G_TYPE_POINTER); + signals[CONTEXT_CLICK_SELECTION] + = g_signal_new ("context-click-selection", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + context_click_selection), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[CONTEXT_CLICK_BACKGROUND] + = g_signal_new ("context-click-background", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + context_click_background), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[MIDDLE_CLICK] + = g_signal_new ("middle-click", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + middle_click), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[ICON_POSITION_CHANGED] + = g_signal_new ("icon-position-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + icon_position_changed), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 2, + G_TYPE_POINTER, + G_TYPE_POINTER); + signals[ICON_STRETCH_STARTED] + = g_signal_new ("icon-stretch-started", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + icon_stretch_started), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[ICON_STRETCH_ENDED] + = g_signal_new ("icon-stretch-ended", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + icon_stretch_ended), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + signals[GET_ICON_URI] + = g_signal_new ("get-icon-uri", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_icon_uri), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_STRING, 1, + G_TYPE_POINTER); + signals[GET_ICON_ACTIVATION_URI] + = g_signal_new ("get-icon-activation-uri", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_icon_activation_uri), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_STRING, 1, + G_TYPE_POINTER); + signals[GET_ICON_DROP_TARGET_URI] + = g_signal_new ("get-icon-drop-target-uri", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_icon_drop_target_uri), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_STRING, 1, + G_TYPE_POINTER); + signals[MOVE_COPY_ITEMS] + = g_signal_new ("move-copy-items", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + move_copy_items), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 6, + G_TYPE_POINTER, + G_TYPE_POINTER, + G_TYPE_POINTER, + GDK_TYPE_DRAG_ACTION, + G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_NETSCAPE_URL] + = g_signal_new ("handle-netscape-url", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + handle_netscape_url), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 5, + G_TYPE_STRING, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, + G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_URI_LIST] + = g_signal_new ("handle-uri-list", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + handle_uri_list), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 5, + G_TYPE_STRING, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, + G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_TEXT] + = g_signal_new ("handle-text", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + handle_text), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 5, + G_TYPE_STRING, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, + G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_RAW] + = g_signal_new ("handle-raw", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + handle_raw), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 7, + G_TYPE_POINTER, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_STRING, + GDK_TYPE_DRAG_ACTION, + G_TYPE_INT, + G_TYPE_INT); + signals[HANDLE_HOVER] = + g_signal_new ("handle-hover", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + handle_hover), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 1, + G_TYPE_STRING); + signals[GET_CONTAINER_URI] + = g_signal_new ("get-container-uri", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_container_uri), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_STRING, 0); + signals[CAN_ACCEPT_ITEM] + = g_signal_new ("can-accept-item", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + can_accept_item), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_INT, 2, + G_TYPE_POINTER, + G_TYPE_STRING); + signals[GET_STORED_ICON_POSITION] + = g_signal_new ("get-stored-icon-position", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_stored_icon_position), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 2, + G_TYPE_POINTER, + G_TYPE_POINTER); + signals[GET_STORED_LAYOUT_TIMESTAMP] + = g_signal_new ("get-stored-layout-timestamp", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + get_stored_layout_timestamp), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 2, + G_TYPE_POINTER, + G_TYPE_POINTER); + signals[STORE_LAYOUT_TIMESTAMP] + = g_signal_new ("store-layout-timestamp", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + store_layout_timestamp), + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_BOOLEAN, 2, + G_TYPE_POINTER, + G_TYPE_POINTER); + signals[LAYOUT_CHANGED] + = g_signal_new ("layout-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + layout_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[BAND_SELECT_STARTED] + = g_signal_new ("band-select-started", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + band_select_started), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[BAND_SELECT_ENDED] + = g_signal_new ("band-select-ended", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + band_select_ended), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[ICON_ADDED] + = g_signal_new ("icon-added", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + icon_added), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[ICON_REMOVED] + = g_signal_new ("icon-removed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + icon_removed), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + + signals[CLEARED] + = g_signal_new ("cleared", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NautilusCanvasContainerClass, + cleared), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /* GtkWidget class. */ + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->destroy = destroy; + widget_class->size_allocate = size_allocate; + widget_class->get_request_mode = get_request_mode; + widget_class->get_preferred_width = get_prefered_width; + widget_class->get_preferred_height = get_prefered_height; + widget_class->realize = realize; + widget_class->unrealize = unrealize; + widget_class->button_press_event = button_press_event; + widget_class->button_release_event = button_release_event; + widget_class->motion_notify_event = motion_notify_event; + widget_class->key_press_event = key_press_event; + widget_class->popup_menu = popup_menu; + widget_class->style_updated = style_updated; + widget_class->grab_notify = grab_notify_cb; + + gtk_widget_class_set_accessible_type (widget_class, nautilus_canvas_container_accessible_get_type ()); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_boolean ("activate_prelight_icon_label", + "Activate Prelight Icon Label", + "Whether icon labels should make use of its prelight color in prelight state", + FALSE, + G_PARAM_READABLE)); } static void update_selected (NautilusCanvasContainer *container) { - GList *node; - NautilusCanvasIcon *icon; - - for (node = container->details->icons; node != NULL; node = node->next) { - icon = node->data; - if (icon->is_selected) { - eel_canvas_item_request_update (EEL_CANVAS_ITEM (icon->item)); - } - } + GList *node; + NautilusCanvasIcon *icon; + + for (node = container->details->icons; node != NULL; node = node->next) + { + icon = node->data; + if (icon->is_selected) + { + eel_canvas_item_request_update (EEL_CANVAS_ITEM (icon->item)); + } + } } static gboolean -handle_focus_in_event (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) +handle_focus_in_event (GtkWidget *widget, + GdkEventFocus *event, + gpointer user_data) { - update_selected (NAUTILUS_CANVAS_CONTAINER (widget)); + update_selected (NAUTILUS_CANVAS_CONTAINER (widget)); - return FALSE; + return FALSE; } static gboolean -handle_focus_out_event (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) +handle_focus_out_event (GtkWidget *widget, + GdkEventFocus *event, + gpointer user_data) { - update_selected (NAUTILUS_CANVAS_CONTAINER (widget)); + update_selected (NAUTILUS_CANVAS_CONTAINER (widget)); - return FALSE; + return FALSE; } @@ -5132,147 +5730,161 @@ static int text_ellipsis_limits[NAUTILUS_CANVAS_ZOOM_LEVEL_N_ENTRIES]; static int desktop_text_ellipsis_limit; static gboolean -get_text_ellipsis_limit_for_zoom (char **strs, - const char *zoom_level, - int *limit) -{ - char **p; - char *str; - gboolean success; - - success = FALSE; - - /* default */ - *limit = 3; - - if (zoom_level != NULL) { - str = g_strdup_printf ("%s:%%d", zoom_level); - } else { - str = g_strdup ("%d"); - } - - if (strs != NULL) { +get_text_ellipsis_limit_for_zoom (char **strs, + const char *zoom_level, + int *limit) +{ + char **p; + char *str; + gboolean success; + + success = FALSE; + + /* default */ + *limit = 3; + + if (zoom_level != NULL) + { + str = g_strdup_printf ("%s:%%d", zoom_level); + } + else + { + str = g_strdup ("%d"); + } + + if (strs != NULL) + { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" - for (p = strs; *p != NULL; p++) { - if (sscanf (*p, str, limit)) { - success = TRUE; - } - } + for (p = strs; *p != NULL; p++) + { + if (sscanf (*p, str, limit)) + { + success = TRUE; + } + } #pragma GCC diagnostic pop - } + } - g_free (str); + g_free (str); - return success; + return success; } -static const char * zoom_level_names[] = { - "small", - "standard", - "large", +static const char *zoom_level_names[] = +{ + "small", + "standard", + "large", }; static void text_ellipsis_limit_changed_callback (gpointer callback_data) { - char **pref; - unsigned int i; - int one_limit; - - pref = g_settings_get_strv (nautilus_icon_view_preferences, - NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT); - - /* set default */ - get_text_ellipsis_limit_for_zoom (pref, NULL, &one_limit); - for (i = 0; i < NAUTILUS_CANVAS_ZOOM_LEVEL_N_ENTRIES; i++) { - text_ellipsis_limits[i] = one_limit; - } - - /* override for each zoom level */ - for (i = 0; i < G_N_ELEMENTS(zoom_level_names); i++) { - if (get_text_ellipsis_limit_for_zoom (pref, - zoom_level_names[i], - &one_limit)) { - text_ellipsis_limits[i] = one_limit; - } - } + char **pref; + unsigned int i; + int one_limit; + + pref = g_settings_get_strv (nautilus_icon_view_preferences, + NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT); + + /* set default */ + get_text_ellipsis_limit_for_zoom (pref, NULL, &one_limit); + for (i = 0; i < NAUTILUS_CANVAS_ZOOM_LEVEL_N_ENTRIES; i++) + { + text_ellipsis_limits[i] = one_limit; + } + + /* override for each zoom level */ + for (i = 0; i < G_N_ELEMENTS (zoom_level_names); i++) + { + if (get_text_ellipsis_limit_for_zoom (pref, + zoom_level_names[i], + &one_limit)) + { + text_ellipsis_limits[i] = one_limit; + } + } - g_strfreev (pref); + g_strfreev (pref); } static void desktop_text_ellipsis_limit_changed_callback (gpointer callback_data) { - int pref; + int pref; - pref = g_settings_get_int (nautilus_desktop_preferences, NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT); - desktop_text_ellipsis_limit = pref; + pref = g_settings_get_int (nautilus_desktop_preferences, NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT); + desktop_text_ellipsis_limit = pref; } static void nautilus_canvas_container_init (NautilusCanvasContainer *container) { - NautilusCanvasContainerDetails *details; - static gboolean setup_prefs = FALSE; + NautilusCanvasContainerDetails *details; + static gboolean setup_prefs = FALSE; - details = g_new0 (NautilusCanvasContainerDetails, 1); + details = g_new0 (NautilusCanvasContainerDetails, 1); - details->icon_set = g_hash_table_new (g_direct_hash, g_direct_equal); - details->layout_timestamp = UNDEFINED_TIME; - details->zoom_level = NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD; + details->icon_set = g_hash_table_new (g_direct_hash, g_direct_equal); + details->layout_timestamp = UNDEFINED_TIME; + details->zoom_level = NAUTILUS_CANVAS_ZOOM_LEVEL_STANDARD; - container->details = details; + container->details = details; - g_signal_connect (container, "focus-in-event", - G_CALLBACK (handle_focus_in_event), NULL); - g_signal_connect (container, "focus-out-event", - G_CALLBACK (handle_focus_out_event), NULL); + g_signal_connect (container, "focus-in-event", + G_CALLBACK (handle_focus_in_event), NULL); + g_signal_connect (container, "focus-out-event", + G_CALLBACK (handle_focus_out_event), NULL); - if (!setup_prefs) { - g_signal_connect_swapped (nautilus_icon_view_preferences, - "changed::" NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT, - G_CALLBACK (text_ellipsis_limit_changed_callback), - NULL); - text_ellipsis_limit_changed_callback (NULL); + if (!setup_prefs) + { + g_signal_connect_swapped (nautilus_icon_view_preferences, + "changed::" NAUTILUS_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT, + G_CALLBACK (text_ellipsis_limit_changed_callback), + NULL); + text_ellipsis_limit_changed_callback (NULL); - g_signal_connect_swapped (nautilus_icon_view_preferences, - "changed::" NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT, - G_CALLBACK (desktop_text_ellipsis_limit_changed_callback), - NULL); - desktop_text_ellipsis_limit_changed_callback (NULL); + g_signal_connect_swapped (nautilus_icon_view_preferences, + "changed::" NAUTILUS_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT, + G_CALLBACK (desktop_text_ellipsis_limit_changed_callback), + NULL); + desktop_text_ellipsis_limit_changed_callback (NULL); - setup_prefs = TRUE; - } + setup_prefs = TRUE; + } } -typedef struct { - NautilusCanvasContainer *container; - GdkEventButton *event; +typedef struct +{ + NautilusCanvasContainer *container; + GdkEventButton *event; } ContextMenuParameters; static gboolean handle_canvas_double_click (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - GdkEventButton *event) + NautilusCanvasIcon *icon, + GdkEventButton *event) { - NautilusCanvasContainerDetails *details; + NautilusCanvasContainerDetails *details; - if (event->button != DRAG_BUTTON) { - return FALSE; - } + if (event->button != DRAG_BUTTON) + { + return FALSE; + } - details = container->details; + details = container->details; - if (!details->single_click_mode && - clicked_within_double_click_interval (container) && - details->double_click_icon[0] == details->double_click_icon[1] && - details->double_click_button[0] == details->double_click_button[1]) { - details->double_clicked = TRUE; - return TRUE; - } + if (!details->single_click_mode && + clicked_within_double_click_interval (container) && + details->double_click_icon[0] == details->double_click_icon[1] && + details->double_click_button[0] == details->double_click_button[1]) + { + details->double_clicked = TRUE; + return TRUE; + } - return FALSE; + return FALSE; } /* NautilusCanvasIcon event handling. */ @@ -5288,969 +5900,1087 @@ handle_canvas_double_click (NautilusCanvasContainer *container, static gboolean handle_canvas_button_press (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon, - GdkEventButton *event) -{ - NautilusCanvasContainerDetails *details; - - details = container->details; - - if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { - return TRUE; - } - - if (event->button != DRAG_BUTTON - && event->button != CONTEXTUAL_MENU_BUTTON - && event->button != DRAG_MENU_BUTTON) { - return TRUE; - } - - if ((event->button == DRAG_BUTTON) && - event->type == GDK_BUTTON_PRESS) { - /* The next double click has to be on this icon */ - details->double_click_icon[1] = details->double_click_icon[0]; - details->double_click_icon[0] = icon; - - details->double_click_button[1] = details->double_click_button[0]; - details->double_click_button[0] = event->button; - } - - if (handle_canvas_double_click (container, icon, event)) { - /* Double clicking does not trigger a D&D action. */ - details->drag_button = 0; - details->drag_icon = NULL; - return TRUE; - } - - if (event->button == DRAG_BUTTON - || event->button == DRAG_MENU_BUTTON) { - details->drag_button = event->button; - details->drag_icon = icon; - details->drag_x = event->x; - details->drag_y = event->y; - details->drag_state = DRAG_STATE_MOVE_OR_COPY; - details->drag_started = FALSE; - - /* Check to see if this is a click on the stretch handles. - * If so, it won't modify the selection. - */ - if (icon == container->details->stretch_icon) { - if (start_stretching (container, (GdkEvent *)event)) { - return TRUE; - } - } - } - - /* Modify the selection as appropriate. Selection is modified - * the same way for contextual menu as it would be without. - */ - details->icon_selected_on_button_down = icon->is_selected; - - if ((event->button == DRAG_BUTTON || event->button == MIDDLE_BUTTON) && - (event->state & GDK_SHIFT_MASK) != 0) { - NautilusCanvasIcon *start_icon; - - set_focus (container, icon, FALSE); - - start_icon = details->range_selection_base_icon; - if (start_icon == NULL || !start_icon->is_selected) { - start_icon = icon; - details->range_selection_base_icon = icon; - } - if (select_range (container, start_icon, icon, - (event->state & GDK_CONTROL_MASK) == 0)) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } else if (!details->icon_selected_on_button_down) { - set_focus (container, icon, FALSE); - - details->range_selection_base_icon = icon; - if (button_event_modifies_selection (event)) { - icon_toggle_selected (container, icon); - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } else { - select_one_unselect_others (container, icon); - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } - } - - if (event->button == CONTEXTUAL_MENU_BUTTON) { - clear_drag_state (container); - - g_signal_emit (container, - signals[CONTEXT_CLICK_SELECTION], 0, - event); - } - - - return TRUE; + NautilusCanvasIcon *icon, + GdkEventButton *event) +{ + NautilusCanvasContainerDetails *details; + + details = container->details; + + if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) + { + return TRUE; + } + + if (event->button != DRAG_BUTTON + && event->button != CONTEXTUAL_MENU_BUTTON + && event->button != DRAG_MENU_BUTTON) + { + return TRUE; + } + + if ((event->button == DRAG_BUTTON) && + event->type == GDK_BUTTON_PRESS) + { + /* The next double click has to be on this icon */ + details->double_click_icon[1] = details->double_click_icon[0]; + details->double_click_icon[0] = icon; + + details->double_click_button[1] = details->double_click_button[0]; + details->double_click_button[0] = event->button; + } + + if (handle_canvas_double_click (container, icon, event)) + { + /* Double clicking does not trigger a D&D action. */ + details->drag_button = 0; + details->drag_icon = NULL; + return TRUE; + } + + if (event->button == DRAG_BUTTON + || event->button == DRAG_MENU_BUTTON) + { + details->drag_button = event->button; + details->drag_icon = icon; + details->drag_x = event->x; + details->drag_y = event->y; + details->drag_state = DRAG_STATE_MOVE_OR_COPY; + details->drag_started = FALSE; + + /* Check to see if this is a click on the stretch handles. + * If so, it won't modify the selection. + */ + if (icon == container->details->stretch_icon) + { + if (start_stretching (container, (GdkEvent *) event)) + { + return TRUE; + } + } + } + + /* Modify the selection as appropriate. Selection is modified + * the same way for contextual menu as it would be without. + */ + details->icon_selected_on_button_down = icon->is_selected; + + if ((event->button == DRAG_BUTTON || event->button == MIDDLE_BUTTON) && + (event->state & GDK_SHIFT_MASK) != 0) + { + NautilusCanvasIcon *start_icon; + + set_focus (container, icon, FALSE); + + start_icon = details->range_selection_base_icon; + if (start_icon == NULL || !start_icon->is_selected) + { + start_icon = icon; + details->range_selection_base_icon = icon; + } + if (select_range (container, start_icon, icon, + (event->state & GDK_CONTROL_MASK) == 0)) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + else if (!details->icon_selected_on_button_down) + { + set_focus (container, icon, FALSE); + + details->range_selection_base_icon = icon; + if (button_event_modifies_selection (event)) + { + icon_toggle_selected (container, icon); + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + else + { + select_one_unselect_others (container, icon); + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } + } + + if (event->button == CONTEXTUAL_MENU_BUTTON) + { + clear_drag_state (container); + + g_signal_emit (container, + signals[CONTEXT_CLICK_SELECTION], 0, + event); + } + + + return TRUE; } static int item_event_callback (EelCanvasItem *item, - GdkEvent *event, - gpointer data) -{ - NautilusCanvasContainer *container; - NautilusCanvasIcon *icon; - GdkEventButton *event_button; - - container = NAUTILUS_CANVAS_CONTAINER (data); - - icon = NAUTILUS_CANVAS_ITEM (item)->user_data; - g_assert (icon != NULL); - - event_button = &event->button; - - switch (event->type) { - case GDK_MOTION_NOTIFY: - return FALSE; - case GDK_BUTTON_PRESS: - container->details->double_clicked = FALSE; - if (handle_canvas_button_press (container, icon, event_button)) { - /* Stop the event from being passed along further. Returning - * TRUE ain't enough. - */ - return TRUE; - } - return FALSE; - case GDK_BUTTON_RELEASE: - if (event_button->button == DRAG_BUTTON - && container->details->double_clicked) { - if (!button_event_modifies_selection (event_button)) { - activate_selected_items (container); - } else if ((event_button->state & GDK_CONTROL_MASK) == 0 && - (event_button->state & GDK_SHIFT_MASK) != 0) { - activate_selected_items_alternate (container, icon); - } - } - /* fall through */ - default: - container->details->double_clicked = FALSE; - return FALSE; - } + GdkEvent *event, + gpointer data) +{ + NautilusCanvasContainer *container; + NautilusCanvasIcon *icon; + GdkEventButton *event_button; + + container = NAUTILUS_CANVAS_CONTAINER (data); + + icon = NAUTILUS_CANVAS_ITEM (item)->user_data; + g_assert (icon != NULL); + + event_button = &event->button; + + switch (event->type) + { + case GDK_MOTION_NOTIFY: + { + return FALSE; + } + + case GDK_BUTTON_PRESS: + { + container->details->double_clicked = FALSE; + if (handle_canvas_button_press (container, icon, event_button)) + { + /* Stop the event from being passed along further. Returning + * TRUE ain't enough. + */ + return TRUE; + } + return FALSE; + } + + case GDK_BUTTON_RELEASE: + { + if (event_button->button == DRAG_BUTTON + && container->details->double_clicked) + { + if (!button_event_modifies_selection (event_button)) + { + activate_selected_items (container); + } + else if ((event_button->state & GDK_CONTROL_MASK) == 0 && + (event_button->state & GDK_SHIFT_MASK) != 0) + { + activate_selected_items_alternate (container, icon); + } + } + /* fall through */ + } + + default: + container->details->double_clicked = FALSE; + return FALSE; + } } GtkWidget * nautilus_canvas_container_new (void) { - return gtk_widget_new (NAUTILUS_TYPE_CANVAS_CONTAINER, NULL); + return gtk_widget_new (NAUTILUS_TYPE_CANVAS_CONTAINER, NULL); } /* Clear all of the icons in the container. */ void nautilus_canvas_container_clear (NautilusCanvasContainer *container) { - NautilusCanvasContainerDetails *details; - GList *p; + NautilusCanvasContainerDetails *details; + GList *p; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - details = container->details; - details->layout_timestamp = UNDEFINED_TIME; - details->store_layout_timestamps_when_finishing_new_icons = FALSE; + details = container->details; + details->layout_timestamp = UNDEFINED_TIME; + details->store_layout_timestamps_when_finishing_new_icons = FALSE; - if (details->icons == NULL) { - return; - } + if (details->icons == NULL) + { + return; + } - clear_focus (container); - clear_keyboard_rubberband_start (container); - unschedule_keyboard_icon_reveal (container); - set_pending_icon_to_reveal (container, NULL); - details->stretch_icon = NULL; - details->drop_target = NULL; + clear_focus (container); + clear_keyboard_rubberband_start (container); + unschedule_keyboard_icon_reveal (container); + set_pending_icon_to_reveal (container, NULL); + details->stretch_icon = NULL; + details->drop_target = NULL; - for (p = details->icons; p != NULL; p = p->next) { - icon_free (p->data); - } - g_list_free (details->icons); - details->icons = NULL; - g_list_free (details->new_icons); - details->new_icons = NULL; - g_list_free (details->selection); - details->selection = NULL; + for (p = details->icons; p != NULL; p = p->next) + { + icon_free (p->data); + } + g_list_free (details->icons); + details->icons = NULL; + g_list_free (details->new_icons); + details->new_icons = NULL; + g_list_free (details->selection); + details->selection = NULL; - g_hash_table_destroy (details->icon_set); - details->icon_set = g_hash_table_new (g_direct_hash, g_direct_equal); - - nautilus_canvas_container_update_scroll_region (container); + g_hash_table_destroy (details->icon_set); + details->icon_set = g_hash_table_new (g_direct_hash, g_direct_equal); + + nautilus_canvas_container_update_scroll_region (container); } gboolean nautilus_canvas_container_is_empty (NautilusCanvasContainer *container) { - return container->details->icons == NULL; + return container->details->icons == NULL; } NautilusCanvasIconData * nautilus_canvas_container_get_first_visible_icon (NautilusCanvasContainer *container) { - GList *l; - NautilusCanvasIcon *icon, *best_icon; - double x, y; - double x1, y1, x2, y2; - double *pos, best_pos; - double hadj_v, vadj_v, h_page_size; - gboolean better_icon; - gboolean compare_lt; - - hadj_v = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); - vadj_v = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); - h_page_size = gtk_adjustment_get_page_size (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); - - if (nautilus_canvas_container_is_layout_rtl (container)) { - x = hadj_v + h_page_size - ICON_PAD_LEFT - 1; - y = vadj_v; - } else { - x = hadj_v; - y = vadj_v; - } - - eel_canvas_c2w (EEL_CANVAS (container), - x, y, - &x, &y); - - l = container->details->icons; - best_icon = NULL; - best_pos = 0; - while (l != NULL) { - icon = l->data; - - if (icon_is_positioned (icon)) { - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), - &x1, &y1, &x2, &y2); - - compare_lt = FALSE; - if (nautilus_canvas_container_is_layout_vertical (container)) { - pos = &x1; - if (nautilus_canvas_container_is_layout_rtl (container)) { - compare_lt = TRUE; - better_icon = x1 < x + ICON_PAD_LEFT; - } else { - better_icon = x2 > x + ICON_PAD_LEFT; - } - } else { - pos = &y1; - better_icon = y2 > y + ICON_PAD_TOP; - } - if (better_icon) { - if (best_icon == NULL) { - better_icon = TRUE; - } else if (compare_lt) { - better_icon = best_pos < *pos; - } else { - better_icon = best_pos > *pos; - } - - if (better_icon) { - best_icon = icon; - best_pos = *pos; - } - } - } - - l = l->next; - } - - return best_icon ? best_icon->data : NULL; + GList *l; + NautilusCanvasIcon *icon, *best_icon; + double x, y; + double x1, y1, x2, y2; + double *pos, best_pos; + double hadj_v, vadj_v, h_page_size; + gboolean better_icon; + gboolean compare_lt; + + hadj_v = gtk_adjustment_get_value (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); + vadj_v = gtk_adjustment_get_value (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container))); + h_page_size = gtk_adjustment_get_page_size (gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container))); + + if (nautilus_canvas_container_is_layout_rtl (container)) + { + x = hadj_v + h_page_size - ICON_PAD_LEFT - 1; + y = vadj_v; + } + else + { + x = hadj_v; + y = vadj_v; + } + + eel_canvas_c2w (EEL_CANVAS (container), + x, y, + &x, &y); + + l = container->details->icons; + best_icon = NULL; + best_pos = 0; + while (l != NULL) + { + icon = l->data; + + if (icon_is_positioned (icon)) + { + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), + &x1, &y1, &x2, &y2); + + compare_lt = FALSE; + if (nautilus_canvas_container_is_layout_vertical (container)) + { + pos = &x1; + if (nautilus_canvas_container_is_layout_rtl (container)) + { + compare_lt = TRUE; + better_icon = x1 < x + ICON_PAD_LEFT; + } + else + { + better_icon = x2 > x + ICON_PAD_LEFT; + } + } + else + { + pos = &y1; + better_icon = y2 > y + ICON_PAD_TOP; + } + if (better_icon) + { + if (best_icon == NULL) + { + better_icon = TRUE; + } + else if (compare_lt) + { + better_icon = best_pos < *pos; + } + else + { + better_icon = best_pos > *pos; + } + + if (better_icon) + { + best_icon = icon; + best_pos = *pos; + } + } + } + + l = l->next; + } + + return best_icon ? best_icon->data : NULL; } /* puts the icon at the top of the screen */ void -nautilus_canvas_container_scroll_to_canvas (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) -{ - GList *l; - NautilusCanvasIcon *icon; - GtkAdjustment *hadj, *vadj; - EelIRect bounds; - GtkAllocation allocation; - - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - - /* We need to force a relayout now if there are updates queued - * since we need the final positions */ - nautilus_canvas_container_layout_now (container); - - l = container->details->icons; - while (l != NULL) { - icon = l->data; - - if (icon->data == data && - icon_is_positioned (icon)) { - - if (nautilus_canvas_container_is_auto_layout (container)) { - /* ensure that we reveal the entire row/column */ - icon_get_row_and_column_bounds (container, icon, &bounds); - } else { - item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), &bounds); - } - - if (nautilus_canvas_container_is_layout_vertical (container)) { - if (nautilus_canvas_container_is_layout_rtl (container)) { - gtk_adjustment_set_value (hadj, bounds.x1 - allocation.width); - } else { - gtk_adjustment_set_value (hadj, bounds.x0); - } - } else { - gtk_adjustment_set_value (vadj, bounds.y0); - } - } - - l = l->next; - } +nautilus_canvas_container_scroll_to_canvas (NautilusCanvasContainer *container, + NautilusCanvasIconData *data) +{ + GList *l; + NautilusCanvasIcon *icon; + GtkAdjustment *hadj, *vadj; + EelIRect bounds; + GtkAllocation allocation; + + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + + /* We need to force a relayout now if there are updates queued + * since we need the final positions */ + nautilus_canvas_container_layout_now (container); + + l = container->details->icons; + while (l != NULL) + { + icon = l->data; + + if (icon->data == data && + icon_is_positioned (icon)) + { + if (nautilus_canvas_container_is_auto_layout (container)) + { + /* ensure that we reveal the entire row/column */ + icon_get_row_and_column_bounds (container, icon, &bounds); + } + else + { + item_get_canvas_bounds (EEL_CANVAS_ITEM (icon->item), &bounds); + } + + if (nautilus_canvas_container_is_layout_vertical (container)) + { + if (nautilus_canvas_container_is_layout_rtl (container)) + { + gtk_adjustment_set_value (hadj, bounds.x1 - allocation.width); + } + else + { + gtk_adjustment_set_value (hadj, bounds.x0); + } + } + else + { + gtk_adjustment_set_value (vadj, bounds.y0); + } + } + + l = l->next; + } } /* Call a function for all the icons. */ -typedef struct { - NautilusCanvasCallback callback; - gpointer callback_data; +typedef struct +{ + NautilusCanvasCallback callback; + gpointer callback_data; } CallbackAndData; static void -call_canvas_callback (gpointer data, gpointer callback_data) +call_canvas_callback (gpointer data, + gpointer callback_data) { - NautilusCanvasIcon *icon; - CallbackAndData *callback_and_data; + NautilusCanvasIcon *icon; + CallbackAndData *callback_and_data; - icon = data; - callback_and_data = callback_data; - (* callback_and_data->callback) (icon->data, callback_and_data->callback_data); + icon = data; + callback_and_data = callback_data; + (*callback_and_data->callback)(icon->data, callback_and_data->callback_data); } void nautilus_canvas_container_for_each (NautilusCanvasContainer *container, - NautilusCanvasCallback callback, - gpointer callback_data) + NautilusCanvasCallback callback, + gpointer callback_data) { - CallbackAndData callback_and_data; + CallbackAndData callback_and_data; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - callback_and_data.callback = callback; - callback_and_data.callback_data = callback_data; + callback_and_data.callback = callback; + callback_and_data.callback_data = callback_data; - g_list_foreach (container->details->icons, - call_canvas_callback, &callback_and_data); + g_list_foreach (container->details->icons, + call_canvas_callback, &callback_and_data); } static int selection_changed_at_idle_callback (gpointer data) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; + + container = NAUTILUS_CANVAS_CONTAINER (data); - container = NAUTILUS_CANVAS_CONTAINER (data); - - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); - container->details->selection_changed_id = 0; - return FALSE; + container->details->selection_changed_id = 0; + return FALSE; } /* utility routine to remove a single icon from the container */ static void icon_destroy (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) -{ - NautilusCanvasContainerDetails *details; - gboolean was_selected; - NautilusCanvasIcon *icon_to_focus; - GList *item; - - details = container->details; - - item = g_list_find (details->icons, icon); - item = item->next ? item->next : item->prev; - icon_to_focus = (item != NULL) ? item->data : NULL; - - details->icons = g_list_remove (details->icons, icon); - details->new_icons = g_list_remove (details->new_icons, icon); - details->selection = g_list_remove (details->selection, icon->data); - g_hash_table_remove (details->icon_set, icon->data); - - was_selected = icon->is_selected; - - if (details->focus == icon || - details->focus == NULL) { - if (icon_to_focus != NULL) { - set_focus (container, icon_to_focus, TRUE); - } else { - clear_focus (container); - } - } - - if (details->keyboard_rubberband_start == icon) { - clear_keyboard_rubberband_start (container); - } - - if (details->keyboard_icon_to_reveal == icon) { - unschedule_keyboard_icon_reveal (container); - } - if (details->drag_icon == icon) { - clear_drag_state (container); - } - if (details->drop_target == icon) { - details->drop_target = NULL; - } - if (details->range_selection_base_icon == icon) { - details->range_selection_base_icon = NULL; - } - if (details->pending_icon_to_reveal == icon) { - set_pending_icon_to_reveal (container, NULL); - } - if (details->stretch_icon == icon) { - details->stretch_icon = NULL; - } - - icon_free (icon); - - if (was_selected) { - /* Coalesce multiple removals causing multiple selection_changed events */ - details->selection_changed_id = g_idle_add (selection_changed_at_idle_callback, container); - } + NautilusCanvasIcon *icon) +{ + NautilusCanvasContainerDetails *details; + gboolean was_selected; + NautilusCanvasIcon *icon_to_focus; + GList *item; + + details = container->details; + + item = g_list_find (details->icons, icon); + item = item->next ? item->next : item->prev; + icon_to_focus = (item != NULL) ? item->data : NULL; + + details->icons = g_list_remove (details->icons, icon); + details->new_icons = g_list_remove (details->new_icons, icon); + details->selection = g_list_remove (details->selection, icon->data); + g_hash_table_remove (details->icon_set, icon->data); + + was_selected = icon->is_selected; + + if (details->focus == icon || + details->focus == NULL) + { + if (icon_to_focus != NULL) + { + set_focus (container, icon_to_focus, TRUE); + } + else + { + clear_focus (container); + } + } + + if (details->keyboard_rubberband_start == icon) + { + clear_keyboard_rubberband_start (container); + } + + if (details->keyboard_icon_to_reveal == icon) + { + unschedule_keyboard_icon_reveal (container); + } + if (details->drag_icon == icon) + { + clear_drag_state (container); + } + if (details->drop_target == icon) + { + details->drop_target = NULL; + } + if (details->range_selection_base_icon == icon) + { + details->range_selection_base_icon = NULL; + } + if (details->pending_icon_to_reveal == icon) + { + set_pending_icon_to_reveal (container, NULL); + } + if (details->stretch_icon == icon) + { + details->stretch_icon = NULL; + } + + icon_free (icon); + + if (was_selected) + { + /* Coalesce multiple removals causing multiple selection_changed events */ + details->selection_changed_id = g_idle_add (selection_changed_at_idle_callback, container); + } } /* activate any selected items in the container */ static void activate_selected_items (NautilusCanvasContainer *container) { - GList *selection; + GList *selection; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - selection = nautilus_canvas_container_get_selection (container); - if (selection != NULL) { - g_signal_emit (container, - signals[ACTIVATE], 0, - selection); - } - g_list_free (selection); + selection = nautilus_canvas_container_get_selection (container); + if (selection != NULL) + { + g_signal_emit (container, + signals[ACTIVATE], 0, + selection); + } + g_list_free (selection); } static void preview_selected_items (NautilusCanvasContainer *container) { - GList *selection; - GArray *locations; - gint idx; + GList *selection; + GArray *locations; + gint idx; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - selection = nautilus_canvas_container_get_selection (container); - locations = nautilus_canvas_container_get_selected_icon_locations (container); + selection = nautilus_canvas_container_get_selection (container); + locations = nautilus_canvas_container_get_selected_icon_locations (container); - for (idx = 0; idx < locations->len; idx++) { - GdkPoint *point = &(g_array_index (locations, GdkPoint, idx)); - gint scroll_x, scroll_y; + for (idx = 0; idx < locations->len; idx++) + { + GdkPoint *point = &(g_array_index (locations, GdkPoint, idx)); + gint scroll_x, scroll_y; - eel_canvas_get_scroll_offsets (EEL_CANVAS (container), - &scroll_x, &scroll_y); + eel_canvas_get_scroll_offsets (EEL_CANVAS (container), + &scroll_x, &scroll_y); - point->x -= scroll_x; - point->y -= scroll_y; - } + point->x -= scroll_x; + point->y -= scroll_y; + } - if (selection != NULL) { - g_signal_emit (container, - signals[ACTIVATE_PREVIEWER], 0, - selection, locations); - } - g_list_free (selection); - g_array_unref (locations); + if (selection != NULL) + { + g_signal_emit (container, + signals[ACTIVATE_PREVIEWER], 0, + selection, locations); + } + g_list_free (selection); + g_array_unref (locations); } static void activate_selected_items_alternate (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - GList *selection; + GList *selection; - g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_assert (NAUTILUS_IS_CANVAS_CONTAINER (container)); - if (icon != NULL) { - selection = g_list_prepend (NULL, icon->data); - } else { - selection = nautilus_canvas_container_get_selection (container); - } - if (selection != NULL) { - g_signal_emit (container, - signals[ACTIVATE_ALTERNATE], 0, - selection); - } - g_list_free (selection); + if (icon != NULL) + { + selection = g_list_prepend (NULL, icon->data); + } + else + { + selection = nautilus_canvas_container_get_selection (container); + } + if (selection != NULL) + { + g_signal_emit (container, + signals[ACTIVATE_ALTERNATE], 0, + selection); + } + g_list_free (selection); } static NautilusIconInfo * nautilus_canvas_container_get_icon_images (NautilusCanvasContainer *container, - NautilusCanvasIconData *data, - int size, - gboolean for_drag_accept) + NautilusCanvasIconData *data, + int size, + gboolean for_drag_accept) { - NautilusCanvasContainerClass *klass; + NautilusCanvasContainerClass *klass; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); - g_assert (klass->get_icon_images != NULL); + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); + g_assert (klass->get_icon_images != NULL); - return klass->get_icon_images (container, data, size, for_drag_accept); + return klass->get_icon_images (container, data, size, for_drag_accept); } static void nautilus_canvas_container_prioritize_thumbnailing (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - NautilusCanvasContainerClass *klass; + NautilusCanvasContainerClass *klass; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); - g_assert (klass->prioritize_thumbnailing != NULL); + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); + g_assert (klass->prioritize_thumbnailing != NULL); - klass->prioritize_thumbnailing (container, icon->data); + klass->prioritize_thumbnailing (container, icon->data); } static void nautilus_canvas_container_update_visible_icons (NautilusCanvasContainer *container) { - GtkAdjustment *vadj, *hadj; - double min_y, max_y; - double min_x, max_x; - double x0, y0, x1, y1; - GList *node; - NautilusCanvasIcon *icon; - gboolean visible; - GtkAllocation allocation; - - hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); - vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); - gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); - - min_x = gtk_adjustment_get_value (hadj); - max_x = min_x + allocation.width; - - min_y = gtk_adjustment_get_value (vadj); - max_y = min_y + allocation.height; - - eel_canvas_c2w (EEL_CANVAS (container), - min_x, min_y, &min_x, &min_y); - eel_canvas_c2w (EEL_CANVAS (container), - max_x, max_y, &max_x, &max_y); - - /* Do the iteration in reverse to get the render-order from top to - * bottom for the prioritized thumbnails. - */ - for (node = g_list_last (container->details->icons); node != NULL; node = node->prev) { - icon = node->data; - - if (icon_is_positioned (icon)) { - eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), - &x0, - &y0, - &x1, - &y1); - eel_canvas_item_i2w (EEL_CANVAS_ITEM (icon->item)->parent, - &x0, - &y0); - eel_canvas_item_i2w (EEL_CANVAS_ITEM (icon->item)->parent, - &x1, - &y1); - - if (nautilus_canvas_container_is_layout_vertical (container)) { - visible = x1 >= min_x && x0 <= max_x; - } else { - visible = y1 >= min_y && y0 <= max_y; - } - - if (visible) { - nautilus_canvas_item_set_is_visible (icon->item, TRUE); - nautilus_canvas_container_prioritize_thumbnailing (container, - icon); - } else { - nautilus_canvas_item_set_is_visible (icon->item, FALSE); - } - } - } + GtkAdjustment *vadj, *hadj; + double min_y, max_y; + double min_x, max_x; + double x0, y0, x1, y1; + GList *node; + NautilusCanvasIcon *icon; + gboolean visible; + GtkAllocation allocation; + + hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (container)); + vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (container)); + gtk_widget_get_allocation (GTK_WIDGET (container), &allocation); + + min_x = gtk_adjustment_get_value (hadj); + max_x = min_x + allocation.width; + + min_y = gtk_adjustment_get_value (vadj); + max_y = min_y + allocation.height; + + eel_canvas_c2w (EEL_CANVAS (container), + min_x, min_y, &min_x, &min_y); + eel_canvas_c2w (EEL_CANVAS (container), + max_x, max_y, &max_x, &max_y); + + /* Do the iteration in reverse to get the render-order from top to + * bottom for the prioritized thumbnails. + */ + for (node = g_list_last (container->details->icons); node != NULL; node = node->prev) + { + icon = node->data; + + if (icon_is_positioned (icon)) + { + eel_canvas_item_get_bounds (EEL_CANVAS_ITEM (icon->item), + &x0, + &y0, + &x1, + &y1); + eel_canvas_item_i2w (EEL_CANVAS_ITEM (icon->item)->parent, + &x0, + &y0); + eel_canvas_item_i2w (EEL_CANVAS_ITEM (icon->item)->parent, + &x1, + &y1); + + if (nautilus_canvas_container_is_layout_vertical (container)) + { + visible = x1 >= min_x && x0 <= max_x; + } + else + { + visible = y1 >= min_y && y0 <= max_y; + } + + if (visible) + { + nautilus_canvas_item_set_is_visible (icon->item, TRUE); + nautilus_canvas_container_prioritize_thumbnailing (container, + icon); + } + else + { + nautilus_canvas_item_set_is_visible (icon->item, FALSE); + } + } + } } static void -handle_vadjustment_changed (GtkAdjustment *adjustment, - NautilusCanvasContainer *container) +handle_vadjustment_changed (GtkAdjustment *adjustment, + NautilusCanvasContainer *container) { - if (!nautilus_canvas_container_is_layout_vertical (container)) { - nautilus_canvas_container_update_visible_icons (container); - } + if (!nautilus_canvas_container_is_layout_vertical (container)) + { + nautilus_canvas_container_update_visible_icons (container); + } } static void -handle_hadjustment_changed (GtkAdjustment *adjustment, - NautilusCanvasContainer *container) +handle_hadjustment_changed (GtkAdjustment *adjustment, + NautilusCanvasContainer *container) { - if (nautilus_canvas_container_is_layout_vertical (container)) { - nautilus_canvas_container_update_visible_icons (container); - } + if (nautilus_canvas_container_is_layout_vertical (container)) + { + nautilus_canvas_container_update_visible_icons (container); + } } -void +void nautilus_canvas_container_update_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - NautilusCanvasContainerDetails *details; - guint icon_size; - guint min_image_size, max_image_size; - NautilusIconInfo *icon_info; - GdkPixbuf *pixbuf; - char *editable_text, *additional_text; - - if (icon == NULL) { - return; - } + NautilusCanvasContainerDetails *details; + guint icon_size; + guint min_image_size, max_image_size; + NautilusIconInfo *icon_info; + GdkPixbuf *pixbuf; + char *editable_text, *additional_text; + + if (icon == NULL) + { + return; + } - details = container->details; + details = container->details; - /* compute the maximum size based on the scale factor */ - min_image_size = MINIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit; - max_image_size = MAX (MAXIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit, NAUTILUS_ICON_MAXIMUM_SIZE); + /* compute the maximum size based on the scale factor */ + min_image_size = MINIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit; + max_image_size = MAX (MAXIMUM_IMAGE_SIZE * EEL_CANVAS (container)->pixels_per_unit, NAUTILUS_ICON_MAXIMUM_SIZE); - /* Get the appropriate images for the file. */ - icon_get_size (container, icon, &icon_size); + /* Get the appropriate images for the file. */ + icon_get_size (container, icon, &icon_size); - icon_size = MAX (icon_size, min_image_size); - icon_size = MIN (icon_size, max_image_size); + icon_size = MAX (icon_size, min_image_size); + icon_size = MIN (icon_size, max_image_size); - DEBUG ("Icon size, getting for size %d", icon_size); + DEBUG ("Icon size, getting for size %d", icon_size); - /* Get the icons. */ - icon_info = nautilus_canvas_container_get_icon_images (container, icon->data, icon_size, - icon == details->drop_target); + /* Get the icons. */ + icon_info = nautilus_canvas_container_get_icon_images (container, icon->data, icon_size, + icon == details->drop_target); - pixbuf = nautilus_icon_info_get_pixbuf (icon_info); - g_object_unref (icon_info); - - nautilus_canvas_container_get_icon_text (container, - icon->data, - &editable_text, - &additional_text, - FALSE); + pixbuf = nautilus_icon_info_get_pixbuf (icon_info); + g_object_unref (icon_info); - eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), - "editable_text", editable_text, - "additional_text", additional_text, - "highlighted_for_drop", icon == details->drop_target, - NULL); + nautilus_canvas_container_get_icon_text (container, + icon->data, + &editable_text, + &additional_text, + FALSE); - nautilus_canvas_item_set_image (icon->item, pixbuf); + eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), + "editable_text", editable_text, + "additional_text", additional_text, + "highlighted_for_drop", icon == details->drop_target, + NULL); - /* Let the pixbufs go. */ - g_object_unref (pixbuf); + nautilus_canvas_item_set_image (icon->item, pixbuf); - g_free (editable_text); - g_free (additional_text); + /* Let the pixbufs go. */ + g_object_unref (pixbuf); + + g_free (editable_text); + g_free (additional_text); } static gboolean assign_icon_position (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) -{ - gboolean have_stored_position; - NautilusCanvasPosition position; - - /* Get the stored position. */ - have_stored_position = FALSE; - position.scale = 1.0; - g_signal_emit (container, - signals[GET_STORED_ICON_POSITION], 0, - icon->data, - &position, - &have_stored_position); - icon->scale = position.scale; - if (!container->details->auto_layout) { - if (have_stored_position) { - icon_set_position (icon, position.x, position.y); - icon->saved_ltr_x = icon->x; - } else { - return FALSE; - } - } - return TRUE; + NautilusCanvasIcon *icon) +{ + gboolean have_stored_position; + NautilusCanvasPosition position; + + /* Get the stored position. */ + have_stored_position = FALSE; + position.scale = 1.0; + g_signal_emit (container, + signals[GET_STORED_ICON_POSITION], 0, + icon->data, + &position, + &have_stored_position); + icon->scale = position.scale; + if (!container->details->auto_layout) + { + if (have_stored_position) + { + icon_set_position (icon, position.x, position.y); + icon->saved_ltr_x = icon->x; + } + else + { + return FALSE; + } + } + return TRUE; } static void finish_adding_icon (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - nautilus_canvas_container_update_icon (container, icon); - eel_canvas_item_show (EEL_CANVAS_ITEM (icon->item)); + nautilus_canvas_container_update_icon (container, icon); + eel_canvas_item_show (EEL_CANVAS_ITEM (icon->item)); - g_signal_connect_object (icon->item, "event", - G_CALLBACK (item_event_callback), container, 0); + g_signal_connect_object (icon->item, "event", + G_CALLBACK (item_event_callback), container, 0); - g_signal_emit (container, signals[ICON_ADDED], 0, icon->data); + g_signal_emit (container, signals[ICON_ADDED], 0, icon->data); } static gboolean finish_adding_new_icons (NautilusCanvasContainer *container) { - GList *p, *new_icons, *no_position_icons, *semi_position_icons; - NautilusCanvasIcon *icon; - double bottom; - - new_icons = container->details->new_icons; - container->details->new_icons = NULL; - - /* Position most icons (not unpositioned manual-layout icons). */ - new_icons = g_list_reverse (new_icons); - no_position_icons = semi_position_icons = NULL; - for (p = new_icons; p != NULL; p = p->next) { - icon = p->data; - if (icon->has_lazy_position) { - assign_icon_position (container, icon); - semi_position_icons = g_list_prepend (semi_position_icons, icon); - } else if (!assign_icon_position (container, icon)) { - no_position_icons = g_list_prepend (no_position_icons, icon); - } - - finish_adding_icon (container, icon); - } - g_list_free (new_icons); - - if (semi_position_icons != NULL) { - PlacementGrid *grid; - time_t now; - gboolean dummy; - - g_assert (!container->details->auto_layout); - - semi_position_icons = g_list_reverse (semi_position_icons); - - /* This is currently only used on the desktop. - * Thus, we pass FALSE for tight, like lay_down_icons_tblr */ - grid = placement_grid_new (container, FALSE); - - /* we can do nothing, just return */ - if (grid == NULL) - return FALSE; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - if (icon_is_positioned (icon) && !icon->has_lazy_position) { - placement_grid_mark_icon (grid, icon); - } - } - - now = time (NULL); - - for (p = semi_position_icons; p != NULL; p = p->next) { - NautilusCanvasIcon *icon; - NautilusCanvasPosition position; - int x, y; - - icon = p->data; - x = icon->x; - y = icon->y; - - find_empty_location (container, grid, - icon, x, y, &x, &y); - - icon_set_position (icon, x, y); - - position.x = icon->x; - position.y = icon->y; - position.scale = icon->scale; - placement_grid_mark_icon (grid, icon); - g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0, - icon->data, &position); - g_signal_emit (container, signals[STORE_LAYOUT_TIMESTAMP], 0, - icon->data, &now, &dummy); - - /* ensure that next time we run this code, the formerly semi-positioned - * icons are treated as being positioned. */ - icon->has_lazy_position = FALSE; - } - - placement_grid_free (grid); - - g_list_free (semi_position_icons); - } - - /* Position the unpositioned manual layout icons. */ - if (no_position_icons != NULL) { - g_assert (!container->details->auto_layout); - - sort_icons (container, &no_position_icons); - if (nautilus_canvas_container_get_is_desktop (container)) { - lay_down_icons (container, no_position_icons, CONTAINER_PAD_TOP); - } else { - get_all_icon_bounds (container, NULL, NULL, NULL, &bottom, BOUNDS_USAGE_FOR_LAYOUT); - lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM); - } - g_list_free (no_position_icons); - } - - if (container->details->store_layout_timestamps_when_finishing_new_icons) { - store_layout_timestamps_now (container); - container->details->store_layout_timestamps_when_finishing_new_icons = FALSE; - } + GList *p, *new_icons, *no_position_icons, *semi_position_icons; + NautilusCanvasIcon *icon; + double bottom; + + new_icons = container->details->new_icons; + container->details->new_icons = NULL; + + /* Position most icons (not unpositioned manual-layout icons). */ + new_icons = g_list_reverse (new_icons); + no_position_icons = semi_position_icons = NULL; + for (p = new_icons; p != NULL; p = p->next) + { + icon = p->data; + if (icon->has_lazy_position) + { + assign_icon_position (container, icon); + semi_position_icons = g_list_prepend (semi_position_icons, icon); + } + else if (!assign_icon_position (container, icon)) + { + no_position_icons = g_list_prepend (no_position_icons, icon); + } - return TRUE; + finish_adding_icon (container, icon); + } + g_list_free (new_icons); + + if (semi_position_icons != NULL) + { + PlacementGrid *grid; + time_t now; + gboolean dummy; + + g_assert (!container->details->auto_layout); + + semi_position_icons = g_list_reverse (semi_position_icons); + + /* This is currently only used on the desktop. + * Thus, we pass FALSE for tight, like lay_down_icons_tblr */ + grid = placement_grid_new (container, FALSE); + + /* we can do nothing, just return */ + if (grid == NULL) + { + return FALSE; + } + + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + + if (icon_is_positioned (icon) && !icon->has_lazy_position) + { + placement_grid_mark_icon (grid, icon); + } + } + + now = time (NULL); + + for (p = semi_position_icons; p != NULL; p = p->next) + { + NautilusCanvasIcon *icon; + NautilusCanvasPosition position; + int x, y; + + icon = p->data; + x = icon->x; + y = icon->y; + + find_empty_location (container, grid, + icon, x, y, &x, &y); + + icon_set_position (icon, x, y); + + position.x = icon->x; + position.y = icon->y; + position.scale = icon->scale; + placement_grid_mark_icon (grid, icon); + g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0, + icon->data, &position); + g_signal_emit (container, signals[STORE_LAYOUT_TIMESTAMP], 0, + icon->data, &now, &dummy); + + /* ensure that next time we run this code, the formerly semi-positioned + * icons are treated as being positioned. */ + icon->has_lazy_position = FALSE; + } + + placement_grid_free (grid); + + g_list_free (semi_position_icons); + } + + /* Position the unpositioned manual layout icons. */ + if (no_position_icons != NULL) + { + g_assert (!container->details->auto_layout); + + sort_icons (container, &no_position_icons); + if (nautilus_canvas_container_get_is_desktop (container)) + { + lay_down_icons (container, no_position_icons, CONTAINER_PAD_TOP); + } + else + { + get_all_icon_bounds (container, NULL, NULL, NULL, &bottom, BOUNDS_USAGE_FOR_LAYOUT); + lay_down_icons (container, no_position_icons, bottom + ICON_PAD_BOTTOM); + } + g_list_free (no_position_icons); + } + + if (container->details->store_layout_timestamps_when_finishing_new_icons) + { + store_layout_timestamps_now (container); + container->details->store_layout_timestamps_when_finishing_new_icons = FALSE; + } + + return TRUE; } static gboolean is_old_or_unknown_icon_data (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) + NautilusCanvasIconData *data) { - time_t timestamp; - gboolean success; + time_t timestamp; + gboolean success; - if (container->details->layout_timestamp == UNDEFINED_TIME) { - /* don't know */ - return FALSE; - } + if (container->details->layout_timestamp == UNDEFINED_TIME) + { + /* don't know */ + return FALSE; + } - g_signal_emit (container, - signals[GET_STORED_LAYOUT_TIMESTAMP], 0, - data, ×tamp, &success); - return (!success || timestamp < container->details->layout_timestamp); + g_signal_emit (container, + signals[GET_STORED_LAYOUT_TIMESTAMP], 0, + data, ×tamp, &success); + return (!success || timestamp < container->details->layout_timestamp); } /** * nautilus_canvas_container_add: * @container: A NautilusCanvasContainer * @data: Icon data. - * + * * Add icon to represent @data to container. * Returns FALSE if there was already such an icon. **/ gboolean nautilus_canvas_container_add (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) -{ - NautilusCanvasContainerDetails *details; - NautilusCanvasIcon *icon; - EelCanvasItem *band, *item; - - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - g_return_val_if_fail (data != NULL, FALSE); - - details = container->details; - - if (g_hash_table_lookup (details->icon_set, data) != NULL) { - return FALSE; - } - - /* Create the new icon, including the canvas item. */ - icon = g_new0 (NautilusCanvasIcon, 1); - icon->data = data; - icon->x = ICON_UNPOSITIONED_VALUE; - icon->y = ICON_UNPOSITIONED_VALUE; - - /* Whether the saved icon position should only be used - * if the previous icon position is free. If the position - * is occupied, another position near the last one will - */ - icon->has_lazy_position = is_old_or_unknown_icon_data (container, data); - icon->scale = 1.0; - icon->item = NAUTILUS_CANVAS_ITEM - (eel_canvas_item_new (EEL_CANVAS_GROUP (EEL_CANVAS (container)->root), - nautilus_canvas_item_get_type (), - "visible", FALSE, - NULL)); - icon->item->user_data = icon; - - /* Make sure the icon is under the selection_rectangle */ - item = EEL_CANVAS_ITEM (icon->item); - band = NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle; - if (band) { - eel_canvas_item_send_behind (item, band); - } - - /* Put it on both lists. */ - details->icons = g_list_prepend (details->icons, icon); - details->new_icons = g_list_prepend (details->new_icons, icon); - - g_hash_table_insert (details->icon_set, data, icon); - - details->needs_resort = TRUE; - - /* Run an idle function to add the icons. */ - schedule_redo_layout (container); - - return TRUE; + NautilusCanvasIconData *data) +{ + NautilusCanvasContainerDetails *details; + NautilusCanvasIcon *icon; + EelCanvasItem *band, *item; + + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (data != NULL, FALSE); + + details = container->details; + + if (g_hash_table_lookup (details->icon_set, data) != NULL) + { + return FALSE; + } + + /* Create the new icon, including the canvas item. */ + icon = g_new0 (NautilusCanvasIcon, 1); + icon->data = data; + icon->x = ICON_UNPOSITIONED_VALUE; + icon->y = ICON_UNPOSITIONED_VALUE; + + /* Whether the saved icon position should only be used + * if the previous icon position is free. If the position + * is occupied, another position near the last one will + */ + icon->has_lazy_position = is_old_or_unknown_icon_data (container, data); + icon->scale = 1.0; + icon->item = NAUTILUS_CANVAS_ITEM + (eel_canvas_item_new (EEL_CANVAS_GROUP (EEL_CANVAS (container)->root), + nautilus_canvas_item_get_type (), + "visible", FALSE, + NULL)); + icon->item->user_data = icon; + + /* Make sure the icon is under the selection_rectangle */ + item = EEL_CANVAS_ITEM (icon->item); + band = NAUTILUS_CANVAS_CONTAINER (item->canvas)->details->rubberband_info.selection_rectangle; + if (band) + { + eel_canvas_item_send_behind (item, band); + } + + /* Put it on both lists. */ + details->icons = g_list_prepend (details->icons, icon); + details->new_icons = g_list_prepend (details->new_icons, icon); + + g_hash_table_insert (details->icon_set, data, icon); + + details->needs_resort = TRUE; + + /* Run an idle function to add the icons. */ + schedule_redo_layout (container); + + return TRUE; } void nautilus_canvas_container_layout_now (NautilusCanvasContainer *container) { - if (container->details->idle_id != 0) { - unschedule_redo_layout (container); - redo_layout_internal (container); - } + if (container->details->idle_id != 0) + { + unschedule_redo_layout (container); + redo_layout_internal (container); + } - /* Also need to make sure we're properly resized, for instance - * newly added files may trigger a change in the size allocation and - * thus toggle scrollbars on */ - gtk_container_check_resize (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET (container)))); + /* Also need to make sure we're properly resized, for instance + * newly added files may trigger a change in the size allocation and + * thus toggle scrollbars on */ + gtk_container_check_resize (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET (container)))); } /** * nautilus_canvas_container_remove: * @container: A NautilusCanvasContainer. * @data: Icon data. - * + * * Remove the icon with this data. **/ gboolean nautilus_canvas_container_remove (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) + NautilusCanvasIconData *data) { - NautilusCanvasIcon *icon; + NautilusCanvasIcon *icon; - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (data != NULL, FALSE); - icon = g_hash_table_lookup (container->details->icon_set, data); + icon = g_hash_table_lookup (container->details->icon_set, data); - if (icon == NULL) { - return FALSE; - } + if (icon == NULL) + { + return FALSE; + } - icon_destroy (container, icon); - schedule_redo_layout (container); + icon_destroy (container, icon); + schedule_redo_layout (container); - g_signal_emit (container, signals[ICON_REMOVED], 0, icon); + g_signal_emit (container, signals[ICON_REMOVED], 0, icon); - return TRUE; + return TRUE; } /** * nautilus_canvas_container_request_update: * @container: A NautilusCanvasContainer. * @data: Icon data. - * + * * Update the icon with this data. **/ void nautilus_canvas_container_request_update (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) + NautilusCanvasIconData *data) { - NautilusCanvasIcon *icon; + NautilusCanvasIcon *icon; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_return_if_fail (data != NULL); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (data != NULL); - icon = g_hash_table_lookup (container->details->icon_set, data); + icon = g_hash_table_lookup (container->details->icon_set, data); - if (icon != NULL) { - nautilus_canvas_container_update_icon (container, icon); - container->details->needs_resort = TRUE; - schedule_redo_layout (container); - } + if (icon != NULL) + { + nautilus_canvas_container_update_icon (container, icon); + container->details->needs_resort = TRUE; + schedule_redo_layout (container); + } } /* zooming */ @@ -6258,49 +6988,54 @@ nautilus_canvas_container_request_update (NautilusCanvasContainer *container, NautilusCanvasZoomLevel nautilus_canvas_container_get_zoom_level (NautilusCanvasContainer *container) { - return container->details->zoom_level; + return container->details->zoom_level; } void -nautilus_canvas_container_set_zoom_level (NautilusCanvasContainer *container, int new_level) -{ - NautilusCanvasContainerDetails *details; - int pinned_level; - double pixels_per_unit; - - details = container->details; - - pinned_level = new_level; - if (pinned_level < NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL) { - pinned_level = NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL; - } else if (pinned_level > NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER) { - pinned_level = NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER; - } - - if (pinned_level == details->zoom_level) { - return; - } - - details->zoom_level = pinned_level; - - pixels_per_unit = (double) nautilus_canvas_container_get_icon_size_for_zoom_level (pinned_level) - / NAUTILUS_CANVAS_ICON_SIZE_STANDARD; - eel_canvas_set_pixels_per_unit (EEL_CANVAS (container), pixels_per_unit); - - nautilus_canvas_container_request_update_all_internal (container, TRUE); +nautilus_canvas_container_set_zoom_level (NautilusCanvasContainer *container, + int new_level) +{ + NautilusCanvasContainerDetails *details; + int pinned_level; + double pixels_per_unit; + + details = container->details; + + pinned_level = new_level; + if (pinned_level < NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL) + { + pinned_level = NAUTILUS_CANVAS_ZOOM_LEVEL_SMALL; + } + else if (pinned_level > NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER) + { + pinned_level = NAUTILUS_CANVAS_ZOOM_LEVEL_LARGER; + } + + if (pinned_level == details->zoom_level) + { + return; + } + + details->zoom_level = pinned_level; + + pixels_per_unit = (double) nautilus_canvas_container_get_icon_size_for_zoom_level (pinned_level) + / NAUTILUS_CANVAS_ICON_SIZE_STANDARD; + eel_canvas_set_pixels_per_unit (EEL_CANVAS (container), pixels_per_unit); + + nautilus_canvas_container_request_update_all_internal (container, TRUE); } /** * nautilus_canvas_container_request_update_all: * For each icon, synchronizes the displayed information (image, text) with the * information from the model. - * + * * @container: An canvas container. **/ void nautilus_canvas_container_request_update_all (NautilusCanvasContainer *container) { - nautilus_canvas_container_request_update_all_internal (container, FALSE); + nautilus_canvas_container_request_update_all_internal (container, FALSE); } /** @@ -6308,26 +7043,28 @@ nautilus_canvas_container_request_update_all (NautilusCanvasContainer *container * Change scroll position as necessary to reveal the specified item. */ void -nautilus_canvas_container_reveal (NautilusCanvasContainer *container, NautilusCanvasIconData *data) +nautilus_canvas_container_reveal (NautilusCanvasContainer *container, + NautilusCanvasIconData *data) { - NautilusCanvasIcon *icon; + NautilusCanvasIcon *icon; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_return_if_fail (data != NULL); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (data != NULL); - icon = g_hash_table_lookup (container->details->icon_set, data); + icon = g_hash_table_lookup (container->details->icon_set, data); - if (icon != NULL) { - reveal_icon (container, icon); - } + if (icon != NULL) + { + reveal_icon (container, icon); + } } /** * nautilus_canvas_container_get_selection: * @container: An canvas container. - * + * * Get a list of the icons currently selected in @container. - * + * * Return value: A GList of the programmer-specified data associated to each * selected icon, or NULL if no canvas is selected. The caller is expected to * free the list when it is not needed anymore. @@ -6335,80 +7072,85 @@ nautilus_canvas_container_reveal (NautilusCanvasContainer *container, NautilusCa GList * nautilus_canvas_container_get_selection (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); - if (container->details->selection_needs_resort) { - sort_selection (container); - } + if (container->details->selection_needs_resort) + { + sort_selection (container); + } - return g_list_copy (container->details->selection); + return g_list_copy (container->details->selection); } static GList * nautilus_canvas_container_get_selected_icons (NautilusCanvasContainer *container) { - GList *list, *p; + GList *list, *p; - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); - list = NULL; - for (p = container->details->icons; p != NULL; p = p->next) { - NautilusCanvasIcon *icon; + list = NULL; + for (p = container->details->icons; p != NULL; p = p->next) + { + NautilusCanvasIcon *icon; - icon = p->data; - if (icon->is_selected) { - list = g_list_prepend (list, icon); - } - } + icon = p->data; + if (icon->is_selected) + { + list = g_list_prepend (list, icon); + } + } - return g_list_reverse (list); + return g_list_reverse (list); } /** * nautilus_canvas_container_invert_selection: * @container: An canvas container. - * + * * Inverts the selection in @container. - * + * **/ void nautilus_canvas_container_invert_selection (NautilusCanvasContainer *container) { - GList *p; + GList *p; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - for (p = container->details->icons; p != NULL; p = p->next) { - NautilusCanvasIcon *icon; + for (p = container->details->icons; p != NULL; p = p->next) + { + NautilusCanvasIcon *icon; - icon = p->data; - icon_toggle_selected (container, icon); - } + icon = p->data; + icon_toggle_selected (container, icon); + } - g_signal_emit (container, signals[SELECTION_CHANGED], 0); + g_signal_emit (container, signals[SELECTION_CHANGED], 0); } /* Returns an array of GdkPoints of locations of the icons. */ static GArray * nautilus_canvas_container_get_icon_locations (NautilusCanvasContainer *container, - GList *icons) + GList *icons) { - GArray *result; - GList *node; - int index; - - result = g_array_new (FALSE, TRUE, sizeof (GdkPoint)); - result = g_array_set_size (result, g_list_length (icons)); - - for (index = 0, node = icons; node != NULL; index++, node = node->next) { - g_array_index (result, GdkPoint, index).x = - ((NautilusCanvasIcon *)node->data)->x; - g_array_index (result, GdkPoint, index).y = - ((NautilusCanvasIcon *)node->data)->y; - } + GArray *result; + GList *node; + int index; + + result = g_array_new (FALSE, TRUE, sizeof (GdkPoint)); + result = g_array_set_size (result, g_list_length (icons)); - return result; + for (index = 0, node = icons; node != NULL; index++, node = node->next) + { + g_array_index (result, GdkPoint, index).x = + ((NautilusCanvasIcon *) node->data)->x; + g_array_index (result, GdkPoint, index).y = + ((NautilusCanvasIcon *) node->data)->y; + } + + return result; } /* Returns an array of GdkRectangles of the icons. The bounding box is adjusted @@ -6417,515 +7159,550 @@ static GArray * nautilus_canvas_container_get_icons_bounding_box (NautilusCanvasContainer *container, GList *icons) { - GArray *result; - GList *node; - int index; - int x1, x2, y1, y2; + GArray *result; + GList *node; + int index; + int x1, x2, y1, y2; - result = g_array_new (FALSE, TRUE, sizeof (GdkRectangle)); - result = g_array_set_size (result, g_list_length (icons)); + result = g_array_new (FALSE, TRUE, sizeof (GdkRectangle)); + result = g_array_set_size (result, g_list_length (icons)); - for (index = 0, node = icons; node != NULL; index++, node = node->next) { - icon_get_bounding_box ((NautilusCanvasIcon *)node->data, - &x1, &y1, &x2, &y2, - BOUNDS_USAGE_FOR_DISPLAY); - g_array_index (result, GdkRectangle, index).x = x1 * EEL_CANVAS (container)->pixels_per_unit + - container->details->left_margin; - g_array_index (result, GdkRectangle, index).width = (x2 - x1) * EEL_CANVAS (container)->pixels_per_unit; - g_array_index (result, GdkRectangle, index).y = y1 * EEL_CANVAS (container)->pixels_per_unit + - container->details->top_margin; - g_array_index (result, GdkRectangle, index).height = (y2 - y1) * EEL_CANVAS (container)->pixels_per_unit; - } + for (index = 0, node = icons; node != NULL; index++, node = node->next) + { + icon_get_bounding_box ((NautilusCanvasIcon *) node->data, + &x1, &y1, &x2, &y2, + BOUNDS_USAGE_FOR_DISPLAY); + g_array_index (result, GdkRectangle, index).x = x1 * EEL_CANVAS (container)->pixels_per_unit + + container->details->left_margin; + g_array_index (result, GdkRectangle, index).width = (x2 - x1) * EEL_CANVAS (container)->pixels_per_unit; + g_array_index (result, GdkRectangle, index).y = y1 * EEL_CANVAS (container)->pixels_per_unit + + container->details->top_margin; + g_array_index (result, GdkRectangle, index).height = (y2 - y1) * EEL_CANVAS (container)->pixels_per_unit; + } - return result; + return result; } GArray * nautilus_canvas_container_get_selected_icons_bounding_box (NautilusCanvasContainer *container) { - GArray *result; - GList *icons; + GArray *result; + GList *icons; - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); - icons = nautilus_canvas_container_get_selected_icons (container); - result = nautilus_canvas_container_get_icons_bounding_box (container, icons); - g_list_free (icons); + icons = nautilus_canvas_container_get_selected_icons (container); + result = nautilus_canvas_container_get_icons_bounding_box (container, icons); + g_list_free (icons); - return result; + return result; } /** * nautilus_canvas_container_get_selected_icon_locations: * @container: An canvas container widget. - * + * * Returns an array of GdkPoints of locations of the selected icons. **/ GArray * nautilus_canvas_container_get_selected_icon_locations (NautilusCanvasContainer *container) { - GArray *result; - GList *icons; + GArray *result; + GList *icons; + + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL); + icons = nautilus_canvas_container_get_selected_icons (container); + result = nautilus_canvas_container_get_icon_locations (container, icons); + g_list_free (icons); - icons = nautilus_canvas_container_get_selected_icons (container); - result = nautilus_canvas_container_get_icon_locations (container, icons); - g_list_free (icons); - - return result; + return result; } /** * nautilus_canvas_container_select_all: * @container: An canvas container widget. - * + * * Select all the icons in @container at once. **/ void nautilus_canvas_container_select_all (NautilusCanvasContainer *container) { - gboolean selection_changed; - GList *p; - NautilusCanvasIcon *icon; + gboolean selection_changed; + GList *p; + NautilusCanvasIcon *icon; + + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + selection_changed = FALSE; - selection_changed = FALSE; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - selection_changed |= icon_set_selected (container, icon, TRUE); - } + selection_changed |= icon_set_selected (container, icon, TRUE); + } - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } /** * nautilus_canvas_container_select_first: * @container: An canvas container widget. - * + * * Select the first icon in @container. **/ void nautilus_canvas_container_select_first (NautilusCanvasContainer *container) { - gboolean selection_changed; - NautilusCanvasIcon *icon; + gboolean selection_changed; + NautilusCanvasIcon *icon; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - selection_changed = FALSE; + selection_changed = FALSE; - if (container->details->needs_resort) { - resort (container); - container->details->needs_resort = FALSE; - } + if (container->details->needs_resort) + { + resort (container); + container->details->needs_resort = FALSE; + } - icon = g_list_nth_data (container->details->icons, 0); - if (icon) { - selection_changed |= icon_set_selected (container, icon, TRUE); - } + icon = g_list_nth_data (container->details->icons, 0); + if (icon) + { + selection_changed |= icon_set_selected (container, icon, TRUE); + } - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } /** * nautilus_canvas_container_set_selection: * @container: An canvas container widget. * @selection: A list of NautilusCanvasIconData *. - * + * * Set the selection to exactly the icons in @container which have * programmer data matching one of the items in @selection. **/ void nautilus_canvas_container_set_selection (NautilusCanvasContainer *container, - GList *selection) -{ - gboolean selection_changed; - GHashTable *hash; - GList *p; - gboolean res; - NautilusCanvasIcon *icon, *selected_icon; - - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - - selection_changed = FALSE; - selected_icon = NULL; - - hash = g_hash_table_new (NULL, NULL); - for (p = selection; p != NULL; p = p->next) { - g_hash_table_insert (hash, p->data, p->data); - } - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - res = icon_set_selected - (container, icon, - g_hash_table_lookup (hash, icon->data) != NULL); - selection_changed |= res; - - if (res) { - selected_icon = icon; - } - } - g_hash_table_destroy (hash); - - if (selection_changed) { - /* if only one item has been selected, use it as range - * selection base (cf. handle_canvas_button_press) */ - if (g_list_length (selection) == 1) { - container->details->range_selection_base_icon = selected_icon; - } - - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + GList *selection) +{ + gboolean selection_changed; + GHashTable *hash; + GList *p; + gboolean res; + NautilusCanvasIcon *icon, *selected_icon; + + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + + selection_changed = FALSE; + selected_icon = NULL; + + hash = g_hash_table_new (NULL, NULL); + for (p = selection; p != NULL; p = p->next) + { + g_hash_table_insert (hash, p->data, p->data); + } + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + + res = icon_set_selected + (container, icon, + g_hash_table_lookup (hash, icon->data) != NULL); + selection_changed |= res; + + if (res) + { + selected_icon = icon; + } + } + g_hash_table_destroy (hash); + + if (selection_changed) + { + /* if only one item has been selected, use it as range + * selection base (cf. handle_canvas_button_press) */ + if (g_list_length (selection) == 1) + { + container->details->range_selection_base_icon = selected_icon; + } + + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } /** * nautilus_canvas_container_select_list_unselect_others. * @container: An canvas container widget. * @selection: A list of NautilusCanvasIcon *. - * + * * Set the selection to exactly the icons in @selection. **/ void nautilus_canvas_container_select_list_unselect_others (NautilusCanvasContainer *container, - GList *selection) + GList *selection) { - gboolean selection_changed; - GHashTable *hash; - GList *p; - NautilusCanvasIcon *icon; + gboolean selection_changed; + GHashTable *hash; + GList *p; + NautilusCanvasIcon *icon; - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - selection_changed = FALSE; + selection_changed = FALSE; - hash = g_hash_table_new (NULL, NULL); - for (p = selection; p != NULL; p = p->next) { - g_hash_table_insert (hash, p->data, p->data); - } - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - - selection_changed |= icon_set_selected - (container, icon, - g_hash_table_lookup (hash, icon) != NULL); - } - g_hash_table_destroy (hash); + hash = g_hash_table_new (NULL, NULL); + for (p = selection; p != NULL; p = p->next) + { + g_hash_table_insert (hash, p->data, p->data); + } + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - if (selection_changed) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + selection_changed |= icon_set_selected + (container, icon, + g_hash_table_lookup (hash, icon) != NULL); + } + g_hash_table_destroy (hash); + + if (selection_changed) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } /** * nautilus_canvas_container_unselect_all: * @container: An canvas container widget. - * + * * Deselect all the icons in @container. **/ void nautilus_canvas_container_unselect_all (NautilusCanvasContainer *container) { - if (unselect_all (container)) { - g_signal_emit (container, - signals[SELECTION_CHANGED], 0); - } + if (unselect_all (container)) + { + g_signal_emit (container, + signals[SELECTION_CHANGED], 0); + } } /** * nautilus_canvas_container_get_icon_by_uri: * @container: An canvas container widget. * @uri: The uri of an canvas to find. - * + * * Locate an icon, given the URI. The URI must match exactly. * Later we may have to have some way of figuring out if the * URI specifies the same object that does not require an exact match. **/ NautilusCanvasIcon * nautilus_canvas_container_get_icon_by_uri (NautilusCanvasContainer *container, - const char *uri) + const char *uri) { - NautilusCanvasContainerDetails *details; - GList *p; + NautilusCanvasContainerDetails *details; + GList *p; - /* Eventually, we must avoid searching the entire canvas list, - but it's OK for now. - A hash table mapping uri to canvas is one possibility. - */ + /* Eventually, we must avoid searching the entire canvas list, + * but it's OK for now. + * A hash table mapping uri to canvas is one possibility. + */ - details = container->details; + details = container->details; - for (p = details->icons; p != NULL; p = p->next) { - NautilusCanvasIcon *icon; - char *icon_uri; - gboolean is_match; + for (p = details->icons; p != NULL; p = p->next) + { + NautilusCanvasIcon *icon; + char *icon_uri; + gboolean is_match; - icon = p->data; + icon = p->data; - icon_uri = nautilus_canvas_container_get_icon_uri - (container, icon); - is_match = strcmp (uri, icon_uri) == 0; - g_free (icon_uri); + icon_uri = nautilus_canvas_container_get_icon_uri + (container, icon); + is_match = strcmp (uri, icon_uri) == 0; + g_free (icon_uri); - if (is_match) { - return icon; - } - } + if (is_match) + { + return icon; + } + } - return NULL; + return NULL; } static NautilusCanvasIcon * -get_nth_selected_icon (NautilusCanvasContainer *container, int index) -{ - GList *p; - NautilusCanvasIcon *icon; - int selection_count; - - g_assert (index > 0); - - /* Find the nth selected icon. */ - selection_count = 0; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - if (icon->is_selected) { - if (++selection_count == index) { - return icon; - } - } - } - return NULL; +get_nth_selected_icon (NautilusCanvasContainer *container, + int index) +{ + GList *p; + NautilusCanvasIcon *icon; + int selection_count; + + g_assert (index > 0); + + /* Find the nth selected icon. */ + selection_count = 0; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + if (icon->is_selected) + { + if (++selection_count == index) + { + return icon; + } + } + } + return NULL; } static NautilusCanvasIcon * get_first_selected_icon (NautilusCanvasContainer *container) { - return get_nth_selected_icon (container, 1); + return get_nth_selected_icon (container, 1); } static gboolean has_multiple_selection (NautilusCanvasContainer *container) { - return get_nth_selected_icon (container, 2) != NULL; + return get_nth_selected_icon (container, 2) != NULL; } static gboolean all_selected (NautilusCanvasContainer *container) { - GList *p; - NautilusCanvasIcon *icon; + GList *p; + NautilusCanvasIcon *icon; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - if (!icon->is_selected) { - return FALSE; - } - } - return TRUE; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + if (!icon->is_selected) + { + return FALSE; + } + } + return TRUE; } static gboolean has_selection (NautilusCanvasContainer *container) { - return get_nth_selected_icon (container, 1) != NULL; + return get_nth_selected_icon (container, 1) != NULL; } /** * nautilus_canvas_container_show_stretch_handles: * @container: An canvas container widget. - * + * * Makes stretch handles visible on the first selected icon. **/ void nautilus_canvas_container_show_stretch_handles (NautilusCanvasContainer *container) { - NautilusCanvasContainerDetails *details; - NautilusCanvasIcon *icon; - guint initial_size; - - icon = get_first_selected_icon (container); - if (icon == NULL) { - return; - } - - /* Check if it already has stretch handles. */ - details = container->details; - if (details->stretch_icon == icon) { - return; - } - - /* Get rid of the existing stretch handles and put them on the new canvas. */ - if (details->stretch_icon != NULL) { - nautilus_canvas_item_set_show_stretch_handles - (details->stretch_icon->item, FALSE); - ungrab_stretch_icon (container); - emit_stretch_ended (container, details->stretch_icon); - } - nautilus_canvas_item_set_show_stretch_handles (icon->item, TRUE); - details->stretch_icon = icon; - - icon_get_size (container, icon, &initial_size); - - /* only need to keep size in one dimension, since they are constrained to be the same */ - container->details->stretch_initial_x = icon->x; - container->details->stretch_initial_y = icon->y; - container->details->stretch_initial_size = initial_size; - - emit_stretch_started (container, icon); + NautilusCanvasContainerDetails *details; + NautilusCanvasIcon *icon; + guint initial_size; + + icon = get_first_selected_icon (container); + if (icon == NULL) + { + return; + } + + /* Check if it already has stretch handles. */ + details = container->details; + if (details->stretch_icon == icon) + { + return; + } + + /* Get rid of the existing stretch handles and put them on the new canvas. */ + if (details->stretch_icon != NULL) + { + nautilus_canvas_item_set_show_stretch_handles + (details->stretch_icon->item, FALSE); + ungrab_stretch_icon (container); + emit_stretch_ended (container, details->stretch_icon); + } + nautilus_canvas_item_set_show_stretch_handles (icon->item, TRUE); + details->stretch_icon = icon; + + icon_get_size (container, icon, &initial_size); + + /* only need to keep size in one dimension, since they are constrained to be the same */ + container->details->stretch_initial_x = icon->x; + container->details->stretch_initial_y = icon->y; + container->details->stretch_initial_size = initial_size; + + emit_stretch_started (container, icon); } /** * nautilus_canvas_container_has_stretch_handles * @container: An canvas container widget. - * + * * Returns true if the first selected item has stretch handles. **/ gboolean nautilus_canvas_container_has_stretch_handles (NautilusCanvasContainer *container) { - NautilusCanvasIcon *icon; + NautilusCanvasIcon *icon; - icon = get_first_selected_icon (container); - if (icon == NULL) { - return FALSE; - } + icon = get_first_selected_icon (container); + if (icon == NULL) + { + return FALSE; + } - return icon == container->details->stretch_icon; + return icon == container->details->stretch_icon; } /** * nautilus_canvas_container_is_stretched * @container: An canvas container widget. - * + * * Returns true if the any selected item is stretched to a size other than 1.0. **/ gboolean nautilus_canvas_container_is_stretched (NautilusCanvasContainer *container) { - GList *p; - NautilusCanvasIcon *icon; + GList *p; + NautilusCanvasIcon *icon; - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - if (icon->is_selected && icon->scale != 1.0) { - return TRUE; - } - } - return FALSE; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + if (icon->is_selected && icon->scale != 1.0) + { + return TRUE; + } + } + return FALSE; } /** * nautilus_canvas_container_unstretch * @container: An canvas container widget. - * + * * Gets rid of any canvas stretching. **/ void nautilus_canvas_container_unstretch (NautilusCanvasContainer *container) { - GList *p; - NautilusCanvasIcon *icon; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; - if (icon->is_selected) { - nautilus_canvas_container_move_icon (container, icon, - icon->x, icon->y, - 1.0, - FALSE, TRUE, TRUE); - } - } + GList *p; + NautilusCanvasIcon *icon; + + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; + if (icon->is_selected) + { + nautilus_canvas_container_move_icon (container, icon, + icon->x, icon->y, + 1.0, + FALSE, TRUE, TRUE); + } + } } static void compute_stretch (StretchState *start, - StretchState *current) -{ - gboolean right, bottom; - int x_stretch, y_stretch; - - /* FIXME bugzilla.gnome.org 45390: This doesn't correspond to - * the way the handles are drawn. - */ - /* Figure out which handle we are dragging. */ - right = start->pointer_x > start->icon_x + (int) start->icon_size / 2; - bottom = start->pointer_y > start->icon_y + (int) start->icon_size / 2; - - /* Figure out how big we should stretch. */ - x_stretch = start->pointer_x - current->pointer_x; - y_stretch = start->pointer_y - current->pointer_y; - if (right) { - x_stretch = - x_stretch; - } - if (bottom) { - y_stretch = - y_stretch; - } - current->icon_size = MAX ((int) start->icon_size + MIN (x_stretch, y_stretch), - (int) NAUTILUS_CANVAS_ICON_SIZE_SMALL); - - /* Figure out where the corner of the icon should be. */ - current->icon_x = start->icon_x; - if (!right) { - current->icon_x += start->icon_size - current->icon_size; - } - current->icon_y = start->icon_y; - if (!bottom) { - current->icon_y += start->icon_size - current->icon_size; - } + StretchState *current) +{ + gboolean right, bottom; + int x_stretch, y_stretch; + + /* FIXME bugzilla.gnome.org 45390: This doesn't correspond to + * the way the handles are drawn. + */ + /* Figure out which handle we are dragging. */ + right = start->pointer_x > start->icon_x + (int) start->icon_size / 2; + bottom = start->pointer_y > start->icon_y + (int) start->icon_size / 2; + + /* Figure out how big we should stretch. */ + x_stretch = start->pointer_x - current->pointer_x; + y_stretch = start->pointer_y - current->pointer_y; + if (right) + { + x_stretch = -x_stretch; + } + if (bottom) + { + y_stretch = -y_stretch; + } + current->icon_size = MAX ((int) start->icon_size + MIN (x_stretch, y_stretch), + (int) NAUTILUS_CANVAS_ICON_SIZE_SMALL); + + /* Figure out where the corner of the icon should be. */ + current->icon_x = start->icon_x; + if (!right) + { + current->icon_x += start->icon_size - current->icon_size; + } + current->icon_y = start->icon_y; + if (!bottom) + { + current->icon_y += start->icon_size - current->icon_size; + } } char * nautilus_canvas_container_get_icon_uri (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - char *uri; + char *uri; - uri = NULL; - g_signal_emit (container, - signals[GET_ICON_URI], 0, - icon->data, - &uri); - return uri; + uri = NULL; + g_signal_emit (container, + signals[GET_ICON_URI], 0, + icon->data, + &uri); + return uri; } char * nautilus_canvas_container_get_icon_activation_uri (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - char *uri; + char *uri; - uri = NULL; - g_signal_emit (container, - signals[GET_ICON_ACTIVATION_URI], 0, - icon->data, - &uri); - return uri; + uri = NULL; + g_signal_emit (container, + signals[GET_ICON_ACTIVATION_URI], 0, + icon->data, + &uri); + return uri; } char * nautilus_canvas_container_get_icon_drop_target_uri (NautilusCanvasContainer *container, - NautilusCanvasIcon *icon) + NautilusCanvasIcon *icon) { - char *uri; + char *uri; - uri = NULL; - g_signal_emit (container, - signals[GET_ICON_DROP_TARGET_URI], 0, - icon->data, - &uri); - return uri; + uri = NULL; + g_signal_emit (container, + signals[GET_ICON_DROP_TARGET_URI], 0, + icon->data, + &uri); + return uri; } /* Call to reset the scroll region only if the container is not empty, @@ -6934,9 +7711,10 @@ nautilus_canvas_container_get_icon_drop_target_uri (NautilusCanvasContainer *con static void reset_scroll_region_if_not_empty (NautilusCanvasContainer *container) { - if (!nautilus_canvas_container_is_empty (container)) { - nautilus_canvas_container_reset_scroll_region (container); - } + if (!nautilus_canvas_container_is_empty (container)) + { + nautilus_canvas_container_reset_scroll_region (container); + } } /* Switch from automatic layout to manual or vice versa. @@ -6945,79 +7723,87 @@ reset_scroll_region_if_not_empty (NautilusCanvasContainer *container) */ void nautilus_canvas_container_set_auto_layout (NautilusCanvasContainer *container, - gboolean auto_layout) + gboolean auto_layout) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - g_return_if_fail (auto_layout == FALSE || auto_layout == TRUE); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (auto_layout == FALSE || auto_layout == TRUE); - if (container->details->auto_layout == auto_layout) { - return; - } + if (container->details->auto_layout == auto_layout) + { + return; + } - reset_scroll_region_if_not_empty (container); - container->details->auto_layout = auto_layout; + reset_scroll_region_if_not_empty (container); + container->details->auto_layout = auto_layout; - if (!auto_layout) { - reload_icon_positions (container); - nautilus_canvas_container_freeze_icon_positions (container); - } + if (!auto_layout) + { + reload_icon_positions (container); + nautilus_canvas_container_freeze_icon_positions (container); + } - container->details->needs_resort = TRUE; - redo_layout (container); + container->details->needs_resort = TRUE; + redo_layout (container); - g_signal_emit (container, signals[LAYOUT_CHANGED], 0); + g_signal_emit (container, signals[LAYOUT_CHANGED], 0); } gboolean nautilus_canvas_container_is_keep_aligned (NautilusCanvasContainer *container) { - return container->details->keep_aligned; + return container->details->keep_aligned; } static gboolean align_icons_callback (gpointer callback_data) { - NautilusCanvasContainer *container; + NautilusCanvasContainer *container; - container = NAUTILUS_CANVAS_CONTAINER (callback_data); - align_icons (container); - container->details->align_idle_id = 0; + container = NAUTILUS_CANVAS_CONTAINER (callback_data); + align_icons (container); + container->details->align_idle_id = 0; - return FALSE; + return FALSE; } static void unschedule_align_icons (NautilusCanvasContainer *container) { - if (container->details->align_idle_id != 0) { - g_source_remove (container->details->align_idle_id); - container->details->align_idle_id = 0; - } + if (container->details->align_idle_id != 0) + { + g_source_remove (container->details->align_idle_id); + container->details->align_idle_id = 0; + } } static void schedule_align_icons (NautilusCanvasContainer *container) { - if (container->details->align_idle_id == 0 - && container->details->has_been_allocated) { - container->details->align_idle_id = g_idle_add - (align_icons_callback, container); - } + if (container->details->align_idle_id == 0 + && container->details->has_been_allocated) + { + container->details->align_idle_id = g_idle_add + (align_icons_callback, container); + } } void nautilus_canvas_container_set_keep_aligned (NautilusCanvasContainer *container, - gboolean keep_aligned) + gboolean keep_aligned) { - if (container->details->keep_aligned != keep_aligned) { - container->details->keep_aligned = keep_aligned; - - if (keep_aligned && !container->details->auto_layout) { - schedule_align_icons (container); - } else { - unschedule_align_icons (container); - } - } + if (container->details->keep_aligned != keep_aligned) + { + container->details->keep_aligned = keep_aligned; + + if (keep_aligned && !container->details->auto_layout) + { + schedule_align_icons (container); + } + else + { + unschedule_align_icons (container); + } + } } /* Switch from automatic to manual layout, freezing all the icons in their @@ -7027,142 +7813,147 @@ nautilus_canvas_container_set_keep_aligned (NautilusCanvasContainer *container, void nautilus_canvas_container_freeze_icon_positions (NautilusCanvasContainer *container) { - gboolean changed; - GList *p; - NautilusCanvasIcon *icon; - NautilusCanvasPosition position; + gboolean changed; + GList *p; + NautilusCanvasIcon *icon; + NautilusCanvasPosition position; - changed = container->details->auto_layout; - container->details->auto_layout = FALSE; - - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; + changed = container->details->auto_layout; + container->details->auto_layout = FALSE; - position.x = icon->saved_ltr_x; - position.y = icon->y; - position.scale = icon->scale; - g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0, - icon->data, &position); - } + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - if (changed) { - g_signal_emit (container, signals[LAYOUT_CHANGED], 0); - } + position.x = icon->saved_ltr_x; + position.y = icon->y; + position.scale = icon->scale; + g_signal_emit (container, signals[ICON_POSITION_CHANGED], 0, + icon->data, &position); + } + + if (changed) + { + g_signal_emit (container, signals[LAYOUT_CHANGED], 0); + } } /* Re-sort, switching to automatic layout if it was in manual layout. */ void nautilus_canvas_container_sort (NautilusCanvasContainer *container) { - gboolean changed; + gboolean changed; - changed = !container->details->auto_layout; - container->details->auto_layout = TRUE; + changed = !container->details->auto_layout; + container->details->auto_layout = TRUE; - reset_scroll_region_if_not_empty (container); - container->details->needs_resort = TRUE; - redo_layout (container); + reset_scroll_region_if_not_empty (container); + container->details->needs_resort = TRUE; + redo_layout (container); - if (changed) { - g_signal_emit (container, signals[LAYOUT_CHANGED], 0); - } + if (changed) + { + g_signal_emit (container, signals[LAYOUT_CHANGED], 0); + } } gboolean nautilus_canvas_container_is_auto_layout (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - return container->details->auto_layout; + return container->details->auto_layout; } void nautilus_canvas_container_set_single_click_mode (NautilusCanvasContainer *container, - gboolean single_click_mode) + gboolean single_click_mode) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - container->details->single_click_mode = single_click_mode; + container->details->single_click_mode = single_click_mode; } /* Return if the canvas container is a fixed size */ gboolean nautilus_canvas_container_get_is_fixed_size (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - return container->details->is_fixed_size; + return container->details->is_fixed_size; } /* Set the canvas container to be a fixed size */ void nautilus_canvas_container_set_is_fixed_size (NautilusCanvasContainer *container, - gboolean is_fixed_size) + gboolean is_fixed_size) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - container->details->is_fixed_size = is_fixed_size; + container->details->is_fixed_size = is_fixed_size; } gboolean nautilus_canvas_container_get_is_desktop (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - return container->details->is_desktop; + return container->details->is_desktop; } void nautilus_canvas_container_set_is_desktop (NautilusCanvasContainer *container, - gboolean is_desktop) + gboolean is_desktop) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - container->details->is_desktop = is_desktop; + container->details->is_desktop = is_desktop; - if (is_desktop) { - GtkStyleContext *context; + if (is_desktop) + { + GtkStyleContext *context; - context = gtk_widget_get_style_context (GTK_WIDGET (container)); - gtk_style_context_add_class (context, "nautilus-desktop"); - } + context = gtk_widget_get_style_context (GTK_WIDGET (container)); + gtk_style_context_add_class (context, "nautilus-desktop"); + } } void nautilus_canvas_container_set_margins (NautilusCanvasContainer *container, - int left_margin, - int right_margin, - int top_margin, - int bottom_margin) + int left_margin, + int right_margin, + int top_margin, + int bottom_margin) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - container->details->left_margin = left_margin; - container->details->right_margin = right_margin; - container->details->top_margin = top_margin; - container->details->bottom_margin = bottom_margin; + container->details->left_margin = left_margin; + container->details->right_margin = right_margin; + container->details->top_margin = top_margin; + container->details->bottom_margin = bottom_margin; - /* redo layout of icons as the margins have changed */ - schedule_redo_layout (container); + /* redo layout of icons as the margins have changed */ + schedule_redo_layout (container); } /* handle theme changes */ void nautilus_canvas_container_set_font (NautilusCanvasContainer *container, - const char *font) + const char *font) { - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - if (g_strcmp0 (container->details->font, font) == 0) { - return; - } + if (g_strcmp0 (container->details->font, font) == 0) + { + return; + } - g_free (container->details->font); - container->details->font = g_strdup (font); + g_free (container->details->font); + container->details->font = g_strdup (font); - nautilus_canvas_container_request_update_all_internal (container, TRUE); - gtk_widget_queue_draw (GTK_WIDGET (container)); + nautilus_canvas_container_request_update_all_internal (container, TRUE); + gtk_widget_queue_draw (GTK_WIDGET (container)); } /** @@ -7172,19 +7963,22 @@ nautilus_canvas_container_set_font (NautilusCanvasContainer *container, * * Gets the description for the icon. This function may return NULL. **/ -char* +char * nautilus_canvas_container_get_icon_description (NautilusCanvasContainer *container, - NautilusCanvasIconData *data) + NautilusCanvasIconData *data) { - NautilusCanvasContainerClass *klass; + NautilusCanvasContainerClass *klass; - klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); + klass = NAUTILUS_CANVAS_CONTAINER_GET_CLASS (container); - if (klass->get_icon_description) { - return klass->get_icon_description (container, data); - } else { - return NULL; - } + if (klass->get_icon_description) + { + return klass->get_icon_description (container, data); + } + else + { + return NULL; + } } /** @@ -7195,29 +7989,30 @@ nautilus_canvas_container_get_icon_description (NautilusCanvasContainer *contain **/ void nautilus_canvas_container_set_highlighted_for_clipboard (NautilusCanvasContainer *container, - GList *clipboard_canvas_data) + GList *clipboard_canvas_data) { - GList *l; - NautilusCanvasIcon *icon; - gboolean highlighted_for_clipboard; - - g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); + GList *l; + NautilusCanvasIcon *icon; + gboolean highlighted_for_clipboard; - for (l = container->details->icons; l != NULL; l = l->next) { - icon = l->data; - highlighted_for_clipboard = (g_list_find (clipboard_canvas_data, icon->data) != NULL); + g_return_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container)); - eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), - "highlighted-for-clipboard", highlighted_for_clipboard, - NULL); - } + for (l = container->details->icons; l != NULL; l = l->next) + { + icon = l->data; + highlighted_for_clipboard = (g_list_find (clipboard_canvas_data, icon->data) != NULL); + eel_canvas_item_set (EEL_CANVAS_ITEM (icon->item), + "highlighted-for-clipboard", highlighted_for_clipboard, + NULL); + } } /* NautilusCanvasContainerAccessible */ -typedef struct { - EelCanvasAccessible parent; - NautilusCanvasContainerAccessiblePrivate *priv; +typedef struct +{ + EelCanvasAccessible parent; + NautilusCanvasContainerAccessiblePrivate *priv; } NautilusCanvasContainerAccessible; typedef EelCanvasAccessibleClass NautilusCanvasContainerAccessibleClass; @@ -7226,107 +8021,122 @@ typedef EelCanvasAccessibleClass NautilusCanvasContainerAccessibleClass; /* AtkAction interface */ static gboolean -nautilus_canvas_container_accessible_do_action (AtkAction *accessible, int i) -{ - GtkWidget *widget; - NautilusCanvasContainer *container; - GList *selection; - - g_return_val_if_fail (i < LAST_ACTION, FALSE); - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } - - container = NAUTILUS_CANVAS_CONTAINER (widget); - switch (i) { - case ACTION_ACTIVATE : - selection = nautilus_canvas_container_get_selection (container); - - if (selection) { - g_signal_emit_by_name (container, "activate", selection); - g_list_free (selection); - } - break; - case ACTION_MENU : - handle_popups (container, NULL,"context_click_background"); - break; - default : - g_warning ("Invalid action passed to NautilusCanvasContainerAccessible::do_action"); - return FALSE; - } - return TRUE; +nautilus_canvas_container_accessible_do_action (AtkAction *accessible, + int i) +{ + GtkWidget *widget; + NautilusCanvasContainer *container; + GList *selection; + + g_return_val_if_fail (i < LAST_ACTION, FALSE); + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } + + container = NAUTILUS_CANVAS_CONTAINER (widget); + switch (i) + { + case ACTION_ACTIVATE: + { + selection = nautilus_canvas_container_get_selection (container); + + if (selection) + { + g_signal_emit_by_name (container, "activate", selection); + g_list_free (selection); + } + } + break; + + case ACTION_MENU: + { + handle_popups (container, NULL, "context_click_background"); + } + break; + + default: + g_warning ("Invalid action passed to NautilusCanvasContainerAccessible::do_action"); + return FALSE; + } + return TRUE; } static int nautilus_canvas_container_accessible_get_n_actions (AtkAction *accessible) { - return LAST_ACTION; + return LAST_ACTION; } static const char * nautilus_canvas_container_accessible_action_get_description (AtkAction *accessible, - int i) + int i) { - NautilusCanvasContainerAccessiblePrivate *priv; + NautilusCanvasContainerAccessiblePrivate *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_container_accessible_action_descriptions[i]; - } + if (priv->action_descriptions[i]) + { + return priv->action_descriptions[i]; + } + else + { + return nautilus_canvas_container_accessible_action_descriptions[i]; + } } static const char * -nautilus_canvas_container_accessible_action_get_name (AtkAction *accessible, int i) +nautilus_canvas_container_accessible_action_get_name (AtkAction *accessible, + int i) { - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - return nautilus_canvas_container_accessible_action_names[i]; + return nautilus_canvas_container_accessible_action_names[i]; } static const char * -nautilus_canvas_container_accessible_action_get_keybinding (AtkAction *accessible, - int i) +nautilus_canvas_container_accessible_action_get_keybinding (AtkAction *accessible, + int i) { - g_assert (i < LAST_ACTION); + g_assert (i < LAST_ACTION); - return NULL; + return NULL; } static gboolean -nautilus_canvas_container_accessible_action_set_description (AtkAction *accessible, - int i, - const char *description) +nautilus_canvas_container_accessible_action_set_description (AtkAction *accessible, + int i, + const char *description) { - NautilusCanvasContainerAccessiblePrivate *priv; + NautilusCanvasContainerAccessiblePrivate *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 FALSE; + return FALSE; } static void nautilus_canvas_container_accessible_action_interface_init (AtkActionIface *iface) { - iface->do_action = nautilus_canvas_container_accessible_do_action; - iface->get_n_actions = nautilus_canvas_container_accessible_get_n_actions; - iface->get_description = nautilus_canvas_container_accessible_action_get_description; - iface->get_name = nautilus_canvas_container_accessible_action_get_name; - iface->get_keybinding = nautilus_canvas_container_accessible_action_get_keybinding; - iface->set_description = nautilus_canvas_container_accessible_action_set_description; + iface->do_action = nautilus_canvas_container_accessible_do_action; + iface->get_n_actions = nautilus_canvas_container_accessible_get_n_actions; + iface->get_description = nautilus_canvas_container_accessible_action_get_description; + iface->get_name = nautilus_canvas_container_accessible_action_get_name; + iface->get_keybinding = nautilus_canvas_container_accessible_action_get_keybinding; + iface->set_description = nautilus_canvas_container_accessible_action_set_description; } /* AtkSelection interface */ @@ -7334,551 +8144,593 @@ nautilus_canvas_container_accessible_action_interface_init (AtkActionIface *ifac static void nautilus_canvas_container_accessible_update_selection (AtkObject *accessible) { - NautilusCanvasContainer *container; - NautilusCanvasContainerAccessiblePrivate *priv; + NautilusCanvasContainer *container; + NautilusCanvasContainerAccessiblePrivate *priv; - container = NAUTILUS_CANVAS_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible))); - priv = GET_ACCESSIBLE_PRIV (accessible); + container = NAUTILUS_CANVAS_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible))); + priv = GET_ACCESSIBLE_PRIV (accessible); - if (priv->selection) { - g_list_free (priv->selection); - priv->selection = NULL; - } + if (priv->selection) + { + g_list_free (priv->selection); + priv->selection = NULL; + } - priv->selection = nautilus_canvas_container_get_selected_icons (container); + priv->selection = nautilus_canvas_container_get_selected_icons (container); } static void nautilus_canvas_container_accessible_selection_changed_cb (NautilusCanvasContainer *container, - gpointer data) + gpointer data) { - g_signal_emit_by_name (data, "selection-changed"); + g_signal_emit_by_name (data, "selection-changed"); } static void nautilus_canvas_container_accessible_icon_added_cb (NautilusCanvasContainer *container, - NautilusCanvasIconData *icon_data, - gpointer data) + NautilusCanvasIconData *icon_data, + gpointer data) { - NautilusCanvasIcon *icon; - AtkObject *atk_parent; - AtkObject *atk_child; + NautilusCanvasIcon *icon; + AtkObject *atk_parent; + AtkObject *atk_child; + + icon = g_hash_table_lookup (container->details->icon_set, icon_data); + if (icon) + { + atk_parent = ATK_OBJECT (data); + atk_child = atk_gobject_accessible_for_object + (G_OBJECT (icon->item)); - icon = g_hash_table_lookup (container->details->icon_set, icon_data); - if (icon) { - atk_parent = ATK_OBJECT (data); - atk_child = atk_gobject_accessible_for_object - (G_OBJECT (icon->item)); - - g_signal_emit_by_name (atk_parent, "children-changed::add", - icon->position, atk_child, NULL); - } + g_signal_emit_by_name (atk_parent, "children-changed::add", + icon->position, atk_child, NULL); + } } static void nautilus_canvas_container_accessible_icon_removed_cb (NautilusCanvasContainer *container, - NautilusCanvasIconData *icon_data, - gpointer data) -{ - NautilusCanvasIcon *icon; - AtkObject *atk_parent; - AtkObject *atk_child; - - icon = g_hash_table_lookup (container->details->icon_set, icon_data); - if (icon) { - atk_parent = ATK_OBJECT (data); - atk_child = atk_gobject_accessible_for_object - (G_OBJECT (icon->item)); - - g_signal_emit_by_name (atk_parent, "children-changed::remove", - icon->position, atk_child, NULL); - } + NautilusCanvasIconData *icon_data, + gpointer data) +{ + NautilusCanvasIcon *icon; + AtkObject *atk_parent; + AtkObject *atk_child; + + icon = g_hash_table_lookup (container->details->icon_set, icon_data); + if (icon) + { + atk_parent = ATK_OBJECT (data); + atk_child = atk_gobject_accessible_for_object + (G_OBJECT (icon->item)); + + g_signal_emit_by_name (atk_parent, "children-changed::remove", + icon->position, atk_child, NULL); + } } static void -nautilus_canvas_container_accessible_cleared_cb (NautilusCanvasContainer *container, - gpointer data) +nautilus_canvas_container_accessible_cleared_cb (NautilusCanvasContainer *container, + gpointer data) { - g_signal_emit_by_name (data, "children-changed", 0, NULL, NULL); + g_signal_emit_by_name (data, "children-changed", 0, NULL, NULL); } -static gboolean -nautilus_canvas_container_accessible_add_selection (AtkSelection *accessible, - int i) -{ - GtkWidget *widget; - NautilusCanvasContainer *container; - GList *l; - GList *selection; - NautilusCanvasIcon *icon; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } - - container = NAUTILUS_CANVAS_CONTAINER (widget); - - l = g_list_nth (container->details->icons, i); - if (l) { - icon = l->data; - - selection = nautilus_canvas_container_get_selection (container); - selection = g_list_prepend (selection, - icon->data); - nautilus_canvas_container_set_selection (container, selection); - - g_list_free (selection); - return TRUE; - } +static gboolean +nautilus_canvas_container_accessible_add_selection (AtkSelection *accessible, + int i) +{ + GtkWidget *widget; + NautilusCanvasContainer *container; + GList *l; + GList *selection; + NautilusCanvasIcon *icon; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } + + container = NAUTILUS_CANVAS_CONTAINER (widget); + + l = g_list_nth (container->details->icons, i); + if (l) + { + icon = l->data; + + selection = nautilus_canvas_container_get_selection (container); + selection = g_list_prepend (selection, + icon->data); + nautilus_canvas_container_set_selection (container, selection); + + g_list_free (selection); + return TRUE; + } - return FALSE; + return FALSE; } static gboolean nautilus_canvas_container_accessible_clear_selection (AtkSelection *accessible) { - GtkWidget *widget; - NautilusCanvasContainer *container; + GtkWidget *widget; + NautilusCanvasContainer *container; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - nautilus_canvas_container_unselect_all (container); + nautilus_canvas_container_unselect_all (container); - return TRUE; + return TRUE; } static AtkObject * -nautilus_canvas_container_accessible_ref_selection (AtkSelection *accessible, - int i) -{ - NautilusCanvasContainerAccessiblePrivate *priv; - AtkObject *atk_object; - GList *item; - NautilusCanvasIcon *icon; - - nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); - priv = GET_ACCESSIBLE_PRIV (accessible); - - item = (g_list_nth (priv->selection, i)); - - if (item) { - icon = item->data; - atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); - if (atk_object) { - g_object_ref (atk_object); - } +nautilus_canvas_container_accessible_ref_selection (AtkSelection *accessible, + int i) +{ + NautilusCanvasContainerAccessiblePrivate *priv; + AtkObject *atk_object; + GList *item; + NautilusCanvasIcon *icon; + + nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); + priv = GET_ACCESSIBLE_PRIV (accessible); + + item = (g_list_nth (priv->selection, i)); + + if (item) + { + icon = item->data; + atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); + if (atk_object) + { + g_object_ref (atk_object); + } - return atk_object; - } else { - return NULL; - } + return atk_object; + } + else + { + return NULL; + } } static int nautilus_canvas_container_accessible_get_selection_count (AtkSelection *accessible) { - NautilusCanvasContainerAccessiblePrivate *priv; - int count; + NautilusCanvasContainerAccessiblePrivate *priv; + int count; - priv = GET_ACCESSIBLE_PRIV (accessible); - nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); - count = g_list_length (priv->selection); + priv = GET_ACCESSIBLE_PRIV (accessible); + nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); + count = g_list_length (priv->selection); - return count; + return count; } static gboolean nautilus_canvas_container_accessible_is_child_selected (AtkSelection *accessible, - int i) + int i) { - NautilusCanvasContainer *container; - GList *l; - NautilusCanvasIcon *icon; - GtkWidget *widget; + NautilusCanvasContainer *container; + GList *l; + NautilusCanvasIcon *icon; + GtkWidget *widget; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - l = g_list_nth (container->details->icons, i); - if (l) { - icon = l->data; - return icon->is_selected; - } - return FALSE; + l = g_list_nth (container->details->icons, i); + if (l) + { + icon = l->data; + return icon->is_selected; + } + return FALSE; } static gboolean nautilus_canvas_container_accessible_remove_selection (AtkSelection *accessible, - int i) -{ - NautilusCanvasContainerAccessiblePrivate *priv; - NautilusCanvasContainer *container; - GList *l; - GList *selection; - NautilusCanvasIcon *icon; - GtkWidget *widget; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } - - container = NAUTILUS_CANVAS_CONTAINER (widget); - nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); - - priv = GET_ACCESSIBLE_PRIV (accessible); - l = g_list_nth (priv->selection, i); - if (l) { - icon = l->data; - - selection = nautilus_canvas_container_get_selection (container); - selection = g_list_remove (selection, icon->data); - nautilus_canvas_container_set_selection (container, selection); - - g_list_free (selection); - return TRUE; - } - - return FALSE; + int i) +{ + NautilusCanvasContainerAccessiblePrivate *priv; + NautilusCanvasContainer *container; + GList *l; + GList *selection; + NautilusCanvasIcon *icon; + GtkWidget *widget; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } + + container = NAUTILUS_CANVAS_CONTAINER (widget); + nautilus_canvas_container_accessible_update_selection (ATK_OBJECT (accessible)); + + priv = GET_ACCESSIBLE_PRIV (accessible); + l = g_list_nth (priv->selection, i); + if (l) + { + icon = l->data; + + selection = nautilus_canvas_container_get_selection (container); + selection = g_list_remove (selection, icon->data); + nautilus_canvas_container_set_selection (container, selection); + + g_list_free (selection); + return TRUE; + } + + return FALSE; } static gboolean nautilus_canvas_container_accessible_select_all_selection (AtkSelection *accessible) { - NautilusCanvasContainer *container; - GtkWidget *widget; + NautilusCanvasContainer *container; + GtkWidget *widget; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } - container = NAUTILUS_CANVAS_CONTAINER (widget); + container = NAUTILUS_CANVAS_CONTAINER (widget); - nautilus_canvas_container_select_all (container); + nautilus_canvas_container_select_all (container); - return TRUE; + return TRUE; } void nautilus_canvas_container_widget_to_file_operation_position (NautilusCanvasContainer *container, - GdkPoint *position) + GdkPoint *position) { - double x, y; + double x, y; - g_return_if_fail (position != NULL); + g_return_if_fail (position != NULL); - x = position->x; - y = position->y; + x = position->x; + y = position->y; - eel_canvas_window_to_world (EEL_CANVAS (container), x, y, &x, &y); + eel_canvas_window_to_world (EEL_CANVAS (container), x, y, &x, &y); - position->x = (int) x; - position->y = (int) y; + position->x = (int) x; + position->y = (int) y; - /* ensure that we end up in the middle of the icon */ - position->x -= nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; - position->y -= nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; + /* ensure that we end up in the middle of the icon */ + position->x -= nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; + position->y -= nautilus_canvas_container_get_icon_size_for_zoom_level (container->details->zoom_level) / 2; } -static void +static void nautilus_canvas_container_accessible_selection_interface_init (AtkSelectionIface *iface) { - iface->add_selection = nautilus_canvas_container_accessible_add_selection; - iface->clear_selection = nautilus_canvas_container_accessible_clear_selection; - iface->ref_selection = nautilus_canvas_container_accessible_ref_selection; - iface->get_selection_count = nautilus_canvas_container_accessible_get_selection_count; - iface->is_child_selected = nautilus_canvas_container_accessible_is_child_selected; - iface->remove_selection = nautilus_canvas_container_accessible_remove_selection; - iface->select_all_selection = nautilus_canvas_container_accessible_select_all_selection; + iface->add_selection = nautilus_canvas_container_accessible_add_selection; + iface->clear_selection = nautilus_canvas_container_accessible_clear_selection; + iface->ref_selection = nautilus_canvas_container_accessible_ref_selection; + iface->get_selection_count = nautilus_canvas_container_accessible_get_selection_count; + iface->is_child_selected = nautilus_canvas_container_accessible_is_child_selected; + iface->remove_selection = nautilus_canvas_container_accessible_remove_selection; + iface->select_all_selection = nautilus_canvas_container_accessible_select_all_selection; } -static gint +static gint nautilus_canvas_container_accessible_get_n_children (AtkObject *accessible) { - NautilusCanvasContainer *container; - GtkWidget *widget; - gint i; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return FALSE; - } + NautilusCanvasContainer *container; + GtkWidget *widget; + gint i; - container = NAUTILUS_CANVAS_CONTAINER (widget); + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { + return FALSE; + } - i = g_hash_table_size (container->details->icon_set); + container = NAUTILUS_CANVAS_CONTAINER (widget); - return i; + i = g_hash_table_size (container->details->icon_set); + + return i; } -static AtkObject* -nautilus_canvas_container_accessible_ref_child (AtkObject *accessible, int i) -{ - AtkObject *atk_object; - NautilusCanvasContainer *container; - GList *item; - NautilusCanvasIcon *icon; - GtkWidget *widget; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (!widget) { - return NULL; - } - - container = NAUTILUS_CANVAS_CONTAINER (widget); - - item = (g_list_nth (container->details->icons, i)); - - if (item) { - icon = item->data; - - atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); - g_object_ref (atk_object); - - return atk_object; - } +static AtkObject * +nautilus_canvas_container_accessible_ref_child (AtkObject *accessible, + int i) +{ + AtkObject *atk_object; + NautilusCanvasContainer *container; + GList *item; + NautilusCanvasIcon *icon; + GtkWidget *widget; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (!widget) + { return NULL; + } + + container = NAUTILUS_CANVAS_CONTAINER (widget); + + item = (g_list_nth (container->details->icons, i)); + + if (item) + { + icon = item->data; + + atk_object = atk_gobject_accessible_for_object (G_OBJECT (icon->item)); + g_object_ref (atk_object); + + return atk_object; + } + return NULL; } G_DEFINE_TYPE_WITH_CODE (NautilusCanvasContainerAccessible, nautilus_canvas_container_accessible, - eel_canvas_accessible_get_type (), - G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, nautilus_canvas_container_accessible_action_interface_init) - G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, nautilus_canvas_container_accessible_selection_interface_init)) + eel_canvas_accessible_get_type (), + G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, nautilus_canvas_container_accessible_action_interface_init) + G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, nautilus_canvas_container_accessible_selection_interface_init)) static void nautilus_canvas_container_accessible_initialize (AtkObject *accessible, - gpointer data) -{ - NautilusCanvasContainer *container; - - if (ATK_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->initialize) { - ATK_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->initialize (accessible, data); - } - - if (GTK_IS_ACCESSIBLE (accessible)) { - nautilus_canvas_container_accessible_update_selection - (ATK_OBJECT (accessible)); - - container = NAUTILUS_CANVAS_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible))); - g_signal_connect (container, "selection-changed", - G_CALLBACK (nautilus_canvas_container_accessible_selection_changed_cb), - accessible); - g_signal_connect (container, "icon-added", - G_CALLBACK (nautilus_canvas_container_accessible_icon_added_cb), - accessible); - g_signal_connect (container, "icon-removed", - G_CALLBACK (nautilus_canvas_container_accessible_icon_removed_cb), - accessible); - g_signal_connect (container, "cleared", - G_CALLBACK (nautilus_canvas_container_accessible_cleared_cb), - accessible); - } + gpointer data) +{ + NautilusCanvasContainer *container; + + if (ATK_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->initialize) + { + ATK_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->initialize (accessible, data); + } + + if (GTK_IS_ACCESSIBLE (accessible)) + { + nautilus_canvas_container_accessible_update_selection + (ATK_OBJECT (accessible)); + + container = NAUTILUS_CANVAS_CONTAINER (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible))); + g_signal_connect (container, "selection-changed", + G_CALLBACK (nautilus_canvas_container_accessible_selection_changed_cb), + accessible); + g_signal_connect (container, "icon-added", + G_CALLBACK (nautilus_canvas_container_accessible_icon_added_cb), + accessible); + g_signal_connect (container, "icon-removed", + G_CALLBACK (nautilus_canvas_container_accessible_icon_removed_cb), + accessible); + g_signal_connect (container, "cleared", + G_CALLBACK (nautilus_canvas_container_accessible_cleared_cb), + accessible); + } } static void nautilus_canvas_container_accessible_finalize (GObject *object) { - NautilusCanvasContainerAccessiblePrivate *priv; - int i; + NautilusCanvasContainerAccessiblePrivate *priv; + int i; - priv = GET_ACCESSIBLE_PRIV (object); + priv = GET_ACCESSIBLE_PRIV (object); - if (priv->selection) { - g_list_free (priv->selection); - } + if (priv->selection) + { + g_list_free (priv->selection); + } - for (i = 0; i < LAST_ACTION; i++) { - if (priv->action_descriptions[i]) { - g_free (priv->action_descriptions[i]); - } - } + for (i = 0; i < LAST_ACTION; i++) + { + if (priv->action_descriptions[i]) + { + g_free (priv->action_descriptions[i]); + } + } - G_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->finalize (object); + G_OBJECT_CLASS (nautilus_canvas_container_accessible_parent_class)->finalize (object); } static void nautilus_canvas_container_accessible_init (NautilusCanvasContainerAccessible *self) { - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_canvas_container_accessible_get_type (), - NautilusCanvasContainerAccessiblePrivate); + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_canvas_container_accessible_get_type (), + NautilusCanvasContainerAccessiblePrivate); } static void nautilus_canvas_container_accessible_class_init (NautilusCanvasContainerAccessibleClass *klass) { - AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass); - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->finalize = nautilus_canvas_container_accessible_finalize; + gobject_class->finalize = nautilus_canvas_container_accessible_finalize; - atk_class->get_n_children = nautilus_canvas_container_accessible_get_n_children; - atk_class->ref_child = nautilus_canvas_container_accessible_ref_child; - atk_class->initialize = nautilus_canvas_container_accessible_initialize; + atk_class->get_n_children = nautilus_canvas_container_accessible_get_n_children; + atk_class->ref_child = nautilus_canvas_container_accessible_ref_child; + atk_class->initialize = nautilus_canvas_container_accessible_initialize; - g_type_class_add_private (klass, sizeof (NautilusCanvasContainerAccessiblePrivate)); + g_type_class_add_private (klass, sizeof (NautilusCanvasContainerAccessiblePrivate)); } gboolean nautilus_canvas_container_is_layout_rtl (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), 0); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), 0); - return (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL); + return (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL); } gboolean nautilus_canvas_container_is_layout_vertical (NautilusCanvasContainer *container) { - g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); + g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), FALSE); - /* we only do vertical layout in the desktop nowadays */ - return container->details->is_desktop; + /* we only do vertical layout in the desktop nowadays */ + return container->details->is_desktop; } int -nautilus_canvas_container_get_max_layout_lines_for_pango (NautilusCanvasContainer *container) +nautilus_canvas_container_get_max_layout_lines_for_pango (NautilusCanvasContainer *container) { - int limit; + int limit; - if (nautilus_canvas_container_get_is_desktop (container)) { - limit = desktop_text_ellipsis_limit; - } else { - limit = text_ellipsis_limits[container->details->zoom_level]; - } + if (nautilus_canvas_container_get_is_desktop (container)) + { + limit = desktop_text_ellipsis_limit; + } + else + { + limit = text_ellipsis_limits[container->details->zoom_level]; + } - if (limit <= 0) { - return G_MININT; - } + if (limit <= 0) + { + return G_MININT; + } - return -limit; + return -limit; } int -nautilus_canvas_container_get_max_layout_lines (NautilusCanvasContainer *container) +nautilus_canvas_container_get_max_layout_lines (NautilusCanvasContainer *container) { - int limit; + int limit; - if (nautilus_canvas_container_get_is_desktop (container)) { - limit = desktop_text_ellipsis_limit; - } else { - limit = text_ellipsis_limits[container->details->zoom_level]; - } + if (nautilus_canvas_container_get_is_desktop (container)) + { + limit = desktop_text_ellipsis_limit; + } + else + { + limit = text_ellipsis_limits[container->details->zoom_level]; + } - if (limit <= 0) { - return G_MAXINT; - } + if (limit <= 0) + { + return G_MAXINT; + } - return limit; + return limit; } void nautilus_canvas_container_begin_loading (NautilusCanvasContainer *container) { - gboolean dummy; + gboolean dummy; - if (nautilus_canvas_container_get_store_layout_timestamps (container)) { - container->details->layout_timestamp = UNDEFINED_TIME; - g_signal_emit (container, - signals[GET_STORED_LAYOUT_TIMESTAMP], 0, - NULL, &container->details->layout_timestamp, &dummy); - } + if (nautilus_canvas_container_get_store_layout_timestamps (container)) + { + container->details->layout_timestamp = UNDEFINED_TIME; + g_signal_emit (container, + signals[GET_STORED_LAYOUT_TIMESTAMP], 0, + NULL, &container->details->layout_timestamp, &dummy); + } } static void store_layout_timestamps_now (NautilusCanvasContainer *container) { - NautilusCanvasIcon *icon; - GList *p; - gboolean dummy; + NautilusCanvasIcon *icon; + GList *p; + gboolean dummy; - container->details->layout_timestamp = time (NULL); - g_signal_emit (container, - signals[STORE_LAYOUT_TIMESTAMP], 0, - NULL, &container->details->layout_timestamp, &dummy); + container->details->layout_timestamp = time (NULL); + g_signal_emit (container, + signals[STORE_LAYOUT_TIMESTAMP], 0, + NULL, &container->details->layout_timestamp, &dummy); - for (p = container->details->icons; p != NULL; p = p->next) { - icon = p->data; + for (p = container->details->icons; p != NULL; p = p->next) + { + icon = p->data; - g_signal_emit (container, - signals[STORE_LAYOUT_TIMESTAMP], 0, - icon->data, &container->details->layout_timestamp, &dummy); - } + g_signal_emit (container, + signals[STORE_LAYOUT_TIMESTAMP], 0, + icon->data, &container->details->layout_timestamp, &dummy); + } } void nautilus_canvas_container_end_loading (NautilusCanvasContainer *container, - gboolean all_icons_added) -{ - if (all_icons_added && - nautilus_canvas_container_get_store_layout_timestamps (container)) { - if (container->details->new_icons == NULL) { - store_layout_timestamps_now (container); - } else { - container->details->store_layout_timestamps_when_finishing_new_icons = TRUE; - } - } + gboolean all_icons_added) +{ + if (all_icons_added && + nautilus_canvas_container_get_store_layout_timestamps (container)) + { + if (container->details->new_icons == NULL) + { + store_layout_timestamps_now (container); + } + else + { + container->details->store_layout_timestamps_when_finishing_new_icons = TRUE; + } + } } gboolean nautilus_canvas_container_get_store_layout_timestamps (NautilusCanvasContainer *container) { - return container->details->store_layout_timestamps; + return container->details->store_layout_timestamps; } void nautilus_canvas_container_set_store_layout_timestamps (NautilusCanvasContainer *container, - gboolean store_layout_timestamps) + gboolean store_layout_timestamps) { - container->details->store_layout_timestamps = store_layout_timestamps; + container->details->store_layout_timestamps = store_layout_timestamps; } -#if ! defined (NAUTILUS_OMIT_SELF_CHECK) +#if !defined (NAUTILUS_OMIT_SELF_CHECK) static char * -check_compute_stretch (int icon_x, int icon_y, int icon_size, - int start_pointer_x, int start_pointer_y, - int end_pointer_x, int end_pointer_y) +check_compute_stretch (int icon_x, + int icon_y, + int icon_size, + int start_pointer_x, + int start_pointer_y, + int end_pointer_x, + int end_pointer_y) { - StretchState start, current; + StretchState start, current; - start.icon_x = icon_x; - start.icon_y = icon_y; - start.icon_size = icon_size; - start.pointer_x = start_pointer_x; - start.pointer_y = start_pointer_y; - current.pointer_x = end_pointer_x; - current.pointer_y = end_pointer_y; + start.icon_x = icon_x; + start.icon_y = icon_y; + start.icon_size = icon_size; + start.pointer_x = start_pointer_x; + start.pointer_y = start_pointer_y; + current.pointer_x = end_pointer_x; + current.pointer_y = end_pointer_y; - compute_stretch (&start, ¤t); + compute_stretch (&start, ¤t); - return g_strdup_printf ("%d,%d:%d", - current.icon_x, - current.icon_y, - current.icon_size); + return g_strdup_printf ("%d,%d:%d", + current.icon_x, + current.icon_y, + current.icon_size); } void nautilus_self_check_canvas_container (void) { - EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 0, 0, 0, 0), "0,0:64"); - EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 64, 64, 65, 65), "0,0:65"); - EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 64, 64, 65, 64), "0,0:64"); - EEL_CHECK_STRING_RESULT (check_compute_stretch (100, 100, 64, 105, 105, 40, 40), "35,35:129"); + EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 0, 0, 0, 0), "0,0:64"); + EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 64, 64, 65, 65), "0,0:65"); + EEL_CHECK_STRING_RESULT (check_compute_stretch (0, 0, 64, 64, 64, 65, 64), "0,0:64"); + EEL_CHECK_STRING_RESULT (check_compute_stretch (100, 100, 64, 105, 105, 40, 40), "35,35:129"); } #endif /* ! NAUTILUS_OMIT_SELF_CHECK */ |