[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