[Xfce4-commits] [apps/xfdashboard] 01/01: Replace XfdashboardPopupMenuItemMeta with an interface called XfdashboardPopupMenuItem which each actor used as pop-up menu item must implement. It is not allowed anymore to use "normal" actors as menu items.

noreply at xfce.org noreply at xfce.org
Fri Dec 23 11:40:21 CET 2016


This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit d9865e3e779e3d1f0dced4c9519653205efde88f
Author: Stephan Haller <nomad at froevel.de>
Date:   Fri Dec 23 11:38:13 2016 +0100

    Replace XfdashboardPopupMenuItemMeta with an interface called XfdashboardPopupMenuItem which each actor used as pop-up menu item must implement. It is not allowed anymore to use "normal" actors as menu items.
    
    XfdashboardPopupMenuItemButton is the first menu item class which can be used and replaces the "normal" actors used in quicklaunch so far.
---
 data/themes/xfdashboard-auber/xfdashboard.css   |  46 ++
 data/themes/xfdashboard-blue/xfdashboard.css    |  46 ++
 data/themes/xfdashboard-dark/xfdashboard.css    |  46 ++
 data/themes/xfdashboard-mint/xfdashboard.css    |  46 ++
 data/themes/xfdashboard-moranga/xfdashboard.css |  46 ++
 data/themes/xfdashboard-wine/xfdashboard.css    |  46 ++
 data/themes/xfdashboard/xfdashboard.css         |  17 +-
 libxfdashboard/Makefile.am                      |   6 +-
 libxfdashboard/popup-menu-item-button.c         | 128 +++++
 libxfdashboard/popup-menu-item-button.h         |  85 ++++
 libxfdashboard/popup-menu-item-meta.c           | 591 ------------------------
 libxfdashboard/popup-menu-item-meta.h           |  95 ----
 libxfdashboard/popup-menu-item.c                | 119 +++++
 libxfdashboard/popup-menu-item.h                |  65 +++
 libxfdashboard/popup-menu.c                     | 259 ++++-------
 libxfdashboard/popup-menu.h                     |  41 +-
 libxfdashboard/quicklaunch.c                    |  77 +--
 17 files changed, 831 insertions(+), 928 deletions(-)

diff --git a/data/themes/xfdashboard-auber/xfdashboard.css b/data/themes/xfdashboard-auber/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-auber/xfdashboard.css
+++ b/data/themes/xfdashboard-auber/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard-blue/xfdashboard.css b/data/themes/xfdashboard-blue/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-blue/xfdashboard.css
+++ b/data/themes/xfdashboard-blue/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard-dark/xfdashboard.css b/data/themes/xfdashboard-dark/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-dark/xfdashboard.css
+++ b/data/themes/xfdashboard-dark/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard-mint/xfdashboard.css b/data/themes/xfdashboard-mint/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-mint/xfdashboard.css
+++ b/data/themes/xfdashboard-mint/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard-moranga/xfdashboard.css b/data/themes/xfdashboard-moranga/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-moranga/xfdashboard.css
+++ b/data/themes/xfdashboard-moranga/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard-wine/xfdashboard.css b/data/themes/xfdashboard-wine/xfdashboard.css
index 48746e3..4d4b09c 100644
--- a/data/themes/xfdashboard-wine/xfdashboard.css
+++ b/data/themes/xfdashboard-wine/xfdashboard.css
@@ -537,3 +537,49 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	corners: all;
 	corner-radius: 4.0;
 }
+
+/* Popup menus */
+.popup-menu
+{
+	background-type: fill outline rounded-corners;
+	background-fill-color: @alpha(@background-base-color, 0.7);
+	outline-color: #5792e2ff;
+	outline-width: 1.0;
+	corners: all;
+	corner-radius: 4.0;
+}
+
+.popup-menu-title
+{
+	font: bold;
+	background-type: outline;
+	outline-borders: bottom;
+	outline-width: 1.0;
+	outline-color: white;
+}
+
+.popup-menu-item
+{
+	margin-top: 2.0;
+	margin-bottom: 2.0;
+}
+
+.popup-menu-item:selected,
+.popup-menu-item:hover
+{
+	background-type: fill;
+	background-fill-color: #93c1ffff;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch
+{
+	show-title: true;
+	show-title-icon: true;
+}
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/data/themes/xfdashboard/xfdashboard.css b/data/themes/xfdashboard/xfdashboard.css
index 9251f9f..4d4b09c 100644
--- a/data/themes/xfdashboard/xfdashboard.css
+++ b/data/themes/xfdashboard/xfdashboard.css
@@ -571,18 +571,15 @@ XfdashboardSearchView XfdashboardSearchResultContainer XfdashboardButton:selecte
 	background-fill-color: #93c1ffff;
 }
 
-.popup-menu-separator
-{
-	background-type: outline;
-	outline-borders: all;
-	outline-width: 1.0;
-	outline-color: white;
-	margin-top: 2.0;
-	margin-bottom: 2.0;
-}
-
 .popup-menu.popup-menu-source-XfdashboardQuicklaunch
 {
 	show-title: true;
 	show-title-icon: true;
 }
+
+.popup-menu.popup-menu-source-XfdashboardQuicklaunch XfdashboardLabel.popup-menu-item
+{
+	icon-size: 16;
+	text-justify: left;
+	color: #ffffffff;
+}
diff --git a/libxfdashboard/Makefile.am b/libxfdashboard/Makefile.am
index 4e6d2f4..2733d23 100644
--- a/libxfdashboard/Makefile.am
+++ b/libxfdashboard/Makefile.am
@@ -57,7 +57,8 @@ libxfdashboard_la_headers = \
 	plugin.h \
 	plugins-manager.h \
 	popup-menu.h \
-	popup-menu-item-meta.h \
+	popup-menu-item.h \
+	popup-menu-item-button.h \
 	quicklaunch.h \
 	scaled-table-layout.h \
 	scrollbar.h \
@@ -127,7 +128,8 @@ libxfdashboard_la_SOURCES = \
 	plugin.c \
 	plugins-manager.c \
 	popup-menu.c \
-	popup-menu-item-meta.c \
+	popup-menu-item.c \
+	popup-menu-item-button.c \
 	quicklaunch.c \
 	scaled-table-layout.c \
 	scrollbar.c \
