Author: jasper Date: 2006-12-26 20:55:16 +0000 (Tue, 26 Dec 2006) New Revision: 24194
Modified: xfce4-panel/trunk/plugins/iconbox/iconbox.c Log: Implement blinking for urgent windows in the iconbox. Modified: xfce4-panel/trunk/plugins/iconbox/iconbox.c =================================================================== --- xfce4-panel/trunk/plugins/iconbox/iconbox.c 2006-12-26 20:46:16 UTC (rev 24193) +++ xfce4-panel/trunk/plugins/iconbox/iconbox.c 2006-12-26 20:55:16 UTC (rev 24194) @@ -35,6 +35,7 @@ #define N_ICONBOX_CONNECTIONS 4 #define N_ICON_CONNECTIONS 4 +#define URGENT_TIMEOUT 500 typedef struct { @@ -69,6 +70,7 @@ GtkWidget *button; GtkWidget *image; gboolean was_minimized; + guint urgent_id; } Icon; @@ -113,8 +115,10 @@ (netk_window_get_screen (icon->window)); } - if (icon->ib->all_workspaces || netk_window_is_sticky (icon->window) || - ws == netk_window_get_workspace (icon->window)) + if (icon->ib->all_workspaces + || netk_window_is_sticky (icon->window) + || ws == netk_window_get_workspace (icon->window) + || netk_window_or_transient_demands_attention (icon->window)) { gtk_widget_show (icon->button); } @@ -185,6 +189,75 @@ update_visibility (icon, NULL); } +/* blinking */ +static void +update_blink (Icon *icon, gboolean blink) +{ + GtkStyle *style; + GtkRcStyle *mod; + GdkColor c; + + style = gtk_widget_get_style (icon->button); + mod = gtk_widget_get_modifier_style (icon->button); + c = style->bg[GTK_STATE_SELECTED]; + + if (blink) + { + gtk_button_set_relief (GTK_BUTTON (icon->button), GTK_RELIEF_NORMAL); + + if(mod->color_flags[GTK_STATE_NORMAL] & GTK_RC_BG) + { + mod->color_flags[GTK_STATE_NORMAL] &= ~(GTK_RC_BG); + gtk_widget_modify_style(icon->button, mod); + } + else + { + mod->color_flags[GTK_STATE_NORMAL] |= GTK_RC_BG; + mod->bg[GTK_STATE_NORMAL] = c; + gtk_widget_modify_style(icon->button, mod); + } + } + else + { + gtk_button_set_relief (GTK_BUTTON (icon->button), GTK_RELIEF_NONE); + mod->color_flags[GTK_STATE_NORMAL] &= ~(GTK_RC_BG); + gtk_widget_modify_style(icon->button, mod); + } +} + +static gboolean +urgent_timeout (Icon *icon) +{ + update_visibility (icon, NULL); + update_blink (icon, TRUE); + return TRUE;; +} + +static void +queue_urgent_timeout (Icon *icon) +{ + if (icon->urgent_id == 0) + { + icon->urgent_id = + g_timeout_add (URGENT_TIMEOUT, (GSourceFunc)urgent_timeout, icon); + } +} + +static void +unqueue_urgent_timeout (Icon *icon) +{ + if (icon->urgent_id > 0) + { + g_source_remove (icon->urgent_id); + icon->urgent_id = 0; + if (icon->button) + { + update_blink (icon, FALSE); + update_visibility (icon, NULL); + } + } +} + /* callbacks */ static gboolean icon_button_pressed (GtkWidget *button, GdkEventButton *ev, gpointer data) @@ -248,6 +321,19 @@ { Icon *icon = (Icon *)data; + if (changed_mask & NETK_WINDOW_STATE_DEMANDS_ATTENTION + || changed_mask & NETK_WINDOW_STATE_URGENT) + { + if (netk_window_or_transient_demands_attention (window)) + { + queue_urgent_timeout (icon); + } + else + { + unqueue_urgent_timeout (icon); + } + } + if (changed_mask & NETK_WINDOW_STATE_MINIMIZED) { update_visibility (icon, NULL); @@ -287,6 +373,8 @@ { int i; + unqueue_urgent_timeout (icon); + for (i = 0; i < N_ICON_CONNECTIONS; i++) { if (icon->connections[i]) @@ -419,6 +507,7 @@ if (window == icon->window) { gtk_widget_destroy (icon->button); + icon->button = NULL; icon_destroy (icon); ib->iconlist = g_slist_delete_link (ib->iconlist, l); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits