[Xfce4-commits] <xfce4-panel:devel> * Use a struct for all the data in the launcher dialog. * Use the libxfce4menu pool for the desktop items.
Nick Schermer
nick at xfce.org
Tue Aug 11 20:26:37 CEST 2009
Updating branch refs/heads/devel
to a07574610ac7a98de9f768e0ec6a1bcf02292b06 (commit)
from 029076f97cfa5ad498d025d6c2f787fe08263ea3 (commit)
commit a07574610ac7a98de9f768e0ec6a1bcf02292b06
Author: Nick Schermer <nick at xfce.org>
Date: Fri Jan 2 13:09:27 2009 +0100
* Use a struct for all the data in the launcher dialog.
* Use the libxfce4menu pool for the desktop items.
plugins/launcher/launcher-dialog.c | 230 +++++++++++++++++++-----------------
plugins/launcher/launcher-dialog.h | 4 +-
plugins/launcher/launcher.c | 3 -
3 files changed, 123 insertions(+), 114 deletions(-)
diff --git a/plugins/launcher/launcher-dialog.c b/plugins/launcher/launcher-dialog.c
index 0f8b384..aff625b 100644
--- a/plugins/launcher/launcher-dialog.c
+++ b/plugins/launcher/launcher-dialog.c
@@ -34,6 +34,16 @@
+typedef struct
+{
+ LauncherPlugin *plugin;
+ GtkBuilder *builder;
+ guint idle_populate_id;
+}
+LauncherPluginDialog;
+
+
+
static gboolean
launcher_dialog_add_visible_function (GtkTreeModel *model,
GtkTreeIter *iter,
@@ -81,38 +91,19 @@ launcher_dialog_add_visible_function (GtkTreeModel *model,
static void
-launcher_dialog_add_store_append (GtkListStore *store,
- XfceMenu *menu)
+launcher_dialog_add_store_insert (gpointer filename,
+ gpointer item,
+ gpointer user_data)
{
- GSList *items, *lp;
- guint i;
-
- if (G_UNLIKELY (xfce_menu_has_layout (menu)))
- {
- items = xfce_menu_get_layout_elements (menu);
- }
- else
- {
- items = xfce_menu_get_menus (menu);
- items = g_slist_concat (items, xfce_menu_get_items (menu));
- }
+ GtkListStore *store = GTK_LIST_STORE (user_data);
+ GtkTreeIter iter;
- for (lp = items, i = 0; lp != NULL; lp = g_slist_next (lp))
- {
- if (XFCE_IS_MENU_ITEM (lp->data))
- {
- /* insert the item */
- gtk_list_store_insert_with_values (store, NULL, i++, 0, xfce_menu_item_get_name (lp->data), -1);
- }
- else if (XFCE_IS_MENU (lp->data))
- {
- /* append the sub items in the store */
- launcher_dialog_add_store_append (store, XFCE_MENU (lp->data));
- }
- }
+ panel_return_if_fail (XFCE_IS_MENU_ITEM (item));
+ panel_return_if_fail (GTK_IS_LIST_STORE (user_data));
- /* free the list */
- g_slist_free (items);
+ /* insert the item */
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, xfce_menu_item_get_name (item), -1);
}
@@ -120,14 +111,15 @@ launcher_dialog_add_store_append (GtkListStore *store,
static gboolean
launcher_dialog_add_populate_model_idle (gpointer user_data)
{
- GtkListStore *store = GTK_LIST_STORE (user_data);
- XfceMenu *root;
- GError *error = NULL;
+ LauncherPluginDialog *dialog = user_data;
+ XfceMenu *root;
+ GError *error = NULL;
+ GObject *store;
+ XfceMenuItemCache *cache;
- panel_return_val_if_fail (GTK_IS_LIST_STORE (store), FALSE);
+ panel_return_val_if_fail (GTK_IS_BUILDER (dialog->builder), FALSE);
/* initialize the menu library */
- /* TODO */
xfce_menu_init (NULL);
GDK_THREADS_ENTER ();
@@ -137,10 +129,15 @@ launcher_dialog_add_populate_model_idle (gpointer user_data)
if (G_LIKELY (root != NULL))
{
/* start appending items in the store */
- launcher_dialog_add_store_append (store, root);
+ store = gtk_builder_get_object (dialog->builder, "add-store");
+
+ /* get the item cache and insert everything in the store */
+ cache = xfce_menu_item_cache_get_default ();
+ xfce_menu_item_cache_foreach (cache, launcher_dialog_add_store_insert, store);
- /* release the root menu */
+ /* release the root menu and cache */
g_object_unref (G_OBJECT (root));
+ g_object_unref (G_OBJECT (cache));
}
else
{
@@ -151,32 +148,44 @@ launcher_dialog_add_populate_model_idle (gpointer user_data)
GDK_THREADS_LEAVE ();
+ /* shutdown menu library */
+ xfce_menu_shutdown ();
+
return FALSE;
}
static void
-launcher_dialog_add_populate_model (GtkBuilder *builder)
+launcher_dialog_add_populate_model_idle_destroyed (gpointer user_data)
+{
+ ((LauncherPluginDialog *) user_data)->idle_populate_id = 0;
+}
+
+
+
+static void
+launcher_dialog_add_populate_model (LauncherPluginDialog *dialog)
{
GObject *store;
- panel_return_if_fail (GTK_IS_BUILDER (builder));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
/* get the store and make sure it's empty */
- store = gtk_builder_get_object (builder, "add-store");
+ store = gtk_builder_get_object (dialog->builder, "add-store");
gtk_list_store_clear (GTK_LIST_STORE (store));
/* fire an idle menu system load */
- /* TODO finish this */
- g_idle_add (launcher_dialog_add_populate_model_idle, store);
+ if (G_LIKELY (dialog->idle_populate_id == 0))
+ dialog->idle_populate_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, launcher_dialog_add_populate_model_idle,
+ dialog, launcher_dialog_add_populate_model_idle_destroyed);
}
static void
-launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
- GtkBuilder *builder)
+launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
+ LauncherPluginDialog *dialog)
{
GObject *object;
GtkTreeModel *model;
@@ -185,7 +194,7 @@ launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
GtkTreePath *path;
panel_return_if_fail (GTK_IS_TREE_SELECTION (selection));
- panel_return_if_fail (GTK_IS_BUILDER (builder));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
@@ -199,60 +208,60 @@ launcher_dialog_tree_selection_changed (GtkTreeSelection *selection,
}
/* update the sensitivity of the buttons */
- object = gtk_builder_get_object (builder, "entry-remove");
+ object = gtk_builder_get_object (dialog->builder, "entry-remove");
gtk_widget_set_sensitive (GTK_WIDGET (object), n_children > 1);
- object = gtk_builder_get_object (builder, "entry-move-up");
+ object = gtk_builder_get_object (dialog->builder, "entry-move-up");
gtk_widget_set_sensitive (GTK_WIDGET (object), position > 0);
- object = gtk_builder_get_object (builder, "entry-move-down");
+ object = gtk_builder_get_object (dialog->builder, "entry-move-down");
gtk_widget_set_sensitive (GTK_WIDGET (object), n_children > position);
- object = gtk_builder_get_object (builder, "entry-edit");
+ object = gtk_builder_get_object (dialog->builder, "entry-edit");
gtk_widget_set_sensitive (GTK_WIDGET (object), position >= 0 /* TODO custom only */);
}
static void
-launcher_dialog_entry_button_clicked (GtkWidget *button,
- GtkBuilder *builder)
+launcher_dialog_entry_button_clicked (GtkWidget *button,
+ LauncherPluginDialog *dialog)
{
const gchar *name;
GObject *object;
- GtkWidget *dialog;
+ GtkWidget *window;
panel_return_if_fail (GTK_IS_BUILDABLE (button));
- panel_return_if_fail (GTK_IS_BUILDER (builder));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
/* name of the button */
name = gtk_buildable_get_name (GTK_BUILDABLE (button));
if (exo_str_is_equal (name, "entry-add"))
{
- object = gtk_builder_get_object (builder, "dialog-add");
- launcher_dialog_add_populate_model (builder);
+ object = gtk_builder_get_object (dialog->builder, "dialog-add");
+ launcher_dialog_add_populate_model (dialog);
gtk_widget_show (GTK_WIDGET (object));
}
else if (exo_str_is_equal (name, "entry-remove"))
{
/* create question dialog */
- dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (button)),
+ window = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (button)),
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
_("Are you sure you want to remove \"%s\"?"), "TODO");
- gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_REMOVE, GTK_RESPONSE_ACCEPT,
+ gtk_dialog_add_buttons (GTK_DIALOG (window), GTK_STOCK_REMOVE, GTK_RESPONSE_ACCEPT,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
+ gtk_dialog_set_default_response (GTK_DIALOG (window), GTK_RESPONSE_ACCEPT);
/* run the dialog */
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+ if (gtk_dialog_run (GTK_DIALOG (window)) == GTK_RESPONSE_ACCEPT)
{
}
/* destroy */
- gtk_widget_destroy (dialog);
+ gtk_widget_destroy (window);
}
else if (exo_str_is_equal (name, "entry-move-up"))
{
@@ -264,7 +273,7 @@ launcher_dialog_entry_button_clicked (GtkWidget *button,
}
else /* entry-edit */
{
- object = gtk_builder_get_object (builder, "dialog-editor");
+ object = gtk_builder_get_object (dialog->builder, "dialog-editor");
gtk_widget_show (GTK_WIDGET (object));
}
}
@@ -272,12 +281,13 @@ launcher_dialog_entry_button_clicked (GtkWidget *button,
static void
-launcher_dialog_response (GtkWidget *dialog,
- gint response_id,
- LauncherPlugin *plugin)
+launcher_dialog_response (GtkWidget *widget,
+ gint response_id,
+ LauncherPluginDialog *dialog)
{
- panel_return_if_fail (GTK_IS_DIALOG (dialog));
- panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (plugin));
+ panel_return_if_fail (GTK_IS_DIALOG (widget));
+ panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (dialog->plugin));
+ panel_return_if_fail (GTK_IS_BUILDER (dialog->builder));
if (G_UNLIKELY (response_id == 1))
{
@@ -285,37 +295,48 @@ launcher_dialog_response (GtkWidget *dialog,
}
else
{
- /* destroy the dialog */
- gtk_widget_destroy (dialog);
+ /* stop idle if still running */
+ if (G_UNLIKELY (dialog->idle_populate_id != 0))
+ g_source_remove (dialog->idle_populate_id);
+
+ /* destroy the dialog and release the builder */
+ gtk_widget_destroy (widget);
+ g_object_unref (G_OBJECT (dialog->builder));
+
+ /* unblock plugin menu */
+ xfce_panel_plugin_unblock_menu (XFCE_PANEL_PLUGIN (dialog->plugin));
+
+ /* cleanup */
+ g_slice_free (LauncherPluginDialog, dialog);
}
}
static void
-launcher_dialog_editor_response (GtkWidget *dialog,
- gint response_id,
- LauncherPlugin *plugin)
+launcher_dialog_editor_response (GtkWidget *widget,
+ gint response_id,
+ LauncherPluginDialog *dialog)
{
- panel_return_if_fail (GTK_IS_DIALOG (dialog));
- panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (plugin));
+ panel_return_if_fail (GTK_IS_DIALOG (widget));
+ panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (dialog->plugin));
/* hide the dialog, since it's owned by gtkbuilder */
- gtk_widget_hide (dialog);
+ gtk_widget_hide (widget);
}
static void
-launcher_dialog_add_response (GtkWidget *dialog,
- gint response_id,
- LauncherPlugin *plugin)
+launcher_dialog_add_response (GtkWidget *widget,
+ gint response_id,
+ LauncherPluginDialog *dialog)
{
- panel_return_if_fail (GTK_IS_DIALOG (dialog));
- panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (plugin));
+ panel_return_if_fail (GTK_IS_DIALOG (widget));
+ panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (dialog->plugin));
/* hide the dialog, since it's owned by gtkbuilder */
- gtk_widget_hide (dialog);
+ gtk_widget_hide (widget);
}
@@ -323,41 +344,44 @@ launcher_dialog_add_response (GtkWidget *dialog,
void
launcher_dialog_show (LauncherPlugin *plugin)
{
- GtkBuilder *builder;
- GObject *dialog;
- GObject *object, *entry;
- guint i;
- GtkTreeSelection *selection;
- const gchar *entry_names[] = { "entry-add", "entry-remove", "entry-move-up", "entry-move-down", "entry-edit" };
+ GtkBuilder *builder;
+ GObject *window, *object, *entry;
+ guint i;
+ GtkTreeSelection *selection;
+ const gchar *entry_names[] = { "entry-add", "entry-remove", "entry-move-up", "entry-move-down", "entry-edit" };
+ LauncherPluginDialog *dialog;
panel_return_if_fail (XFCE_IS_LAUNCHER_PLUGIN (plugin));
builder = gtk_builder_new ();
if (gtk_builder_add_from_string (builder, launcher_dialog_glade, launcher_dialog_glade_length, NULL))
{
- /* get dialog from builder, release builder when dialog is destroyed */
- dialog = gtk_builder_get_object (builder, "dialog");
- g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, builder);
- xfce_panel_plugin_take_window (XFCE_PANEL_PLUGIN (plugin), GTK_WINDOW (dialog));
- g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (launcher_dialog_response), plugin);
+ /* create structure */
+ dialog = g_slice_new0 (LauncherPluginDialog);
+ dialog->builder = builder;
+ dialog->plugin = plugin;
- /* block plugin, release block when the dialog is destroyed */
+ /* block plugin menu */
xfce_panel_plugin_block_menu (XFCE_PANEL_PLUGIN (plugin));
- g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) xfce_panel_plugin_unblock_menu, plugin);
+
+ /* get dialog from builder, release builder when dialog is destroyed */
+ window = gtk_builder_get_object (builder, "dialog");
+ xfce_panel_plugin_take_window (XFCE_PANEL_PLUGIN (plugin), GTK_WINDOW (window));
+ g_signal_connect (G_OBJECT (window), "response", G_CALLBACK (launcher_dialog_response), dialog);
/* connect entry buttons */
for (i = 0; i < G_N_ELEMENTS (entry_names); i++)
{
object = gtk_builder_get_object (builder, entry_names[i]);
- g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (launcher_dialog_entry_button_clicked), builder);
+ g_signal_connect (G_OBJECT (object), "clicked", G_CALLBACK (launcher_dialog_entry_button_clicked), dialog);
}
/* setup treeview selection */
object = gtk_builder_get_object (builder, "entry-treeview");
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
- g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (launcher_dialog_tree_selection_changed), builder);
- launcher_dialog_tree_selection_changed (selection, builder);
+ g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (launcher_dialog_tree_selection_changed), dialog);
+ launcher_dialog_tree_selection_changed (selection, dialog);
/* connect binding to the advanced properties */
object = gtk_builder_get_object (builder, "disable-tooltips");
@@ -374,11 +398,11 @@ launcher_dialog_show (LauncherPlugin *plugin)
/* setup responses for the other dialogs */
object = gtk_builder_get_object (builder, "dialog-editor");
- g_signal_connect (G_OBJECT (object), "response", G_CALLBACK (launcher_dialog_editor_response), plugin);
+ g_signal_connect (G_OBJECT (object), "response", G_CALLBACK (launcher_dialog_editor_response), dialog);
g_signal_connect (G_OBJECT (object), "delete-event", G_CALLBACK (exo_noop_true), NULL);
object = gtk_builder_get_object (builder, "dialog-add");
- g_signal_connect (G_OBJECT (object), "response", G_CALLBACK (launcher_dialog_add_response), plugin);
+ g_signal_connect (G_OBJECT (object), "response", G_CALLBACK (launcher_dialog_add_response), dialog);
g_signal_connect (G_OBJECT (object), "delete-event", G_CALLBACK (exo_noop_true), NULL);
object = gtk_builder_get_object (builder, "add-store");
@@ -391,7 +415,7 @@ launcher_dialog_show (LauncherPlugin *plugin)
g_signal_connect_swapped (G_OBJECT (entry), "changed", G_CALLBACK (gtk_tree_model_filter_refilter), object);
/* show the dialog */
- gtk_widget_show (GTK_WIDGET (dialog));
+ gtk_widget_show (GTK_WIDGET (window));
}
else
{
@@ -400,13 +424,3 @@ launcher_dialog_show (LauncherPlugin *plugin)
panel_assert_not_reached ();
}
}
-
-
-
-void
-launcher_dialog_menu_shutdown (void)
-{
- /* decrease counter and unload library */
- /* TODO */
- //xfce_menu_shutdown ();
-}
diff --git a/plugins/launcher/launcher-dialog.h b/plugins/launcher/launcher-dialog.h
index 90d7b67..f5bef00 100644
--- a/plugins/launcher/launcher-dialog.h
+++ b/plugins/launcher/launcher-dialog.h
@@ -20,8 +20,6 @@
#include "launcher.h"
-void launcher_dialog_show (LauncherPlugin *plugin);
-
-void launcher_dialog_menu_shutdown (void);
+void launcher_dialog_show (LauncherPlugin *plugin);
#endif /* !__XFCE_LAUNCHER_DIALOG_H__ */
diff --git a/plugins/launcher/launcher.c b/plugins/launcher/launcher.c
index 0ea44fd..1b94842 100644
--- a/plugins/launcher/launcher.c
+++ b/plugins/launcher/launcher.c
@@ -321,9 +321,6 @@ launcher_plugin_free_data (XfcePanelPlugin *panel_plugin)
/* shutdown xfconf */
xfconf_shutdown ();
-
- /* shutdown the menu if needed */
- launcher_dialog_menu_shutdown ();
/* stop popup timeout */
if (G_UNLIKELY (plugin->popup_timeout_id))
More information about the Xfce4-commits
mailing list