diff --git a/libxfdashboard/popup-menu-item-button.c b/libxfdashboard/popup-menu-item-button.c
new file mode 100644
index 0000000..bcd04e9
--- /dev/null
+++ b/libxfdashboard/popup-menu-item-button.c
@@ -0,0 +1,128 @@
+/*
+ * popup-menu-item-button: A button pop-up menu item
+ * 
+ * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
+ * 
+ * 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.
+ * 
+ * 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <libxfdashboard/popup-menu-item-button.h>
+
+#include <glib/gi18n-lib.h>
+
+#include <libxfdashboard/popup-menu-item.h>
+#include <libxfdashboard/click-action.h>
+#include <libxfdashboard/compat.h>
+
+
+/* Define this class in GObject system */
+static void _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init(XfdashboardPopupMenuItemInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE(XfdashboardPopupMenuItemButton,
+						xfdashboard_popup_menu_item_button,
+						XFDASHBOARD_TYPE_LABEL,
+						G_IMPLEMENT_INTERFACE(XFDASHBOARD_TYPE_POPUP_MENU_ITEM, _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init))
+
+/* Private structure - access only by public API if needed */
+#define XFDASHBOARD_BUTTON_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON, XfdashboardPopupMenuItemButtonPrivate))
+
+struct _XfdashboardPopupMenuItemButtonPrivate
+{
+	/* Instance related */
+	ClutterAction				*clickAction;
+};
+
+/* IMPLEMENTATION: Private variables and methods */
+
+/* Pop-up menu item button was clicked so activate this item */
+static void _xfdashboard_popup_menu_item_button_clicked(XfdashboardClickAction *inAction,
+														ClutterActor *self,
+														gpointer inUserData)
+{
+	g_return_if_fail(XFDASHBOARD_IS_CLICK_ACTION(inAction));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON(self));
+
+	/* Only activate item if click was perform with left button */
+	if(xfdashboard_click_action_get_button(inAction)==XFDASHBOARD_CLICK_ACTION_LEFT_BUTTON)
+	{
+		xfdashboard_popup_menu_item_activate(XFDASHBOARD_POPUP_MENU_ITEM(self));
+	}
+}
+
+/* IMPLEMENTATION: Interface XfdashboardPopupMenuItem */
+
+/* Interface initialization
+ * Set up default functions
+ */
+void _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init(XfdashboardPopupMenuItemInterface *iface)
+{
+}
+
+/* IMPLEMENTATION: GObject */
+
+/* Class initialization
+ * Override functions in parent classes and define properties
+ * and signals
+ */
+static void xfdashboard_popup_menu_item_button_class_init(XfdashboardPopupMenuItemButtonClass *klass)
+{
+	/* Set up private structure */
+	g_type_class_add_private(klass, sizeof(XfdashboardPopupMenuItemButtonPrivate));
+}
+
+/* Object initialization
+ * Create private structure and set up default values
+ */
+static void xfdashboard_popup_menu_item_button_init(XfdashboardPopupMenuItemButton *self)
+{
+	XfdashboardPopupMenuItemButtonPrivate	*priv;
+
+	priv=self->priv=XFDASHBOARD_BUTTON_GET_PRIVATE(self);
+
+	/* This actor reacts on events */
+	clutter_actor_set_reactive(CLUTTER_ACTOR(self), TRUE);
+
+	/* Connect signals */
+	priv->clickAction=xfdashboard_click_action_new();
+	clutter_actor_add_action(CLUTTER_ACTOR(self), priv->clickAction);
+	g_signal_connect(priv->clickAction, "clicked", G_CALLBACK(_xfdashboard_popup_menu_item_button_clicked), NULL);
+}
+
+/* IMPLEMENTATION: Public API */
+
+/* Create new actor */
+ClutterActor* xfdashboard_popup_menu_item_button_new(void)
+{
+	return(g_object_new(XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON,
+						"text", N_(""),
+						"label-style", XFDASHBOARD_LABEL_STYLE_TEXT,
+						NULL));
+}
+
+ClutterActor* xfdashboard_popup_menu_item_button_new_with_text(const gchar *inText)
+{
+	return(g_object_new(XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON,
+						"text", inText,
+						"label-style", XFDASHBOARD_LABEL_STYLE_TEXT,
+						NULL));
+}
diff --git a/libxfdashboard/popup-menu-item-button.h b/libxfdashboard/popup-menu-item-button.h
new file mode 100644
index 0000000..7da47ea
--- /dev/null
+++ b/libxfdashboard/popup-menu-item-button.h
@@ -0,0 +1,85 @@
+/*
+ * popup-menu-item-button: A button pop-up menu item
+ * 
+ * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
+ * 
+ * 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 __LIBXFDASHBOARD_POPUP_MENU_ITEM_BUTTON__
+#define __LIBXFDASHBOARD_POPUP_MENU_ITEM_BUTTON__
+
+#if !defined(__LIBXFDASHBOARD_H_INSIDE__) && !defined(LIBXFDASHBOARD_COMPILATION)
+#error "Only <libxfdashboard/libxfdashboard.h> can be included directly."
+#endif
+
+#include <libxfdashboard/label.h>
+
+G_BEGIN_DECLS
+
+#define XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON				(xfdashboard_popup_menu_item_button_get_type())
+#define XFDASHBOARD_POPUP_MENU_ITEM_BUTTON(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON, XfdashboardPopupMenuItemButton))
+#define XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON))
+#define XFDASHBOARD_POPUP_MENU_ITEM_BUTTON_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON, XfdashboardPopupMenuItemButtonClass))
+#define XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON))
+#define XFDASHBOARD_POPUP_MENU_ITEM_BUTTON_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON, XfdashboardPopupMenuItemButtonClass))
+
+typedef struct _XfdashboardPopupMenuItemButton				XfdashboardPopupMenuItemButton;
+typedef struct _XfdashboardPopupMenuItemButtonClass			XfdashboardPopupMenuItemButtonClass;
+typedef struct _XfdashboardPopupMenuItemButtonPrivate		XfdashboardPopupMenuItemButtonPrivate;
+
+/**
+ * XfdashboardPopupMenuItemButton:
+ *
+ * The #XfdashboardPopupMenuItemButton structure contains only private data and
+ * should be accessed using the provided API
+ */
+struct _XfdashboardPopupMenuItemButton
+{
+	/*< private >*/
+	/* Parent instance */
+	XfdashboardLabel							parent_instance;
+
+	/* Private structure */
+	XfdashboardPopupMenuItemButtonPrivate		*priv;
+};
+
+/**
+ * XfdashboardPopupMenuItemButtonClass:
+ *
+ * The #XfdashboardPopupMenuItemButtonClass structure contains only private data
+ */
+struct _XfdashboardPopupMenuItemButtonClass
+{
+	/*< private >*/
+	/* Parent class */
+	XfdashboardLabelClass						parent_class;
+
+	/*< public >*/
+	/* Virtual functions */
+};
+
+/* Public API */
+GType xfdashboard_popup_menu_item_button_get_type(void) G_GNUC_CONST;
+
+ClutterActor* xfdashboard_popup_menu_item_button_new(void);
+ClutterActor* xfdashboard_popup_menu_item_button_new_with_text(const gchar *inText);
+
+G_END_DECLS
+
+#endif	/* __LIBXFDASHBOARD_POPUP_MENU_ITEM_BUTTON__ */
diff --git a/libxfdashboard/popup-menu-item-meta.c b/libxfdashboard/popup-menu-item-meta.c
deleted file mode 100644
index eda6e45..0000000
--- a/libxfdashboard/popup-menu-item-meta.c
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * popup-menu-item-meta: A meta class for menu items in a pop-up menu
- * 
- * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
- * 
- * 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.
- * 
- * 
- */
-
-/**
- * SECTION:popup-menu-item-meta
- * @short_description: A meta class for menu items in a pop-up menu
- * @include: xfdashboard/popup-menu-item-meta.h
- *
- * A #XfdashboardPopupMenuItemMetaItemMeta will be created to set to each menu item
- * added to the items container of a #XfdashboardPopupMenu. This meta class handles
- * the activation of a menu item and calls the callback function with the associated
- * user data.
- *
- * This class should not be used directly.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <libxfdashboard/popup-menu-item-meta.h>
-
-#include <glib/gi18n-lib.h>
-
-#include <libxfdashboard/stylable.h>
-#include <libxfdashboard/click-action.h>
-#include <libxfdashboard/compat.h>
-
-
-/* Define this class in GObject system */
-G_DEFINE_TYPE(XfdashboardPopupMenuItemMeta,
-				xfdashboard_popup_menu_item_meta,
-				G_TYPE_OBJECT);
-
-/* Private structure - access only by public API if needed */
-#define XFDASHBOARD_POPUP_MENU_ITEM_META_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META, XfdashboardPopupMenuItemMetaPrivate))
-
-struct _XfdashboardPopupMenuItemMetaPrivate
-{
-	/* Properties related */
-	XfdashboardPopupMenu						*popupMenu;
-	ClutterActor								*menuItem;
-	XfdashboardPopupMenuItemActivateCallback	callback;
-	gpointer									userData;
-
-	/* Instance related */
-	ClutterAction								*clickAction;
-};
-
-/* Properties */
-enum
-{
-	PROP_0,
-
-	PROP_POPUP_MENU,
-	PROP_MENU_ITEM,
-	PROP_CALLBACK,
-	PROP_USER_DATA,
-
-	PROP_LAST
-};
-
-static GParamSpec* XfdashboardPopupMenuItemMetaProperties[PROP_LAST]={ 0, };
-
-/* Signals */
-enum
-{
-	SIGNAL_ACTIVATED,
-
-	SIGNAL_LAST
-};
-
-static guint XfdashboardPopupMenuItemMetaSignals[SIGNAL_LAST]={ 0, };
-
-
-/* IMPLEMENTATION: Private variables and methods */
-
-/* A menu item was clicked */
-static void _xfdashboard_popup_menu_item_meta_clicked(XfdashboardPopupMenuItemMeta *self,
-														ClutterActor *inActor,
-														gpointer inUserData)
-{
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-	g_return_if_fail(CLUTTER_IS_ACTOR(inActor));
-	g_return_if_fail(XFDASHBOARD_IS_CLICK_ACTION(inUserData));
-
-	/* Activate menu item */
-	xfdashboard_popup_menu_item_meta_activate(self);
-}
-
-/* Set pop-up menu */
-static void _xfdashboard_popup_menu_item_meta_set_popup_menu(XfdashboardPopupMenuItemMeta *self,
-																XfdashboardPopupMenu *inPopupMenu)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu));
-
-	priv=self->priv;
-
-	/* This function can only be called once so no pop-up must be set yet */
-	if(priv->popupMenu)
-	{
-		g_critical(_("Attempting to set pop-up menu %s at %s but it is already set."),
-					G_OBJECT_TYPE_NAME(inPopupMenu),
-					G_OBJECT_TYPE_NAME(self));
-		return;
-	}
-
-	/* Set value if changed */
-	if(priv->popupMenu!=inPopupMenu)
-	{
-		/* Set value */
-		priv->popupMenu=inPopupMenu;
-		g_object_add_weak_pointer(G_OBJECT(priv->popupMenu), (gpointer*)&priv->popupMenu);
-
-		/* Notify about property change */
-		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardPopupMenuItemMetaProperties[PROP_POPUP_MENU]);
-	}
-}
-
-/* Set menu item actor */
-static void _xfdashboard_popup_menu_item_meta_set_menu_item(XfdashboardPopupMenuItemMeta *self,
-															ClutterActor *inMenuItem)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-	g_return_if_fail(CLUTTER_IS_ACTOR(inMenuItem));
-
-	priv=self->priv;
-
-	/* This function can only be called once so no menu item must be set yet */
-	if(priv->menuItem || priv->clickAction)
-	{
-		g_critical(_("Attempting to set menu item %s at %s but it is already set."),
-					G_OBJECT_TYPE_NAME(inMenuItem),
-					G_OBJECT_TYPE_NAME(self));
-		return;
-	}
-
-	/* Set value if changed */
-	if(priv->menuItem!=inMenuItem)
-	{
-		/* Set value */
-		priv->menuItem=inMenuItem;
-		g_object_add_weak_pointer(G_OBJECT(priv->menuItem), (gpointer*)&priv->menuItem);
-
-		/* Apply style for menu item if possible */
-		if(XFDASHBOARD_IS_STYLABLE(priv->menuItem))
-		{
-			xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(priv->menuItem), "popup-menu-item");
-		}
-
-		/* Create click action and add it to menu item actor */
-		priv->clickAction=xfdashboard_click_action_new();
-		g_signal_connect_swapped(priv->clickAction,
-									"clicked",
-									G_CALLBACK(_xfdashboard_popup_menu_item_meta_clicked),
-									self);
-		clutter_actor_add_action(priv->menuItem, priv->clickAction);
-
-		/* Notify about property change */
-		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardPopupMenuItemMetaProperties[PROP_MENU_ITEM]);
-	}
-}
-
-/* Set callback function */
-static void _xfdashboard_popup_menu_item_meta_set_callback(XfdashboardPopupMenuItemMeta *self,
-															XfdashboardPopupMenuItemActivateCallback inCallback)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-
-	priv=self->priv;
-
-	/* This function can only be called once so no callback function must be set yet */
-	if(priv->callback)
-	{
-		g_critical(_("Attempting to set callback function at %s but it is already set."),
-					G_OBJECT_TYPE_NAME(self));
-		return;
-	}
-
-	/* Set value if changed */
-	if(priv->callback!=inCallback)
-	{
-		/* Set value */
-		priv->callback=inCallback;
-
-		/* Notify about property change */
-		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardPopupMenuItemMetaProperties[PROP_CALLBACK]);
-	}
-}
-
-/* Set user-data function */
-static void _xfdashboard_popup_menu_item_meta_set_user_data(XfdashboardPopupMenuItemMeta *self,
-															gpointer inUserData)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-
-	priv=self->priv;
-
-	/* This function can only be called once so no user-data must be set yet */
-	if(priv->userData)
-	{
-		g_critical(_("Attempting to set user-data at %s but it is already set."),
-					G_OBJECT_TYPE_NAME(self));
-		return;
-	}
-
-	/* Set value if changed */
-	if(priv->userData!=inUserData)
-	{
-		/* Set value */
-		priv->userData=inUserData;
-
-		/* Notify about property change */
-		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardPopupMenuItemMetaProperties[PROP_USER_DATA]);
-	}
-}
-
-
-/* IMPLEMENTATION: GObject */
-
-/* Dispose this object */
-static void _xfdashboard_popup_menu_item_meta_dispose(GObject *inObject)
-{
-	XfdashboardPopupMenuItemMeta			*self=XFDASHBOARD_POPUP_MENU_ITEM_META(inObject);
-	XfdashboardPopupMenuItemMetaPrivate		*priv=self->priv;
-
-	/* Release our allocated variables */
-	if(priv->popupMenu)
-	{
-		g_object_remove_weak_pointer(G_OBJECT(priv->popupMenu), (gpointer*)&priv->popupMenu);
-		priv->popupMenu=NULL;
-	}
-
-	if(priv->menuItem)
-	{
-		/* Remove style from menu item if possible */
-		if(XFDASHBOARD_IS_STYLABLE(priv->menuItem))
-		{
-			xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->menuItem), "popup-menu-item");
-		}
-
-		/* Remove click action from menu item actor */
-		if(priv->clickAction)
-		{
-			clutter_actor_remove_action(priv->menuItem, priv->clickAction);
-			priv->clickAction=NULL;
-		}
-
-		/* Release menu item actor */
-		g_object_remove_weak_pointer(G_OBJECT(priv->menuItem), (gpointer*)&priv->menuItem);
-		priv->menuItem=NULL;
-	}
-
-	if(priv->callback)
-	{
-		priv->callback=NULL;
-	}
-
-	if(priv->userData)
-	{
-		priv->userData=NULL;
-	}
-
-	/* Call parent's class dispose method */
-	G_OBJECT_CLASS(xfdashboard_popup_menu_item_meta_parent_class)->dispose(inObject);
-}
-
-/* Set/get properties */
-static void _xfdashboard_popup_menu_item_meta_set_property(GObject *inObject,
-															guint inPropID,
-															const GValue *inValue,
-															GParamSpec *inSpec)
-{
-	XfdashboardPopupMenuItemMeta			*self=XFDASHBOARD_POPUP_MENU_ITEM_META(inObject);
-
-	switch(inPropID)
-	{
-		case PROP_POPUP_MENU:
-			_xfdashboard_popup_menu_item_meta_set_popup_menu(self, g_value_get_object(inValue));
-			break;
-
-		case PROP_MENU_ITEM:
-			_xfdashboard_popup_menu_item_meta_set_menu_item(self, g_value_get_object(inValue));
-			break;
-
-		case PROP_CALLBACK:
-			_xfdashboard_popup_menu_item_meta_set_callback(self, g_value_get_pointer(inValue));
-			break;
-
-		case PROP_USER_DATA:
-			_xfdashboard_popup_menu_item_meta_set_user_data(self, g_value_get_pointer(inValue));
-			break;
-
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
-			break;
-	}
-}
-
-static void _xfdashboard_popup_menu_item_meta_get_property(GObject *inObject,
-															guint inPropID,
-															GValue *outValue,
-															GParamSpec *inSpec)
-{
-	XfdashboardPopupMenuItemMeta			*self=XFDASHBOARD_POPUP_MENU_ITEM_META(inObject);
-	XfdashboardPopupMenuItemMetaPrivate		*priv=self->priv;
-
-	switch(inPropID)
-	{
-		case PROP_POPUP_MENU:
-			g_value_set_object(outValue, priv->popupMenu);
-			break;
-
-		case PROP_MENU_ITEM:
-			g_value_set_object(outValue, priv->menuItem);
-			break;
-
-		case PROP_CALLBACK:
-			g_value_set_pointer(outValue, priv->callback);
-			break;
-
-		case PROP_USER_DATA:
-			g_value_set_pointer(outValue, priv->userData);
-			break;
-
-		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
-			break;
-	}
-}
-
-/* Class initialization
- * Override functions in parent classes and define properties
- * and signals
- */
-static void xfdashboard_popup_menu_item_meta_class_init(XfdashboardPopupMenuItemMetaClass *klass)
-{
-	GObjectClass			*gobjectClass=G_OBJECT_CLASS(klass);
-
-	/* Override functions */
-	gobjectClass->dispose=_xfdashboard_popup_menu_item_meta_dispose;
-	gobjectClass->set_property=_xfdashboard_popup_menu_item_meta_set_property;
-	gobjectClass->get_property=_xfdashboard_popup_menu_item_meta_get_property;
-
-	/* Set up private structure */
-	g_type_class_add_private(klass, sizeof(XfdashboardPopupMenuItemMetaPrivate));
-
-	/* Define properties */
-	/**
-	 * XfdashboardPopupMenuItemMeta:popup-menu:
-	 *
-	 * The pop-up menu which contains the menu item where this meta belongs to.
-	 */
-	XfdashboardPopupMenuItemMetaProperties[PROP_POPUP_MENU]=
-		g_param_spec_object("popup-menu",
-							_("Pop-up menu"),
-							_("The pop-up menu containing the menu item where this meta belongs to"),
-							XFDASHBOARD_TYPE_POPUP_MENU,
-							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
-
-	/**
-	 * XfdashboardPopupMenuItemMeta:menu-item:
-	 *
-	 * The menu item where this meta belongs to.
-	 */
-	XfdashboardPopupMenuItemMetaProperties[PROP_MENU_ITEM]=
-		g_param_spec_object("menu-item",
-							_("Menu item"),
-							_("The menu item where this meta belongs to"),
-							CLUTTER_TYPE_ACTOR,
-							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
-
-	/**
-	 * XfdashboardPopupMenuItemMeta:callback:
-	 *
-	 * The callback function to call when this meta for a menu item is activated.
-	 */
-	XfdashboardPopupMenuItemMetaProperties[PROP_CALLBACK]=
-		g_param_spec_pointer("callback",
-								_("Callback"),
-								_("The callback function to call when this meta is activated"),
-								G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
-
-	/**
-	 * XfdashboardPopupMenuItemMeta:user-data:
-	 *
-	 * The user-data to pass to callback function which is called when this meta
-	 * for a menu item is activated.
-	 */
-	XfdashboardPopupMenuItemMetaProperties[PROP_USER_DATA]=
-		g_param_spec_pointer("user-data",
-								_("User data"),
-								_("The user data to pass to callback function"),
-								G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
-
-	g_object_class_install_properties(gobjectClass, PROP_LAST, XfdashboardPopupMenuItemMetaProperties);
-
-	/* Define signals */
-	/**
-	 * XfdashboardPopupMenuItemMeta::activated:
-	 * @self: The pop-up menu which was activated
-	 *
-	 * The ::activated signal is emitted when the pop-up menu is shown and the
-	 * user can perform an action by selecting an item.
-	 */
-	XfdashboardPopupMenuItemMetaSignals[SIGNAL_ACTIVATED]=
-		g_signal_new("activated",
-						G_TYPE_FROM_CLASS(klass),
-						G_SIGNAL_RUN_LAST,
-						G_STRUCT_OFFSET(XfdashboardPopupMenuItemMetaClass, activated),
-						NULL,
-						NULL,
-						g_cclosure_marshal_VOID__VOID,
-						G_TYPE_NONE,
-						0);
-}
-
-/* Object initialization
- * Create private structure and set up default values
- */
-static void xfdashboard_popup_menu_item_meta_init(XfdashboardPopupMenuItemMeta *self)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	priv=self->priv=XFDASHBOARD_POPUP_MENU_ITEM_META_GET_PRIVATE(self);
-
-	/* Set up default values */
-	priv->popupMenu=NULL;
-	priv->menuItem=NULL;
-	priv->callback=NULL;
-	priv->userData=NULL;
-	priv->clickAction=NULL;
-}
-
-/* IMPLEMENTATION: Public API */
-
-/**
- * xfdashboard_popup_menu_item_meta_new:
- * @inPopupMenu: The #XfdashboardPopupMenu where the menu item belongs to
- * @inMenuItem: A #ClutterActor menu item of pop-up menu
- * @inCallback: (type XfdashboardPopupMenuItemActivateCallback): The function to
- *   be called when the menu item is activated
- * @inUserData: Data to be passed to @inCallback
- *
- * Creates a new #XfdashboardPopupMenuItemMeta meta object instance for the menu
- * item actor @inMenuItem at pop-up menu @inPopupMenu. When the menu item is
- * clicked or xfdashboard_popup_menu_item_meta_activate() is called for the menu
- * item the callback function @inCallback is called and the data @inUserData is
- * passed to that callback function.
- * 
- * Return value: The newly created #XfdashboardPopupMenuItemMeta
- */
-XfdashboardPopupMenuItemMeta* xfdashboard_popup_menu_item_meta_new(XfdashboardPopupMenu *inPopupMenu,
-																	ClutterActor *inMenuItem,
-																	XfdashboardPopupMenuItemActivateCallback inCallback,
-																	gpointer inUserData)
-{
-	GObject				*meta;
-
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu), NULL);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), NULL);
-
-	/* Create meta object */
-	meta=g_object_new(XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META,
-						"popup-menu", inPopupMenu,
-						"menu-item", inMenuItem,
-						"callback", inCallback,
-						"user-data", inUserData,
-						NULL);
-
-	/* Return newly created meta object */
-	return(XFDASHBOARD_POPUP_MENU_ITEM_META(meta));
-}
-
-/**
- * xfdashboard_popup_menu_item_meta_new:
- * @self: A #XfdashboardPopupMenuItemMeta
- *
- * Activates the menu item associated with this #XfdashboardPopupMenuItemMeta by
- * calling the callback function and passing the user data to that function. Also
- * the signal "activated" will be emitted after the callback function was called.
- */
-void xfdashboard_popup_menu_item_meta_activate(XfdashboardPopupMenuItemMeta *self)
-{
-	XfdashboardPopupMenuItemMetaPrivate		*priv;
-
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self));
-
-	priv=self->priv;
-
-	/* Call the callback handler and pass data and associated user data to it */
-	if(priv->callback)
-	{
-		(priv->callback)(priv->popupMenu, priv->menuItem, priv->userData);
-	}
-
-	/* Emit signal for activation */
-	g_signal_emit(self, XfdashboardPopupMenuItemMetaSignals[SIGNAL_ACTIVATED], 0);
-}
-
-/**
- * xfdashboard_popup_menu_item_meta_get_popup_menu:
- * @self: A #XfdashboardPopupMenuItemMeta
- *
- * Retrieves the associated pop-up menu of @self.
- *
- * Return value: (transfer none): The associated pop-up menu of type #XfdashboardPopupMenu
- */
-XfdashboardPopupMenu* xfdashboard_popup_menu_item_meta_get_popup_menu(XfdashboardPopupMenuItemMeta *self)
-{
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self), NULL);
-
-	return(self->priv->popupMenu);
-}
-
-/**
- * xfdashboard_popup_menu_item_meta_get_menu_item:
- * @self: A #XfdashboardPopupMenuItemMeta
- *
- * Retrieves the associated menu item actor of @self.
- *
- * Return value: (transfer none): The associated menu item actor
- */
-ClutterActor* xfdashboard_popup_menu_item_meta_get_menu_item(XfdashboardPopupMenuItemMeta *self)
-{
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self), NULL);
-
-	return(self->priv->menuItem);
-}
-
-/**
- * xfdashboard_popup_menu_item_meta_get_callback:
- * @self: A #XfdashboardPopupMenuItemMeta
- *
- * Retrieves the associated callback function of @self which is called when the
- * menu item is activated.
- *
- * Return value: The pointer to callback function
- */
-gpointer xfdashboard_popup_menu_item_meta_get_callback(XfdashboardPopupMenuItemMeta *self)
-{
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self), NULL);
-
-	return(self->priv->callback);
-}
-
-/**
- * xfdashboard_popup_menu_item_meta_get_user_data:
- * @self: A #XfdashboardPopupMenuItemMeta
- *
- * Retrieves the associated user data passed to callback function of @self which
- * is called when the menu item is activated.
- *
- * Return value: The associated user data
- */
-gpointer xfdashboard_popup_menu_item_meta_get_user_data(XfdashboardPopupMenuItemMeta *self)
-{
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(self), NULL);
-
-	return(self->priv->userData);
-}
diff --git a/libxfdashboard/popup-menu-item-meta.h b/libxfdashboard/popup-menu-item-meta.h
deleted file mode 100644
index 75a1f36..0000000
--- a/libxfdashboard/popup-menu-item-meta.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * popup-menu-item-meta: A meta class for menu items in a pop-up menu
- * 
- * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
- * 
- * 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 __LIBXFDASHBOARD_POPUP_MENU_ITEM_META__
-#define __LIBXFDASHBOARD_POPUP_MENU_ITEM_META__
-
-#if !defined(__LIBXFDASHBOARD_H_INSIDE__) && !defined(LIBXFDASHBOARD_COMPILATION)
-#error "Only <libxfdashboard/libxfdashboard.h> can be included directly."
-#endif
-
-#include <libxfdashboard/popup-menu.h>
-
-G_BEGIN_DECLS
-
-#define XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META				(xfdashboard_popup_menu_item_meta_get_type())
-#define XFDASHBOARD_POPUP_MENU_ITEM_META(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META, XfdashboardPopupMenuItemMeta))
-#define XFDASHBOARD_IS_POPUP_MENU_ITEM_META(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META))
-#define XFDASHBOARD_POPUP_MENU_ITEM_META_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META, XfdashboardPopupMenuItemMetaClass))
-#define XFDASHBOARD_IS_POPUP_MENU_ITEM_META_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META))
-#define XFDASHBOARD_POPUP_MENU_ITEM_META_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM_META, XfdashboardPopupMenuItemMetaClass))
-
-typedef struct _XfdashboardPopupMenuItemMeta				XfdashboardPopupMenuItemMeta;
-typedef struct _XfdashboardPopupMenuItemMetaClass			XfdashboardPopupMenuItemMetaClass;
-typedef struct _XfdashboardPopupMenuItemMetaPrivate			XfdashboardPopupMenuItemMetaPrivate;
-
-/**
- * XfdashboardPopupMenuItemMeta:
- *
- * The #XfdashboardPopupMenuItemMeta structure contains only private data and
- * should be accessed using the provided API
- */
-struct _XfdashboardPopupMenuItemMeta
-{
-	/*< private >*/
-	/* Parent instance */
-	GObject										parent_instance;
-
-	/* Private structure */
-	XfdashboardPopupMenuItemMetaPrivate			*priv;
-};
-
-/**
- * XfdashboardPopupMenuItemMetaClass:
- *
- * The #XfdashboardPopupMenuItemMetaClass structure contains only private data
- */
-struct _XfdashboardPopupMenuItemMetaClass
-{
-	/*< private >*/
-	/* Parent class */
-	GObjectClass								parent_class;
-
-	/*< public >*/
-	/* Virtual functions */
-	void (*activated)(XfdashboardPopupMenuItemMeta *self);
-};
-
-/* Public API */
-GType xfdashboard_popup_menu_item_meta_get_type(void) G_GNUC_CONST;
-
-XfdashboardPopupMenuItemMeta* xfdashboard_popup_menu_item_meta_new(XfdashboardPopupMenu *inPopupMenu,
-																	ClutterActor *inMenuItem,
-																	XfdashboardPopupMenuItemActivateCallback inCallback,
-																	gpointer inUserData);
-
-XfdashboardPopupMenu* xfdashboard_popup_menu_item_meta_get_popup_menu(XfdashboardPopupMenuItemMeta *self);
-ClutterActor* xfdashboard_popup_menu_item_meta_get_menu_item(XfdashboardPopupMenuItemMeta *self);
-gpointer xfdashboard_popup_menu_item_meta_get_callback(XfdashboardPopupMenuItemMeta *self);
-gpointer xfdashboard_popup_menu_item_meta_get_user_data(XfdashboardPopupMenuItemMeta *self);
-
-void xfdashboard_popup_menu_item_meta_activate(XfdashboardPopupMenuItemMeta *self);
-
-G_END_DECLS
-
-#endif	/* __LIBXFDASHBOARD_POPUP_MENU_ITEM_META__ */
diff --git a/libxfdashboard/popup-menu-item.c b/libxfdashboard/popup-menu-item.c
new file mode 100644
index 0000000..e0dfc5a
--- /dev/null
+++ b/libxfdashboard/popup-menu-item.c
@@ -0,0 +1,119 @@
+/*
+ * popup-menu-item: An interface implemented by actors used as pop-up menu item
+ * 
+ * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
+ * 
+ * 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.
+ * 
+ * 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <libxfdashboard/popup-menu-item.h>
+
+#include <glib/gi18n-lib.h>
+
+#include <libxfdashboard/compat.h>
+
+
+/* Define this interface in GObject system */
+G_DEFINE_INTERFACE(XfdashboardPopupMenuItem,
+					xfdashboard_popup_menu_item,
+					G_TYPE_OBJECT)
+
+/* Signals */
+enum
+{
+	/* Signals */
+	SIGNAL_ACTIVATED,
+
+	SIGNAL_LAST
+};
+
+static guint XfdashboardPopupMenuItemSignals[SIGNAL_LAST]={ 0, };
+
+/* IMPLEMENTATION: Private variables and methods */
+#define XFDASHBOARD_POPUP_MENU_ITEM_WARN_NOT_IMPLEMENTED(self, vfunc) \
+	g_warning(_("Object of type %s does not implement required virtual function XfdashboardPopupMenuItem::%s"), \
+				G_OBJECT_TYPE_NAME(self), \
+				vfunc);
+
+
+/* IMPLEMENTATION: GObject */
+
+/* Interface initialization
+ * Set up default functions
+ */
+void xfdashboard_popup_menu_item_default_init(XfdashboardPopupMenuItemInterface *iface)
+{
+	static gboolean		initialized=FALSE;
+	// TODO: GParamSpec			*property;
+
+	/* Define properties */
+	// TODO: property=g_param_spec_boolean("enabled",
+									// TODO: _("Enabled"),
+									// TODO: _("Whether this pop-up menu item is enabled"),
+									// TODO: TRUE,
+									// TODO: G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+	// TODO: g_object_interface_install_property(iface, property);
+
+	/* Define signals and actions */
+	if(!initialized)
+	{
+		/* Define signals */
+		/**
+		 * XfdashboardPopupMenuItem::activated:
+		 * @self: The pop-up menu item which was activated
+		 *
+		 * The ::activated signal is emitted for the item the user selected in
+		 * the pop-up menu.
+		 */
+		XfdashboardPopupMenuItemSignals[SIGNAL_ACTIVATED]=
+			g_signal_new("activated",
+							G_TYPE_FROM_INTERFACE(iface),
+							G_SIGNAL_RUN_LAST,
+							NULL,
+							NULL,
+							NULL,
+							g_cclosure_marshal_VOID__VOID,
+							G_TYPE_NONE,
+							0);
+
+		/* Set flag that base initialization was done for this interface */
+		initialized=TRUE;
+	}
+}
+
+/* IMPLEMENTATION: Public API */
+
+/**
+ * xfdashboard_popup_menu_item_activate:
+ * @self: A #XfdashboardPopupMenuItem
+ *
+ * Activates the menu item at @self by emitting the signal "activated".
+ */
+void xfdashboard_popup_menu_item_activate(XfdashboardPopupMenuItem *self)
+{
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(self));
+
+	// TODO: Check if popup menu item is enabled and return if disabled
+
+	/* Emit signal for activation */
+	g_signal_emit(self, XfdashboardPopupMenuItemSignals[SIGNAL_ACTIVATED], 0);
+}
diff --git a/libxfdashboard/popup-menu-item.h b/libxfdashboard/popup-menu-item.h
new file mode 100644
index 0000000..08b51d1
--- /dev/null
+++ b/libxfdashboard/popup-menu-item.h
@@ -0,0 +1,65 @@
+/*
+ * popup-menu-item: An interface implemented by actors used as pop-up menu item
+ * 
+ * Copyright 2012-2016 Stephan Haller <nomad at froevel.de>
+ * 
+ * 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 __LIBXFDASHBOARD_POPUP_MENU_ITEM__
+#define __LIBXFDASHBOARD_POPUP_MENU_ITEM__
+
+#if !defined(__LIBXFDASHBOARD_H_INSIDE__) && !defined(LIBXFDASHBOARD_COMPILATION)
+#error "Only <libxfdashboard/libxfdashboard.h> can be included directly."
+#endif
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define XFDASHBOARD_TYPE_POPUP_MENU_ITEM				(xfdashboard_popup_menu_item_get_type())
+#define XFDASHBOARD_POPUP_MENU_ITEM(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM, XfdashboardPopupMenuItem))
+#define XFDASHBOARD_IS_POPUP_MENU_ITEM(obj)				(G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM))
+#define XFDASHBOARD_POPUP_MENU_ITEM_GET_IFACE(obj)		(G_TYPE_INSTANCE_GET_INTERFACE((obj), XFDASHBOARD_TYPE_POPUP_MENU_ITEM, XfdashboardPopupMenuItemInterface))
+
+typedef struct _XfdashboardPopupMenuItem				XfdashboardPopupMenuItem;
+typedef struct _XfdashboardPopupMenuItemInterface		XfdashboardPopupMenuItemInterface;
+
+/**
+ * XfdashboardPopupMenuItemInterface:
+ *
+ * The #XfdashboardPopupMenuItemInterface structure contains only private data
+ */
+struct _XfdashboardPopupMenuItemInterface
+{
+	/*< private >*/
+	/* Parent interface */
+	GTypeInterface				parent_interface;
+
+	/*< public >*/
+	/* Virtual functions */
+};
+
+/* Public API */
+GType xfdashboard_popup_menu_item_get_type(void) G_GNUC_CONST;
+
+void xfdashboard_popup_menu_item_activate(XfdashboardPopupMenuItem *self);
+
+G_END_DECLS
+
+#endif	/* __LIBXFDASHBOARD_POPUP_MENU_ITEM__ */
diff --git a/libxfdashboard/popup-menu.c b/libxfdashboard/popup-menu.c
index f993c14..3d598c9 100644
--- a/libxfdashboard/popup-menu.c
+++ b/libxfdashboard/popup-menu.c
@@ -51,7 +51,6 @@
 #include <gdk/gdk.h>
 #include <math.h>
 
