/* * gedit-file-browser-messages.c * * Copyright (C) 2006 - Jesse van den Kieboom * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include "gedit-file-browser-messages.h" #include "gedit-file-browser-store.h" #include "messages/messages.h" #include #define MESSAGE_OBJECT_PATH "/plugins/filebrowser" #define WINDOW_DATA_KEY "GeditFileBrowserMessagesWindowData" #define BUS_CONNECT(bus, name, data) gedit_message_bus_connect(bus, MESSAGE_OBJECT_PATH, #name, (GeditMessageCallback) message_##name##_cb, data, NULL) #define BUS_DISCONNECT(bus, name, data) gedit_message_bus_disconnect_by_func(bus, MESSAGE_OBJECT_PATH, #name, (GeditMessageCallback) message_##name##_cb, data) typedef struct { GeditWindow *window; GeditMessage *message; } MessageCacheData; typedef struct { guint row_inserted_id; guint before_row_deleted_id; guint root_changed_id; guint begin_loading_id; guint end_loading_id; GeditMessageBus *bus; GeditFileBrowserWidget *widget; GHashTable *row_tracking; GHashTable *filters; } WindowData; typedef struct { gulong id; GeditWindow *window; GeditMessage *message; } FilterData; static WindowData * window_data_new (GeditWindow *window, GeditFileBrowserWidget *widget) { WindowData *data = g_slice_new (WindowData); data->bus = gedit_window_get_message_bus (window); data->widget = widget; data->row_tracking = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); data->filters = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL); g_object_set_data (G_OBJECT (window), WINDOW_DATA_KEY, data); return data; } static WindowData * get_window_data (GeditWindow *window) { return (WindowData *) (g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY)); } static void window_data_free (GeditWindow *window) { WindowData *data = get_window_data (window); g_hash_table_destroy (data->row_tracking); g_hash_table_destroy (data->filters); g_slice_free (WindowData, data); g_object_set_data (G_OBJECT (window), WINDOW_DATA_KEY, NULL); } static FilterData * filter_data_new (GeditWindow *window, GeditMessage *message) { FilterData *data = g_slice_new (FilterData); WindowData *wdata; data->window = window; data->id = 0; data->message = message; wdata = get_window_data (window); g_hash_table_insert (wdata->filters, gedit_message_type_identifier (gedit_message_get_object_path (message), gedit_message_get_method (message)), data); return data; } static void filter_data_free (FilterData *data) { WindowData *wdata = get_window_data (data->window); gchar *identifier; identifier = gedit_message_type_identifier (gedit_message_get_object_path (data->message), gedit_message_get_method (data->message)); g_hash_table_remove (wdata->filters, identifier); g_free (identifier); g_object_unref (data->message); g_slice_free (FilterData, data); } static GtkTreePath * track_row_lookup (WindowData *data, const gchar *id) { GtkTreeRowReference *ref; ref = (GtkTreeRowReference *)g_hash_table_lookup (data->row_tracking, id); if (!ref) return NULL; return gtk_tree_row_reference_get_path (ref); } static void message_cache_data_free (MessageCacheData *data) { g_object_unref (data->message); g_slice_free (MessageCacheData, data); } static MessageCacheData * message_cache_data_new (GeditWindow *window, GeditMessage *message) { MessageCacheData *data = g_slice_new (MessageCacheData); data->window = window; data->message = message; return data; } static void message_get_root_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { GeditFileBrowserStore *store; GFile *location; store = gedit_file_browser_widget_get_browser_store (data->widget); location = gedit_file_browser_store_get_virtual_root (store); if (location) { g_object_set (message, "location", location, NULL); g_object_unref (location); } } static void message_set_root_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { GFile *root; GFile *virtual = NULL; g_object_get (message, "location", &root, NULL); if (!root) { return; } g_object_get (message, "virtual", &virtual, NULL); if (virtual) { gedit_file_browser_widget_set_root_and_virtual_root (data->widget, root, virtual); } else { gedit_file_browser_widget_set_root (data->widget, root, TRUE); } } static void message_set_emblem_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gchar *id = NULL; gchar *emblem = NULL; GtkTreePath *path; GeditFileBrowserStore *store; g_object_get (message, "id", &id, "emblem", &emblem, NULL); if (!id) { g_free (id); g_free (emblem); return; } path = track_row_lookup (data, id); if (path != NULL) { GtkTreeIter iter; GValue value = G_VALUE_INIT; GdkPixbuf *pixbuf = NULL; if (emblem != NULL) { pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), emblem, 10, GTK_ICON_LOOKUP_FORCE_SIZE, NULL); } store = gedit_file_browser_widget_get_browser_store (data->widget); if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) { g_value_init (&value, GDK_TYPE_PIXBUF); g_value_set_object (&value, pixbuf); gedit_file_browser_store_set_value (store, &iter, GEDIT_FILE_BROWSER_STORE_COLUMN_EMBLEM, &value); g_value_unset (&value); } if (pixbuf) { g_object_unref (pixbuf); } } g_free (id); g_free (emblem); } static void message_set_markup_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gchar *id = NULL; gchar *markup = NULL; GtkTreePath *path; GeditFileBrowserStore *store; g_object_get (message, "id", &id, "markup", &markup, NULL); if (!id) { g_free (id); g_free (markup); return; } path = track_row_lookup (data, id); if (path != NULL) { GtkTreeIter iter; GValue value = G_VALUE_INIT; store = gedit_file_browser_widget_get_browser_store (data->widget); if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) { if (markup == NULL) { gchar *name; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, GEDIT_FILE_BROWSER_STORE_COLUMN_NAME, &name, -1); markup = g_markup_escape_text (name, -1); g_free (name); } g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, markup); gedit_file_browser_store_set_value (store, &iter, GEDIT_FILE_BROWSER_STORE_COLUMN_MARKUP, &value); g_value_unset (&value); } gtk_tree_path_free (path); } g_free (id); g_free (markup); } static gchar * item_id (const gchar *path, GFile *location) { gchar *uri; gchar *id; uri = g_file_get_uri (location); id = g_strconcat (path, "::", uri, NULL); g_free (uri); return id; } static gchar * track_row (WindowData *data, GeditFileBrowserStore *store, GtkTreePath *path, GFile *location) { GtkTreeRowReference *ref; gchar *id; gchar *pathstr; pathstr = gtk_tree_path_to_string (path); id = item_id (pathstr, location); ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (store), path); g_hash_table_insert (data->row_tracking, g_strdup (id), ref); g_free (pathstr); return id; } static void set_item_message (WindowData *data, GtkTreeIter *iter, GtkTreePath *path, GeditMessage *message) { GeditFileBrowserStore *store; gchar *name; GFile *location; guint flags = 0; store = gedit_file_browser_widget_get_browser_store (data->widget); gtk_tree_model_get (GTK_TREE_MODEL (store), iter, GEDIT_FILE_BROWSER_STORE_COLUMN_NAME, &name, GEDIT_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, -1); if (location) { gchar *track_id; if (path && gtk_tree_path_get_depth (path) != 0) { track_id = track_row (data, store, path, location); } else { track_id = NULL; } g_object_set (message, "id", track_id, "location", location, NULL); if (gedit_message_has (message, "name")) { g_object_set (message, "name", name, NULL); } if (gedit_message_has (message, "is_directory")) { g_object_set (message, "is_directory", FILE_IS_DIR (flags), NULL); } g_free (track_id); g_object_unref (location); } g_free (name); } static gboolean custom_message_filter_func (GeditFileBrowserWidget *widget, GeditFileBrowserStore *store, GtkTreeIter *iter, FilterData *data) { WindowData *wdata = get_window_data (data->window); GFile *location; guint flags = 0; gboolean filter = FALSE; GtkTreePath *path; gtk_tree_model_get (GTK_TREE_MODEL (store), iter, GEDIT_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, -1); if (!location || FILE_IS_DUMMY (flags)) return FALSE; path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); set_item_message (wdata, iter, path, data->message); gtk_tree_path_free (path); g_object_set (data->message, "filter", filter, NULL); gedit_message_bus_send_message_sync (wdata->bus, data->message); g_object_get (data->message, "filter", &filter, NULL); g_object_unref (location); return !filter; } static void message_add_filter_cb (GeditMessageBus *bus, GeditMessage *message, GeditWindow *window) { const gchar *object_path = NULL; const gchar *method = NULL; gulong id; GeditMessage *cbmessage; FilterData *filter_data; WindowData *data; GType message_type; data = get_window_data (window); object_path = gedit_message_get_object_path (message); method = gedit_message_get_method (message); message_type = gedit_message_bus_lookup (bus, object_path, method); if (message_type == G_TYPE_INVALID) { return; } /* Check if the message type has the correct arguments */ if (!gedit_message_type_check (message_type, "id", G_TYPE_STRING) || !gedit_message_type_check (message_type, "location", G_TYPE_FILE) || !gedit_message_type_check (message_type, "is-directory", G_TYPE_BOOLEAN) || !gedit_message_type_check (message_type, "filter", G_TYPE_BOOLEAN)) { return; } cbmessage = g_object_new (message_type, "object-path", object_path, "method", method, "id", NULL, "location", NULL, "is-directory", FALSE, "filter", FALSE, NULL); /* Register the custom filter on the widget */ filter_data = filter_data_new (window, cbmessage); id = gedit_file_browser_widget_add_filter (data->widget, (GeditFileBrowserWidgetFilterFunc)custom_message_filter_func, filter_data, (GDestroyNotify)filter_data_free); filter_data->id = id; } static void message_remove_filter_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gulong id = 0; g_object_get (message, "id", &id, NULL); if (!id) return; gedit_file_browser_widget_remove_filter (data->widget, id); } static void message_extend_context_menu_cb (GeditMessageBus *bus, GeditMessage *message, GeditWindow *window) { WindowData *data; GeditMenuExtension *ext; data = get_window_data (window); ext = gedit_file_browser_widget_extend_context_menu (data->widget); g_object_set (message, "extension", ext, NULL); g_object_unref (ext); } static void message_up_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { GeditFileBrowserStore *store = gedit_file_browser_widget_get_browser_store (data->widget); gedit_file_browser_store_set_virtual_root_up (store); } static void message_history_back_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gedit_file_browser_widget_history_back (data->widget); } static void message_history_forward_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gedit_file_browser_widget_history_forward (data->widget); } static void message_refresh_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gedit_file_browser_widget_refresh (data->widget); } static void message_set_show_hidden_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gboolean active = FALSE; GeditFileBrowserStore *store; GeditFileBrowserStoreFilterMode mode; g_object_get (message, "active", &active, NULL); store = gedit_file_browser_widget_get_browser_store (data->widget); mode = gedit_file_browser_store_get_filter_mode (store); if (active) mode &= ~GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN; else mode |= GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN; gedit_file_browser_store_set_filter_mode (store, mode); } static void message_set_show_binary_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gboolean active = FALSE; GeditFileBrowserStore *store; GeditFileBrowserStoreFilterMode mode; g_object_get (message, "active", &active, NULL); store = gedit_file_browser_widget_get_browser_store (data->widget); mode = gedit_file_browser_store_get_filter_mode (store); if (active) mode &= ~GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY; else mode |= GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY; gedit_file_browser_store_set_filter_mode (store, mode); } static void message_show_bookmarks_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gedit_file_browser_widget_show_bookmarks (data->widget); } static void message_show_files_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { gedit_file_browser_widget_show_files (data->widget); } static void message_get_view_cb (GeditMessageBus *bus, GeditMessage *message, WindowData *data) { GeditFileBrowserView *view; view = gedit_file_browser_widget_get_browser_view (data->widget); g_object_set (message, "view", view, NULL); } static void register_methods (GeditWindow *window, GeditFileBrowserWidget *widget) { GeditMessageBus *bus = gedit_window_get_message_bus (window); WindowData *data = get_window_data (window); /* Register method calls */ gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_GET_ROOT, MESSAGE_OBJECT_PATH, "get_root"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_ROOT, MESSAGE_OBJECT_PATH, "set_root"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_EMBLEM, MESSAGE_OBJECT_PATH, "set_emblem"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_MARKUP, MESSAGE_OBJECT_PATH, "set_markup"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ADD_FILTER, MESSAGE_OBJECT_PATH, "add_filter"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID, MESSAGE_OBJECT_PATH, "remove_filter"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_EXTEND_CONTEXT_MENU, MESSAGE_OBJECT_PATH, "extend_context_menu"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "up"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "history_back"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "history_forward"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "refresh"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ACTIVATION, MESSAGE_OBJECT_PATH, "set_show_hidden"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ACTIVATION, MESSAGE_OBJECT_PATH, "set_show_binary"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "show_bookmarks"); gedit_message_bus_register (bus, GEDIT_TYPE_MESSAGE, MESSAGE_OBJECT_PATH, "show_files"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_GET_VIEW, MESSAGE_OBJECT_PATH, "get_view"); BUS_CONNECT (bus, get_root, data); BUS_CONNECT (bus, set_root, data); BUS_CONNECT (bus, set_emblem, data); BUS_CONNECT (bus, set_markup, data); BUS_CONNECT (bus, add_filter, window); BUS_CONNECT (bus, remove_filter, data); BUS_CONNECT (bus, extend_context_menu, window); BUS_CONNECT (bus, up, data); BUS_CONNECT (bus, history_back, data); BUS_CONNECT (bus, history_forward, data); BUS_CONNECT (bus, refresh, data); BUS_CONNECT (bus, set_show_hidden, data); BUS_CONNECT (bus, set_show_binary, data); BUS_CONNECT (bus, show_bookmarks, data); BUS_CONNECT (bus, show_files, data); BUS_CONNECT (bus, get_view, data); } static void store_row_inserted (GeditFileBrowserStore *store, GtkTreePath *path, GtkTreeIter *iter, MessageCacheData *data) { guint flags = 0; gtk_tree_model_get (GTK_TREE_MODEL (store), iter, GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, -1); if (!FILE_IS_DUMMY (flags) && !FILE_IS_FILTERED (flags)) { WindowData *wdata = get_window_data (data->window); set_item_message (wdata, iter, path, data->message); gedit_message_bus_send_message_sync (wdata->bus, data->message); } } static void store_before_row_deleted (GeditFileBrowserStore *store, GtkTreePath *path, MessageCacheData *data) { GtkTreeIter iter; guint flags = 0; if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) return; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, -1); 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); } } static void store_virtual_root_changed (GeditFileBrowserStore *store, GParamSpec *spec, MessageCacheData *data) { WindowData *wdata = get_window_data (data->window); GFile *vroot; vroot = gedit_file_browser_store_get_virtual_root (store); if (!vroot) { return; } g_object_set (data->message, "location", vroot, NULL); gedit_message_bus_send_message_sync (wdata->bus, data->message); g_object_unref (vroot); } static void store_begin_loading (GeditFileBrowserStore *store, GtkTreeIter *iter, MessageCacheData *data) { GtkTreePath *path; WindowData *wdata = get_window_data (data->window); path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); set_item_message (wdata, iter, path, data->message); gedit_message_bus_send_message_sync (wdata->bus, data->message); gtk_tree_path_free (path); } static void store_end_loading (GeditFileBrowserStore *store, GtkTreeIter *iter, MessageCacheData *data) { GtkTreePath *path; WindowData *wdata = get_window_data (data->window); path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); set_item_message (wdata, iter, path, data->message); gedit_message_bus_send_message_sync (wdata->bus, data->message); gtk_tree_path_free (path); } static void register_signals (GeditWindow *window, GeditFileBrowserWidget *widget) { GeditMessageBus *bus = gedit_window_get_message_bus (window); GeditFileBrowserStore *store; GeditMessage *message; WindowData *data; /* Register signals */ gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, MESSAGE_OBJECT_PATH, "root_changed"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, MESSAGE_OBJECT_PATH, "begin_loading"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, MESSAGE_OBJECT_PATH, "end_loading"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, MESSAGE_OBJECT_PATH, "inserted"); gedit_message_bus_register (bus, GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, MESSAGE_OBJECT_PATH, "deleted"); store = gedit_file_browser_widget_get_browser_store (widget); message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, "object-path", MESSAGE_OBJECT_PATH, "method", "inserted", NULL); data = get_window_data (window); data->row_inserted_id = g_signal_connect_data (store, "row-inserted", G_CALLBACK (store_row_inserted), message_cache_data_new (window, message), (GClosureNotify)message_cache_data_free, 0); message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, "object-path", MESSAGE_OBJECT_PATH, "method", "deleted", NULL); data->before_row_deleted_id = g_signal_connect_data (store, "before-row-deleted", G_CALLBACK (store_before_row_deleted), message_cache_data_new (window, message), (GClosureNotify)message_cache_data_free, 0); message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, "object-path", MESSAGE_OBJECT_PATH, "method", "root_changed", NULL); data->root_changed_id = g_signal_connect_data (store, "notify::virtual-root", G_CALLBACK (store_virtual_root_changed), message_cache_data_new (window, message), (GClosureNotify)message_cache_data_free, 0); message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, "object-path", MESSAGE_OBJECT_PATH, "method", "begin_loading", NULL); data->begin_loading_id = g_signal_connect_data (store, "begin_loading", G_CALLBACK (store_begin_loading), message_cache_data_new (window, message), (GClosureNotify)message_cache_data_free, 0); message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, "object-path", MESSAGE_OBJECT_PATH, "method", "end_loading", NULL); data->end_loading_id = g_signal_connect_data (store, "end_loading", G_CALLBACK (store_end_loading), message_cache_data_new (window, message), (GClosureNotify)message_cache_data_free, 0); } static void message_unregistered (GeditMessageBus *bus, const gchar *object_path, const gchar *method, GeditWindow *window) { gchar *identifier; FilterData *data; WindowData *wdata; wdata = get_window_data (window); identifier = gedit_message_type_identifier (object_path, method); data = g_hash_table_lookup (wdata->filters, identifier); if (data) { gedit_file_browser_widget_remove_filter (wdata->widget, data->id); } g_free (identifier); } void gedit_file_browser_messages_register (GeditWindow *window, GeditFileBrowserWidget *widget) { window_data_new (window, widget); register_methods (window, widget); register_signals (window, widget); g_signal_connect (gedit_window_get_message_bus (window), "unregistered", G_CALLBACK (message_unregistered), window); } static void cleanup_signals (GeditWindow *window) { WindowData *data = get_window_data (window); GeditFileBrowserStore *store; 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->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); g_signal_handlers_disconnect_by_func (data->bus, message_unregistered, window); } void gedit_file_browser_messages_unregister (GeditWindow *window) { GeditMessageBus *bus = gedit_window_get_message_bus (window); WindowData *data = get_window_data (window); cleanup_signals (window); BUS_DISCONNECT (bus, get_root, data); BUS_DISCONNECT (bus, set_root, data); BUS_DISCONNECT (bus, set_emblem, data); BUS_DISCONNECT (bus, set_markup, data); BUS_DISCONNECT (bus, add_filter, window); BUS_DISCONNECT (bus, remove_filter, data); BUS_DISCONNECT (bus, up, data); BUS_DISCONNECT (bus, history_back, data); BUS_DISCONNECT (bus, history_forward, data); BUS_DISCONNECT (bus, refresh, data); BUS_DISCONNECT (bus, set_show_hidden, data); BUS_DISCONNECT (bus, set_show_binary, data); BUS_DISCONNECT (bus, show_bookmarks, data); BUS_DISCONNECT (bus, show_files, data); BUS_DISCONNECT (bus, get_view, data); gedit_message_bus_unregister_all (bus, MESSAGE_OBJECT_PATH); window_data_free (window); } /* ex:set ts=8 noet: */