diff src/view_dir_list.c @ 380:5afe77bb563a

Introduce a new struct ViewDir to handle directory views common data. Specific data is now in ViewDirInfoList and ViewDirInfoTree. Type of directory view can be specified with enum DirViewType. This is saved to rc file as layout.dir_view_type, which replace layout.view_as_tree. Code was modified to reflect these changes. This is a first to move to merge common code of view_dir_list.c and view_dir_tree.c and ease the introduction of new types of directory view.
author zas_
date Wed, 16 Apr 2008 14:45:22 +0000
parents 61a3c8b05b24
children ff63dcb0425c
line wrap: on
line diff
--- a/src/view_dir_list.c	Tue Apr 15 21:49:28 2008 +0000
+++ b/src/view_dir_list.c	Wed Apr 16 14:45:22 2008 +0000
@@ -23,20 +23,14 @@
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tree_edit.h"
+#include "view_dir.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
 
 #define VDLIST_PAD 4
 
-
-enum {
-	DIR_COLUMN_POINTER = 0,
-	DIR_COLUMN_ICON,
-	DIR_COLUMN_NAME,
-	DIR_COLUMN_COLOR,
-	DIR_COLUMN_COUNT
-};
+#define VDLIST_INFO(_vd_, _part_) (((ViewDirInfoList *)(_vd_->info))->_part_)
 
 
 static void vdlist_popup_destroy_cb(GtkWidget *widget, gpointer data);
@@ -48,13 +42,13 @@
  *-----------------------------------------------------------------------------
  */
 
-static gint vdlist_find_row(ViewDirList *vdl, FileData *fd, GtkTreeIter *iter)
+static gint vdlist_find_row(ViewDir *vdl, FileData *fd, GtkTreeIter *iter)
 {
 	GtkTreeModel *store;
 	gint valid;
 	gint row = 0;
 
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	valid = gtk_tree_model_get_iter_first(store, iter);
 	while (valid)
 		{
@@ -71,7 +65,7 @@
 
 static gint vdlist_rename_row_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreeModel *store;
 	GtkTreeIter iter;
 	FileData *fd;
@@ -79,7 +73,7 @@
 	gchar *new_path;
 	gchar *base;
 
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	if (!gtk_tree_model_get_iter(store, &iter, td->path)) return FALSE;
 	gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
 	if (!fd) return FALSE;
@@ -90,7 +84,7 @@
 	new_path = concat_dir_and_file(base, new);
 	g_free(base);
 
-	if (file_util_rename_dir(fd, new_path, vdl->listview))
+	if (file_util_rename_dir(fd, new_path, vdl->view))
 		{
 		if (vdl->layout && strcmp(vdl->path, old_path) == 0)
 			{
@@ -107,22 +101,22 @@
 	return FALSE;
 }
 
-static void vdlist_rename_by_row(ViewDirList *vdl, FileData *fd)
+static void vdlist_rename_by_row(ViewDir *vdl, FileData *fd)
 {
 	GtkTreeModel *store;
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 
 	if (vdlist_find_row(vdl, fd, &iter) < 0) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	tpath = gtk_tree_model_get_path(store, &iter);
 
-	tree_edit_by_path(GTK_TREE_VIEW(vdl->listview), tpath, 0, fd->name,
+	tree_edit_by_path(GTK_TREE_VIEW(vdl->view), tpath, 0, fd->name,
 			  vdlist_rename_row_cb, vdl);
 	gtk_tree_path_free(tpath);
 }
 
-static FileData *vdlist_row_by_path(ViewDirList *vdl, const gchar *path, gint *row)
+static FileData *vdlist_row_by_path(ViewDir *vdl, const gchar *path, gint *row)
 {
 	GList *work;
 	gint n;
@@ -134,7 +128,7 @@
 		}
 
 	n = 0;
-	work = vdl->list;
+	work = VDLIST_INFO(vdl, list);
 	while (work)
 		{
 		FileData *fd = work->data;
@@ -151,13 +145,13 @@
 	return NULL;
 }
 
-static void vdlist_color_set(ViewDirList *vdl, FileData *fd, gint color_set)
+static void vdlist_color_set(ViewDir *vdl, FileData *fd, gint color_set)
 {
 	GtkTreeModel *store;
 	GtkTreeIter iter;
 
 	if (vdlist_find_row(vdl, fd, &iter) < 0) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	gtk_list_store_set(GTK_LIST_STORE(store), &iter, DIR_COLUMN_COLOR, color_set, -1);
 }
 
@@ -169,7 +163,7 @@
 
 static void vdlist_drop_menu_copy_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	const gchar *path;
 	GList *list;
 
@@ -184,7 +178,7 @@
 
 static void vdlist_drop_menu_move_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	const gchar *path;
 	GList *list;
 
@@ -198,7 +192,7 @@
 	file_util_move_simple(list, path);
 }
 
-static GtkWidget *vdlist_drop_menu(ViewDirList *vdl, gint active)
+static GtkWidget *vdlist_drop_menu(ViewDir *vdl, gint active)
 {
 	GtkWidget *menu;
 
@@ -224,7 +218,7 @@
 
 static void vdlist_pop_menu_up_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	gchar *path;
 
 	if (!vdl->path || strcmp(vdl->path, "/") == 0) return;
@@ -240,7 +234,7 @@
 
 static void vdlist_pop_menu_slide_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	gchar *path;
 
 	if (!vdl->layout || !vdl->click_fd) return;
@@ -257,7 +251,7 @@
 
 static void vdlist_pop_menu_slide_rec_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	gchar *path;
 	GList *list;
 
@@ -273,7 +267,7 @@
 	g_free(path);
 }
 
-static void vdlist_pop_menu_dupe(ViewDirList *vdl, gint recursive)
+static void vdlist_pop_menu_dupe(ViewDir *vdl, gint recursive)
 {
 	DupeWindow *dw;
 	GList *list = NULL;
@@ -298,19 +292,19 @@
 
 static void vdlist_pop_menu_dupe_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	vdlist_pop_menu_dupe(vdl, FALSE);
 }
 
 static void vdlist_pop_menu_dupe_rec_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	vdlist_pop_menu_dupe(vdl, TRUE);
 }
 
 static void vdlist_pop_menu_new_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	gchar *new_path;
 	gchar *buf;
 
@@ -326,7 +320,7 @@
 		gchar *text;
 
 		text = g_strdup_printf(_("Unable to create folder:\n%s"), new_path);
-		file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, vdl->listview);
+		file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, vdl->view);
 		g_free(text);
 		}
 	else