-#include <libxfdashboard/popup-menu-item-meta.h>
 #include <libxfdashboard/box-layout.h>
 #include <libxfdashboard/focusable.h>
 #include <libxfdashboard/focus-manager.h>
@@ -146,8 +145,6 @@ static guint XfdashboardPopupMenuSignals[SIGNAL_LAST]={ 0, };
 
 /* IMPLEMENTATION: Private variables and methods */
 
-static GQuark					_xfdashboard_popup_menu_items_container_child_meta_quark=0;
-
 /* An event occured after a popup menu was activated so check if popup menu should
  * be cancelled because a button was pressed and release outside the popup menu.
  */
@@ -249,41 +246,51 @@ static gboolean _xfdashboard_popup_menu_on_captured_event(XfdashboardPopupMenu *
 }
 
 /*  Check if menu item is really part of this pop-up menu */
-static gboolean _xfdashboard_popup_menu_contains_menu_item(XfdashboardPopupMenu *self, ClutterActor *inMenuItem)
+static gboolean _xfdashboard_popup_menu_contains_menu_item(XfdashboardPopupMenu *self,
+															XfdashboardPopupMenuItem *inMenuItem)
 {
-	XfdashboardPopupMenuItemMeta	*meta;
+	ClutterActor			*parent;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), FALSE);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), FALSE);
-
-	/* Get meta of requested menu item actor */
-	meta=g_object_get_qdata(G_OBJECT(inMenuItem), _xfdashboard_popup_menu_items_container_child_meta_quark);
-	if(!meta || !XFDASHBOARD_IS_POPUP_MENU_ITEM_META(meta)) return(FALSE);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem), FALSE);
 
