[gedit] Fix the file browser's "deleted" message bus signal
- From: Garrett Regier <gregier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] Fix the file browser's "deleted" message bus signal
- Date: Wed, 18 Feb 2015 16:34:11 +0000 (UTC)
commit 59595a7ab827d34864428c3cae0d44528563ebce
Author: Garrett Regier <garrettregier gmail com>
Date: Wed Feb 18 08:31:25 2015 -0800
Fix the file browser's "deleted" message bus signal
Tested with a modified git plugin and the "deleted"
message bus signal now works properly.
https://bugzilla.gnome.org/show_bug.cgi?id=726618
plugins/filebrowser/gedit-file-browser-messages.c | 24 ++++++---
plugins/filebrowser/gedit-file-browser-store.c | 53 +++++++++++++++------
plugins/filebrowser/gedit-file-browser-store.h | 34 +++++++------
3 files changed, 73 insertions(+), 38 deletions(-)
---
diff --git a/plugins/filebrowser/gedit-file-browser-messages.c
b/plugins/filebrowser/gedit-file-browser-messages.c
index 10d812d..7f25424 100644
--- a/plugins/filebrowser/gedit-file-browser-messages.c
+++ b/plugins/filebrowser/gedit-file-browser-messages.c
@@ -38,7 +38,7 @@ typedef struct
typedef struct
{
guint row_inserted_id;
- guint row_deleted_id;
+ guint before_row_deleted_id;
guint root_changed_id;
guint begin_loading_id;
guint end_loading_id;
@@ -788,9 +788,9 @@ store_row_inserted (GeditFileBrowserStore *store,
}
static void
-store_row_deleted (GeditFileBrowserStore *store,
- GtkTreePath *path,
- MessageCacheData *data)
+store_before_row_deleted (GeditFileBrowserStore *store,
+ GtkTreePath *path,
+ MessageCacheData *data)
{
GtkTreeIter iter;
guint flags = 0;
@@ -805,9 +805,17 @@ store_row_deleted (GeditFileBrowserStore *store,
if (!FILE_IS_DUMMY (flags) && !FILE_IS_FILTERED (flags))
{
WindowData *wdata = get_window_data (data->window);
+ gchar *id;
set_item_message (wdata, &iter, path, data->message);
+
+ /* Must get the ID before the plugin can modify it */
+ g_object_get (data->message, "id", &id, NULL);
+
gedit_message_bus_send_message_sync (wdata->bus, data->message);
+
+ g_hash_table_remove (wdata->row_tracking, id);
+ g_free (id);
}
}
@@ -925,10 +933,10 @@ register_signals (GeditWindow *window,
"method", "deleted",
NULL);
- data->row_deleted_id =
+ data->before_row_deleted_id =
g_signal_connect_data (store,
- "row-deleted",
- G_CALLBACK (store_row_deleted),
+ "before-row-deleted",
+ G_CALLBACK (store_before_row_deleted),
message_cache_data_new (window, message),
(GClosureNotify)message_cache_data_free,
0);
@@ -1022,7 +1030,7 @@ cleanup_signals (GeditWindow *window)
store = gedit_file_browser_widget_get_browser_store (data->widget);
g_signal_handler_disconnect (store, data->row_inserted_id);
- g_signal_handler_disconnect (store, data->row_deleted_id);
+ g_signal_handler_disconnect (store, data->before_row_deleted_id);
g_signal_handler_disconnect (store, data->root_changed_id);
g_signal_handler_disconnect (store, data->begin_loading_id);
g_signal_handler_disconnect (store, data->end_loading_id);
diff --git a/plugins/filebrowser/gedit-file-browser-store.c b/plugins/filebrowser/gedit-file-browser-store.c
index 6a7cec0..cbad20d 100644
--- a/plugins/filebrowser/gedit-file-browser-store.c
+++ b/plugins/filebrowser/gedit-file-browser-store.c
@@ -226,6 +226,7 @@ enum
BEGIN_REFRESH,
END_REFRESH,
UNLOAD,
+ BEFORE_ROW_DELETED,
NUM_SIGNALS
};
@@ -445,6 +446,15 @@ gedit_file_browser_store_class_init (GeditFileBrowserStoreClass *klass)
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
G_TYPE_FILE);
+ model_signals[BEFORE_ROW_DELETED] =
+ g_signal_new ("before-row-deleted",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditFileBrowserStoreClass,
+ before_row_deleted), NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_TREE_PATH | G_SIGNAL_TYPE_STATIC_SCOPE);
}
static void
@@ -1259,13 +1269,33 @@ row_inserted (GeditFileBrowserStore *model,
static void
row_deleted (GeditFileBrowserStore *model,
- const GtkTreePath *path)
+ FileBrowserNode *node,
+ const GtkTreePath *path)
{
- GtkTreePath *copy = gtk_tree_path_copy (path);
+ gboolean hidden;
+ GtkTreePath *copy;
- /* Delete a copy of the actual path here because the row-deleted
- signal may alter the path */
- gtk_tree_model_row_deleted (GTK_TREE_MODEL(model), copy);
+ /* We should always be called when the row is still inserted */
+ g_return_if_fail (node->inserted == TRUE);
+
+ hidden = FILE_IS_HIDDEN (node->flags);
+ node->flags &= ~GEDIT_FILE_BROWSER_STORE_FLAG_IS_HIDDEN;
+
+ /* Create temporary copies of the path as the signals may alter it */
+
+ copy = gtk_tree_path_copy (path);
+ g_signal_emit (model, model_signals[BEFORE_ROW_DELETED], 0, copy);
+ gtk_tree_path_free (copy);
+
+ node->inserted = FALSE;
+
+ if (hidden)
+ {
+ node->flags |= GEDIT_FILE_BROWSER_STORE_FLAG_IS_HIDDEN;
+ }
+
+ copy = gtk_tree_path_copy (path);
+ gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), copy);
gtk_tree_path_free (copy);
}
@@ -1327,8 +1357,7 @@ model_refilter_node (GeditFileBrowserStore *model,
{
if (old_visible)
{
- node->inserted = FALSE;
- row_deleted (model, *path);
+ row_deleted (model, node, *path);
}
else
{
@@ -1576,8 +1605,7 @@ model_remove_node (GeditFileBrowserStore *model,
not the virtual root) */
if (model_node_visibility (model, node) && node != model->priv->virtual_root)
{
- node->inserted = FALSE;
- row_deleted (model, path);
+ row_deleted (model, node, path);
}
if (free_path)
@@ -1645,9 +1673,7 @@ model_clear (GeditFileBrowserStore *model,
model_node_visibility (model, dummy))
{
path = gtk_tree_path_new_first ();
-
- dummy->inserted = FALSE;
- row_deleted (model, path);
+ row_deleted (model, dummy, path);
gtk_tree_path_free (path);
}
}
@@ -1868,8 +1894,7 @@ model_check_dummy (GeditFileBrowserStore *model,
path = gedit_file_browser_store_get_path_real (model, dummy);
dummy->flags |= GEDIT_FILE_BROWSER_STORE_FLAG_IS_HIDDEN;
- dummy->inserted = FALSE;
- row_deleted (model, path);
+ row_deleted (model, dummy, path);
gtk_tree_path_free (path);
}
}
diff --git a/plugins/filebrowser/gedit-file-browser-store.h b/plugins/filebrowser/gedit-file-browser-store.h
index 3464838..5505adf 100644
--- a/plugins/filebrowser/gedit-file-browser-store.h
+++ b/plugins/filebrowser/gedit-file-browser-store.h
@@ -98,22 +98,24 @@ struct _GeditFileBrowserStoreClass {
GObjectClass parent_class;
/* Signals */
- void (* begin_loading) (GeditFileBrowserStore *model,
- GtkTreeIter *iter);
- void (* end_loading) (GeditFileBrowserStore *model,
- GtkTreeIter *iter);
- void (* error) (GeditFileBrowserStore *model,
- guint code,
- gchar *message);
- gboolean (* no_trash) (GeditFileBrowserStore *model,
- GList *files);
- void (* rename) (GeditFileBrowserStore *model,
- GFile *oldfile,
- GFile *newfile);
- void (* begin_refresh) (GeditFileBrowserStore *model);
- void (* end_refresh) (GeditFileBrowserStore *model);
- void (* unload) (GeditFileBrowserStore *model,
- GFile *location);
+ void (* begin_loading) (GeditFileBrowserStore *model,
+ GtkTreeIter *iter);
+ void (* end_loading) (GeditFileBrowserStore *model,
+ GtkTreeIter *iter);
+ void (* error) (GeditFileBrowserStore *model,
+ guint code,
+ gchar *message);
+ gboolean (* no_trash) (GeditFileBrowserStore *model,
+ GList *files);
+ void (* rename) (GeditFileBrowserStore *model,
+ GFile *oldfile,
+ GFile *newfile);
+ void (* begin_refresh) (GeditFileBrowserStore *model);
+ void (* end_refresh) (GeditFileBrowserStore *model);
+ void (* unload) (GeditFileBrowserStore *model,
+ GFile *location);
+ void (* before_row_deleted) (GeditFileBrowserStore *model,
+ GtkTreePath *path);
};
GType gedit_file_browser_store_get_type (void) G_GNUC_CONST;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]