[Xfce4-commits] <xfce4-panel:devel> Add Xfconf based kiosk locking to the panel.
Nick Schermer
noreply at xfce.org
Sat Jan 30 14:24:01 CET 2010
Updating branch refs/heads/devel
to 7ba3d816059667848406277b1e90edf130e001e5 (commit)
from fa2481116f11d003f9b1f47ec05f499a19d055a5 (commit)
commit 7ba3d816059667848406277b1e90edf130e001e5
Author: Nick Schermer <nick at xfce.org>
Date: Fri Jan 29 21:23:18 2010 +0100
Add Xfconf based kiosk locking to the panel.
Each panel can be locked individually though Xfconf and
new API function xfce_panel_plugin_get_locked() for plugins;
although it might be safer for plugins to directly check the
Xfconf channel.
common/panel-dbus.h | 15 +-
docs/references/libxfce4panel-sections.txt | 1 +
libxfce4panel/libxfce4panel-deprecated.h | 7 +-
libxfce4panel/libxfce4panel.symbols | 1 +
libxfce4panel/xfce-panel-plugin-provider.c | 11 ++
libxfce4panel/xfce-panel-plugin-provider.h | 5 +
libxfce4panel/xfce-panel-plugin.c | 245 ++++++++++++++++++----------
libxfce4panel/xfce-panel-plugin.h | 2 +
panel/panel-application.c | 90 +++++++++--
panel/panel-application.h | 2 +
panel/panel-dialogs.c | 24 +++
panel/panel-dialogs.h | 2 +
panel/panel-item-dialog.c | 5 +
panel/panel-plugin-external-46.c | 17 ++
panel/panel-plugin-external.c | 23 +++
panel/panel-preferences-dialog.c | 19 ++-
panel/panel-preferences-dialog.glade | 2 +-
panel/panel-window.c | 122 ++++++++------
panel/panel-window.h | 5 +
wrapper/main.c | 2 +
20 files changed, 440 insertions(+), 160 deletions(-)
diff --git a/common/panel-dbus.h b/common/panel-dbus.h
index 2b26f58..e53b15c 100644
--- a/common/panel-dbus.h
+++ b/common/panel-dbus.h
@@ -32,13 +32,14 @@
#define SIGNAL_SET_SIZE SIGNAL_PREFIX_S "a"
#define SIGNAL_SET_ORIENTATION SIGNAL_PREFIX_S "b"
#define SIGNAL_SET_SCREEN_POSITION SIGNAL_PREFIX_S "c"
-#define SIGNAL_SAVE SIGNAL_PREFIX_S "d"
-#define SIGNAL_SHOW_CONFIGURE SIGNAL_PREFIX_S "e"
-#define SIGNAL_SHOW_ABOUT SIGNAL_PREFIX_S "f"
-#define SIGNAL_REMOVED SIGNAL_PREFIX_S "g"
-#define SIGNAL_WRAPPER_SET_SENSITIVE SIGNAL_PREFIX_S "h"
-#define SIGNAL_WRAPPER_BACKGROUND_ALPHA SIGNAL_PREFIX_S "i"
-#define SIGNAL_WRAPPER_QUIT SIGNAL_PREFIX_S "j"
+#define SIGNAL_SET_LOCKED SIGNAL_PREFIX_S "d"
+#define SIGNAL_SAVE SIGNAL_PREFIX_S "e"
+#define SIGNAL_SHOW_CONFIGURE SIGNAL_PREFIX_S "f"
+#define SIGNAL_SHOW_ABOUT SIGNAL_PREFIX_S "g"
+#define SIGNAL_REMOVED SIGNAL_PREFIX_S "h"
+#define SIGNAL_WRAPPER_SET_SENSITIVE SIGNAL_PREFIX_S "i"
+#define SIGNAL_WRAPPER_BACKGROUND_ALPHA SIGNAL_PREFIX_S "j"
+#define SIGNAL_WRAPPER_QUIT SIGNAL_PREFIX_S "k"
/* special types for dbus communication */
#define PANEL_TYPE_DBUS_SET_MESSAGE dbus_g_type_get_struct ("GValueArray", \
diff --git a/docs/references/libxfce4panel-sections.txt b/docs/references/libxfce4panel-sections.txt
index dac9d86..77ea93a 100644
--- a/docs/references/libxfce4panel-sections.txt
+++ b/docs/references/libxfce4panel-sections.txt
@@ -113,6 +113,7 @@ xfce_panel_plugin_get_expand
xfce_panel_plugin_set_expand
xfce_panel_plugin_get_orientation
xfce_panel_plugin_get_screen_position
+xfce_panel_plugin_get_locked
xfce_panel_plugin_take_window
xfce_panel_plugin_add_action_widget
xfce_panel_plugin_menu_insert_item
diff --git a/libxfce4panel/libxfce4panel-deprecated.h b/libxfce4panel/libxfce4panel-deprecated.h
index febdcee..7eff9a3 100644
--- a/libxfce4panel/libxfce4panel-deprecated.h
+++ b/libxfce4panel/libxfce4panel-deprecated.h
@@ -36,6 +36,7 @@ enum /*< skip >*/
PANEL_CLIENT_EVENT_REMOVED,
PANEL_CLIENT_EVENT_SAVE,
PANEL_CLIENT_EVENT_SET_BACKGROUND_ALPHA,
+ PANEL_CLIENT_EVENT_SET_LOCKED,
PANEL_CLIENT_EVENT_SET_ORIENTATION,
PANEL_CLIENT_EVENT_SET_SCREEN_POSITION,
PANEL_CLIENT_EVENT_SET_SENSITIVE,
@@ -117,6 +118,10 @@ enum /*< skip >*/
gtk_widget_queue_draw (plug); \
break; \
\
+ case PANEL_CLIENT_EVENT_SET_LOCKED: \
+ xfce_panel_plugin_provider_set_locked (provider, !!value) \
+ break; \
+ \
case PANEL_CLIENT_EVENT_SET_ORIENTATION: \
xfce_panel_plugin_provider_set_orientation (provider, value); \
break; \
@@ -126,7 +131,7 @@ enum /*< skip >*/
break; \
\
case PANEL_CLIENT_EVENT_SET_SENSITIVE: \
- gtk_widget_set_sensitive (plug, value); \
+ gtk_widget_set_sensitive (plug, !!value); \
break; \
\
case PANEL_CLIENT_EVENT_SET_SIZE: \
diff --git a/libxfce4panel/libxfce4panel.symbols b/libxfce4panel/libxfce4panel.symbols
index 29a0e36..96146af 100644
--- a/libxfce4panel/libxfce4panel.symbols
+++ b/libxfce4panel/libxfce4panel.symbols
@@ -95,6 +95,7 @@ xfce_panel_plugin_get_arguments G_GNUC_PURE
xfce_panel_plugin_get_size G_GNUC_PURE
xfce_panel_plugin_get_expand G_GNUC_PURE
xfce_panel_plugin_set_expand
+xfce_panel_plugin_get_locked
xfce_panel_plugin_get_orientation G_GNUC_PURE
xfce_panel_plugin_get_screen_position G_GNUC_PURE
xfce_panel_plugin_take_window
diff --git a/libxfce4panel/xfce-panel-plugin-provider.c b/libxfce4panel/xfce-panel-plugin-provider.c
index 9587e9a..073c474 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.c
+++ b/libxfce4panel/xfce-panel-plugin-provider.c
@@ -222,5 +222,16 @@ xfce_panel_plugin_provider_remote_event (XfcePanelPluginProvider *provider,
+void
+xfce_panel_plugin_provider_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked)
+{
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+ (*XFCE_PANEL_PLUGIN_PROVIDER_GET_INTERFACE (provider)->set_locked) (provider, locked);
+}
+
+
+
#define __XFCE_PANEL_PLUGIN_PROVIDER_C__
#include <libxfce4panel/libxfce4panel-aliasdef.c>
diff --git a/libxfce4panel/xfce-panel-plugin-provider.h b/libxfce4panel/xfce-panel-plugin-provider.h
index 6af499f..9c37e3f 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.h
+++ b/libxfce4panel/xfce-panel-plugin-provider.h
@@ -65,6 +65,8 @@ struct _XfcePanelPluginProviderInterface
gboolean (*remote_event) (XfcePanelPluginProvider *provider,
const gchar *name,
const GValue *value);
+ void (*set_locked) (XfcePanelPluginProvider *provider,
+ gboolean locked);
};
/* signals send from the plugin to the panel (possibly through the wrapper) */
@@ -148,6 +150,9 @@ gboolean xfce_panel_plugin_provider_remote_event (XfcePanelP
const gchar *name,
const GValue *value);
+void xfce_panel_plugin_provider_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked);
+
G_END_DECLS
#endif /* !__XFCE_PANEL_PLUGIN_PROVIDER_H__ */
diff --git a/libxfce4panel/xfce-panel-plugin.c b/libxfce4panel/xfce-panel-plugin.c
index effea33..332a608 100644
--- a/libxfce4panel/xfce-panel-plugin.c
+++ b/libxfce4panel/xfce-panel-plugin.c
@@ -96,6 +96,8 @@ static void xfce_panel_plugin_removed (XfcePanelPluginPr
static gboolean xfce_panel_plugin_remote_event (XfcePanelPluginProvider *provider,
const gchar *name,
const GValue *value);
+static void xfce_panel_plugin_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked);
static void xfce_panel_plugin_take_window_notify (gpointer data,
GObject *where_the_object_was);
@@ -152,6 +154,7 @@ struct _XfcePanelPluginPrivate
guint expand : 1;
GtkOrientation orientation;
XfceScreenPosition screen_position;
+ guint locked : 1;
/* flags for rembering states */
PluginFlags flags;
@@ -168,7 +171,9 @@ struct _XfcePanelPluginPrivate
-static guint plugin_signals[LAST_SIGNAL];
+static guint plugin_signals[LAST_SIGNAL];
+static GQuark item_properties = 0;
+static GQuark item_about = 0;
@@ -531,6 +536,9 @@ xfce_panel_plugin_class_init (XfcePanelPluginClass *klass)
FALSE,
G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS));
+
+ item_properties = g_quark_from_static_string ("item-properties");
+ item_about = g_quark_from_static_string ("item-about");
}
@@ -554,6 +562,7 @@ xfce_panel_plugin_init (XfcePanelPlugin *plugin)
plugin->priv->menu_blocked = 0;
plugin->priv->panel_lock = 0;
plugin->priv->flags = 0;
+ plugin->priv->locked = TRUE;
/* hide the event box window to make the plugin transparent */
gtk_event_box_set_visible_window (GTK_EVENT_BOX (plugin), FALSE);
@@ -576,6 +585,7 @@ xfce_panel_plugin_provider_init (XfcePanelPluginProviderInterface *iface)
iface->show_about = xfce_panel_plugin_show_about;
iface->removed = xfce_panel_plugin_removed;
iface->remote_event = xfce_panel_plugin_remote_event;
+ iface->set_locked = xfce_panel_plugin_set_locked;
}
@@ -768,8 +778,9 @@ xfce_panel_plugin_button_press_event (GtkWidget *widget,
menu = xfce_panel_plugin_menu_get (plugin);
/* if the menu is block, some items are insensitive */
- item = g_object_get_data (G_OBJECT (menu), g_intern_static_string ("properties-item"));
- gtk_widget_set_sensitive (item, plugin->priv->menu_blocked == 0);
+ item = g_object_get_qdata (G_OBJECT (menu), item_properties);
+ if (item != NULL)
+ gtk_widget_set_sensitive (item, plugin->priv->menu_blocked == 0);
/* popup the menu */
gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time);
@@ -836,8 +847,9 @@ xfce_panel_plugin_menu_add_items (XfcePanelPlugin *plugin)
panel_return_if_fail (XFCE_PANEL_PLUGIN_CONSTRUCTED (plugin));
/* open items dialog */
- xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (plugin),
- PROVIDER_SIGNAL_ADD_NEW_ITEMS);
+ if (!xfce_panel_plugin_get_locked (plugin))
+ xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (plugin),
+ PROVIDER_SIGNAL_ADD_NEW_ITEMS);
}
@@ -850,8 +862,9 @@ xfce_panel_plugin_menu_panel_preferences (XfcePanelPlugin *plugin)
panel_return_if_fail (XFCE_PANEL_PLUGIN_CONSTRUCTED (plugin));
/* open preferences dialog */
- xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (plugin),
- PROVIDER_SIGNAL_PANEL_PREFERENCES);
+ if (!xfce_panel_plugin_get_locked (plugin))
+ xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (plugin),
+ PROVIDER_SIGNAL_PANEL_PREFERENCES);
}
@@ -904,11 +917,14 @@ xfce_panel_plugin_menu_get (XfcePanelPlugin *plugin)
GtkWidget *menu, *submenu;
GtkWidget *item;
GtkWidget *image;
+ gboolean locked;
panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (plugin), NULL);
if (G_UNLIKELY (plugin->priv->menu == NULL))
{
+ locked = xfce_panel_plugin_get_locked (plugin);
+
menu = gtk_menu_new ();
gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (plugin), NULL);
@@ -923,85 +939,91 @@ xfce_panel_plugin_menu_get (XfcePanelPlugin *plugin)
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
- /* properties item */
- item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PROPERTIES, NULL);
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_show_configure), plugin);
- g_object_set_data (G_OBJECT (menu), g_intern_static_string ("properties-item"), item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- if (PANEL_HAS_FLAG (plugin->priv->flags, PLUGIN_FLAG_SHOW_CONFIGURE))
- gtk_widget_show (item);
-
- /* about item */
- item = gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL);
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_show_about), plugin);
- g_object_set_data (G_OBJECT (menu), g_intern_static_string ("about-item"), item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- if (PANEL_HAS_FLAG (plugin->priv->flags, PLUGIN_FLAG_SHOW_ABOUT))
- gtk_widget_show (item);
-
- /* move item */
- item = gtk_image_menu_item_new_with_mnemonic (_("_Move"));
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_menu_move), plugin);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- image = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- gtk_widget_show (image);
-
- /* separator */
- item = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- /* remove */
- item = gtk_image_menu_item_new_from_stock (GTK_STOCK_REMOVE, NULL);
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_menu_remove), plugin);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- /* separator */
- item = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ if (!locked)
+ {
+ /* properties item */
+ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PROPERTIES, NULL);
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_show_configure), plugin);
+ g_object_set_qdata (G_OBJECT (menu), item_properties, item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ if (PANEL_HAS_FLAG (plugin->priv->flags, PLUGIN_FLAG_SHOW_CONFIGURE))
+ gtk_widget_show (item);
+
+ /* about item */
+ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL);
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_show_about), plugin);
+ g_object_set_qdata (G_OBJECT (menu), item_about, item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ if (PANEL_HAS_FLAG (plugin->priv->flags, PLUGIN_FLAG_SHOW_ABOUT))
+ gtk_widget_show (item);
+
+ /* move item */
+ item = gtk_image_menu_item_new_with_mnemonic (_("_Move"));
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_menu_move), plugin);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_show (image);
+
+ /* separator */
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ /* remove */
+ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_REMOVE, NULL);
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_menu_remove), plugin);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ /* separator */
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+ }
/* create a panel submenu item */
submenu = gtk_menu_new ();
- item = gtk_image_menu_item_new_with_mnemonic ("_Xfce Panel");
+ item = gtk_menu_item_new_with_mnemonic ("_Xfce Panel");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
gtk_widget_show (item);
- /* add new items */
- item = gtk_image_menu_item_new_with_mnemonic (_("Add _New Items..."));
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_menu_add_items), plugin);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
- gtk_widget_show (item);
-
- image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- gtk_widget_show (image);
-
- /* customize panel */
- item = gtk_image_menu_item_new_with_mnemonic (_("Panel Pr_eferences..."));
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (xfce_panel_plugin_menu_panel_preferences), plugin);
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
- gtk_widget_show (item);
-
- image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- gtk_widget_show (image);
-
- /* separator */
- item = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
- gtk_widget_show (item);
+ if (!locked)
+ {
+ /* add new items */
+ item = gtk_image_menu_item_new_with_mnemonic (_("Add _New Items..."));
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_menu_add_items), plugin);
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
+ gtk_widget_show (item);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_show (image);
+
+ /* customize panel */
+ item = gtk_image_menu_item_new_with_mnemonic (_("Panel Pr_eferences..."));
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (xfce_panel_plugin_menu_panel_preferences), plugin);
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
+ gtk_widget_show (item);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_show (image);
+
+ /* separator */
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
+ gtk_widget_show (item);
+ }
/* quit item */
item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
@@ -1157,10 +1179,13 @@ xfce_panel_plugin_set_screen_position (XfcePanelPluginProvider *provider,
static void
xfce_panel_plugin_save (XfcePanelPluginProvider *provider)
{
+ XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (provider);
+
panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (provider));
/* only send the save signal if the plugin is not locked */
- if (XFCE_PANEL_PLUGIN (provider)->priv->menu_blocked == 0)
+ if (XFCE_PANEL_PLUGIN (provider)->priv->menu_blocked == 0
+ && !xfce_panel_plugin_get_locked (plugin))
g_signal_emit (G_OBJECT (provider), plugin_signals[SAVE], 0);
}
@@ -1186,8 +1211,8 @@ xfce_panel_plugin_show_configure (XfcePanelPluginProvider *provider)
panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (provider));
- /* emit configure-plugin signal */
- if (G_LIKELY (plugin->priv->menu_blocked == 0))
+ if (plugin->priv->menu_blocked == 0
+ && !xfce_panel_plugin_get_locked (plugin))
g_signal_emit (G_OBJECT (plugin), plugin_signals[CONFIGURE_PLUGIN], 0);
}
@@ -1249,6 +1274,29 @@ xfce_panel_plugin_remote_event (XfcePanelPluginProvider *provider,
static void
+xfce_panel_plugin_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked)
+{
+ XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (provider);
+
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN (provider));
+
+ if (G_LIKELY (plugin->priv->locked != locked))
+ {
+ plugin->priv->locked = locked;
+
+ /* destroy the menu if it exists */
+ if (plugin->priv->menu != NULL)
+ {
+ gtk_widget_destroy (GTK_WIDGET (plugin->priv->menu));
+ plugin->priv->menu = NULL;
+ }
+ }
+}
+
+
+
+static void
xfce_panel_plugin_take_window_notify (gpointer data,
GObject *where_the_object_was)
{
@@ -1615,7 +1663,7 @@ xfce_panel_plugin_menu_show_configure (XfcePanelPlugin *plugin)
{
/* get and show the properties item */
menu = xfce_panel_plugin_menu_get (plugin);
- item = g_object_get_data (G_OBJECT (menu), g_intern_static_string ("properties-item"));
+ item = g_object_get_qdata (G_OBJECT (menu), item_properties);
if (G_LIKELY (item != NULL))
gtk_widget_show (item);
}
@@ -1650,7 +1698,7 @@ xfce_panel_plugin_menu_show_about (XfcePanelPlugin *plugin)
{
/* get and show the about item */
menu = xfce_panel_plugin_menu_get (plugin);
- item = g_object_get_data (G_OBJECT (menu), g_intern_static_string ("about-item"));
+ item = g_object_get_qdata (G_OBJECT (menu), item_about);
if (G_LIKELY (item != NULL))
gtk_widget_show (item);
}
@@ -1666,6 +1714,35 @@ xfce_panel_plugin_menu_show_about (XfcePanelPlugin *plugin)
* xfce_panel_plugin_remove:
* @plugin : an #XfcePanelPlugin.
*
+ * Whether the plugin is locked (not allowing customization). This
+ * is emitted through the panel based on the Xfconf locking of the
+ * panel window the plugin is embedded on.
+ *
+ * It is however possible to send a fake signal to the plugin to
+ * override this propery, so you should only use this for interface
+ * elements and (if you use Xfconf) check the locking yourself
+ * before you write any values or query the kiosk mode using the
+ * api in libxfce4util.
+ *
+ * Returns: %TRUE if the user is not allowed to modify the plugin,
+ * %FALSE is customization is allowed.
+ *
+ * Since: 4.8.0
+ **/
+gboolean
+xfce_panel_plugin_get_locked (XfcePanelPlugin *plugin)
+{
+ g_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (plugin), TRUE);
+
+ return plugin->priv->locked;
+}
+
+
+
+/**
+ * xfce_panel_plugin_remove:
+ * @plugin : an #XfcePanelPlugin.
+ *
* Remove this plugin from the panel and remove all its configuration.
*
* Plugins should not use this function to implement their own
diff --git a/libxfce4panel/xfce-panel-plugin.h b/libxfce4panel/xfce-panel-plugin.h
index 399e39a..df20626 100644
--- a/libxfce4panel/xfce-panel-plugin.h
+++ b/libxfce4panel/xfce-panel-plugin.h
@@ -136,6 +136,8 @@ void xfce_panel_plugin_menu_show_configure (XfcePanelPlugin *
void xfce_panel_plugin_menu_show_about (XfcePanelPlugin *plugin);
+gboolean xfce_panel_plugin_get_locked (XfcePanelPlugin *plugin);
+
void xfce_panel_plugin_remove (XfcePanelPlugin *plugin);
void xfce_panel_plugin_block_menu (XfcePanelPlugin *plugin);
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 820709c..9dd4929 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -253,7 +253,7 @@ panel_application_xfconf_window_bindings (PanelApplication *application,
gchar *property_base;
const PanelProperty properties[] =
{
- { "locked", G_TYPE_BOOLEAN },
+ { "position-locked", G_TYPE_BOOLEAN },
{ "autohide", G_TYPE_BOOLEAN },
{ "span-monitors", G_TYPE_BOOLEAN },
{ "horizontal", G_TYPE_BOOLEAN },
@@ -279,6 +279,10 @@ panel_application_xfconf_window_bindings (PanelApplication *application,
panel_properties_bind (application->xfconf, G_OBJECT (window),
property_base, properties, save_properties);
+ /* set locking for this panel */
+ panel_window_set_locked (window,
+ xfconf_channel_is_property_locked (application->xfconf, property_base));
+
g_free (property_base);
}
@@ -465,8 +469,10 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide
switch (provider_signal)
{
case PROVIDER_SIGNAL_MOVE_PLUGIN:
- /* start plugin drag */
- panel_application_plugin_move (GTK_WIDGET (provider), application);
+ /* check the window locking, not that of the provider, because
+ * the users might have worked around that and both should be identical */
+ if (!panel_window_get_locked (window))
+ panel_application_plugin_move (GTK_WIDGET (provider), application);
break;
case PROVIDER_SIGNAL_EXPAND_PLUGIN:
@@ -500,28 +506,33 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide
break;
case PROVIDER_SIGNAL_REMOVE_PLUGIN:
- /* give plugin the opportunity to cleanup special configuration */
- xfce_panel_plugin_provider_removed (provider);
+ /* check the window locking, not that of the provider, because
+ * the users might have worked around that and both should be identical */
+ if (!panel_window_get_locked (window))
+ {
+ /* give plugin the opportunity to cleanup special configuration */
+ xfce_panel_plugin_provider_removed (provider);
- /* store the provider's unique id and name (lost after destroy) */
- unique_id = xfce_panel_plugin_provider_get_unique_id (provider);
- name = g_strdup (xfce_panel_plugin_provider_get_name (provider));
+ /* store the provider's unique id and name (lost after destroy) */
+ unique_id = xfce_panel_plugin_provider_get_unique_id (provider);
+ name = g_strdup (xfce_panel_plugin_provider_get_name (provider));
- /* destroy the plugin */
- gtk_widget_destroy (GTK_WIDGET (provider));
+ /* destroy the plugin */
+ gtk_widget_destroy (GTK_WIDGET (provider));
- /* remove the plugin configuration */
- panel_application_plugin_delete_config (application, name, unique_id);
- g_free (name);
+ /* remove the plugin configuration */
+ panel_application_plugin_delete_config (application, name, unique_id);
+ g_free (name);
+ }
break;
case PROVIDER_SIGNAL_ADD_NEW_ITEMS:
- /* open the items dialog */
+ /* open the items dialog, locking is handled in the object */
panel_item_dialog_show (window);
break;
case PROVIDER_SIGNAL_PANEL_PREFERENCES:
- /* open the panel preferences */
+ /* open the panel preferences, locking is handled in the object */
panel_preferences_dialog_show (window);
break;
@@ -571,6 +582,10 @@ panel_application_plugin_insert (PanelApplication *application,
panel_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
panel_return_val_if_fail (name != NULL, FALSE);
+ /* leave if the window is locked */
+ if (panel_window_get_locked (window))
+ return FALSE;
+
/* create a new panel plugin */
provider = panel_module_factory_new_plugin (application->factory,
name, screen, unique_id,
@@ -720,6 +735,13 @@ panel_application_drag_data_received (PanelWindow *window,
panel_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
panel_return_if_fail (PANEL_IS_ITEMBAR (itembar));
+ /* we don't allow any kind of drops here when the panel is locked */
+ if (panel_window_get_locked (window))
+ {
+ gdk_drag_status (context, 0, drag_time);
+ return;
+ }
+
/* get the application */
application = panel_application_get ();
@@ -865,6 +887,10 @@ panel_application_drag_motion (GtkWidget *window,
panel_return_val_if_fail (PANEL_IS_APPLICATION (application), FALSE);
panel_return_val_if_fail (!application->drop_occurred, FALSE);
+ /* don't allow anything when the window is locked */
+ if (panel_window_get_locked (PANEL_WINDOW (window)))
+ goto not_a_drop_zone;
+
/* determine the drag target */
target = gtk_drag_dest_find_target (window, context, NULL);
@@ -904,6 +930,7 @@ panel_application_drag_motion (GtkWidget *window,
panel_itembar_get_drop_index (PANEL_ITEMBAR (itembar), x, y));
}
+not_a_drop_zone:
gdk_drag_status (context, drag_action, drag_time);
return (drag_action == 0);
@@ -1007,6 +1034,10 @@ panel_application_save (PanelApplication *application,
for (li = application->windows, i = 0; li != NULL; li = li->next, i++)
{
+ /* skip this window if it is locked */
+ if (panel_window_get_locked (li->data))
+ continue;
+
/* get the itembar children */
itembar = gtk_bin_get_child (GTK_BIN (li->data));
children = gtk_container_get_children (GTK_CONTAINER (itembar));
@@ -1053,7 +1084,8 @@ panel_application_save (PanelApplication *application,
}
/* store the number of panels */
- xfconf_channel_set_uint (channel, "/panels", i);
+ if (!xfconf_channel_is_property_locked (channel, "/panels"))
+ xfconf_channel_set_uint (channel, "/panels", i);
}
@@ -1311,3 +1343,29 @@ panel_application_windows_autohide (PanelApplication *application,
panel_window_thaw_autohide (PANEL_WINDOW (li->data));
}
}
+
+
+
+gboolean
+panel_application_get_locked (PanelApplication *application)
+{
+ GSList *li;
+
+ panel_return_val_if_fail (PANEL_IS_APPLICATION (application), TRUE);
+ panel_return_val_if_fail (XFCONF_IS_CHANNEL (application->xfconf), TRUE);
+
+ /* don't even look for the individual window if the
+ * entire channel is locked */
+ if (xfconf_channel_is_property_locked (application->xfconf, "/"))
+ return TRUE;
+
+ /* if one of the windows is not locked, the user can still modify
+ * some settings, so then we return %FALSE */
+ for (li = application->windows; li != NULL; li = li->next)
+ if (!panel_window_get_locked (li->data))
+ return FALSE;
+
+ /* TODO we could extend this to a plugin basis (ie. panels are
+ * locked but maybe not all the plugins) */
+ return TRUE;
+}
diff --git a/panel/panel-application.h b/panel/panel-application.h
index ffb7b39..8fe375f 100644
--- a/panel/panel-application.h
+++ b/panel/panel-application.h
@@ -75,6 +75,8 @@ void panel_application_windows_sensitive (PanelApplication *applic
void panel_application_windows_autohide (PanelApplication *application,
gboolean freeze);
+gboolean panel_application_get_locked (PanelApplication *application);
+
G_END_DECLS
#endif /* !__PANEL_APPLICATION_H__ */
diff --git a/panel/panel-dialogs.c b/panel/panel-dialogs.c
index 3de1cd0..0b57908 100644
--- a/panel/panel-dialogs.c
+++ b/panel/panel-dialogs.c
@@ -26,6 +26,7 @@
#include <exo/exo.h>
#include <libxfce4util/libxfce4util.h>
+#include <libxfce4ui/libxfce4ui.h>
#include <common/panel-private.h>
#include <libxfce4panel/libxfce4panel.h>
@@ -147,6 +148,29 @@ panel_dialogs_choose_panel (PanelApplication *application)
gboolean
+panel_dialogs_kiosk_warning (void)
+{
+ PanelApplication *application;
+ gboolean locked;
+
+ application = panel_application_get ();
+ locked = panel_application_get_locked (application);
+ g_object_unref (G_OBJECT (application));
+
+ if (locked)
+ {
+ xfce_dialog_show_warning (NULL,
+ _("Because the panel is running in kiosk mode, you are not allowed "
+ "to make changes to the panel configuration as a regular user"),
+ _("Modifying the panel is not allowed"));
+ }
+
+ return locked;
+}
+
+
+
+gboolean
panel_dialogs_restart_plugin (GtkWindow *parent,
const gchar *plugin_name)
{
diff --git a/panel/panel-dialogs.h b/panel/panel-dialogs.h
index a42f5ed..253e344 100644
--- a/panel/panel-dialogs.h
+++ b/panel/panel-dialogs.h
@@ -28,6 +28,8 @@ void panel_dialogs_show_about (void);
gint panel_dialogs_choose_panel (PanelApplication *application);
+gboolean panel_dialogs_kiosk_warning (void);
+
gboolean panel_dialogs_restart_plugin (GtkWindow *parent,
const gchar *plugin_name);
diff --git a/panel/panel-item-dialog.c b/panel/panel-item-dialog.c
index fc5063c..abebcec 100644
--- a/panel/panel-item-dialog.c
+++ b/panel/panel-item-dialog.c
@@ -33,6 +33,7 @@
#include <panel/panel-application.h>
#include <panel/panel-item-dialog.h>
+#include <panel/panel-dialogs.h>
#include <panel/panel-module.h>
#include <panel/panel-module-factory.h>
#include <panel/panel-preferences-dialog.h>
@@ -701,6 +702,10 @@ panel_item_dialog_show (PanelWindow *window)
panel_return_if_fail (window == NULL || PANEL_IS_WINDOW (window));
+ /* check if not the entire application is locked */
+ if (panel_dialogs_kiosk_warning ())
+ return;
+
if (G_LIKELY (dialog_singleton == NULL))
{
/* create new dialog singleton */
diff --git a/panel/panel-plugin-external-46.c b/panel/panel-plugin-external-46.c
index 7efbebd..ab06f9d 100644
--- a/panel/panel-plugin-external-46.c
+++ b/panel/panel-plugin-external-46.c
@@ -85,6 +85,8 @@ static void panel_plugin_external_46_removed (XfcePanelPlu
static gboolean panel_plugin_external_46_remote_event (XfcePanelPluginProvider *provider,
const gchar *name,
const GValue *value);
+static void panel_plugin_external_46_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked);
static void panel_plugin_external_46_set_sensitive (PanelPluginExternal46 *external);
static void panel_plugin_external_46_child_watch (GPid pid,
gint status,
@@ -235,6 +237,7 @@ panel_plugin_external_46_provider_init (XfcePanelPluginProviderInterface *iface)
iface->show_about = panel_plugin_external_46_show_about;
iface->removed = panel_plugin_external_46_removed;
iface->remote_event = panel_plugin_external_46_remote_event;
+ iface->set_locked = panel_plugin_external_46_set_locked;
}
@@ -741,6 +744,20 @@ panel_plugin_external_46_remote_event (XfcePanelPluginProvider *provider,
static void
+panel_plugin_external_46_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked)
+{
+ panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL_46 (provider));
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+ panel_plugin_external_46_queue_add (PANEL_PLUGIN_EXTERNAL_46 (provider),
+ PANEL_CLIENT_EVENT_SET_LOCKED,
+ locked);
+}
+
+
+
+static void
panel_plugin_external_46_set_sensitive (PanelPluginExternal46 *external)
{
panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL_46 (external));
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index fa680ba..82ded1f 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -99,6 +99,8 @@ static void panel_plugin_external_removed (XfcePanelPlugin
static gboolean panel_plugin_external_remote_event (XfcePanelPluginProvider *provider,
const gchar *name,
const GValue *value);
+static void panel_plugin_external_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked);
static void panel_plugin_external_set_sensitive (PanelPluginExternal *external);
static void panel_plugin_external_child_watch (GPid pid,
gint status,
@@ -268,6 +270,7 @@ panel_plugin_external_provider_init (XfcePanelPluginProviderInterface *iface)
iface->show_about = panel_plugin_external_show_about;
iface->removed = panel_plugin_external_removed;
iface->remote_event = panel_plugin_external_remote_event;
+ iface->set_locked = panel_plugin_external_set_locked;
}
@@ -853,6 +856,26 @@ panel_plugin_external_remote_event (XfcePanelPluginProvider *provider,
static void
+panel_plugin_external_set_locked (XfcePanelPluginProvider *provider,
+ gboolean locked)
+{
+ GValue value = { 0, };
+
+ panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
+ panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
+
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, locked);
+
+ panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+ FALSE, SIGNAL_SET_LOCKED, &value);
+
+ g_value_unset (&value);
+}
+
+
+
+static void
panel_plugin_external_set_sensitive (PanelPluginExternal *external)
{
GValue value = { 0, };
diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c
index 96c1026..621d96a 100644
--- a/panel/panel-preferences-dialog.c
+++ b/panel/panel-preferences-dialog.c
@@ -31,6 +31,7 @@
#include <panel/panel-window.h>
#include <panel/panel-application.h>
+#include <panel/panel-dialogs.h>
#include <panel/panel-module.h>
#include <panel/panel-itembar.h>
#include <panel/panel-item-dialog.h>
@@ -353,7 +354,7 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
/* hook up the bindings */
panel_preferences_dialog_bindings_add (dialog, "horizontal", "active");
panel_preferences_dialog_bindings_add (dialog, "span-monitors", "active");
- panel_preferences_dialog_bindings_add (dialog, "locked", "active");
+ panel_preferences_dialog_bindings_add (dialog, "position-locked", "active");
panel_preferences_dialog_bindings_add (dialog, "autohide", "active");
panel_preferences_dialog_bindings_add (dialog, "size", "value");
panel_preferences_dialog_bindings_add (dialog, "length", "value");
@@ -519,6 +520,7 @@ panel_preferences_dialog_panel_combobox_changed (GtkComboBox *combobo
gint nth;
GtkWidget *itembar;
GObject *object;
+ gboolean locked = TRUE;
panel_return_if_fail (GTK_IS_COMBO_BOX (combobox));
panel_return_if_fail (PANEL_IS_PREFERENCES_DIALOG (dialog));
@@ -548,8 +550,19 @@ panel_preferences_dialog_panel_combobox_changed (GtkComboBox *combobo
/* update the items treeview */
panel_preferences_dialog_item_store_rebuild (itembar, dialog);
+
+ /* make the entire notebook insensitive when the window is locked */
+ locked = panel_window_get_locked (dialog->active);
+ object = gtk_builder_get_object (GTK_BUILDER (dialog), "notebook");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_widget_set_sensitive (GTK_WIDGET (object), !locked);
}
+ /* sensitivity of the remove button */
+ object = gtk_builder_get_object (GTK_BUILDER (dialog), "panel-remove");
+ panel_return_if_fail (GTK_IS_WIDGET (object));
+ gtk_widget_set_sensitive (GTK_WIDGET (object), !locked);
+
/* sensitivity of the add button in item tab */
object = gtk_builder_get_object (GTK_BUILDER (dialog), "item-add");
panel_return_if_fail (GTK_IS_WIDGET (object));
@@ -973,6 +986,10 @@ panel_preferences_dialog_show (PanelWindow *active)
panel_return_if_fail (active == NULL || PANEL_IS_WINDOW (active));
+ /* check if not the entire application is locked */
+ if (panel_dialogs_kiosk_warning ())
+ return;
+
if (G_LIKELY (dialog_singleton == NULL))
{
/* create new dialog singleton */
diff --git a/panel/panel-preferences-dialog.glade b/panel/panel-preferences-dialog.glade
index e46776c..392c1d4 100644
--- a/panel/panel-preferences-dialog.glade
+++ b/panel/panel-preferences-dialog.glade
@@ -229,7 +229,7 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="locked">
+ <object class="GtkCheckButton" id="position-locked">
<property name="label" translatable="yes">_Lock panel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 4bfad54..d034ee8 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -135,7 +135,7 @@ enum
PROP_HORIZONTAL,
PROP_SIZE,
PROP_LENGTH,
- PROP_LOCKED,
+ PROP_POSITION_LOCKED,
PROP_AUTOHIDE,
PROP_SPAN_MONITORS,
PROP_OUTPUT_NAME,
@@ -221,6 +221,10 @@ struct _PanelWindow
{
PanelBaseWindow __parent__;
+ /* whether the user is allowed to make
+ * changes to this window */
+ guint locked : 1;
+
/* screen and working area of this panel */
GdkScreen *screen;
GdkRectangle area;
@@ -251,8 +255,8 @@ struct _PanelWindow
gint popup_delay;
gint popdown_delay;
- /* whether the window is locked */
- guint locked : 1;
+ /* whether the window position is locked */
+ guint position_locked : 1;
/* window base point */
gint base_x;
@@ -327,8 +331,8 @@ panel_window_class_init (PanelWindowClass *klass)
EXO_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
- PROP_LOCKED,
- g_param_spec_boolean ("locked", NULL, NULL,
+ PROP_POSITION_LOCKED,
+ g_param_spec_boolean ("position-locked", NULL, NULL,
FALSE,
EXO_PARAM_READWRITE));
@@ -391,6 +395,7 @@ panel_window_class_init (PanelWindowClass *klass)
static void
panel_window_init (PanelWindow *window)
{
+ window->locked = TRUE;
window->screen = NULL;
window->struts_edge = STRUTS_EDGE_NONE;
window->struts_disabled = FALSE;
@@ -399,7 +404,7 @@ panel_window_init (PanelWindow *window)
window->length = 0.10;
window->snap_position = SNAP_POSITION_NONE;
window->span_monitors = FALSE;
- window->locked = FALSE;
+ window->position_locked = FALSE;
window->autohide_state = AUTOHIDE_DISABLED;
window->autohide_timeout_id = 0;
window->autohide_block = 0;
@@ -453,8 +458,8 @@ panel_window_get_property (GObject *object,
g_value_set_uint (value, rint (window->length * 100.00));
break;
- case PROP_LOCKED:
- g_value_set_boolean (value, window->locked);
+ case PROP_POSITION_LOCKED:
+ g_value_set_boolean (value, window->position_locked);
break;
case PROP_AUTOHIDE:
@@ -557,11 +562,11 @@ panel_window_set_property (GObject *object,
}
break;
- case PROP_LOCKED:
+ case PROP_POSITION_LOCKED:
val_bool = g_value_get_boolean (value);
- if (window->locked != val_bool)
+ if (window->position_locked != val_bool)
{
- window->locked = !!val_bool;
+ window->position_locked = !!val_bool;
gtk_widget_queue_resize (GTK_WIDGET (window));
}
break;
@@ -661,7 +666,7 @@ panel_window_expose_event (GtkWidget *widget,
/* expose the background and borders handled in PanelBaseWindow */
(*GTK_WIDGET_CLASS (panel_window_parent_class)->expose_event) (widget, event);
- if (window->locked || !GTK_WIDGET_DRAWABLE (widget))
+ if (window->position_locked || !GTK_WIDGET_DRAWABLE (widget))
goto end;
if (window->horizontal)
@@ -891,7 +896,7 @@ panel_window_button_press_event (GtkWidget *widget,
if (event->button == 1
&& event->type == GDK_BUTTON_PRESS
- && !window->locked
+ && !window->position_locked
&& modifiers == 0)
{
panel_return_val_if_fail (window->grab_time == 0, FALSE);
@@ -995,7 +1000,7 @@ panel_window_size_request (GtkWidget *widget,
gtk_widget_size_request (GTK_BIN (widget)->child, &child_requisition);
/* handle size */
- if (!window->locked)
+ if (!window->position_locked)
{
if (window->horizontal)
extra_width += 2 * HANDLE_SIZE_TOTAL;
@@ -1108,7 +1113,7 @@ panel_window_size_allocate (GtkWidget *widget,
child_alloc.height--;
/* keep space for the panel handles if not locked */
- if (!window->locked)
+ if (!window->position_locked)
{
if (window->horizontal)
{
@@ -2005,16 +2010,6 @@ panel_window_menu_deactivate (GtkMenu *menu,
static void
-panel_window_menu_add_items (PanelWindow *window)
-{
- panel_return_if_fail (PANEL_IS_WINDOW (window));
-
- panel_item_dialog_show (window);
-}
-
-
-
-static void
panel_window_menu_popup (PanelWindow *window,
guint32 event_time)
{
@@ -2042,31 +2037,34 @@ panel_window_menu_popup (PanelWindow *window,
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
- /* add new items */
- item = gtk_image_menu_item_new_with_mnemonic (_("Add _New Items..."));
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (panel_window_menu_add_items), window);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- gtk_widget_show (image);
-
- /* customize panel */
- item = gtk_image_menu_item_new_with_mnemonic (_("Panel Pr_eferences..."));
- g_signal_connect_swapped (G_OBJECT (item), "activate",
- G_CALLBACK (panel_preferences_dialog_show), window);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
-
- image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- gtk_widget_show (image);
-
- item = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
+ if (!panel_window_get_locked (window))
+ {
+ /* add new items */
+ item = gtk_image_menu_item_new_with_mnemonic (_("Add _New Items..."));
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (panel_item_dialog_show), window);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_show (image);
+
+ /* customize panel */
+ item = gtk_image_menu_item_new_with_mnemonic (_("Panel Pr_eferences..."));
+ g_signal_connect_swapped (G_OBJECT (item), "activate",
+ G_CALLBACK (panel_preferences_dialog_show), window);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_show (image);
+
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+ }
/* quit item */
item = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
@@ -2227,6 +2225,9 @@ panel_window_set_povider_info (PanelWindow *window,
panel_window_set_plugin_orientation (provider, window);
panel_window_set_plugin_screen_position (provider, window);
+ xfce_panel_plugin_provider_set_locked (XFCE_PANEL_PLUGIN_PROVIDER (provider),
+ panel_window_get_locked (window));
+
if (PANEL_BASE_WINDOW (window)->background_alpha < 1.0)
{
if (PANEL_IS_PLUGIN_EXTERNAL (provider))
@@ -2269,3 +2270,24 @@ panel_window_thaw_autohide (PanelWindow *window)
&& window->autohide_state != AUTOHIDE_DISABLED)
panel_window_autohide_queue (window, AUTOHIDE_POPDOWN);
}
+
+
+
+void
+panel_window_set_locked (PanelWindow *window,
+ gboolean locked)
+{
+ panel_return_if_fail (PANEL_IS_WINDOW (window));
+
+ window->locked = locked;
+}
+
+
+
+gboolean
+panel_window_get_locked (PanelWindow *window)
+{
+ panel_return_val_if_fail (PANEL_IS_WINDOW (window), TRUE);
+
+ return window->locked;
+}
diff --git a/panel/panel-window.h b/panel/panel-window.h
index 81155d7..5150c74 100644
--- a/panel/panel-window.h
+++ b/panel/panel-window.h
@@ -44,6 +44,11 @@ void panel_window_freeze_autohide (PanelWindow *window);
void panel_window_thaw_autohide (PanelWindow *window);
+void panel_window_set_locked (PanelWindow *window,
+ gboolean locked);
+
+gboolean panel_window_get_locked (PanelWindow *window);
+
G_END_DECLS
#endif /* !__PANEL_WINDOW_H__ */
diff --git a/wrapper/main.c b/wrapper/main.c
index c4e5fdd..00124c3 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -93,6 +93,8 @@ wrapper_gproxy_set (DBusGProxy *dbus_gproxy,
xfce_panel_plugin_provider_set_orientation (provider, g_value_get_uint (value));
else if (strcmp (property, SIGNAL_SET_SCREEN_POSITION) == 0)
xfce_panel_plugin_provider_set_screen_position (provider, g_value_get_uint (value));
+ else if (strcmp (property, SIGNAL_SET_LOCKED) == 0)
+ xfce_panel_plugin_provider_set_locked (provider, g_value_get_boolean (value));
else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_ALPHA) == 0)
{
plug = g_object_get_qdata (G_OBJECT (provider), plug_quark);
More information about the Xfce4-commits
mailing list