-	/* Meta must really belong to the requested menu item actor */
-	if(xfdashboard_popup_menu_item_meta_get_menu_item(meta)!=inMenuItem)
+	/* Iterate through parents and for each XfdashboardPopupMenu found, check
+	 * if it is this pop-up menu and return TRUE if it is.
+	 */
+	parent=clutter_actor_get_parent(CLUTTER_ACTOR(inMenuItem));
+	while(parent)
 	{
-		g_critical(_("Menu item meta does not match menu item!"));
-		return(FALSE);
-	}
+		/* Check if current iterated parent is a XfdashboardPopupMenu and if it
+		 * is this pop-up menu.
+		 */
+		if(XFDASHBOARD_IS_POPUP_MENU(parent) &&
+			XFDASHBOARD_POPUP_MENU(parent)==self)
+		{
+			/* This one is this pop-up menu, so return TRUE here */
+			return(TRUE);
+		}
 
-	/* Meta must belong to this pop-up menu */
-	if(xfdashboard_popup_menu_item_meta_get_popup_menu(meta)!=self)
-	{
-		g_critical(_("Menu item meta does not match pop-up menu!"));
-		return(FALSE);
+		/* Continue with next parent */
+		parent=clutter_actor_get_parent(parent);
 	}
 
 	/* If we get here the "menu item" actor is a menu item of this pop-up menu */
