[Xfce4-commits] <xfce4-panel:devel> Implement urgentcy notification enable/disable in the window menu plugin.
Nick Schermer
nick at xfce.org
Tue Aug 11 20:30:39 CEST 2009
Updating branch refs/heads/devel
to ca1061f6b2bb6cbaf7951dd05692bc55bf822864 (commit)
from 962557a406eba0b2d77357afe55ad28adc0c4e75 (commit)
commit ca1061f6b2bb6cbaf7951dd05692bc55bf822864
Author: Nick Schermer <nick at xfce.org>
Date: Fri Mar 20 20:45:58 2009 +0100
Implement urgentcy notification enable/disable in the window menu plugin.
plugins/windowmenu/windowmenu-dialog.glade | 1 -
plugins/windowmenu/windowmenu.c | 150 +++++++++++++++++++++-------
2 files changed, 113 insertions(+), 38 deletions(-)
diff --git a/plugins/windowmenu/windowmenu-dialog.glade b/plugins/windowmenu/windowmenu-dialog.glade
index ebad67e..fcc97c5 100644
--- a/plugins/windowmenu/windowmenu-dialog.glade
+++ b/plugins/windowmenu/windowmenu-dialog.glade
@@ -97,7 +97,6 @@
<object class="GtkCheckButton" id="urgentcy-notification">
<property name="label" translatable="yes">Enable _urgency notification</property>
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
diff --git a/plugins/windowmenu/windowmenu.c b/plugins/windowmenu/windowmenu.c
index 555eb89..05156be 100644
--- a/plugins/windowmenu/windowmenu.c
+++ b/plugins/windowmenu/windowmenu.c
@@ -114,6 +114,9 @@ static void window_menu_plugin_window_opened (WnckScreen *s
static void window_menu_plugin_window_closed (WnckScreen *screen,
WnckWindow *window,
WindowMenuPlugin *plugin);
+static void window_menu_plugin_windows_disconnect (WindowMenuPlugin *plugin);
+static void window_menu_plugin_windows_connect (WindowMenuPlugin *plugin,
+ gboolean traverse_windows);
static gboolean window_menu_plugin_button_press_event (GtkWidget *button,
GdkEventButton *event,
WindowMenuPlugin *plugin);
@@ -207,10 +210,6 @@ window_menu_plugin_init (WindowMenuPlugin *plugin)
/* show configure */
xfce_panel_plugin_menu_show_configure (XFCE_PANEL_PLUGIN (plugin));
- /* monitor screen changes */
- g_signal_connect (G_OBJECT (plugin), "screen-changed",
- G_CALLBACK (window_menu_plugin_screen_changed), NULL);
-
/* create the widgets */
plugin->button = xfce_arrow_button_new (GTK_ARROW_NONE);
xfce_panel_plugin_add_action_widget (XFCE_PANEL_PLUGIN (plugin), plugin->button);
@@ -272,23 +271,25 @@ window_menu_plugin_set_property (GObject *object,
WindowMenuPlugin *plugin = XFCE_WINDOW_MENU_PLUGIN (object);
XfcePanelPlugin *panel_plugin = XFCE_PANEL_PLUGIN (object);
guint button_style;
+ gboolean urgentcy_notification;
+
+ panel_return_if_fail (XFCE_IS_WINDOW_MENU_PLUGIN (plugin));
switch (prop_id)
{
case PROP_STYLE:
button_style = g_value_get_uint (value);
-
- /* show or hide the icon */
- if (button_style == BUTTON_STYLE_ICON)
- gtk_widget_show (plugin->icon);
- else
- gtk_widget_hide (plugin->icon);
-
if (plugin->button_style != button_style)
{
/* set new value */
plugin->button_style = button_style;
+ /* show or hide the icon */
+ if (button_style == BUTTON_STYLE_ICON)
+ gtk_widget_show (plugin->icon);
+ else
+ gtk_widget_hide (plugin->icon);
+
/* update the plugin */
window_menu_plugin_size_changed (panel_plugin,
xfce_panel_plugin_get_size (panel_plugin));
@@ -308,7 +309,21 @@ window_menu_plugin_set_property (GObject *object,
break;
case PROP_URGENTCY_NOTIFICATION:
- plugin->urgentcy_notification = g_value_get_boolean (value);
+ urgentcy_notification = g_value_get_boolean (value);
+ if (plugin->urgentcy_notification != urgentcy_notification)
+ {
+ /* set new value */
+ plugin->urgentcy_notification = urgentcy_notification;
+
+ if (plugin->screen != NULL)
+ {
+ /* (dis)connect window signals */
+ if (plugin->urgentcy_notification)
+ window_menu_plugin_windows_connect (plugin, TRUE);
+ else
+ window_menu_plugin_windows_disconnect (plugin);
+ }
+ }
break;
case PROP_ALL_WORKSPACES:
@@ -343,13 +358,12 @@ window_menu_plugin_screen_changed (GtkWidget *widget,
if (G_UNLIKELY (plugin->screen != NULL))
{
+ /* disconnect from all windows on the old screen */
+ window_menu_plugin_windows_disconnect (plugin);
+
/* disconnect from the previous screen */
g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
window_menu_plugin_active_window_changed, plugin);
- g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
- window_menu_plugin_window_opened, plugin);
- g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
- window_menu_plugin_window_closed, plugin);
}
/* set the new screen */
@@ -358,10 +372,9 @@ window_menu_plugin_screen_changed (GtkWidget *widget,
/* connect signal to monitor this screen */
g_signal_connect (G_OBJECT (plugin->screen), "active-window-changed",
G_CALLBACK (window_menu_plugin_active_window_changed), plugin);
- g_signal_connect (G_OBJECT (plugin->screen), "window-opened",
- G_CALLBACK (window_menu_plugin_window_opened), plugin);
- g_signal_connect (G_OBJECT (plugin->screen), "window-closed",
- G_CALLBACK (window_menu_plugin_window_closed), plugin);
+
+ if (plugin->urgentcy_notification)
+ window_menu_plugin_windows_connect (plugin, FALSE);
}
@@ -389,6 +402,13 @@ window_menu_plugin_construct (XfcePanelPlugin *panel_plugin)
xfconf_g_property_bind (plugin->channel, "/all-workspaces",
G_TYPE_BOOLEAN, plugin, "all-workspaces");
+ /* monitor screen changes */
+ g_signal_connect (G_OBJECT (plugin), "screen-changed",
+ G_CALLBACK (window_menu_plugin_screen_changed), NULL);
+
+ /* initialize the screen */
+ window_menu_plugin_screen_changed (GTK_WIDGET (plugin), NULL);
+
/* show the button */
gtk_widget_show (plugin->button);
}
@@ -407,12 +427,12 @@ window_menu_plugin_free_data (XfcePanelPlugin *panel_plugin)
/* disconnect from the screen */
if (G_LIKELY (plugin->screen != NULL))
{
+ /* disconnect from all windows */
+ window_menu_plugin_windows_disconnect (plugin);
+
+ /* disconnect from the screen */
g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
window_menu_plugin_active_window_changed, plugin);
- g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
- window_menu_plugin_window_opened, plugin);
- g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
- window_menu_plugin_window_closed, plugin);
/* unset the screen */
plugin->screen = NULL;
@@ -439,7 +459,8 @@ window_menu_plugin_screen_position_changed (XfcePanelPlugin *panel_plugin,
if (plugin->button_style == BUTTON_STYLE_ARROW)
arrow_type = xfce_panel_plugin_arrow_type (panel_plugin);
- xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (plugin->button), arrow_type);
+ xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (plugin->button),
+ arrow_type);
}
@@ -569,6 +590,7 @@ window_menu_plugin_window_state_changed (WnckWindow *window,
panel_return_if_fail (XFCE_IS_WINDOW_MENU_PLUGIN (plugin));
panel_return_if_fail (WNCK_IS_WINDOW (window));
panel_return_if_fail (plugin->urgentcy_notification);
+ panel_return_if_fail (plugin->urgentcy_notification);
/* only response to urgency changes and urgency notify is enabled */
if (!PANEL_HAS_FLAG (changed_mask, URGENT_FLAGS))
@@ -585,7 +607,6 @@ window_menu_plugin_window_state_changed (WnckWindow *window,
xfce_arrow_button_set_blinking (XFCE_ARROW_BUTTON (plugin->button), TRUE);
else if (plugin->urgent_windows == 0)
xfce_arrow_button_set_blinking (XFCE_ARROW_BUTTON (plugin->button), FALSE);
-
}
@@ -599,10 +620,7 @@ window_menu_plugin_window_opened (WnckScreen *screen,
panel_return_if_fail (WNCK_IS_WINDOW (window));
panel_return_if_fail (WNCK_IS_SCREEN (screen));
panel_return_if_fail (plugin->screen == screen);
-
- /* leave when urgency notify is disabled */
- if (!plugin->urgentcy_notification)
- return;
+ panel_return_if_fail (plugin->urgentcy_notification);
/* monitor the window's state */
g_signal_connect (G_OBJECT (window), "state-changed",
@@ -625,10 +643,7 @@ window_menu_plugin_window_closed (WnckScreen *screen,
panel_return_if_fail (WNCK_IS_WINDOW (window));
panel_return_if_fail (WNCK_IS_SCREEN (screen));
panel_return_if_fail (plugin->screen == screen);
-
- /* leave when urgency notify is disabled */
- if (!plugin->urgentcy_notification)
- return;
+ panel_return_if_fail (plugin->urgentcy_notification);
/* check if we need to update the urgency counter */
if (wnck_window_needs_attention (window))
@@ -638,6 +653,67 @@ window_menu_plugin_window_closed (WnckScreen *screen,
+static void
+window_menu_plugin_windows_disconnect (WindowMenuPlugin *plugin)
+{
+ GList *windows, *li;
+
+ panel_return_if_fail (XFCE_IS_WINDOW_MENU_PLUGIN (plugin));
+ panel_return_if_fail (WNCK_IS_SCREEN (plugin->screen));
+
+ /* disconnect screen signals */
+ g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
+ window_menu_plugin_window_closed, plugin);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (plugin->screen),
+ window_menu_plugin_window_opened, plugin);
+
+ /* disconnect the state changed signal from all windows */
+ windows = wnck_screen_get_windows (plugin->screen);
+ for (li = windows; li != NULL; li = li->next)
+ {
+ panel_return_if_fail (WNCK_IS_WINDOW (li->data));
+ g_signal_handlers_disconnect_by_func (G_OBJECT (li->data),
+ window_menu_plugin_window_state_changed, plugin);
+ }
+
+ /* stop blinking */
+ plugin->urgent_windows = 0;
+ xfce_arrow_button_set_blinking (XFCE_ARROW_BUTTON (plugin->button), FALSE);
+}
+
+
+
+static void
+window_menu_plugin_windows_connect (WindowMenuPlugin *plugin,
+ gboolean traverse_windows)
+{
+ GList *windows, *li;
+
+ panel_return_if_fail (XFCE_IS_WINDOW_MENU_PLUGIN (plugin));
+ panel_return_if_fail (WNCK_IS_SCREEN (plugin->screen));
+ panel_return_if_fail (plugin->urgentcy_notification);
+
+ g_signal_connect (G_OBJECT (plugin->screen), "window-opened",
+ G_CALLBACK (window_menu_plugin_window_opened), plugin);
+ g_signal_connect (G_OBJECT (plugin->screen), "window-closed",
+ G_CALLBACK (window_menu_plugin_window_closed), plugin);
+
+ if (traverse_windows)
+ {
+ /* connect the state changed signal to all windows */
+ windows = wnck_screen_get_windows (plugin->screen);
+ for (li = windows; li != NULL; li = li->next)
+ {
+ panel_return_if_fail (WNCK_IS_WINDOW (li->data));
+ window_menu_plugin_window_opened (plugin->screen,
+ WNCK_WINDOW (li->data),
+ plugin);
+ }
+ }
+}
+
+
+
static gboolean
window_menu_plugin_button_press_event (GtkWidget *button,
GdkEventButton *event,
@@ -730,7 +806,7 @@ window_menu_plugin_menu_workspace_item_new (WnckWorkspace *workspace,
/* create fallback name if no name is set */
if (!IS_STRING (name))
name = name_num = g_strdup_printf (_("Workspace %d"),
- wnck_workspace_get_number (workspace) + 1);
+ wnck_workspace_get_number (workspace) + 1);
/* create the menu item */
mi = gtk_menu_item_new_with_label (name);
@@ -992,7 +1068,7 @@ window_menu_plugin_menu_new (WindowMenuPlugin *plugin)
gint urgent_windows = 0;
gboolean has_windows;
gboolean is_empty = TRUE;
- guint n_workspaces;
+ guint n_workspaces = 0;
const gchar *name = NULL;
gchar *utf8 = NULL, *label;
@@ -1027,7 +1103,7 @@ window_menu_plugin_menu_new (WindowMenuPlugin *plugin)
workspaces = &fake;
}
- for (lp = workspaces, n_workspaces = 0; lp != NULL; lp = lp->next, n_workspaces++)
+ for (lp = workspaces; lp != NULL; lp = lp->next, n_workspaces++)
{
workspace = WNCK_WORKSPACE (lp->data);
More information about the Xfce4-commits
mailing list