@@ -344,42 +338,42 @@
 
 static void vdlist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	vdlist_rename_by_row(vdl, vdl->click_fd);
 }
 
 static void vdlist_pop_menu_delete_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (!vdl->click_fd) return;
 	file_util_delete_dir(vdl->click_fd, vdl->widget);
 }
 
-static void vdlist_pop_menu_tree_cb(GtkWidget *widget, gpointer data)
+static void vdlist_pop_menu_dir_view_as_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
-	if (vdl->layout) layout_views_set(vdl->layout, TRUE, vdl->layout->icon_view);
+	if (vdl->layout) layout_views_set(vdl->layout, DIRVIEW_TREE, vdl->layout->icon_view);
 }
 
 static void vdlist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (vdl->layout) layout_refresh(vdl->layout);
 }
 
 static void vdlist_toggle_show_hidden_files_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	options->file_filter.show_hidden_files = !options->file_filter.show_hidden_files;
 	if (vdl->layout) layout_refresh(vdl->layout);
 }
 
-static GtkWidget *vdlist_pop_menu(ViewDirList *vdl, FileData *fd)
+static GtkWidget *vdlist_pop_menu(ViewDir *vdl, FileData *fd)
 {
 	GtkWidget *menu;
 	gint active;
@@ -425,7 +419,7 @@
 
 	menu_item_add_divider(menu);
 	menu_item_add_check(menu, _("View as _tree"), FALSE,
-			    G_CALLBACK(vdlist_pop_menu_tree_cb), vdl);
+			    G_CALLBACK(vdlist_pop_menu_dir_view_as_cb), vdl);
 	menu_item_add_check(menu, _("Show _hidden files"), options->file_filter.show_hidden_files,
 			    G_CALLBACK(vdlist_toggle_show_hidden_files_cb), vdl);
 
@@ -437,7 +431,7 @@
 
 static void vdlist_popup_destroy_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	vdlist_color_set(vdl, vdl->click_fd, FALSE);
 	vdl->click_fd = NULL;
@@ -460,18 +454,18 @@
 };
 static gint vdlist_dnd_drop_types_count = 1;
 