-	return(TRUE);
+	return(FALSE);
 }
 
 /* Menu item was activated */
-static void _xfdashboard_popup_menu_on_meta_activated(XfdashboardPopupMenu *self,
-														gpointer inUserData)
+static void _xfdashboard_popup_menu_on_menu_item_activated(XfdashboardPopupMenu *self,
+															gpointer inUserData)
 {
+	XfdashboardPopupMenuItem		*menuItem;
+
 	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(self));
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_META(inUserData));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inUserData));
+
+	menuItem=XFDASHBOARD_POPUP_MENU_ITEM(inUserData);
+
+	/* Emit "item-activated" signal */
+	g_signal_emit(self, XfdashboardPopupMenuSignals[SIGNAL_ITEM_ACTIVATED], 0, menuItem);
 
 	/* Cancel pop-up menu as menu item was activated and its callback function
 	 * was called by its meta object.
@@ -655,13 +662,14 @@ static gboolean _xfdashboard_popup_menu_focusable_activate_selection(Xfdashboard
 																		ClutterActor *inSelection)
 {
 	XfdashboardPopupMenu				*self;
-	XfdashboardPopupMenuItemMeta		*meta;
+	XfdashboardPopupMenuItem			*menuItem;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE);
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(inFocusable), FALSE);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inSelection), FALSE);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inSelection), FALSE);
 
 	self=XFDASHBOARD_POPUP_MENU(inFocusable);
+	menuItem=XFDASHBOARD_POPUP_MENU_ITEM(inSelection);
 
 	/* Check that selection is a child of this actor */
 	if(!clutter_actor_contains(CLUTTER_ACTOR(self), inSelection))
@@ -677,26 +685,8 @@ static gboolean _xfdashboard_popup_menu_focusable_activate_selection(Xfdashboard
 		return(FALSE);
 	}
 
-	/* Get meta of requested menu item actor */
-	meta=g_object_get_qdata(G_OBJECT(inSelection), _xfdashboard_popup_menu_items_container_child_meta_quark);
-	if(!meta || !XFDASHBOARD_IS_POPUP_MENU_ITEM_META(meta)) return(FALSE);
-
-	/* Meta must really belong to the requested menu item actor */
-	if(xfdashboard_popup_menu_item_meta_get_menu_item(meta)!=inSelection)
-	{
-		g_critical(_("Menu item meta does not match menu item!"));
-		return(FALSE);
-	}
-
-	/* Meta must belong to this pop-up menu */
-	if(xfdashboard_popup_menu_item_meta_get_popup_menu(meta)!=self)
-	{
-		g_critical(_("Menu item meta does not match pop-up menu!"));
-		return(FALSE);
-	}
-
 	/* Activate selection */
