+2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
+
+ Fixed #138004 using Federico's code from #132327.
+
+ * gtk/gtkfilesystemwin32.c (struct _GtkFileSystemWin32): Add a
+ folder_hash field to keep a list of live folder objects.
+ (gtk_file_system_win32_init): Create the folder_hash.
+ (gtk_file_system_win32_finalize): Destroy the folder_hash.
+ (gtk_file_system_win32_get_folder): Ref and return an existing
+ folder if we have it around, otherwise return a new folder object.
+ (struct _GtkFileFolderWin32): Add a field for the parent file system.
+ (gtk_file_folder_win32_finalize): Remove the folder from the file
+ system's hash table.
+ (gtk_file_system_win32_create_folder): Emit "files-added" on the
+ newly-created folder's parent. Fixes #138004.
+
2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
* gtk/gtkfilesystemwin32.c
+2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
+
+ Fixed #138004 using Federico's code from #132327.
+
+ * gtk/gtkfilesystemwin32.c (struct _GtkFileSystemWin32): Add a
+ folder_hash field to keep a list of live folder objects.
+ (gtk_file_system_win32_init): Create the folder_hash.
+ (gtk_file_system_win32_finalize): Destroy the folder_hash.
+ (gtk_file_system_win32_get_folder): Ref and return an existing
+ folder if we have it around, otherwise return a new folder object.
+ (struct _GtkFileFolderWin32): Add a field for the parent file system.
+ (gtk_file_folder_win32_finalize): Remove the folder from the file
+ system's hash table.
+ (gtk_file_system_win32_create_folder): Emit "files-added" on the
+ newly-created folder's parent. Fixes #138004.
+
2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
* gtk/gtkfilesystemwin32.c
+2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
+
+ Fixed #138004 using Federico's code from #132327.
+
+ * gtk/gtkfilesystemwin32.c (struct _GtkFileSystemWin32): Add a
+ folder_hash field to keep a list of live folder objects.
+ (gtk_file_system_win32_init): Create the folder_hash.
+ (gtk_file_system_win32_finalize): Destroy the folder_hash.
+ (gtk_file_system_win32_get_folder): Ref and return an existing
+ folder if we have it around, otherwise return a new folder object.
+ (struct _GtkFileFolderWin32): Add a field for the parent file system.
+ (gtk_file_folder_win32_finalize): Remove the folder from the file
+ system's hash table.
+ (gtk_file_system_win32_create_folder): Emit "files-added" on the
+ newly-created folder's parent. Fixes #138004.
+
2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
* gtk/gtkfilesystemwin32.c
+2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
+
+ Fixed #138004 using Federico's code from #132327.
+
+ * gtk/gtkfilesystemwin32.c (struct _GtkFileSystemWin32): Add a
+ folder_hash field to keep a list of live folder objects.
+ (gtk_file_system_win32_init): Create the folder_hash.
+ (gtk_file_system_win32_finalize): Destroy the folder_hash.
+ (gtk_file_system_win32_get_folder): Ref and return an existing
+ folder if we have it around, otherwise return a new folder object.
+ (struct _GtkFileFolderWin32): Add a field for the parent file system.
+ (gtk_file_folder_win32_finalize): Remove the folder from the file
+ system's hash table.
+ (gtk_file_system_win32_create_folder): Emit "files-added" on the
+ newly-created folder's parent. Fixes #138004.
+
2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
* gtk/gtkfilesystemwin32.c
+2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
+
+ Fixed #138004 using Federico's code from #132327.
+
+ * gtk/gtkfilesystemwin32.c (struct _GtkFileSystemWin32): Add a
+ folder_hash field to keep a list of live folder objects.
+ (gtk_file_system_win32_init): Create the folder_hash.
+ (gtk_file_system_win32_finalize): Destroy the folder_hash.
+ (gtk_file_system_win32_get_folder): Ref and return an existing
+ folder if we have it around, otherwise return a new folder object.
+ (struct _GtkFileFolderWin32): Add a field for the parent file system.
+ (gtk_file_folder_win32_finalize): Remove the folder from the file
+ system's hash table.
+ (gtk_file_system_win32_create_folder): Emit "files-added" on the
+ newly-created folder's parent. Fixes #138004.
+
2004-03-24 J. Ali Harlow <ali@juiblex.co.uk>
* gtk/gtkfilesystemwin32.c
struct _GtkFileSystemWin32
{
GObject parent_instance;
+
+ GHashTable *folder_hash;
};
#define GTK_TYPE_FILE_FOLDER_WIN32 (gtk_file_folder_win32_get_type ())
{
GObject parent_instance;
+ GtkFileSystemWin32 *system_win32;
GtkFileInfoType types;
gchar *filename;
};
static void
gtk_file_system_win32_init (GtkFileSystemWin32 *system_win32)
{
+ system_win32->folder_hash = g_hash_table_new (g_str_hash, g_str_equal);
}
static void
gtk_file_system_win32_finalize (GObject *object)
{
+ GtkFileSystemWin32 *system_win32;
+
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (object);
+
+ /* FIXME: assert that the hash is empty? */
+ g_hash_table_destroy (system_win32->folder_hash);
+
system_parent_class->finalize (object);
}
GtkFileInfoType types,
GError **error)
{
+ GtkFileSystemWin32 *system_win32;
GtkFileFolderWin32 *folder_win32;
gchar *filename;
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (file_system);
+
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, NULL);
+ folder_win32 = g_hash_table_lookup (system_win32->folder_hash, filename);
+
+ if (folder_win32)
+ return g_object_ref (folder_win32);
+
if (!g_file_test (filename, G_FILE_TEST_IS_DIR))
{
int save_errno = errno;
}
folder_win32 = g_object_new (GTK_TYPE_FILE_FOLDER_WIN32, NULL);
+ folder_win32->system_win32 = system_win32;
folder_win32->filename = filename;
folder_win32->types = types;
+ g_hash_table_insert (system_win32->folder_hash, folder_win32->filename, folder_win32);
+
return GTK_FILE_FOLDER (folder_win32);
}
const GtkFilePath *path,
GError **error)
{
+ GtkFileSystemWin32 *system_win32;
gchar *filename;
gboolean result;
+ char *parent;
+
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (file_system);
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, FALSE);
g_strerror (errno));
g_free (filename_utf8);
}
-
+ else if (!filename_is_root (filename))
+ {
+ parent = g_path_get_dirname (filename);
+ if (parent)
+ {
+ GtkFileFolderWin32 *folder_win32;
+
+ folder_win32 = g_hash_table_lookup (system_win32->folder_hash, parent);
+ if (folder_win32)
+ {
+ GSList *paths;
+
+ paths = g_slist_append (NULL, (GtkFilePath *) path);
+ g_signal_emit_by_name (folder_win32, "files-added", paths);
+ g_slist_free (paths);
+ }
+ g_free(parent);
+ }
+ }
+
g_free (filename);
-
+
return result;
}
{
GtkFileFolderWin32 *folder_win32 = GTK_FILE_FOLDER_WIN32 (object);
+ g_hash_table_remove (folder_win32->system_win32->folder_hash, folder_win32->filename);
+
g_free (folder_win32->filename);
folder_parent_class->finalize (object);