-static void vdlist_dest_set(ViewDirList *vdl, gint enable)
+static void vdlist_dest_set(ViewDir *vdl, gint enable)
 {
 	if (enable)
 		{
-		gtk_drag_dest_set(vdl->listview,
+		gtk_drag_dest_set(vdl->view,
 				  GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
 				  vdlist_dnd_drop_types, vdlist_dnd_drop_types_count,
 				  GDK_ACTION_MOVE | GDK_ACTION_COPY);
 		}
 	else
 		{
-		gtk_drag_dest_unset(vdl->listview);
+		gtk_drag_dest_unset(vdl->view);
 		}
 }
 
@@ -479,7 +473,7 @@
 			   GtkSelectionData *selection_data, guint info,
 			   guint time, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GList *list;
 	gchar *text = NULL;
 	gint length = 0;
@@ -505,7 +499,7 @@
 
 static void vdlist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	vdlist_color_set(vdl, vdl->click_fd, TRUE);
 	vdlist_dest_set(vdl, FALSE);
@@ -513,7 +507,7 @@
 
 static void vdlist_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	vdlist_color_set(vdl, vdl->click_fd, FALSE);
 
@@ -529,7 +523,7 @@
 				    GtkSelectionData *selection_data, guint info,
 				    guint time, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 	FileData *fd = NULL;
@@ -569,7 +563,7 @@
 }
 
 #if 0
-static gint vdlist_get_row_visibility(ViewDirList *vdl, FileData *fd)
+static gint vdlist_get_row_visibility(ViewDir *vdl, FileData *fd)
 {
 	GtkTreeModel *store;
 	GtkTreeViewColumn *column;
@@ -581,12 +575,12 @@
 
 	if (!fd || vdlist_find_row(vdl, fd, &iter) < 0) return 0;
 
-	column = gtk_tree_view_get_column(GTK_TREE_VIEW(vdl->listview), 0);
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(vdl->view), 0);
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	tpath = gtk_tree_model_get_path(store, &iter);
 
-	gtk_tree_view_get_visible_rect(GTK_TREE_VIEW(vdl->listview), &vrect);
-	gtk_tree_view_get_cell_area(GTK_TREE_VIEW(vdl->listview), tpath, column, &crect);
+	gtk_tree_view_get_visible_rect(GTK_TREE_VIEW(vdl->view), &vrect);
+	gtk_tree_view_get_cell_area(GTK_TREE_VIEW(vdl->view), tpath, column, &crect);
 printf("window: %d + %d; cell: %d + %d\n", vrect.y, vrect.height, crect.y, crect.height);
 	gtk_tree_path_free(tpath);
 
@@ -596,38 +590,38 @@
 }
 #endif
 
-static void vdlist_scroll_to_row(ViewDirList *vdl, FileData *fd, gfloat y_align)
+static void vdlist_scroll_to_row(ViewDir *vdl, FileData *fd, gfloat y_align)
 {
 	GtkTreeIter iter;
 
-	if (GTK_WIDGET_REALIZED(vdl->listview) &&
+	if (GTK_WIDGET_REALIZED(vdl->view) &&
 	    vdlist_find_row(vdl, fd, &iter) >= 0)
 		{
 		GtkTreeModel *store;
 		GtkTreePath *tpath;
 
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 		tpath = gtk_tree_model_get_path(store, &iter);
-		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vdl->listview), tpath, NULL, TRUE, y_align, 0.0);
-		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vdl->listview), tpath, NULL, FALSE);
+		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vdl->view), tpath, NULL, TRUE, y_align, 0.0);
+		gtk_tree_view_set_cursor(GTK_TREE_VIEW(vdl->view), tpath, NULL, FALSE);
 		gtk_tree_path_free(tpath);
 
-		if (!GTK_WIDGET_HAS_FOCUS(vdl->listview)) gtk_widget_grab_focus(vdl->listview);
+		if (!GTK_WIDGET_HAS_FOCUS(vdl->view)) gtk_widget_grab_focus(vdl->view);
 		}
 }
 
-static void vdlist_drop_update(ViewDirList *vdl, gint x, gint y)
+static void vdlist_drop_update(ViewDir *vdl, gint x, gint y)
 {
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 	FileData *fd = NULL;
 
-	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vdl->listview), x, y,
+	if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vdl->view), x, y,
 					  &tpath, NULL, NULL, NULL))
 		{
 		GtkTreeModel *store;
 
-		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+		store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 		gtk_tree_model_get_iter(store, &iter, tpath);
 		gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
 		gtk_tree_path_free(tpath);
@@ -642,7 +636,7 @@
 	vdl->drop_fd = fd;
 }
 