-	xfdashboard_popup_menu_item_meta_activate(XFDASHBOARD_POPUP_MENU_ITEM_META(meta));
+	xfdashboard_popup_menu_item_activate(menuItem);
 
 	/* If we get here activation of menu item was successful */
 	return(TRUE);
@@ -905,9 +895,6 @@ static void xfdashboard_popup_menu_class_init(XfdashboardPopupMenuClass *klass)
 	/* Set up private structure */
 	g_type_class_add_private(klass, sizeof(XfdashboardPopupMenuPrivate));
 
-	/* Set up quark for child meta used at menu item actors */
-	_xfdashboard_popup_menu_items_container_child_meta_quark=g_quark_from_static_string("xfdashboard-popup-menu-items-container-child-data");
-
 	/* Define properties */
 	/**
 	 * XfdashboardPopupMenu:destroy-on-cancel:
@@ -1060,7 +1047,7 @@ static void xfdashboard_popup_menu_class_init(XfdashboardPopupMenuClass *klass)
 						g_cclosure_marshal_VOID__OBJECT,
 						G_TYPE_NONE,
 						1,
-						CLUTTER_TYPE_ACTOR);
+						XFDASHBOARD_TYPE_POPUP_MENU_ITEM);
 
 	/**
 	 * XfdashboardPopupMenu::item-added:
@@ -1079,7 +1066,7 @@ static void xfdashboard_popup_menu_class_init(XfdashboardPopupMenuClass *klass)
 						g_cclosure_marshal_VOID__OBJECT,
 						G_TYPE_NONE,
 						1,
-						CLUTTER_TYPE_ACTOR);
+						XFDASHBOARD_TYPE_POPUP_MENU_ITEM);
 
 	/**
 	 * XfdashboardPopupMenu::item-removed:
@@ -1098,7 +1085,7 @@ static void xfdashboard_popup_menu_class_init(XfdashboardPopupMenuClass *klass)
 						g_cclosure_marshal_VOID__OBJECT,
 						G_TYPE_NONE,
 						1,
-						CLUTTER_TYPE_ACTOR);
+						XFDASHBOARD_TYPE_POPUP_MENU_ITEM);
 }
 
 /* Object initialization
@@ -1560,41 +1547,28 @@ void xfdashboard_popup_menu_set_title_gicon(XfdashboardPopupMenu *self, GIcon *i
 /**
  * xfdashboard_popup_menu_add_item:
  * @self: A #XfdashboardPopupMenu
- * @inMenuItem: A #ClutterActor used as menu item
- * @inCallback: The callback handler to call when this menu item was activated
- * @inUserData: The user data to pass to callback handler when this menu item
- *              was activated.
- *
- * Adds the actor @inMenuItem to end of pop-up menu. When the pop-up menu at @self
- * is displayed and this menu item is activated then the callback handler @inCallback
- * is called and the user data @inUserData is passed to that callback handler.
+ * @inMenuItem: A #XfdashboardPopupMenuItem to add to pop-up menu
  *
+ * Adds the actor @inMenuItem to end of pop-up menu.
+ * 
  * If menu item actor implements the #XfdashboardStylable interface the CSS class
  * popup-menu-item will be added.
  * 
  * Return value: Returns index where item was inserted at or -1 if it failed.
  */
 gint xfdashboard_popup_menu_add_item(XfdashboardPopupMenu *self,
-										ClutterActor *inMenuItem,
-										XfdashboardPopupMenuItemActivateCallback inCallback,
-										gpointer inUserData)
+										XfdashboardPopupMenuItem *inMenuItem)
 {
-	return(xfdashboard_popup_menu_insert_item(self, inMenuItem, -1, inCallback, inUserData));
+	return(xfdashboard_popup_menu_insert_item(self, inMenuItem, -1));
 }
 
 /**
  * xfdashboard_popup_menu_insert_item:
  * @self: A #XfdashboardPopupMenu
- * @inMenuItem: A #ClutterActor used as menu item
+ * @inMenuItem: A #XfdashboardPopupMenuItem to add to pop-up menu
  * @inIndex: The position where to insert this item at
- * @inCallback: The callback handler to call when this menu item was activated
- * @inUserData: The user data to pass to callback handler when this menu item
- *              was activated.
  *
- * Inserts the actor @inMenuItem at position @inIndex into pop-up menu. When the
- * pop-up menu at @self is displayed and this menu item is activated then the
- * callback handler @inCallback is called and the user data @inUserData is passed
- * to that callback handler.
+ * Inserts the actor @inMenuItem at position @inIndex into pop-up menu.
  *
  * If position @inIndex is greater than the number of menu items in @self or is
  * less than 0, then the menu item actor @inMenuItem is added to end to
@@ -1606,34 +1580,39 @@ gint xfdashboard_popup_menu_add_item(XfdashboardPopupMenu *self,
  * Return value: Returns index where item was inserted at or -1 if it failed.
  */
 gint xfdashboard_popup_menu_insert_item(XfdashboardPopupMenu *self,
-										ClutterActor *inMenuItem,
-										gint inIndex,
-										XfdashboardPopupMenuItemActivateCallback inCallback,
-										gpointer inUserData)
+										XfdashboardPopupMenuItem *inMenuItem,
+										gint inIndex)
 {
 	XfdashboardPopupMenuPrivate		*priv;
-	XfdashboardPopupMenuItemMeta	*meta;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), -1);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), -1);
-	g_return_val_if_fail(clutter_actor_get_parent(inMenuItem)==NULL, -1);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem), -1);
+	g_return_val_if_fail(clutter_actor_get_parent(CLUTTER_ACTOR(inMenuItem))==NULL, -1);
 
 	priv=self->priv;
 
 	/* Insert menu item actor to container at requested position */
-	clutter_actor_insert_child_at_index(priv->itemsContainer, inMenuItem, inIndex);
+	clutter_actor_insert_child_at_index(priv->itemsContainer, CLUTTER_ACTOR(inMenuItem), inIndex);
 
-	/* Create and add meta for menu item actor */
-	meta=xfdashboard_popup_menu_item_meta_new(self, inMenuItem, inCallback, inUserData);
-	g_object_set_qdata_full(G_OBJECT(inMenuItem),
-							_xfdashboard_popup_menu_items_container_child_meta_quark,
-							meta,
-							(GDestroyNotify)g_object_unref);
+	/* Add CSS class 'popup-menu-item' to newly added menu item */
+	if(XFDASHBOARD_IS_STYLABLE(inMenuItem))
+	{
+		xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(inMenuItem), "popup-menu-item");
+	}
 
-	g_signal_connect_swapped(meta,
-								"activated",
-								G_CALLBACK(_xfdashboard_popup_menu_on_meta_activated),
-								self);
+	/* Connect signal to get notified when user made a selection to cancel pop-up
+	 * menu but ensure that it is called nearly at last because the pop-up menu
+	 * could be configured to get destroyed automatically when user selected an
+	 * item (or cancelled the menu). In this case other signal handler may not be
+	 * called if pop-up menu's signal handler is called before. By calling it at
+	 * last all other normally connected signal handlers will get be called.
+	 */
+	g_signal_connect_data(inMenuItem,
+							"activated",
+							G_CALLBACK(_xfdashboard_popup_menu_on_menu_item_activated),
+							self,
+							NULL,
+							G_CONNECT_AFTER | G_CONNECT_SWAPPED);
 
 	/* Emit signal */
 	g_signal_emit(self, XfdashboardPopupMenuSignals[SIGNAL_ITEM_ADDED], 0, inMenuItem);
@@ -1645,7 +1624,7 @@ gint xfdashboard_popup_menu_insert_item(XfdashboardPopupMenu *self,
 /**
  * xfdashboard_popup_menu_move_item:
  * @self: A #XfdashboardPopupMenu
- * @inMenuItem: A #ClutterActor menu item to move
+ * @inMenuItem: A #XfdashboardPopupMenuItem menu item to move
  * @inIndex: The position where to insert this item at
  *
  * Moves the actor @inMenuItem to position @inIndex at pop-up menu @self. If position
@@ -1655,13 +1634,13 @@ gint xfdashboard_popup_menu_insert_item(XfdashboardPopupMenu *self,
  * Return value: Returns %TRUE if moving menu item was successful, otherwise %FALSE.
  */
 gboolean xfdashboard_popup_menu_move_item(XfdashboardPopupMenu *self,
-											ClutterActor *inMenuItem,
+											XfdashboardPopupMenuItem *inMenuItem,
 											gint inIndex)
 {
 	XfdashboardPopupMenuPrivate		*priv;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), FALSE);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), FALSE);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem), FALSE);
 
 	priv=self->priv;
 
