From 62748a9c8bd680856d08cd0a915d8eb5e66224e0 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 19 Dec 1999 07:44:16 +0000 Subject: [PATCH] Hmm, it sort of does something. 1999-12-19 Havoc Pennington * src/file-manager/desktop-layout.c: don't do an arrangement on every change * src/file-manager/desktop-canvas.c (desktop_canvas_load_desktop_icons): connect to finished_load and arrange the icons when we get it. This is a temporary hack, because the DesktopLayout engine isn't progressive yet. * src/file-manager/fm-directory-list.c (fm_directory_list_class_init): add a finished_load signal * src/file-manager/desktop-window.c (desktop_window_init): for now, don't fill the whole screen so we can see gdb. * src/file-manager/desktop-item.c: Move user data accessors into the .c file, these are private. --- src/file-manager/desktop-canvas.c | 89 +++++++++++++++++++++++++++++-- src/file-manager/desktop-canvas.h | 1 + src/file-manager/desktop-item.c | 23 ++++++-- src/file-manager/desktop-item.h | 8 --- src/file-manager/desktop-layout.c | 13 +++-- src/file-manager/desktop-window.c | 6 ++- src/file-manager/gnome-desktop.c | 10 +++- 7 files changed, 126 insertions(+), 24 deletions(-) diff --git a/src/file-manager/desktop-canvas.c b/src/file-manager/desktop-canvas.c index 5e41ff38c..bea828b18 100644 --- a/src/file-manager/desktop-canvas.c +++ b/src/file-manager/desktop-canvas.c @@ -26,6 +26,7 @@ #include #include "desktop-menu.h" #include "fm-icon-cache.h" +#include "desktop-item.h" static void desktop_canvas_class_init (DesktopCanvasClass *class); static void desktop_canvas_init (DesktopCanvas *dcanvas); @@ -101,6 +102,7 @@ desktop_canvas_init (DesktopCanvas *dcanvas) dcanvas->desktop_dir_list = NULL; dcanvas->entries_loaded_id = 0; + dcanvas->finished_load_id = 0; } static void @@ -122,8 +124,11 @@ desktop_canvas_destroy (GtkObject *object) gtk_object_unref(GTK_OBJECT(canvas->desktop_dir_list)); gtk_signal_disconnect(GTK_OBJECT(canvas->desktop_dir_list), canvas->entries_loaded_id); + gtk_signal_disconnect(GTK_OBJECT(canvas->desktop_dir_list), + canvas->finished_load_id); canvas->desktop_dir_list = NULL; canvas->entries_loaded_id = 0; + canvas->finished_load_id = 0; } (* GTK_OBJECT_CLASS(parent_class)->destroy) (object); @@ -187,22 +192,91 @@ desktop_canvas_size_allocate(GtkWidget *widget, 0, 0, allocation->width, allocation->height); - + if (GTK_WIDGET_CLASS (parent_class)->size_allocate) (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation); } +static void +dicon_size_request(DesktopLayoutItem *layout_item, + gint *x, gint *y, gint *width, gint *height, + gpointer user_data) +{ + DesktopItem *icon = user_data; + + desktop_item_size_request(icon, x, y, width, height); + + printf("size req: %d,%d %dx%d\n", *x, *y, *width, *height); +} + +static void +dicon_size_allocate(DesktopLayoutItem *layout_item, + gint x, gint y, gint width, gint height, + gpointer user_data) +{ + DesktopItem *icon = user_data; + + desktop_item_size_allocate(icon, x, y, width, height); + + printf("size alloc: %d,%d %dx%d\n", x, y, width, height); +} + +static void +dicon_destroy_notify(gpointer data) +{ + DesktopItem *icon = data; + + desktop_item_unref(icon); +} + static void entries_loaded_cb(FMDirectoryList *dlist, GSList *entries, gpointer data) { DesktopCanvas *canvas = data; - + GSList *iter; + g_assert(canvas != NULL); - printf("loaded some entries\n"); + iter = entries; + while (iter != NULL) { + FMDirectoryListEntry *entry = iter->data; + DesktopItem *icon; + DesktopLayoutItem *layout_item; + + printf("entry: %s\n", + fm_directory_list_entry_get_name(entry)); + + icon = desktop_icon_new(); + + desktop_icon_set_icon(icon, fm_directory_list_entry_get_icon(entry)); + desktop_icon_set_name(icon, fm_directory_list_entry_get_name(entry)); + + layout_item = desktop_layout_item_new(dicon_size_request, + dicon_size_allocate, + dicon_destroy_notify, + icon); + + desktop_layout_add_item(canvas->layout, + layout_item); + + desktop_layout_item_unref(layout_item); + + /* sort of a hack to have this here */ + desktop_item_realize(icon, GNOME_CANVAS_GROUP(GNOME_CANVAS(canvas)->root)); + + iter = g_slist_next(iter); + } +} + +static void +finished_load_cb(FMDirectoryList *dlist, gpointer data) +{ + DesktopCanvas *canvas = data; + + desktop_layout_arrange(canvas->layout, FALSE); } void @@ -215,8 +289,11 @@ desktop_canvas_load_desktop_icons(DesktopCanvas *canvas, const gchar *uri) gtk_object_unref(GTK_OBJECT(canvas->desktop_dir_list)); gtk_signal_disconnect(GTK_OBJECT(canvas->desktop_dir_list), canvas->entries_loaded_id); + gtk_signal_disconnect(GTK_OBJECT(canvas->desktop_dir_list), + canvas->finished_load_id); canvas->desktop_dir_list = NULL; canvas->entries_loaded_id = 0; + canvas->finished_load_id = 0; } if (uri != NULL) { @@ -230,6 +307,12 @@ desktop_canvas_load_desktop_icons(DesktopCanvas *canvas, const gchar *uri) "entries_loaded", (GtkSignalFunc)entries_loaded_cb, canvas); + + canvas->finished_load_id = + gtk_signal_connect(GTK_OBJECT(canvas->desktop_dir_list), + "finished_load", + (GtkSignalFunc)finished_load_cb, + canvas); fm_directory_list_load_uri(canvas->desktop_dir_list, uri); diff --git a/src/file-manager/desktop-canvas.h b/src/file-manager/desktop-canvas.h index 696d1ddce..ed1785bdb 100644 --- a/src/file-manager/desktop-canvas.h +++ b/src/file-manager/desktop-canvas.h @@ -95,6 +95,7 @@ struct _DesktopCanvas { FMDirectoryList *desktop_dir_list; guint entries_loaded_id; + guint finished_load_id; }; struct _DesktopCanvasClass { diff --git a/src/file-manager/desktop-item.c b/src/file-manager/desktop-item.c index 75ca80cc6..64b9d38a4 100644 --- a/src/file-manager/desktop-item.c +++ b/src/file-manager/desktop-item.c @@ -24,6 +24,15 @@ #include + +/* User data is used by the specific DesktopItem types */ +static void desktop_item_set_user_data (DesktopItem *item, + gpointer user_data, + GDestroyNotify destroy_notify_func); +static gpointer desktop_item_get_user_data (DesktopItem *item); + + + typedef enum { DESKTOP_ITEM_NONE, DESKTOP_ITEM_ICON @@ -229,7 +238,12 @@ icon_realize (DesktopItem *item, GnomeCanvasGroup *group) gnome_canvas_pixbuf_get_type(), "x", 0.0, "y", 0.0, "pixbuf", icon->pixbuf, + "width", icon->pixbuf ? + (double)gdk_pixbuf_get_width(icon->pixbuf) : 10.0, + "height", icon->pixbuf ? + (double)gdk_pixbuf_get_height(icon->pixbuf) : 10.0, "x_set", TRUE, "y_set", TRUE, + "width_set", TRUE, "height_set", TRUE, NULL); } @@ -284,11 +298,10 @@ icon_size_allocate (DesktopItem *item, if (item->canvas_item) { gnome_canvas_item_set (item->canvas_item, - "x", x, - "y", y, - "width", width, - "height", height, - "width_set", TRUE, "height_set", TRUE, + "x", (double)x, + "y", (double)y, + "width", (double)width, + "height", (double)height, NULL); } } diff --git a/src/file-manager/desktop-item.h b/src/file-manager/desktop-item.h index ac2f0434f..fa54b1f11 100644 --- a/src/file-manager/desktop-item.h +++ b/src/file-manager/desktop-item.h @@ -48,14 +48,6 @@ void desktop_item_size_request (DesktopItem *item, void desktop_item_size_allocate (DesktopItem *item, gint x, gint y, gint width, gint height); - -/* User data is used by the specific DesktopItem types */ -void desktop_item_set_user_data (DesktopItem *item, - gpointer user_data, - GDestroyNotify destroy_notify_func); -gpointer desktop_item_get_user_data (DesktopItem *item); - - /* This is a specific DesktopItem type */ DesktopItem* desktop_icon_new (void); void desktop_icon_set_icon (DesktopItem *item, diff --git a/src/file-manager/desktop-layout.c b/src/file-manager/desktop-layout.c index d86e6d0cf..a95f04fc3 100644 --- a/src/file-manager/desktop-layout.c +++ b/src/file-manager/desktop-layout.c @@ -243,6 +243,11 @@ desktop_layout_unref (DesktopLayout *layout) } /* FIXME changing any of this stuff requires a layout recomputation */ +static void +queue_arrange(DesktopLayout *layout) +{ + /* FIXME do something */ +} void desktop_layout_set_size (DesktopLayout *layout, @@ -256,7 +261,7 @@ desktop_layout_set_size (DesktopLayout *layout, layout->width = width; layout->height = height; - desktop_layout_arrange(layout, FALSE); + queue_arrange(layout); } void @@ -269,7 +274,7 @@ desktop_layout_set_mode (DesktopLayout *layout, layout->hmode = hmode; layout->vmode = vmode; - desktop_layout_arrange(layout, FALSE); + queue_arrange(layout); } void @@ -279,7 +284,7 @@ desktop_layout_add_item (DesktopLayout *layout, desktop_layout_item_ref(item); layout->items = g_list_prepend(layout->items, item); - desktop_layout_arrange(layout, FALSE); + queue_arrange(layout); } void @@ -289,7 +294,7 @@ desktop_layout_remove_item (DesktopLayout *layout, layout->items = g_list_remove(layout->items, item); desktop_layout_item_unref(item); - desktop_layout_arrange(layout, FALSE); + queue_arrange(layout); } diff --git a/src/file-manager/desktop-window.c b/src/file-manager/desktop-window.c index 42565c50f..920706591 100644 --- a/src/file-manager/desktop-window.c +++ b/src/file-manager/desktop-window.c @@ -87,8 +87,10 @@ desktop_window_init (DesktopWindow *dwindow) /* Match the screen size */ gtk_widget_set_usize(GTK_WIDGET(dwindow), - gdk_screen_width(), - gdk_screen_height()); + 350, 350 + /* FIXME hard to debug :-) + gdk_screen_width(), + gdk_screen_height() */); } GtkWidget* diff --git a/src/file-manager/gnome-desktop.c b/src/file-manager/gnome-desktop.c index 5c29ef5e5..8c9260dd3 100644 --- a/src/file-manager/gnome-desktop.c +++ b/src/file-manager/gnome-desktop.c @@ -55,16 +55,22 @@ main (int argc, char *argv[]) gnome_CORBA_init ("gnome-desktop", VERSION, &argc, argv, GNORBA_INIT_SERVER_FUNC, &ev); gnome_vfs_init(); - + gdk_rgb_init(); + window = desktop_window_new(); + + gtk_widget_push_visual(gdk_rgb_get_visual()); + gtk_widget_push_colormap(gdk_rgb_get_cmap()); canvas = desktop_canvas_new(); + gtk_widget_pop_visual(); + gtk_widget_pop_colormap(); gtk_container_add(GTK_CONTAINER(window), canvas); desktop_canvas_set_solid_background_color(DESKTOP_CANVAS(canvas), 0xFF0000); desktop_canvas_load_desktop_icons(DESKTOP_CANVAS (canvas), - "file:/home/hp"); + "file:/home/"); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_event_cb), NULL);