-static void vdlist_dnd_drop_scroll_cancel(ViewDirList *vdl)
+static void vdlist_dnd_drop_scroll_cancel(ViewDir *vdl)
 {
 	if (vdl->drop_scroll_id != -1) g_source_remove(vdl->drop_scroll_id);
 	vdl->drop_scroll_id = -1;
@@ -650,7 +644,7 @@
 
 static gint vdlist_auto_scroll_idle_cb(gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (vdl->drop_fd)
 		{
@@ -658,7 +652,7 @@
 		gint x, y;
 		gint w, h;
 
-		window = vdl->listview->window;
+		window = vdl->view->window;
 		gdk_window_get_pointer(window, &x, &y, NULL);
 		gdk_drawable_get_size(window, &w, &h);
 		if (x >= 0 && x < w && y >= 0 && y < h)
@@ -673,7 +667,7 @@
 
 static gint vdlist_auto_scroll_notify_cb(GtkWidget *widget, gint x, gint y, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (!vdl->drop_fd || vdl->drop_list) return FALSE;
 
@@ -685,11 +679,11 @@
 static gint vdlist_dnd_drop_motion(GtkWidget *widget, GdkDragContext *context,
 				   gint x, gint y, guint time, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	vdl->click_fd = NULL;
 
-	if (gtk_drag_get_source_widget(context) == vdl->listview)
+	if (gtk_drag_get_source_widget(context) == vdl->view)
 		{
 		/* from same window */
 		gdk_drag_status(context, 0, time);
@@ -704,8 +698,8 @@
 
         if (vdl->drop_fd)
 		{
-		GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vdl->listview));
-		widget_auto_scroll_start(vdl->listview, adj, -1, -1, vdlist_auto_scroll_notify_cb, vdl);
+		GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vdl->view));
+		widget_auto_scroll_start(vdl->view, adj, -1, -1, vdlist_auto_scroll_notify_cb, vdl);
 		}
 
 	return FALSE;
@@ -713,31 +707,31 @@
 
 static void vdlist_dnd_drop_leave(GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (vdl->drop_fd != vdl->click_fd) vdlist_color_set(vdl, vdl->drop_fd, FALSE);
 
 	vdl->drop_fd = NULL;
 }
 
-static void vdlist_dnd_init(ViewDirList *vdl)
+static void vdlist_dnd_init(ViewDir *vdl)
 {
-	gtk_drag_source_set(vdl->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+	gtk_drag_source_set(vdl->view, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
 			    dnd_file_drag_types, dnd_file_drag_types_count,
 			    GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_data_get",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_data_get",
 			 G_CALLBACK(vdlist_dnd_get), vdl);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_begin",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_begin",
 			 G_CALLBACK(vdlist_dnd_begin), vdl);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_end",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_end",
 			 G_CALLBACK(vdlist_dnd_end), vdl);
 
 	vdlist_dest_set(vdl, TRUE);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_data_received",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_data_received",
 			 G_CALLBACK(vdlist_dnd_drop_receive), vdl);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_motion",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_motion",
 			 G_CALLBACK(vdlist_dnd_drop_motion), vdl);
-	g_signal_connect(G_OBJECT(vdl->listview), "drag_leave",
+	g_signal_connect(G_OBJECT(vdl->view), "drag_leave",
 			 G_CALLBACK(vdlist_dnd_drop_leave), vdl);
 }
 
@@ -747,7 +741,7 @@
  *-----------------------------------------------------------------------------
  */ 
 
-static void vdlist_select_row(ViewDirList *vdl, FileData *fd)
+static void vdlist_select_row(ViewDir *vdl, FileData *fd)
 {
 	if (fd && vdl->select_func)
 		{
@@ -759,26 +753,26 @@
 		}
 }
 
-const gchar *vdlist_row_get_path(ViewDirList *vdl, gint row)
+const gchar *vdlist_row_get_path(ViewDir *vdl, gint row)
 {
 	FileData *fd;
 
-	fd = g_list_nth_data(vdl->list, row);
+	fd = g_list_nth_data(VDLIST_INFO(vdl, list), row);
 
 	if (fd) return fd->path;
 
 	return NULL;
 }
 
-static void vdlist_populate(ViewDirList *vdl)
+static void vdlist_populate(ViewDir *vdl)
 {
 	GtkListStore *store;
 	GList *work;
 
-	store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview)));
+	store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view)));
 	gtk_list_store_clear(store);
 
-	work = vdl->list;
+	work = VDLIST_INFO(vdl, list);
 	while (work)
 		{
 		FileData *fd;
@@ -820,7 +814,7 @@
 	vdl->drop_fd = NULL;
 }
 
