Hmm, it sort of does something.

1999-12-19  Havoc Pennington  <hp@pobox.com>

	* 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.
This commit is contained in:
Havoc Pennington 1999-12-19 07:44:16 +00:00 committed by Havoc Pennington
parent a82b8a9b18
commit 62748a9c8b
7 changed files with 126 additions and 24 deletions

View file

@ -26,6 +26,7 @@
#include <gtk/gtk.h>
#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);
@ -193,16 +198,85 @@ desktop_canvas_size_allocate(GtkWidget *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) {
@ -231,6 +308,12 @@ desktop_canvas_load_desktop_icons(DesktopCanvas *canvas, const gchar *uri)
(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);
}

View file

@ -95,6 +95,7 @@ struct _DesktopCanvas {
FMDirectoryList *desktop_dir_list;
guint entries_loaded_id;
guint finished_load_id;
};
struct _DesktopCanvasClass {

View file

@ -24,6 +24,15 @@
#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
/* 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);
}
}

View file

@ -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,

View file

@ -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);
}

View file

@ -87,8 +87,10 @@ desktop_window_init (DesktopWindow *dwindow)
/* Match the screen size */
gtk_widget_set_usize(GTK_WIDGET(dwindow),
350, 350
/* FIXME hard to debug :-)
gdk_screen_width(),
gdk_screen_height());
gdk_screen_height() */);
}
GtkWidget*

View file

@ -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);