@@ -1676,8 +1655,8 @@ gboolean xfdashboard_popup_menu_move_item(XfdashboardPopupMenu *self,
 
 	/* Move menu item actor to new position */
 	g_object_ref(inMenuItem);
-	clutter_actor_remove_child(priv->itemsContainer, inMenuItem);
-	clutter_actor_insert_child_at_index(priv->itemsContainer, inMenuItem, inIndex);
+	clutter_actor_remove_child(priv->itemsContainer, CLUTTER_ACTOR(inMenuItem));
+	clutter_actor_insert_child_at_index(priv->itemsContainer, CLUTTER_ACTOR(inMenuItem), inIndex);
 	g_object_unref(inMenuItem);
 
 	/* If we get here moving menu item actor was successful */
@@ -1691,13 +1670,14 @@ gboolean xfdashboard_popup_menu_move_item(XfdashboardPopupMenu *self,
  *
  * Returns the menu item actor at position @inIndex at pop-up menu @self.
  *
- * Return value: Returns #ClutterActor of the menu item at position @inIndex or
+ * Return value: Returns #XfdashboardPopupMenuItem of the menu item at position @inIndex or
  *   %NULL in case of errors or if index is out of range that means it is greater
  *   than the number of menu items in @self or is less than 0.
  */
-ClutterActor* xfdashboard_popup_menu_get_item(XfdashboardPopupMenu *self, gint inIndex)
+XfdashboardPopupMenuItem* xfdashboard_popup_menu_get_item(XfdashboardPopupMenu *self, gint inIndex)
 {
 	XfdashboardPopupMenuPrivate		*priv;
+	ClutterActor					*menuItem;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), NULL);
 	g_return_val_if_fail(inIndex>=0 && inIndex<clutter_actor_get_n_children(self->priv->itemsContainer), NULL);
@@ -1705,20 +1685,21 @@ ClutterActor* xfdashboard_popup_menu_get_item(XfdashboardPopupMenu *self, gint i
 	priv=self->priv;
 
 	/* Get and return child at requested position at items container */
-	return(clutter_actor_get_child_at_index(priv->itemsContainer, inIndex));
+	menuItem=clutter_actor_get_child_at_index(priv->itemsContainer, inIndex);
+	return(XFDASHBOARD_POPUP_MENU_ITEM(menuItem));
 }
 
 /**
  * xfdashboard_popup_menu_get_item_index:
  * @self: A #XfdashboardPopupMenu
- * @inMenuItem: The #ClutterActor menu item whose index to lookup
+ * @inMenuItem: The #XfdashboardPopupMenuItem menu item whose index to lookup
  *
  * Returns the position for menu item actor @inMenuItem of pop-up menu @self.
  *
  * Return value: Returns the position of the menu item or -1 in case of errors
  *   or if pop-up menu does not have the menu item
  */
-gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterActor *inMenuItem)
+gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem)
 {
 	XfdashboardPopupMenuPrivate		*priv;
 	gint							index;
@@ -1726,7 +1707,7 @@ gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterAc
 	ClutterActor					*child;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), -1);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), -1);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem), -1);
 
 	priv=self->priv;
 
@@ -1737,7 +1718,7 @@ gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterAc
 	while(clutter_actor_iter_next(&iter, &child))
 	{
 		/* If this child is the one we are looking for return index now */
-		if(child==inMenuItem) return(index);
+		if(child==CLUTTER_ACTOR(inMenuItem)) return(index);
 
 		/* Increase index */
 		index++;
@@ -1750,7 +1731,7 @@ gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterAc
 /**
  * xfdashboard_popup_menu_remove_item:
  * @self: A #XfdashboardPopupMenu
- * @inMenuItem: A #ClutterActor menu item to remove
+ * @inMenuItem: A #XfdashboardPopupMenuItem menu item to remove
  *
  * Removes the actor @inMenuItem from pop-up menu @self. When the pop-up menu holds
  * the last reference on that menu item actor then it will be destroyed otherwise
@@ -1761,12 +1742,12 @@ gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterAc
  *
  * Return value: Returns %TRUE if moving menu item was successful, otherwise %FALSE.
  */
-gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, ClutterActor *inMenuItem)
+gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem)
 {
 	XfdashboardPopupMenuPrivate		*priv;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), FALSE);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inMenuItem), FALSE);
+	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem), FALSE);
 
 	priv=self->priv;
 
@@ -1782,13 +1763,17 @@ gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, ClutterA
 	/* Take extra reference on actor to remove to keep it alive while working with it */
 	g_object_ref(inMenuItem);
 
+	/* Remove CSS class 'popup-menu-item' from menu item going to be removed */
+	if(XFDASHBOARD_IS_STYLABLE(inMenuItem))
+	{
+		xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(inMenuItem), "popup-menu-item");
+	}
+
 	/* Remove menu item actor from pop-up menu */
-	clutter_actor_remove_child(priv->itemsContainer, inMenuItem);
+	clutter_actor_remove_child(priv->itemsContainer, CLUTTER_ACTOR(inMenuItem));
 
-	/* Remove meta from menu item actor */
-	g_object_set_qdata(G_OBJECT(inMenuItem),
-						_xfdashboard_popup_menu_items_container_child_meta_quark,
-						NULL);
+	/* Disconnect signal handlers from removed menu item */
+	g_signal_handlers_disconnect_by_func(inMenuItem, G_CALLBACK(_xfdashboard_popup_menu_on_menu_item_activated), self);
 
 	/* Emit signal */
 	g_signal_emit(self, XfdashboardPopupMenuSignals[SIGNAL_ITEM_REMOVED], 0, inMenuItem);
@@ -1801,62 +1786,6 @@ gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, ClutterA
 }
 
 /**
- * xfdashboard_popup_menu_add_separator:
- * @self: A #XfdashboardPopupMenu
- *
- * Adds a separator menu item to end of pop-up menu.
- *
- * The separator menu item implements the #XfdashboardStylable interface and
- * adds the CSS class popup-menu-separator.
- * 
- * Return value: Returns index where item was inserted at or -1 if it failed.
- */
-gint xfdashboard_popup_menu_add_separator(XfdashboardPopupMenu *self)
-{
-	return(xfdashboard_popup_menu_insert_separator(self, -1));
-}
-
-/**
- * xfdashboard_popup_menu_add_separator:
- * @self: A #XfdashboardPopupMenu
- * @inIndex: The position where to insert this item at
- * 
- * Inserts a separator menu item at position @inIndex into pop-up menu.
- *
- * If position @inIndex is greater than the number of menu items in @self or is
- * less than 0, then the menu item actor is added to end of pop-up menu.
- *
- * The separator menu item implements the #XfdashboardStylable interface and
- * adds the CSS class popup-menu-separator.
- * 
- * Return value: Returns index where item was inserted at or -1 if it failed.
- */
-gint xfdashboard_popup_menu_insert_separator(XfdashboardPopupMenu *self, gint inIndex)
-{
-	XfdashboardPopupMenuPrivate		*priv;
-	ClutterActor					*separator;
-
-	g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU(self), -1);
-
-	priv=self->priv;
-
-	/* Create separator menu item */
-	separator=xfdashboard_actor_new();
-	clutter_actor_set_x_expand(separator, TRUE);
-	clutter_actor_set_y_expand(separator, TRUE);
-	xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(separator), "popup-menu-separator");
-
-	/* Insert menu item actor to container at requested position */
-	clutter_actor_insert_child_at_index(priv->itemsContainer, separator, inIndex);
-
-	/* Emit signal */
-	g_signal_emit(self, XfdashboardPopupMenuSignals[SIGNAL_ITEM_ADDED], 0, separator);
-
-	/* Get index where menu item actor was inserted at */
-	return(xfdashboard_popup_menu_get_item_index(self, separator));
-}
-
-/**
  * xfdashboard_popup_menu_activate:
  * @self: A #XfdashboardPopupMenu
  *
diff --git a/libxfdashboard/popup-menu.h b/libxfdashboard/popup-menu.h
index 900a5df..04da41d 100644
--- a/libxfdashboard/popup-menu.h
+++ b/libxfdashboard/popup-menu.h
@@ -30,6 +30,7 @@
 #endif
 
 #include <libxfdashboard/background.h>
+#include <libxfdashboard/popup-menu-item.h>
 
 G_BEGIN_DECLS
 
@@ -76,25 +77,12 @@ struct _XfdashboardPopupMenuClass
 	void (*activated)(XfdashboardPopupMenu *self);
 	void (*cancelled)(XfdashboardPopupMenu *self);
 
-	void (*item_activated)(XfdashboardPopupMenu *self, ClutterActor *inMenuItem);
+	void (*item_activated)(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem);
 
-	void (*item_added)(XfdashboardPopupMenu *self, ClutterActor *inMenuItem);
-	void (*item_removed)(XfdashboardPopupMenu *self, ClutterActor *inMenuItem);
+	void (*item_added)(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem);
+	void (*item_removed)(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem);
 };
 
-/**
- * XfdashboardPopupMenuItemActivateCallback:
- * @self: The popup menu containing the activated menu item
- * @inMenuItem: The menu item actor which was activated
- * @inUserData: Data passed to the function, set with xfdashboard_popup_menu_add_entry()
- *
- * A callback called when the menu item @inMenuItem at pop-up menu @self was
- * activated.
- */
-typedef void (*XfdashboardPopupMenuItemActivateCallback)(XfdashboardPopupMenu *self,
-															ClutterActor *inMenuItem,
-															gpointer inUserData);
-
 /* Public API */
 GType xfdashboard_popup_menu_get_type(void) G_GNUC_CONST;
 
@@ -124,23 +112,16 @@ void xfdashboard_popup_menu_set_title_gicon(XfdashboardPopupMenu *self, GIcon *i
 
 
 gint xfdashboard_popup_menu_add_item(XfdashboardPopupMenu *self,
-										ClutterActor *inMenuItem,
-										XfdashboardPopupMenuItemActivateCallback inCallback,
-										gpointer inUserData);
+										XfdashboardPopupMenuItem *inMenuItem);
 gint xfdashboard_popup_menu_insert_item(XfdashboardPopupMenu *self,
-										ClutterActor *inMenuItem,
-										gint inIndex,
-										XfdashboardPopupMenuItemActivateCallback inCallback,
-										gpointer inUserData);
+										XfdashboardPopupMenuItem *inMenuItem,
+										gint inIndex);
 gboolean xfdashboard_popup_menu_move_item(XfdashboardPopupMenu *self,
-											ClutterActor *inMenuItem,
+											XfdashboardPopupMenuItem *inMenuItem,
 											gint inIndex);