-gint vdlist_set_path(ViewDirList *vdl, const gchar *path)
+gint vdlist_set_path(ViewDir *vdl, const gchar *path)
 {
 	gint ret;
 	FileData *fd;
@@ -845,12 +839,12 @@
 	g_free(vdl->path);
 	vdl->path = g_strdup(path);
 
-	filelist_free(vdl->list);
-	vdl->list = NULL;
+	filelist_free(VDLIST_INFO(vdl, list));
+	VDLIST_INFO(vdl, list) = NULL;
 
-	ret = filelist_read(vdl->path, NULL, &vdl->list);
+	ret = filelist_read(vdl->path, NULL, &VDLIST_INFO(vdl, list));
 
-	vdl->list = filelist_sort(vdl->list, SORT_NAME, TRUE);
+	VDLIST_INFO(vdl, list) = filelist_sort(VDLIST_INFO(vdl, list), SORT_NAME, TRUE);
 
 	/* add . and .. */
 
@@ -858,7 +852,7 @@
 		{
 		filepath = g_strconcat(vdl->path, "/", "..", NULL); 
 		fd = file_data_new_simple(filepath);
-		vdl->list = g_list_prepend(vdl->list, fd);
+		VDLIST_INFO(vdl, list) = g_list_prepend(VDLIST_INFO(vdl, list), fd);
 		g_free(filepath);
 		}
 	
@@ -866,7 +860,7 @@
 		{
 		filepath = g_strconcat(vdl->path, "/", ".", NULL); 
 		fd = file_data_new_simple(filepath);
-		vdl->list = g_list_prepend(vdl->list, fd);
+		VDLIST_INFO(vdl, list) = g_list_prepend(VDLIST_INFO(vdl, list), fd);
 		g_free(filepath);
 	}
 
@@ -878,7 +872,7 @@
 		FileData *found = NULL;
 		GList *work;
 
-		work = vdl->list;
+		work = VDLIST_INFO(vdl, list);
 		while (work && !found)
 			{
 			FileData *fd = work->data;
@@ -892,15 +886,15 @@
 		return ret;
 		}
 
-	if (GTK_WIDGET_REALIZED(vdl->listview))
+	if (GTK_WIDGET_REALIZED(vdl->view))
 		{
-		gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(vdl->listview), 0, 0);
+		gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(vdl->view), 0, 0);
 		}
 
 	return ret;
 }
 
-void vdlist_refresh(ViewDirList *vdl)
+void vdlist_refresh(ViewDir *vdl)
 {
 	gchar *path;
 
@@ -912,16 +906,16 @@
 
 static void vdlist_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreeModel *store;
 	GtkTreeIter iter;
 	GtkTreePath *tpath;
 	gint cw, ch;
 
 	if (vdlist_find_row(vdl, vdl->click_fd, &iter) < 0) return;
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+	store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->view));
 	tpath = gtk_tree_model_get_path(store, &iter);
-	tree_view_get_cell_clamped(GTK_TREE_VIEW(vdl->listview), tpath, 0, TRUE, x, y, &cw, &ch);
+	tree_view_get_cell_clamped(GTK_TREE_VIEW(vdl->view), tpath, 0, TRUE, x, y, &cw, &ch);
 	gtk_tree_path_free(tpath);
 	*y += ch;
 	popup_menu_position_clamp(menu, x, y, 0);
@@ -929,12 +923,12 @@
 
 static gint vdlist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreePath *tpath;
 	
 	if (event->keyval != GDK_Menu) return FALSE;
 
