summaryrefslogtreecommitdiff
path: root/libnautilus
diff options
context:
space:
mode:
authorDarin Adler <darin@src.gnome.org>2000-04-05 01:28:31 +0000
committerDarin Adler <darin@src.gnome.org>2000-04-05 01:28:31 +0000
commitcd9618f0c6c13e847f92e6509ff0ae1e3e5369b8 (patch)
tree1b5ce191296fb53b11a7fb1e9b82533d82ff6ff6 /libnautilus
parentdc703c8ba1607c1b77441d13e2b9f55328d35a62 (diff)
downloadnautilus-cd9618f0c6c13e847f92e6509ff0ae1e3e5369b8.tar.gz
Finished task 54 (Set background image by drag/drop).
Fixed bug 346 (Bad icon positions when you change user level). Fixed bug 372 (Better icons for common file types). * libnautilus/nautilus-background-canvas-group.c: (nautilus_background_canvas_group_draw): Got rid of the colormap which is not needed now that we use gtk_rgb instead of gtk_color calls. Passed in the corner of the canvas as a parameter to nautilus_background_draw so it knows where the origin of any repeating pattern should be. * libnautilus/nautilus-background.h: * libnautilus/nautilus-background.c: (nautilus_background_draw): Added parameters to determine where the origin of any repeating pattern should be. Removed colormap parameter (see above). (nautilus_background_draw_flat_box): Passed in origin parameters in call to nautilus_background_draw. * libnautilus/nautilus-gdk-extensions.h: * libnautilus/nautilus-gdk-extensions.c: (nautilus_fill_rectangle_with_gradient): Removed colormap parameter (see above). * libnautilus/nautilus-gdk-pixbuf-extensions.c: (nautilus_gdk_pixbuf_render_to_drawable_tiled): Fixed the tiling so it will use the dither parameters to set the origin of the tiles as well. * libnautilus/nautilus-icon-dnd.c: (receive_dropped_tile_image), (nautilus_icon_container_receive_dropped_icons): Added code so that dropping an image file on the window with the shift key held down will customize the background tile image. * libnautilus/nautilus-icon-factory.c: (make_full_icon_path), (get_themed_icon_file_path): Fixed two bugs that prevented MIME-type-based icons from working correctly. First, got rid of code that tried to prepend the theme name and "nautilus/" to the beginning of a full path. Then made sure that it tries the file name without adding a suffix before it starts trying out suffixes. * libnautilus/nautilus-icon-grid.c: (nautilus_icon_grid_clear): Fixed bug where clearing the grid was resetting the visible width. * components/sample/Makefile.am: * components/services/startup/Makefile.am: Turned on -Werror for these two directories. * components/sample/nautilus-sample-content-view.h: * components/sample/nautilus-sample-content-view.c: (nautilus_sample_content_view_destroy), (bonobo_sample_callback): Fixed warnings and did some small cleanup.
Diffstat (limited to 'libnautilus')
-rw-r--r--libnautilus/nautilus-background-canvas-group.c8
-rw-r--r--libnautilus/nautilus-background.c11
-rw-r--r--libnautilus/nautilus-background.h5
-rw-r--r--libnautilus/nautilus-gdk-extensions.c3
-rw-r--r--libnautilus/nautilus-gdk-extensions.h1
-rw-r--r--libnautilus/nautilus-gdk-pixbuf-extensions.c49
-rw-r--r--libnautilus/nautilus-icon-dnd.c35
-rw-r--r--libnautilus/nautilus-icon-factory.c34
-rw-r--r--libnautilus/nautilus-icon-grid.c12
9 files changed, 113 insertions, 45 deletions
diff --git a/libnautilus/nautilus-background-canvas-group.c b/libnautilus/nautilus-background-canvas-group.c
index 32217ca69..06cb28b8e 100644
--- a/libnautilus/nautilus-background-canvas-group.c
+++ b/libnautilus/nautilus-background-canvas-group.c
@@ -81,18 +81,15 @@ nautilus_background_canvas_group_draw (GnomeCanvasItem *item, GdkDrawable *drawa
background = nautilus_get_widget_background(GTK_WIDGET (item->canvas));
if (background != NULL) {
GdkGC *gc;
- GdkColormap *colormap;
GdkRectangle rectangle;
/* Create a new gc each time.
If this is a speed problem, we can create one and keep it around,
but it's a bit more complicated to ensure that it's always compatible
- with whatever drawable is passed in to use.
+ with whatever drawable is passed in.
*/
gc = gdk_gc_new (drawable);
- colormap = gtk_widget_get_colormap (GTK_WIDGET (item->canvas));
-
/* The rectangle is the size of the entire viewed area of the canvas.
The corner is determined by the current scroll position of the
GtkLayout, and the size is determined by the current size of the widget.
@@ -104,7 +101,8 @@ nautilus_background_canvas_group_draw (GnomeCanvasItem *item, GdkDrawable *drawa
rectangle.width = GTK_WIDGET (item->canvas)->allocation.width;
rectangle.height = GTK_WIDGET (item->canvas)->allocation.height;
- nautilus_background_draw (background, drawable, gc, colormap, &rectangle);
+ nautilus_background_draw (background, drawable, gc, &rectangle,
+ -drawable_corner_x, -drawable_corner_y);
gdk_gc_unref (gc);
}
diff --git a/libnautilus/nautilus-background.c b/libnautilus/nautilus-background.c
index 944875a26..484f245f7 100644
--- a/libnautilus/nautilus-background.c
+++ b/libnautilus/nautilus-background.c
@@ -126,8 +126,9 @@ void
nautilus_background_draw (NautilusBackground *background,
GdkDrawable *drawable,
GdkGC *gc,
- GdkColormap *colormap,
- const GdkRectangle *rectangle)
+ const GdkRectangle *rectangle,
+ int origin_x,
+ int origin_y)
{
char *start_color_spec, *end_color_spec;
guint32 start_rgb, end_rgb;
@@ -139,7 +140,7 @@ nautilus_background_draw (NautilusBackground *background,
gc,
rectangle,
GDK_RGB_DITHER_NORMAL,
- 0, 0);
+ origin_x, origin_y);
} else {
start_color_spec = nautilus_gradient_get_start_color_spec (background->details->color);
end_color_spec = nautilus_gradient_get_end_color_spec (background->details->color);
@@ -153,7 +154,6 @@ nautilus_background_draw (NautilusBackground *background,
nautilus_fill_rectangle_with_gradient (drawable,
gc,
- colormap,
rectangle,
start_rgb,
end_rgb,
@@ -333,8 +333,7 @@ nautilus_background_draw_flat_box (GtkStyle *style,
rectangle.height = height;
nautilus_background_draw (background, window, gc,
- gtk_widget_get_colormap (widget),
- &rectangle);
+ &rectangle, 0, 0);
gdk_gc_unref (gc);
}
diff --git a/libnautilus/nautilus-background.h b/libnautilus/nautilus-background.h
index be2209b9c..45690c12d 100644
--- a/libnautilus/nautilus-background.h
+++ b/libnautilus/nautilus-background.h
@@ -74,8 +74,9 @@ char * nautilus_background_get_tile_image_uri (NautilusBackgroun
void nautilus_background_draw (NautilusBackground *background,
GdkDrawable *drawable,
GdkGC *gc,
- GdkColormap *colormap,
- const GdkRectangle *rectangle);
+ const GdkRectangle *rectangle,
+ int origin_x,
+ int origin_y);
/* Handles a dragged color being dropped on a widget to change the background color. */
void nautilus_background_receive_dropped_color (NautilusBackground *background,
diff --git a/libnautilus/nautilus-gdk-extensions.c b/libnautilus/nautilus-gdk-extensions.c
index d9a9ca1da..42fe1dc49 100644
--- a/libnautilus/nautilus-gdk-extensions.c
+++ b/libnautilus/nautilus-gdk-extensions.c
@@ -77,7 +77,6 @@ nautilus_fill_rectangle_with_color (GdkDrawable *drawable,
* nautilus_fill_rectangle_with_gradient:
* @drawable: Target to draw into.
* @gc: Graphics context (mainly for clip).
- * @colormap: Map to use to allocate colors for gradient.
* @rectangle: Rectangle to draw gradient in.
* @start_color: Color for the left or top; pixel value does not matter.
* @end_color: Color for the right or bottom; pixel value does not matter.
@@ -85,13 +84,11 @@ nautilus_fill_rectangle_with_color (GdkDrawable *drawable,
*
* Fill the rectangle with a gradient.
* The color changes from start_color to end_color.
- * A colormap is necessary because a gradient uses many different colors.
* This effect works best on true color displays.
*/
void
nautilus_fill_rectangle_with_gradient (GdkDrawable *drawable,
GdkGC *gc,
- GdkColormap *colormap,
const GdkRectangle *rectangle,
guint32 start_rgb,
guint32 end_rgb,
diff --git a/libnautilus/nautilus-gdk-extensions.h b/libnautilus/nautilus-gdk-extensions.h
index 6b9eead97..e1c4d6f20 100644
--- a/libnautilus/nautilus-gdk-extensions.h
+++ b/libnautilus/nautilus-gdk-extensions.h
@@ -70,7 +70,6 @@ void nautilus_fill_rectangle_with_color (GdkDrawable *drawab
guint32 rgb);
void nautilus_fill_rectangle_with_gradient (GdkDrawable *drawable,
GdkGC *gc,
- GdkColormap *colormap,
const GdkRectangle *rectangle,
guint32 start_rgb,
guint32 end_rgb,
diff --git a/libnautilus/nautilus-gdk-pixbuf-extensions.c b/libnautilus/nautilus-gdk-pixbuf-extensions.c
index 705fb1a54..993d198cc 100644
--- a/libnautilus/nautilus-gdk-pixbuf-extensions.c
+++ b/libnautilus/nautilus-gdk-pixbuf-extensions.c
@@ -274,21 +274,48 @@ nautilus_gdk_pixbuf_render_to_drawable_tiled (GdkPixbuf *pixbuf,
int y_dither)
{
int x, y;
- int width, height;
+ int start_x, start_y;
+ int end_x, end_y;
+ int tile_x, tile_y;
+ int blit_x, blit_y;
+ int tile_width, tile_height;
+ int blit_width, blit_height;
+ int tile_offset_x, tile_offset_y;
+
+ tile_width = gdk_pixbuf_get_width (pixbuf);
+ tile_height = gdk_pixbuf_get_height (pixbuf);
+
+ tile_offset_x = (rect->x - x_dither) % tile_width;
+ if (tile_offset_x < 0) {
+ tile_offset_x += tile_width;
+ }
+ g_assert (tile_offset_x >= 0 && tile_offset_x < tile_width);
+
+ tile_offset_y = (rect->y - y_dither) % tile_height;
+ if (tile_offset_y < 0) {
+ tile_offset_y += tile_height;
+ }
+ g_assert (tile_offset_y >= 0 && tile_offset_y < tile_height);
+
+ start_x = rect->x - tile_offset_x;
+ start_y = rect->y - tile_offset_y;
+
+ end_x = rect->x + rect->width;
+ end_y = rect->y + rect->height;
- for (x = rect->x;
- x < rect->x + rect->width;
- x += gdk_pixbuf_get_width (pixbuf)) {
- width = MIN (gdk_pixbuf_get_width (pixbuf), rect->x + rect->width - x);
+ for (x = start_x; x < end_x; x += tile_width) {
+ blit_x = MAX (x, rect->x);
+ tile_x = blit_x - x;
+ blit_width = MIN (tile_width, end_x - x) - tile_x;
- for (y = rect->y;
- y < rect->y + rect->height;
- y += gdk_pixbuf_get_height (pixbuf)) {
- height = MIN (gdk_pixbuf_get_height (pixbuf), rect->y + rect->height - y);
+ for (y = start_y; y < end_y; y += tile_height) {
+ blit_y = MAX (y, rect->y);
+ tile_y = blit_y - y;
+ blit_height = MIN (tile_height, end_y - y) - tile_y;
gdk_pixbuf_render_to_drawable (pixbuf, drawable, gc,
- 0, 0,
- x, y, width, height,
+ tile_x, tile_y,
+ blit_x, blit_y, blit_width, blit_height,
dither, x_dither, y_dither);
}
}
diff --git a/libnautilus/nautilus-icon-dnd.c b/libnautilus/nautilus-icon-dnd.c
index c49faa175..503ce3dae 100644
--- a/libnautilus/nautilus-icon-dnd.c
+++ b/libnautilus/nautilus-icon-dnd.c
@@ -645,6 +645,23 @@ nautilus_icon_canvas_item_can_accept_items (NautilusIconContainer *container,
}
static void
+receive_dropped_tile_image (NautilusIconContainer *container)
+{
+ GList *list;
+
+ /* We only accept the image if it's the only thing dragged. */
+ list = container->details->dnd_info->selection_list;
+ g_assert (list != NULL);
+ if (list->next != NULL) {
+ return;
+ }
+
+ nautilus_background_set_tile_image_uri
+ (nautilus_get_widget_background (GTK_WIDGET (container)),
+ ((DndSelectionItem *) list->data)->uri);
+}
+
+static void
nautilus_icon_container_receive_dropped_icons (NautilusIconContainer *container,
GdkDragContext *context,
int x, int y)
@@ -660,20 +677,27 @@ nautilus_icon_container_receive_dropped_icons (NautilusIconContainer *container,
GdkPoint *source_item_locations;
int index;
int count;
+ GdkModifierType modifiers;
- local_move_only = FALSE;
-
- if (container->details->dnd_info->selection_list == NULL)
+ if (container->details->dnd_info->selection_list == NULL) {
return;
+ }
+ /* If the shift key is down, then this is a drag that customizes
+ * the background tile image.
+ */
+ gdk_window_get_pointer (GTK_WIDGET (container)->window,
+ NULL, NULL, &modifiers);
+ if ((modifiers & GDK_SHIFT_MASK) != 0) {
+ receive_dropped_tile_image (container);
+ return;
+ }
gnome_canvas_window_to_world (GNOME_CANVAS (container),
x, y, &world_x, &world_y);
/* find the item we hit with our drop, if any */
drop_target_icon = nautilus_icon_container_item_at (container, world_x, world_y);
-
-
if (drop_target_icon != NULL && !nautilus_icon_canvas_item_can_accept_items
(container, drop_target_icon, container->details->dnd_info->selection_list)) {
/* the item we dropped our selection on cannot accept the items,
@@ -682,6 +706,7 @@ nautilus_icon_container_receive_dropped_icons (NautilusIconContainer *container,
drop_target_icon = NULL;
}
+ local_move_only = FALSE;
if (drop_target_icon == NULL && context->action == GDK_ACTION_MOVE) {
/* we can just move the icon positions if the move ended up in
* the item's parent container
diff --git a/libnautilus/nautilus-icon-factory.c b/libnautilus/nautilus-icon-factory.c
index 0ce263fbe..9b66c7ecc 100644
--- a/libnautilus/nautilus-icon-factory.c
+++ b/libnautilus/nautilus-icon-factory.c
@@ -53,6 +53,7 @@
/* List of suffixes to search when looking for an icon file. */
static const char *icon_file_name_suffixes[] =
{
+ "",
".png",
".PNG",
".gif",
@@ -467,6 +468,22 @@ nautilus_icon_factory_get_icon_name_for_file (NautilusFile *file)
}
}
+static char *
+make_full_icon_path (const char *path, const char *suffix)
+{
+ char *partial_path, *full_path;
+
+ if (path[0] == '/') {
+ return g_strconcat (path, suffix, NULL);
+ }
+
+ /* Build a path for this icon. */
+ partial_path = g_strconcat ("nautilus/", path, suffix, NULL);
+ full_path = gnome_pixmap_file (partial_path);
+ g_free (partial_path);
+ return full_path;
+}
+
/* Pick a particular icon to use, trying all the various suffixes.
* Return the path of the icon or NULL if no icon is found.
*/
@@ -484,7 +501,7 @@ get_themed_icon_file_path (const char *theme_name,
char *size_as_string, *property;
ArtIRect parsed_rect;
- if (theme_name == NULL) {
+ if (theme_name == NULL || icon_name[0] == '/') {
themed_icon_name = g_strdup (icon_name);
} else {
themed_icon_name = g_strconcat (theme_name, "/", icon_name, NULL);
@@ -496,12 +513,13 @@ get_themed_icon_file_path (const char *theme_name,
for (i = 0; i < NAUTILUS_N_ELEMENTS (icon_file_name_suffixes); i++) {
/* Build a path for this icon. */
- partial_path = g_strdup_printf ("nautilus/%s%s%.0u%s",
+ partial_path = g_strdup_printf ("%s%s%.0u",
themed_icon_name,
include_size ? "-" : "",
- include_size ? icon_size : 0,
- icon_file_name_suffixes[i]);
- path = gnome_pixmap_file (partial_path);
+ include_size ? icon_size : 0);
+
+ path = make_full_icon_path (partial_path,
+ icon_file_name_suffixes[i]);
g_free (partial_path);
/* Return the path if the file exists. */
@@ -509,16 +527,14 @@ get_themed_icon_file_path (const char *theme_name,
break;
}
g_free (path);
+ path = NULL;
}
/* Open the XML file to get the text rectangle. */
if (path != NULL && text_rect != NULL) {
memset (text_rect, 0, sizeof (*text_rect));
- partial_path = g_strdup_printf ("nautilus/%s.xml",
- themed_icon_name);
- xml_path = gnome_pixmap_file (partial_path);
- g_free (partial_path);
+ xml_path = make_full_icon_path (themed_icon_name, ".xml");
doc = xmlParseFile (xml_path);
g_free (xml_path);
diff --git a/libnautilus/nautilus-icon-grid.c b/libnautilus/nautilus-icon-grid.c
index 50b8b930b..3f2947258 100644
--- a/libnautilus/nautilus-icon-grid.c
+++ b/libnautilus/nautilus-icon-grid.c
@@ -73,8 +73,14 @@ nautilus_icon_grid_clear (NautilusIconGrid *grid)
g_list_free (grid->elements[i]);
}
g_free (grid->elements);
-
- memset (grid, 0, sizeof (*grid));
+ grid->elements = 0;
+
+ grid->bounds.x0 = 0;
+ grid->bounds.y0 = 0;
+ grid->bounds.x1 = 0;
+ grid->bounds.y1 = 0;
+ grid->first_free_x = 0;
+ grid->first_free_y = 0;
}
void
@@ -178,7 +184,7 @@ nautilus_icon_grid_set_visible_width (NautilusIconGrid *grid,
int visible_width;
ArtIRect bounds;
- visible_width = floor (world_visible_width / GRID_CELL_WIDTH);
+ visible_width = MAX(1, floor (world_visible_width / GRID_CELL_WIDTH));
if (visible_width > grid->bounds.x1) {
bounds = grid->bounds;