-ClutterActor* xfdashboard_popup_menu_get_item(XfdashboardPopupMenu *self, gint inIndex);
-gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, ClutterActor *inMenuItem);
-gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, ClutterActor *inMenuItem);
-
-gint xfdashboard_popup_menu_add_separator(XfdashboardPopupMenu *self);
-gint xfdashboard_popup_menu_insert_separator(XfdashboardPopupMenu *self, gint inIndex);
+XfdashboardPopupMenuItem* xfdashboard_popup_menu_get_item(XfdashboardPopupMenu *self, gint inIndex);
+gint xfdashboard_popup_menu_get_item_index(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem);
+gboolean xfdashboard_popup_menu_remove_item(XfdashboardPopupMenu *self, XfdashboardPopupMenuItem *inMenuItem);
 
 
 void xfdashboard_popup_menu_activate(XfdashboardPopupMenu *self);
diff --git a/libxfdashboard/quicklaunch.c b/libxfdashboard/quicklaunch.c
index 6cb9d4d..6d890b4 100644
--- a/libxfdashboard/quicklaunch.c
+++ b/libxfdashboard/quicklaunch.c
@@ -49,6 +49,7 @@
 #include <libxfdashboard/window-tracker-window.h>
 #include <libxfdashboard/click-action.h>
 #include <libxfdashboard/popup-menu.h>
+#include <libxfdashboard/popup-menu-item-button.h>
 #include <libxfdashboard/utils.h>
 #include <libxfdashboard/compat.h>
 
@@ -417,14 +418,12 @@ static void _xfdashboard_quicklaunch_on_favourite_clicked(XfdashboardQuicklaunch
 }
 
 /* User selected to activate a window at pop-up menu */
-static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_activate_window(XfdashboardPopupMenu *inPopupMenu,
-																					ClutterActor *inMenuItem,
+static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_activate_window(XfdashboardPopupMenuItem *inMenuItem,
 																					gpointer inUserData)
 {
 	XfdashboardWindowTrackerWindow		*window;
 
-	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu));
-	g_return_if_fail(XFDASHBOARD_IS_BUTTON(inMenuItem));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem));
 	g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inUserData));
 
 	window=XFDASHBOARD_WINDOW_TRACKER_WINDOW(inUserData);
@@ -438,7 +437,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_activate_windo
 
 /* User selected to open a new window or to launch that application at pop-up menu */
 static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_launch(XfdashboardPopupMenu *inPopupMenu,
-																			ClutterActor *inMenuItem,
+																			XfdashboardPopupMenuItem *inMenuItem,
 																			gpointer inUserData)
 {
 	GAppInfo							*appInfo;
@@ -447,7 +446,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_launch(Xfdashb
 	const gchar							*iconName;
 
 	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu));
-	g_return_if_fail(XFDASHBOARD_IS_BUTTON(inMenuItem));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem));
 	g_return_if_fail(G_IS_APP_INFO(inUserData));
 
 	appInfo=G_APP_INFO(inUserData);
@@ -508,7 +507,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_launch(Xfdashb
 
 /* User selected to remove application from favourites via pop-up menu */
 static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_remove_from_favourite(XfdashboardPopupMenu *inPopupMenu,
-																						ClutterActor *inMenuItem,
+																						XfdashboardPopupMenuItem *inMenuItem,
 																						gpointer inUserData)
 {
 	XfdashboardApplicationButton		*appButton;
@@ -518,7 +517,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_remove_from_fa
 	XfdashboardQuicklaunchPrivate		*priv;
 
 	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu));
-	g_return_if_fail(XFDASHBOARD_IS_BUTTON(inMenuItem));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem));
 	g_return_if_fail(XFDASHBOARD_IS_APPLICATION_BUTTON(inUserData));
 
 	appButton=XFDASHBOARD_APPLICATION_BUTTON(inUserData);
@@ -577,7 +576,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_remove_from_fa
 
 /* User selected to add application to favourites via pop-up menu */
 static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_add_to_favourite(XfdashboardPopupMenu *inPopupMenu,
-																					ClutterActor *inMenuItem,
+																					XfdashboardPopupMenuItem *inMenuItem,
 																					gpointer inUserData)
 {
 	XfdashboardApplicationButton		*appButton;
@@ -587,7 +586,7 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu_item_add_to_favouri
 	XfdashboardQuicklaunchPrivate		*priv;
 
 	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU(inPopupMenu));
-	g_return_if_fail(XFDASHBOARD_IS_BUTTON(inMenuItem));
+	g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM(inMenuItem));
 	g_return_if_fail(XFDASHBOARD_IS_APPLICATION_BUTTON(inUserData));
 
 	appButton=XFDASHBOARD_APPLICATION_BUTTON(inUserData);
@@ -751,22 +750,24 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu(XfdashboardQuicklau
 				if(windowWorkspace!=activeWorkspace &&
 					!separatorAdded)
 				{
-					xfdashboard_popup_menu_add_separator(XFDASHBOARD_POPUP_MENU(popup));
+					// TODO: xfdashboard_popup_menu_add_separator(XFDASHBOARD_POPUP_MENU(popup));
 					separatorAdded=TRUE;
 				}
 
 				/* Create menu item for window */
-				menuItem=xfdashboard_button_new();
+				menuItem=xfdashboard_popup_menu_item_button_new();
 				xfdashboard_label_set_text(XFDASHBOARD_LABEL(menuItem), xfdashboard_window_tracker_window_get_title(window));
 				clutter_actor_set_x_expand(menuItem, TRUE);
-				xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup),
-												menuItem,
-												_xfdashboard_quicklaunch_on_favourite_popup_menu_item_activate_window,
-												window);
+				xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup), XFDASHBOARD_POPUP_MENU_ITEM(menuItem));
+
+				g_signal_connect(menuItem,
+									"activated",
+									G_CALLBACK(_xfdashboard_quicklaunch_on_favourite_popup_menu_item_activate_window),
+									window);
 			}
 
 			/* Add a separator to split windows from other actions in pop-up menu */
-			xfdashboard_popup_menu_add_separator(XFDASHBOARD_POPUP_MENU(popup));
+			// TODO: xfdashboard_popup_menu_add_separator(XFDASHBOARD_POPUP_MENU(popup));
 
 			/* Release allocated resources */
 			g_list_free(sortedList);
@@ -776,13 +777,15 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu(XfdashboardQuicklau
 		/* Add menu item to launch application if it is not running */
 		if(!xfdashboard_application_tracker_is_running_by_app_info(priv->appTracker, appInfo))
 		{
-			menuItem=xfdashboard_button_new();
-			clutter_actor_set_x_expand(menuItem, TRUE);
+			menuItem=xfdashboard_popup_menu_item_button_new();
 			xfdashboard_label_set_text(XFDASHBOARD_LABEL(menuItem), _("Launch"));
-			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup),
-											menuItem,
-											_xfdashboard_quicklaunch_on_favourite_popup_menu_item_launch,
-											appInfo);
+			clutter_actor_set_x_expand(menuItem, TRUE);
+			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup), XFDASHBOARD_POPUP_MENU_ITEM(menuItem));
+
+			g_signal_connect(menuItem,
+								"activated",
+								G_CALLBACK(_xfdashboard_quicklaunch_on_favourite_popup_menu_item_launch),
+								appInfo);
 		}
 
 // TODO: Add actions from GAppInfo
@@ -790,25 +793,29 @@ static void _xfdashboard_quicklaunch_on_favourite_popup_menu(XfdashboardQuicklau
 		/* Add "Remove from favourites" if application button is for a favourite application */
 		if(xfdashboard_stylable_has_class(XFDASHBOARD_STYLABLE(appButton), "favourite-app"))
 		{
-			menuItem=xfdashboard_button_new();
-			clutter_actor_set_x_expand(menuItem, TRUE);
+			menuItem=xfdashboard_popup_menu_item_button_new();
 			xfdashboard_label_set_text(XFDASHBOARD_LABEL(menuItem), _("Remove from favourites"));
-			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup),
-											menuItem,
-											_xfdashboard_quicklaunch_on_favourite_popup_menu_item_remove_from_favourite,
-											appButton);
+			clutter_actor_set_x_expand(menuItem, TRUE);
+			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup), XFDASHBOARD_POPUP_MENU_ITEM(menuItem));
+
+			g_signal_connect(menuItem,
+								"activated",
+								G_CALLBACK(_xfdashboard_quicklaunch_on_favourite_popup_menu_item_remove_from_favourite),
+								appButton);
 		}
 
 		/* Add "Add to favourites" if application button is for a non-favourite application */
 		if(xfdashboard_stylable_has_class(XFDASHBOARD_STYLABLE(appButton), "dynamic-app"))
 		{
-			menuItem=xfdashboard_button_new();
-			clutter_actor_set_x_expand(menuItem, TRUE);
+			menuItem=xfdashboard_popup_menu_item_button_new();
 			xfdashboard_label_set_text(XFDASHBOARD_LABEL(menuItem), _("Add to favourites"));
-			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup),
-											menuItem,
-											_xfdashboard_quicklaunch_on_favourite_popup_menu_item_add_to_favourite,
-											appButton);
+			clutter_actor_set_x_expand(menuItem, TRUE);
+			xfdashboard_popup_menu_add_item(XFDASHBOARD_POPUP_MENU(popup), XFDASHBOARD_POPUP_MENU_ITEM(menuItem));
+
+			g_signal_connect(menuItem,
+								"activated",
+								G_CALLBACK(_xfdashboard_quicklaunch_on_favourite_popup_menu_item_add_to_favourite),
+								appButton);
 		}
 
 		/* Activate pop-up menu */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list