-	gtk_tree_view_get_cursor(GTK_TREE_VIEW(vdl->listview), &tpath, NULL);
+	gtk_tree_view_get_cursor(GTK_TREE_VIEW(vdl->view), &tpath, NULL);
 	if (tpath)
 		{
 		GtkTreeModel *store;
@@ -962,7 +956,7 @@
 
 static gint vdlist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 	FileData *fd = NULL;
@@ -994,7 +988,7 @@
 
 static gint vdlist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreePath *tpath;
 	GtkTreeIter iter;
 	FileData *fd = NULL;
@@ -1025,7 +1019,7 @@
 
 static void vdlist_select_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *column, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	GtkTreeModel *store;
 	GtkTreeIter iter;
 	FileData *fd;
@@ -1058,18 +1052,18 @@
 static void vdlist_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
 			    GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 	gboolean set;
 
 	gtk_tree_model_get(tree_model, iter, DIR_COLUMN_COLOR, &set, -1);
 	g_object_set(G_OBJECT(cell),
-		     "cell-background-gdk", vdlist_color_shifted(vdl->listview),
+		     "cell-background-gdk", vdlist_color_shifted(vdl->view),
 		     "cell-background-set", set, NULL);
 }
 
 static void vdlist_destroy_cb(GtkWidget *widget, gpointer data)
 {
-	ViewDirList *vdl = data;
+	ViewDir *vdl = data;
 
 	if (vdl->popup)
 		{
@@ -1079,29 +1073,32 @@
 		}
 
 	vdlist_dnd_drop_scroll_cancel(vdl);
-	widget_auto_scroll_stop(vdl->listview);
+	widget_auto_scroll_stop(vdl->view);
 
 	filelist_free(vdl->drop_list);
 
 	folder_icons_free(vdl->pf);
 
 	g_free(vdl->path);
-	filelist_free(vdl->list);
+	filelist_free(VDLIST_INFO(vdl, list));
+	g_free(vdl->info);
 	g_free(vdl);
 }
 
-ViewDirList *vdlist_new(const gchar *path)
+ViewDir *vdlist_new(const gchar *path)
 {
-	ViewDirList *vdl;
+	ViewDir *vdl;
 	GtkListStore *store;
 	GtkTreeSelection *selection;
 	GtkTreeViewColumn *column;
 	GtkCellRenderer *renderer;
 
-	vdl = g_new0(ViewDirList, 1);
+	vdl = g_new0(ViewDir, 1);
+	vdl->info = g_new0(ViewDirInfoList, 1);
+	vdl->type = DIRVIEW_LIST;
 
 	vdl->path = NULL;
-	vdl->list = NULL;
+	VDLIST_INFO(vdl, list) = NULL;
 	vdl->click_fd = NULL;
 
 	vdl->drop_fd = NULL;
@@ -1119,16 +1116,16 @@
 			 G_CALLBACK(vdlist_destroy_cb), vdl);
 
 	store = gtk_list_store_new(4, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
-	vdl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+	vdl->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
 	g_object_unref(store);
 
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vdl->listview), FALSE);
-	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vdl->listview), FALSE);
-	g_signal_connect(G_OBJECT(vdl->listview), "row_activated",
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vdl->view), FALSE);
+	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vdl->view), FALSE);
+	g_signal_connect(G_OBJECT(vdl->view), "row_activated",
 
 			 G_CALLBACK(vdlist_select_cb), vdl);
 
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vdl->listview));
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vdl->view));
 	gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);
 
 	column = gtk_tree_view_column_new();
@@ -1144,36 +1141,23 @@
 	gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_NAME);
 	gtk_tree_view_column_set_cell_data_func(column, renderer, vdlist_color_cb, vdl, NULL);
 
-	gtk_tree_view_append_column(GTK_TREE_VIEW(vdl->listview), column);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(vdl->view), column);
 
-	g_signal_connect(G_OBJECT(vdl->listview), "key_press_event",
+	g_signal_connect(G_OBJECT(vdl->view), "key_press_event",
 			   G_CALLBACK(vdlist_press_key_cb), vdl);
-	gtk_container_add(GTK_CONTAINER(vdl->widget), vdl->listview);
-	gtk_widget_show(vdl->listview);
+	gtk_container_add(GTK_CONTAINER(vdl->widget), vdl->view);
+	gtk_widget_show(vdl->view);
 
 	vdl->pf = folder_icons_new();
 
 	vdlist_dnd_init(vdl);
 
-	g_signal_connect(G_OBJECT(vdl->listview), "button_press_event",
+	g_signal_connect(G_OBJECT(vdl->view), "button_press_event",
 			 G_CALLBACK(vdlist_press_cb), vdl);
-	g_signal_connect(G_OBJECT(vdl->listview), "button_release_event",
+	g_signal_connect(G_OBJECT(vdl->view), "button_release_event",
 			 G_CALLBACK(vdlist_release_cb), vdl);
 
 	if (path) vdlist_set_path(vdl, path);
 
 	return vdl;
 }
-
-void vdlist_set_select_func(ViewDirList *vdl,
-			    void (*func)(ViewDirList *vdl, const gchar *path, gpointer data), gpointer data)
-{
-	vdl->select_func = func;
-	vdl->select_data = data;
-}
-
-void vdlist_set_layout(ViewDirList *vdl, LayoutWindow *layout)
-{
-	vdl->layout = layout;
-}
-