[Xfce4-commits] [xfce/thunar] 01/01: Introduce ThunarxMenu
noreply at xfce.org
noreply at xfce.org
Sun Nov 19 19:02:58 CET 2017
This is an automated email from the git hooks/post-receive script.
a n d r e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository xfce/thunar.
commit fb32b8e48e49224ef94675c1a3b84c3d6f1c3cbe
Author: Andre Miranda <andreldm at xfce.org>
Date: Sun Nov 19 15:02:23 2017 -0300
Introduce ThunarxMenu
Also refactoring some menu related code into thunar-menu-util.c
---
docs/reference/thunarx/thunarx-docs.xml | 2 +
docs/reference/thunarx/thunarx-sections.txt | 22 ++++
docs/reference/thunarx/thunarx.types | 1 +
thunar/Makefile.am | 2 +
thunar/thunar-dnd.c | 17 +--
thunar/thunar-menu-util.c | 164 ++++++++++++++++++++++++
thunar/thunar-menu-util.h | 39 ++++++
thunar/thunar-renamer-dialog.c | 24 +---
thunar/thunar-shortcuts-view.c | 16 +--
thunar/thunar-standard-view.c | 48 +++----
thunar/thunar-tree-view.c | 16 +--
thunar/thunar-util.c | 53 --------
thunar/thunar-util.h | 2 -
thunar/thunar-window.c | 58 ++-------
thunarx/Makefile.am | 2 +
thunarx/thunarx-menu-item.c | 71 +++++++++-
thunarx/thunarx-menu-item.h | 42 +-----
thunarx/thunarx-menu.c | 144 +++++++++++++++++++++
thunarx/{thunarx-menu-item.h => thunarx-menu.h} | 59 ++++++++-
thunarx/thunarx.h | 2 +-
thunarx/thunarx.symbols | 8 ++
21 files changed, 540 insertions(+), 252 deletions(-)
diff --git a/docs/reference/thunarx/thunarx-docs.xml b/docs/reference/thunarx/thunarx-docs.xml
index 6633795..12127dc 100644
--- a/docs/reference/thunarx/thunarx-docs.xml
+++ b/docs/reference/thunarx/thunarx-docs.xml
@@ -3,6 +3,7 @@
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY ThunarxFileInfo SYSTEM "xml/thunarx-file-info.xml">
+<!ENTITY ThunarxMenu SYSTEM "xml/thunarx-menu.xml">
<!ENTITY ThunarxMenuItem SYSTEM "xml/thunarx-menu-item.xml">
<!ENTITY ThunarxMenuProvider SYSTEM "xml/thunarx-menu-provider.xml">
<!ENTITY ThunarxPreferencesProvider SYSTEM "xml/thunarx-preferences-provider.xml">
@@ -451,6 +452,7 @@ thunar_extension_initialize (ThunarxProviderPlugin *plugin)
</para>
&ThunarxFileInfo;
+ &ThunarxMenu;
&ThunarxMenuItem;
&ThunarxPropertyPage;
&ThunarxProviderPlugin;
diff --git a/docs/reference/thunarx/thunarx-sections.txt b/docs/reference/thunarx/thunarx-sections.txt
index 7eceb0c..d057ceb 100644
--- a/docs/reference/thunarx/thunarx-sections.txt
+++ b/docs/reference/thunarx/thunarx-sections.txt
@@ -31,6 +31,26 @@ thunarx_file_info_list_get_type
</SECTION>
<SECTION>
+<FILE>thunarx-menu</FILE>
+<TITLE>ThunarxMenu</TITLE>
+ThunarxMenu
+thunarx_menu_new
+thunarx_menu_append_item
+thunarx_menu_get_items
+<SUBSECTION Standard>
+ThunarxMenuClass
+THUNARX_TYPE_MENU
+THUNARX_MENU
+THUNARX_MENU_CLASS
+THUNARX_IS_MENU
+THUNARX_IS_MENU_CLASS
+THUNARX_MENU_GET_CLASS
+<SUBSECTION Private>
+ThunarxMenuPrivate
+thunarx_menu_get_type
+</SECTION>
+
+<SECTION>
<FILE>thunarx-menu-item</FILE>
<TITLE>ThunarxMenuItem</TITLE>
ThunarxMenuItem
@@ -38,6 +58,8 @@ thunarx_menu_item_new
thunarx_menu_item_activate
thunarx_menu_item_get_sensitive
thunarx_menu_item_set_sensitive
+thunarx_menu_item_set_menu
+thunarx_menu_item_list_free
<SUBSECTION Standard>
ThunarxMenuItemClass
THUNARX_TYPE_MENU_ITEM
diff --git a/docs/reference/thunarx/thunarx.types b/docs/reference/thunarx/thunarx.types
index 81cbc41..7af7f57 100644
--- a/docs/reference/thunarx/thunarx.types
+++ b/docs/reference/thunarx/thunarx.types
@@ -1,6 +1,7 @@
#include <thunarx/thunarx.h>
thunarx_file_info_get_type
+thunarx_menu_get_type
thunarx_menu_item_get_type
thunarx_menu_provider_get_type
thunarx_preferences_provider_get_type
diff --git a/thunar/Makefile.am b/thunar/Makefile.am
index dc8284e..1ae0d3e 100644
--- a/thunar/Makefile.am
+++ b/thunar/Makefile.am
@@ -139,6 +139,8 @@ thunar_SOURCES = \
thunar-location-buttons.h \
thunar-location-entry.c \
thunar-location-entry.h \
+ thunar-menu-util.c \
+ thunar-menu-util.h \
thunar-misc-jobs.c \
thunar-misc-jobs.h \
thunar-notify.c \
diff --git a/thunar/thunar-dnd.c b/thunar/thunar-dnd.c
index 9bf1b86..a8b54d0 100644
--- a/thunar/thunar-dnd.c
+++ b/thunar/thunar-dnd.c
@@ -29,8 +29,8 @@
#include <thunar/thunar-dialogs.h>
#include <thunar/thunar-dnd.h>
#include <thunar/thunar-gtk-extensions.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-private.h>
-#include <thunar/thunar-util.h>
@@ -85,7 +85,6 @@ thunar_dnd_ask (GtkWidget *widget,
GList *items = NULL;
GList *lp;
guint n;
- GtkAction *action;
_thunar_return_val_if_fail (thunar_file_is_directory (folder), 0);
_thunar_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
@@ -153,19 +152,7 @@ thunar_dnd_ask (GtkWidget *widget,
if (G_UNLIKELY (items != NULL))
{
/* add menu items for all items */
- for (lp = items; lp != NULL; lp = lp->next)
- {
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- /* add a menu item for the action */
- item = gtk_action_create_menu_item (action);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- /* release the reference on the menu item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
- }
+ thunar_menu_util_add_items_to_menu (menu, items);
g_list_free (items);
/* append another separator */
diff --git a/thunar/thunar-menu-util.c b/thunar/thunar-menu-util.c
new file mode 100644
index 0000000..9218305
--- /dev/null
+++ b/thunar/thunar-menu-util.c
@@ -0,0 +1,164 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2017 Andre Miranda <andreldm at xfce.org>
+ *
+ * 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 of the License, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <thunar/thunar-menu-util.h>
+
+#include <thunarx/thunarx.h>
+
+
+
+static void
+extension_action_callback (GtkAction *action,
+ gpointer callback_data)
+{
+ thunarx_menu_item_activate (THUNARX_MENU_ITEM (callback_data));
+}
+
+
+
+static GtkAction *
+action_from_menu_item (GObject *item)
+{
+ gchar *name, *label, *tooltip, *icon_name;
+ gboolean sensitive, priority;
+ GtkAction *action;
+
+ g_return_val_if_fail (THUNARX_IS_MENU_ITEM (item), NULL);
+
+ g_object_get (G_OBJECT (item),
+ "name", &name,
+ "label", &label,
+ "tooltip", &tooltip,
+ "icon", &icon_name,
+ "sensitive", &sensitive,
+ "priority", &priority,
+ NULL);
+
+ action = gtk_action_new (name, label, tooltip, NULL);
+
+ if (icon_name != NULL)
+ {
+ gtk_action_set_icon_name (action, icon_name);
+ }
+
+ gtk_action_set_sensitive (action, sensitive);
+ g_object_set (action, "is-important", priority, NULL);
+
+ g_signal_connect_data (action, "activate",
+ G_CALLBACK (extension_action_callback),
+ g_object_ref (item),
+ (GClosureNotify) g_object_unref, 0);
+
+ g_free (name);
+ g_free (label);
+ g_free (tooltip);
+ g_free (icon_name);
+
+ return action;
+}
+
+
+
+void
+thunar_menu_util_add_items_to_ui_manager (GtkUIManager *ui_manager,
+ GtkActionGroup *action_group,
+ gint merge_id,
+ const gchar *path,
+ GList *items)
+{
+ GList *lp;
+ GtkAction *action;
+ ThunarxMenu *menu;
+ char *subpath;
+ GList *children;
+
+ /* add the menu items to the UI manager */
+ for (lp = items; lp != NULL; lp = lp->next)
+ {
+ action = action_from_menu_item (G_OBJECT (lp->data));
+ g_object_get (G_OBJECT (lp->data), "menu", &menu, NULL);
+
+ /* add the action to the action group */
+ gtk_action_group_add_action (action_group, action);
+
+ /* add the action to the UI manager */
+ gtk_ui_manager_add_ui (ui_manager, merge_id, path,
+ gtk_action_get_name (GTK_ACTION (action)),
+ gtk_action_get_name (GTK_ACTION (action)),
+ (menu != NULL) ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE);
+
+ /* add submenu items if any */
+ if (menu != NULL) {
+ children = thunarx_menu_get_items (menu);
+ subpath = g_build_path ("/", path, gtk_action_get_name (action), NULL);
+
+ thunar_menu_util_add_items_to_ui_manager (ui_manager, action_group, merge_id,
+ subpath, children);
+
+ thunarx_menu_item_list_free (children);
+ g_free (subpath);
+ }
+
+ /* release the reference on item and action */
+ g_object_unref (G_OBJECT (lp->data));
+ g_object_unref (G_OBJECT (action));
+ }
+}
+
+
+
+void
+thunar_menu_util_add_items_to_menu (GtkWidget *menu,
+ GList *items)
+{
+ GList *lp;
+ GtkAction *action;
+ GtkWidget *item;
+ GtkWidget *submenu;
+ ThunarxMenu *thunarx_menu;
+ GList *children;
+
+ /* add the menu items to the UI manager */
+ for (lp = items; lp != NULL; lp = lp->next)
+ {
+ action = action_from_menu_item (G_OBJECT (lp->data));
+
+ item = gtk_action_create_menu_item (action);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ /* add submenu items if any */
+ g_object_get (G_OBJECT (lp->data), "menu", &thunarx_menu, NULL);
+ if (thunarx_menu != NULL) {
+ children = thunarx_menu_get_items (thunarx_menu);
+
+ submenu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
+
+ thunar_menu_util_add_items_to_menu (submenu, children);
+
+ thunarx_menu_item_list_free (children);
+ }
+
+ /* release the reference on item and action */
+ g_object_unref (G_OBJECT (lp->data));
+ g_object_unref (G_OBJECT (action));
+ }
+}
diff --git a/thunar/thunar-menu-util.h b/thunar/thunar-menu-util.h
new file mode 100644
index 0000000..68efe81
--- /dev/null
+++ b/thunar/thunar-menu-util.h
@@ -0,0 +1,39 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2017 Andre Miranda <andreldm at xfce.org>
+ *
+ * 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 of the License, 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __THUNAR_MENU_UTIL_H__
+#define __THUNAR_MENU_UTIL_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+void thunar_menu_util_add_items_to_ui_manager (GtkUIManager *ui_manager,
+ GtkActionGroup *action_group,
+ gint merge_id,
+ const gchar *path,
+ GList *items);
+
+void thunar_menu_util_add_items_to_menu (GtkWidget *menu,
+ GList *items);
+
+G_END_DECLS
+
+#endif /* !__THUNAR_MENU_UTIL_H__ */
diff --git a/thunar/thunar-renamer-dialog.c b/thunar/thunar-renamer-dialog.c
index 5cbffe7..e72889f 100644
--- a/thunar/thunar-renamer-dialog.c
+++ b/thunar/thunar-renamer-dialog.c
@@ -37,13 +37,13 @@
#include <thunar/thunar-icon-factory.h>
#include <thunar/thunar-icon-renderer.h>
#include <thunar/thunar-launcher.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-private.h>
#include <thunar/thunar-properties-dialog.h>
#include <thunar/thunar-renamer-dialog.h>
#include <thunar/thunar-renamer-dialog-ui.h>
#include <thunar/thunar-renamer-model.h>
#include <thunar/thunar-renamer-progress.h>
-#include <thunar/thunar-util.h>
@@ -849,9 +849,7 @@ thunar_renamer_dialog_context_menu (ThunarRenamerDialog *renamer_dialog,
ThunarxRenamer *renamer;
GtkWidget *menu;
GList *items = NULL;
- GList *lp;
gint renamer_merge_id = 0;
- GtkAction *action;
_thunar_return_if_fail (THUNAR_IS_RENAMER_DIALOG (renamer_dialog));
@@ -875,24 +873,8 @@ thunar_renamer_dialog_context_menu (ThunarRenamerDialog *renamer_dialog,
gtk_ui_manager_insert_action_group (renamer_dialog->ui_manager, renamer_actions, -1);
/* add the items to the UI manager */
- for (lp = items; lp != NULL; lp = lp->next)
- {
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- /* add the action to the action group */
- gtk_action_group_add_action (renamer_actions, action);
-
- /* add the action to the UI manager */
- gtk_ui_manager_add_ui (renamer_dialog->ui_manager, renamer_merge_id,
- "/file-context-menu/placeholder-renamer-actions",
- gtk_action_get_name (action),
- gtk_action_get_name (action),
- GTK_UI_MANAGER_MENUITEM, FALSE);
-
- /* release the reference on the menu item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
- }
+ thunar_menu_util_add_items_to_ui_manager (renamer_dialog->ui_manager, renamer_actions, renamer_merge_id,
+ "/file-context-menu/placeholder-renamer-actions", items);
/* be sure to update the UI manager to avoid flickering */
gtk_ui_manager_ensure_update (renamer_dialog->ui_manager);
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 0685246..e457423 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -40,13 +40,13 @@
#include <thunar/thunar-dnd.h>
#include <thunar/thunar-gio-extensions.h>
#include <thunar/thunar-gtk-extensions.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-preferences.h>
#include <thunar/thunar-private.h>
#include <thunar/thunar-shortcuts-icon-renderer.h>
#include <thunar/thunar-shortcuts-model.h>
#include <thunar/thunar-shortcuts-view.h>
#include <thunar/thunar-stock.h>
-#include <thunar/thunar-util.h>
@@ -1072,7 +1072,6 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
gboolean can_mount;
gboolean can_unmount;
gboolean can_eject;
- GtkAction *action;
/* check if this is an item menu or a header menu */
gtk_tree_model_get (model, iter, THUNAR_SHORTCUTS_MODEL_COLUMN_IS_HEADER, &is_header, -1);
@@ -1242,18 +1241,7 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
}
/* add the menu items to the menu */
- for (lp = items; lp != NULL; lp = lp->next)
- {
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- item = gtk_action_create_menu_item (action);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- /* release the reference on the menu item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
- }
+ thunar_menu_util_add_items_to_menu (menu, items);
/* cleanup */
g_list_free (items);
diff --git a/thunar/thunar-standard-view.c b/thunar/thunar-standard-view.c
index 165507b..5ae8ab2 100644
--- a/thunar/thunar-standard-view.c
+++ b/thunar/thunar-standard-view.c
@@ -43,6 +43,7 @@
#include <thunar/thunar-history.h>
#include <thunar/thunar-icon-renderer.h>
#include <thunar/thunar-marshal.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-private.h>
#include <thunar/thunar-properties-dialog.h>
#include <thunar/thunar-renamer-dialog.h>
@@ -2002,7 +2003,7 @@ thunar_standard_view_merge_custom_actions (ThunarStandardView *standard_view,
GList *files = NULL;
GList *tmp;
GList *lp;
- GtkAction *action;
+ gchar *path;
/* we cannot add anything if we aren't connected to any UI manager */
if (G_UNLIKELY (standard_view->ui_manager == NULL))
@@ -2075,40 +2076,21 @@ thunar_standard_view_merge_custom_actions (ThunarStandardView *standard_view,
standard_view->priv->custom_merge_id = gtk_ui_manager_new_merge_id (standard_view->ui_manager);
gtk_ui_manager_insert_action_group (standard_view->ui_manager, standard_view->priv->custom_actions, -1);
- /* add the menu items to the UI manager */
- for (lp = items; lp != NULL; lp = lp->next)
+ if (G_LIKELY (selected_items != NULL))
{
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- /* add the action to the action group */
- gtk_action_group_add_action (standard_view->priv->custom_actions, action);
-
- /* add the action to the UI manager */
- if (G_LIKELY (selected_items != NULL))
- {
- /* add to the file context menu */
- gtk_ui_manager_add_ui (standard_view->ui_manager,
- standard_view->priv->custom_merge_id,
- "/file-context-menu/placeholder-custom-actions",
- gtk_action_get_name (GTK_ACTION (action)),
- gtk_action_get_name (GTK_ACTION (action)),
- GTK_UI_MANAGER_MENUITEM, FALSE);
- }
- else
- {
- /* add to the folder context menu */
- gtk_ui_manager_add_ui (standard_view->ui_manager,
- standard_view->priv->custom_merge_id,
- "/folder-context-menu/placeholder-custom-actions",
- gtk_action_get_name (GTK_ACTION (action)),
- gtk_action_get_name (GTK_ACTION (action)),
- GTK_UI_MANAGER_MENUITEM, FALSE);
- }
-
- /* release the reference on item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
+ /* add to the file context menu */
+ path = "/file-context-menu/placeholder-custom-actions";
}
+ else
+ {
+ /* add to the folder context menu */
+ path = "/folder-context-menu/placeholder-custom-actions";
+ }
+
+ thunar_menu_util_add_items_to_ui_manager (standard_view->ui_manager,
+ standard_view->priv->custom_actions,
+ standard_view->priv->custom_merge_id,
+ path, items);
/* be sure to update the UI manager to avoid flickering */
gtk_ui_manager_ensure_update (standard_view->ui_manager);
diff --git a/thunar/thunar-tree-view.c b/thunar/thunar-tree-view.c
index 17954bb..7711b92 100644
--- a/thunar/thunar-tree-view.c
+++ b/thunar/thunar-tree-view.c
@@ -35,6 +35,7 @@
#include <thunar/thunar-gtk-extensions.h>
#include <thunar/thunar-job.h>
#include <thunar/thunar-marshal.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-preferences.h>
#include <thunar/thunar-private.h>
#include <thunar/thunar-stock.h>
@@ -43,7 +44,6 @@
#include <thunar/thunar-simple-job.h>
#include <thunar/thunar-tree-model.h>
#include <thunar/thunar-tree-view.h>
-#include <thunar/thunar-util.h>
@@ -1266,7 +1266,6 @@ thunar_tree_view_context_menu (ThunarTreeView *view,
GIcon *icon;
GList *providers, *lp;
GList *items = NULL, *tmp;
- GtkAction *action;
/* verify that we're connected to the clipboard manager */
if (G_UNLIKELY (view->clipboard == NULL))
@@ -1516,18 +1515,7 @@ thunar_tree_view_context_menu (ThunarTreeView *view,
g_list_free (providers);
/* add the menu items to the menu */
- for (lp = items; lp != NULL; lp = lp->next)
- {
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- item = gtk_action_create_menu_item (action);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- /* release the reference on the menu item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
- }
+ thunar_menu_util_add_items_to_menu (menu, items);
/* add a separator to the end of the menu */
if (G_LIKELY (lp != items))
diff --git a/thunar/thunar-util.c b/thunar/thunar-util.c
index e4a291d..c61a73b 100644
--- a/thunar/thunar-util.c
+++ b/thunar/thunar-util.c
@@ -56,7 +56,6 @@
#include <thunar/thunar-private.h>
#include <thunar/thunar-util.h>
-#include <thunarx/thunarx.h>
#include <glib.h>
#include <glib/gstdio.h>
@@ -610,55 +609,3 @@ thunar_setup_display_cb (gpointer data)
{
g_setenv ("DISPLAY", (char *) data, TRUE);
}
-
-
-
-static void
-extension_action_callback (GtkAction *action,
- gpointer callback_data)
-{
- thunarx_menu_item_activate (THUNARX_MENU_ITEM (callback_data));
-}
-
-
-
-GtkAction *
-thunar_util_action_from_menu_item (GObject *item)
-{
- gchar *name, *label, *tooltip, *icon_name;
- gboolean sensitive, priority;
- GtkAction *action;
-
- g_return_val_if_fail (THUNARX_IS_MENU_ITEM (item), NULL);
-
- g_object_get (G_OBJECT (item),
- "name", &name,
- "label", &label,
- "tooltip", &tooltip,
- "icon", &icon_name,
- "sensitive", &sensitive,
- "priority", &priority,
- NULL);
-
- action = gtk_action_new (name, label, tooltip, NULL);
-
- if (icon_name != NULL)
- {
- gtk_action_set_icon_name (action, icon_name);
- }
-
- gtk_action_set_sensitive (action, sensitive);
- g_object_set (action, "is-important", priority, NULL);
-
- g_signal_connect_data (action, "activate",
- G_CALLBACK (extension_action_callback),
- g_object_ref (item),
- (GClosureNotify) g_object_unref, 0);
-
- g_free (name);
- g_free (label);
- g_free (tooltip);
- g_free (icon_name);
-
- return action;
-}
diff --git a/thunar/thunar-util.h b/thunar/thunar-util.h
index adf0585..5449f0c 100644
--- a/thunar/thunar-util.h
+++ b/thunar/thunar-util.h
@@ -55,8 +55,6 @@ gchar *thunar_util_change_working_directory (const gchar *new_directory)
void thunar_setup_display_cb (gpointer data);
-GtkAction *thunar_util_action_from_menu_item (GObject *item) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
-
G_END_DECLS;
#endif /* !__THUNAR_UTIL_H__ */
diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c
index 462eceb..9d846e9 100644
--- a/thunar/thunar-window.c
+++ b/thunar/thunar-window.c
@@ -49,6 +49,7 @@
#include <thunar/thunar-location-buttons.h>
#include <thunar/thunar-location-entry.h>
#include <thunar/thunar-marshal.h>
+#include <thunar/thunar-menu-util.h>
#include <thunar/thunar-pango-extensions.h>
#include <thunar/thunar-preferences-dialog.h>
#include <thunar/thunar-preferences.h>
@@ -1946,8 +1947,7 @@ thunar_window_merge_custom_preferences (ThunarWindow *window)
{
GList *providers;
GList *items;
- GList *ap, *pp;
- GtkAction *action;
+ GList *pp;
_thunar_return_if_fail (THUNAR_IS_WINDOW (window));
_thunar_return_if_fail (window->custom_preferences_merge_id == 0);
@@ -1964,24 +1964,12 @@ thunar_window_merge_custom_preferences (ThunarWindow *window)
{
/* determine the available menu items for the provider */
items = thunarx_preferences_provider_get_menu_items (THUNARX_PREFERENCES_PROVIDER (pp->data), GTK_WIDGET (window));
- for (ap = items; ap != NULL; ap = ap->next)
- {
- /* add the action to the action group */
- action = thunar_util_action_from_menu_item (G_OBJECT (ap->data));
- gtk_action_group_add_action (window->action_group, action);
-
- /* add the action to the UI manager */
- gtk_ui_manager_add_ui (window->ui_manager,
- window->custom_preferences_merge_id,
- "/main-menu/edit-menu/placeholder-custom-preferences",
- gtk_action_get_name (GTK_ACTION (action)),
- gtk_action_get_name (GTK_ACTION (action)),
- GTK_UI_MANAGER_MENUITEM, FALSE);
-
- /* release the references on menu item and action */
- g_object_unref (G_OBJECT (ap->data));
- g_object_unref (G_OBJECT (action));
- }
+
+ thunar_menu_util_add_items_to_ui_manager (window->ui_manager,
+ window->action_group,
+ window->custom_preferences_merge_id,
+ "/main-menu/edit-menu/placeholder-custom-preferences",
+ items);
/* release the reference on the provider */
g_object_unref (G_OBJECT (pp->data));
@@ -3361,7 +3349,6 @@ thunar_window_update_custom_actions (ThunarView *view,
GList *lp;
GList *providers;
GList *tmp;
- GtkAction *action;
_thunar_return_if_fail (THUNAR_IS_VIEW (view));
_thunar_return_if_fail (THUNAR_IS_WINDOW (window));
@@ -3436,30 +3423,11 @@ thunar_window_update_custom_actions (ThunarView *view,
gtk_ui_manager_ensure_update (window->ui_manager);
/* add the menu items to the UI manager */
- for (lp = items; lp != NULL; lp = lp->next)
- {
- if (G_UNLIKELY (lp->data == NULL))
- continue;
-
- action = thunar_util_action_from_menu_item (G_OBJECT (lp->data));
-
- /* add the action to the action group */
- gtk_action_group_add_action_with_accel (window->custom_actions,
- action,
- NULL);
-
- /* add to the file context menu */
- gtk_ui_manager_add_ui (window->ui_manager,
- window->custom_merge_id,
- "/main-menu/file-menu/placeholder-custom-actions",
- gtk_action_get_name (GTK_ACTION (action)),
- gtk_action_get_name (GTK_ACTION (action)),
- GTK_UI_MANAGER_MENUITEM, FALSE);
-
- /* release the references on menu item and action */
- g_object_unref (G_OBJECT (lp->data));
- g_object_unref (G_OBJECT (action));
- }
+ thunar_menu_util_add_items_to_ui_manager (window->ui_manager,
+ window->custom_actions,
+ window->custom_merge_id,
+ "/main-menu/file-menu/placeholder-custom-actions",
+ items);
/* cleanup */
g_list_free (items);
diff --git a/thunarx/Makefile.am b/thunarx/Makefile.am
index abea879..82161ec 100644
--- a/thunarx/Makefile.am
+++ b/thunarx/Makefile.am
@@ -9,6 +9,7 @@ libthunarx_headers = \
thunarx.h \
thunarx-config.h \
thunarx-file-info.h \
+ thunarx-menu.h \
thunarx-menu-item.h \
thunarx-menu-provider.h \
thunarx-preferences-provider.h \
@@ -32,6 +33,7 @@ libthunarx_3_la_SOURCES = \
$(libthunarx_headers) \
thunarx-config.c \
thunarx-file-info.c \
+ thunarx-menu.c \
thunarx-menu-item.c \
thunarx-menu-provider.c \
thunarx-preferences-provider.c \
diff --git a/thunarx/thunarx-menu-item.c b/thunarx/thunarx-menu-item.c
index 3a48d6f..9f4f608 100644
--- a/thunarx/thunarx-menu-item.c
+++ b/thunarx/thunarx-menu-item.c
@@ -23,6 +23,7 @@
#include <thunarx/thunarx-private.h>
#include <thunarx/thunarx-menu-item.h>
+#include <thunarx/thunarx-menu.h>
@@ -77,12 +78,13 @@ static void thunarx_menu_item_finalize (GObject *object);
struct _ThunarxMenuItemPrivate
{
- gchar *name;
- gchar *label;
- gchar *tooltip;
- gchar *icon;
- gboolean sensitive;
- gboolean priority;
+ gchar *name;
+ gchar *label;
+ gchar *tooltip;
+ gchar *icon;
+ gboolean sensitive;
+ gboolean priority;
+ ThunarxMenu *menu;
};
@@ -146,7 +148,6 @@ thunarx_menu_item_class_init (ThunarxMenuItemClass *klass)
"Name of the icon to display in the menu item",
NULL,
G_PARAM_READWRITE));
-
g_object_class_install_property (gobject_class,
PROP_SENSITIVE,
g_param_spec_boolean ("sensitive",
@@ -161,6 +162,13 @@ thunarx_menu_item_class_init (ThunarxMenuItemClass *klass)
"Show priority text in toolbars",
TRUE,
G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class,
+ PROP_MENU,
+ g_param_spec_object ("menu",
+ "Menu",
+ "The menu belonging to this item. May be null.",
+ THUNARX_TYPE_MENU,
+ G_PARAM_READWRITE));
}
@@ -171,6 +179,7 @@ thunarx_menu_item_init (ThunarxMenuItem *item)
item->priv = THUNARX_MENU_ITEM_GET_PRIVATE (item);
item->priv->sensitive = TRUE;
item->priv->priority = FALSE;
+ item->priv->menu = NULL;
}
@@ -209,6 +218,10 @@ thunarx_menu_item_get_property (GObject *object,
g_value_set_boolean (value, item->priv->priority);
break;
+ case PROP_MENU:
+ g_value_set_object (value, item->priv->menu);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -261,6 +274,13 @@ thunarx_menu_item_set_property (GObject *object,
g_object_notify (object, "priority");
break;
+ case PROP_MENU:
+ if (item->priv->menu)
+ g_object_unref (item->priv->menu);
+ item->priv->menu = g_object_ref (g_value_get_object (value));
+ g_object_notify (object, "menu");
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -279,6 +299,9 @@ thunarx_menu_item_finalize (GObject *object)
g_free (item->priv->tooltip);
g_free (item->priv->icon);
+ if (item->priv->menu)
+ g_object_unref (item->priv->menu);
+
(*G_OBJECT_CLASS (thunarx_menu_item_parent_class)->finalize) (object);
}
@@ -357,3 +380,37 @@ thunarx_menu_item_set_sensitive (ThunarxMenuItem *item,
g_return_if_fail (THUNARX_IS_MENU_ITEM (item));
item->priv->sensitive = sensitive;
}
+
+
+
+/**
+ * thunarx_menu_item_set_menu:
+ * @item: pointer to a #ThunarxMenuItem instance
+ * @menu: pointer to a #ThunarxMenu instance
+ *
+ * Attaches @menu to menu item.
+ */
+void
+thunarx_menu_item_set_menu (ThunarxMenuItem *item,
+ ThunarxMenu *menu)
+{
+ g_return_if_fail (THUNARX_IS_MENU_ITEM (item));
+ g_return_if_fail (THUNARX_IS_MENU (menu));
+
+ g_object_set (item, "menu", THUNARX_MENU (menu), NULL);
+}
+
+
+
+/**
+ * thunarx_menu_item_list_free:
+ * @items: (element-type ThunarxMenuItem): a list of #ThunarxMenuItem
+ */
+void
+thunarx_menu_item_list_free (GList *items)
+{
+ g_return_if_fail (items != NULL);
+
+ g_list_foreach (items, (GFunc)g_object_unref, NULL);
+ g_list_free (items);
+}
diff --git a/thunarx/thunarx-menu-item.h b/thunarx/thunarx-menu-item.h
index 3eaed6b..0055090 100644
--- a/thunarx/thunarx-menu-item.h
+++ b/thunarx/thunarx-menu-item.h
@@ -23,46 +23,6 @@
#ifndef __THUNARX_MENU_ITEM_H__
#define __THUNARX_MENU_ITEM_H__
-#include <glib-object.h>
-
-G_BEGIN_DECLS;
-
-typedef struct _ThunarxMenuItemPrivate ThunarxMenuItemPrivate;
-typedef struct _ThunarxMenuItemClass ThunarxMenuItemClass;
-typedef struct _ThunarxMenuItem ThunarxMenuItem;
-
-#define THUNARX_TYPE_MENU_ITEM (thunarx_menu_item_get_type ())
-#define THUNARX_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNARX_TYPE_MENU_ITEM, ThunarxMenuItem))
-#define THUNARX_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNARX_TYPE_MENU_ITEM, ThunarxMenuItemClass))
-#define THUNARX_IS_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNARX_TYPE_MENU_ITEM))
-#define THUNARX_IS_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), THUNARX_TYPE_MENU_ITEM))
-#define THUNARX_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), THUNARX_TYPE_MENU_ITEM))
-
-struct _ThunarxMenuItemClass {
- GObjectClass __parent__;
- void (*activate) (ThunarxMenuItem *item);
-};
-
-struct _ThunarxMenuItem {
- GObject __parent__;
-
- /*< private >*/
- ThunarxMenuItemPrivate *priv;
-};
-
-GType thunarx_menu_item_get_type (void) G_GNUC_CONST;
-
-ThunarxMenuItem *thunarx_menu_item_new (const gchar *name,
- const gchar *label,
- const gchar *tip,
- const gchar *icon) G_GNUC_MALLOC;
-
-void thunarx_menu_item_activate (ThunarxMenuItem *item);
-
-gboolean thunarx_menu_item_get_sensitive (ThunarxMenuItem *item);
-void thunarx_menu_item_set_sensitive (ThunarxMenuItem *item,
- gboolean sensitive);
-
-G_END_DECLS;
+#include "thunarx-menu.h"
#endif /* !__THUNARX_MENU_ITEM_H__ */
diff --git a/thunarx/thunarx-menu.c b/thunarx/thunarx-menu.c
new file mode 100644
index 0000000..97961b5
--- /dev/null
+++ b/thunarx/thunarx-menu.c
@@ -0,0 +1,144 @@
+/*-
+ * Copyright (c) 2017 Andre Miranda <andreldm at xfce.org>
+ *
+ * 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 of the License, 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, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n-lib.h>
+
+#include <thunarx/thunarx-private.h>
+#include <thunarx/thunarx-menu-item.h>
+#include <thunarx/thunarx-menu.h>
+
+
+
+#define THUNARX_MENU_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), THUNARX_TYPE_MENU, ThunarxMenuPrivate))
+
+/**
+ * SECTION: thunarx-menu
+ * @short_description: The base class for submenus added to the context menus
+ * @title: ThunarxMenu
+ * @include: thunarx/thunarx.h
+ *
+ * The class for submenus that can be added to Thunar's context menus. Extensions
+ * can provide ThunarxMenu objects by attaching them to ThunarxMenuItem objects,
+ * using thunarx_menu_item_set_menu().
+ */
+
+
+
+static void thunarx_menu_finalize (GObject *object);
+
+
+
+struct _ThunarxMenuPrivate
+{
+ GList *items;
+};
+
+
+
+G_DEFINE_TYPE (ThunarxMenu, thunarx_menu, G_TYPE_OBJECT)
+
+
+
+static void
+thunarx_menu_class_init (ThunarxMenuClass *klass)
+{
+ GObjectClass *gobject_class;
+
+ /* add our private data to the class type */
+ g_type_class_add_private (klass, sizeof (ThunarxMenuPrivate));
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = thunarx_menu_finalize;
+}
+
+
+
+static void
+thunarx_menu_init (ThunarxMenu *menu)
+{
+ menu->priv = THUNARX_MENU_GET_PRIVATE (menu);
+ menu->priv->items = NULL;
+}
+
+
+
+static void
+thunarx_menu_finalize (GObject *object)
+{
+ ThunarxMenu *menu = THUNARX_MENU (object);
+
+ if (menu->priv->items)
+ g_list_free (menu->priv->items);
+
+ (*G_OBJECT_CLASS (thunarx_menu_parent_class)->finalize) (object);
+}
+
+
+
+/**
+ * thunarx_menu_new:
+ *
+ * Creates a new menu that can be added to the toolbar or to a contextual menu.
+ *
+ * Returns: a newly created #ThunarxMenu
+ */
+ThunarxMenu *
+thunarx_menu_new (void)
+{
+ return g_object_new (THUNARX_TYPE_MENU, NULL);
+}
+
+
+
+/**
+ * thunarx_menu_append_item:
+ * @menu: a #ThunarxMenu
+ * @item: a #ThunarxMenuItem
+ */
+void
+thunarx_menu_append_item (ThunarxMenu *menu, ThunarxMenuItem *item)
+{
+ g_return_if_fail (menu != NULL);
+ g_return_if_fail (item != NULL);
+
+ menu->priv->items = g_list_append (menu->priv->items, g_object_ref (item));
+}
+
+
+
+/**
+ * thunarx_menu_get_items:
+ * @menu: a #ThunarxMenu
+ *
+ * Returns: (element-type ThunarxMenuItem) (transfer full): the provided #ThunarxMenuItem list
+ */
+GList *
+thunarx_menu_get_items (ThunarxMenu *menu)
+{
+ GList *items;
+
+ g_return_val_if_fail (menu != NULL, NULL);
+
+ items = g_list_copy (menu->priv->items);
+ g_list_foreach (items, (GFunc) g_object_ref, NULL);
+
+ return items;
+}
diff --git a/thunarx/thunarx-menu-item.h b/thunarx/thunarx-menu.h
similarity index 60%
copy from thunarx/thunarx-menu-item.h
copy to thunarx/thunarx-menu.h
index 3eaed6b..1f43f6e 100644
--- a/thunarx/thunarx-menu-item.h
+++ b/thunarx/thunarx-menu.h
@@ -20,17 +20,35 @@
#error "Only <thunarx/thunarx.h> can be included directly, this file may disappear or change contents"
#endif
-#ifndef __THUNARX_MENU_ITEM_H__
-#define __THUNARX_MENU_ITEM_H__
+#ifndef __THUNARX_MENU_H__
+#define __THUNARX_MENU_H__
#include <glib-object.h>
G_BEGIN_DECLS;
+/* ThunarxMenu types */
+typedef struct _ThunarxMenuPrivate ThunarxMenuPrivate;
+typedef struct _ThunarxMenuClass ThunarxMenuClass;
+typedef struct _ThunarxMenu ThunarxMenu;
+
+/* ThunarxMenuItem types */
typedef struct _ThunarxMenuItemPrivate ThunarxMenuItemPrivate;
typedef struct _ThunarxMenuItemClass ThunarxMenuItemClass;
typedef struct _ThunarxMenuItem ThunarxMenuItem;
+
+
+
+/* ThunarxMenu defines */
+#define THUNARX_TYPE_MENU (thunarx_menu_get_type ())
+#define THUNARX_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNARX_TYPE_MENU, ThunarxMenu))
+#define THUNARX_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNARX_TYPE_MENU, ThunarxMenuClass))
+#define THUNARX_IS_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), THUNARX_TYPE_MENU))
+#define THUNARX_IS_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), THUNARX_TYPE_MENU))
+#define THUNARX_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), THUNARX_TYPE_MENU))
+
+/* ThunarxMenuItem defines */
#define THUNARX_TYPE_MENU_ITEM (thunarx_menu_item_get_type ())
#define THUNARX_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNARX_TYPE_MENU_ITEM, ThunarxMenuItem))
#define THUNARX_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNARX_TYPE_MENU_ITEM, ThunarxMenuItemClass))
@@ -38,6 +56,19 @@ typedef struct _ThunarxMenuItem ThunarxMenuItem;
#define THUNARX_IS_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), THUNARX_TYPE_MENU_ITEM))
#define THUNARX_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), THUNARX_TYPE_MENU_ITEM))
+
+
+/* ThunarxMenu structs */
+struct _ThunarxMenuClass {
+ GObjectClass __parent__;
+};
+
+struct _ThunarxMenu {
+ GObject __parent__;
+ ThunarxMenuPrivate *priv;
+};
+
+/* ThunarxMenuItem structs */
struct _ThunarxMenuItemClass {
GObjectClass __parent__;
void (*activate) (ThunarxMenuItem *item);
@@ -45,16 +76,27 @@ struct _ThunarxMenuItemClass {
struct _ThunarxMenuItem {
GObject __parent__;
-
- /*< private >*/
ThunarxMenuItemPrivate *priv;
};
+
+
+/* ThunarxMenu methods */
+GType thunarx_menu_get_type (void) G_GNUC_CONST;
+
+ThunarxMenu *thunarx_menu_new (void) G_GNUC_MALLOC;
+
+void thunarx_menu_append_item (ThunarxMenu *menu,
+ ThunarxMenuItem *item);
+
+GList* thunarx_menu_get_items (ThunarxMenu *menu);
+
+/* ThunarxMenuItem methods */
GType thunarx_menu_item_get_type (void) G_GNUC_CONST;
ThunarxMenuItem *thunarx_menu_item_new (const gchar *name,
const gchar *label,
- const gchar *tip,
+ const gchar *tooltip,
const gchar *icon) G_GNUC_MALLOC;
void thunarx_menu_item_activate (ThunarxMenuItem *item);
@@ -63,6 +105,11 @@ gboolean thunarx_menu_item_get_sensitive (ThunarxMenuItem *item);
void thunarx_menu_item_set_sensitive (ThunarxMenuItem *item,
gboolean sensitive);
+void thunarx_menu_item_list_free (GList *items);
+
+void thunarx_menu_item_set_menu (ThunarxMenuItem *item,
+ ThunarxMenu *menu);
+
G_END_DECLS;
-#endif /* !__THUNARX_MENU_ITEM_H__ */
+#endif /* !__THUNARX_MENU_H__ */
diff --git a/thunarx/thunarx.h b/thunarx/thunarx.h
index d6de691..192bf9a 100644
--- a/thunarx/thunarx.h
+++ b/thunarx/thunarx.h
@@ -25,7 +25,7 @@
#include <thunarx/thunarx-config.h>
#include <thunarx/thunarx-file-info.h>
-#include <thunarx/thunarx-menu-item.h>
+#include <thunarx/thunarx-menu.h>
#include <thunarx/thunarx-menu-provider.h>
#include <thunarx/thunarx-preferences-provider.h>
#include <thunarx/thunarx-property-page.h>
diff --git a/thunarx/thunarx.symbols b/thunarx/thunarx.symbols
index a53ed09..750d55f 100644
--- a/thunarx/thunarx.symbols
+++ b/thunarx/thunarx.symbols
@@ -46,12 +46,20 @@ thunarx_file_info_list_get_type
thunarx_file_info_list_copy
thunarx_file_info_list_free
+/* ThunarxMenu methods */
+thunarx_menu_get_type G_GNUC_CONST
+thunarx_menu_new G_GNUC_MALLOC
+thunarx_menu_append_item
+thunarx_menu_get_items
+
/* ThunarxMenuItem methods */
thunarx_menu_item_get_type G_GNUC_CONST
thunarx_menu_item_new G_GNUC_MALLOC
thunarx_menu_item_activate
thunarx_menu_item_get_sensitive
thunarx_menu_item_set_sensitive
+thunarx_menu_item_set_menu
+thunarx_menu_item_list_free
/* ThunarxMenuProvider methods */
thunarx_menu_provider_get_type G_GNUC_CONST
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list