[Xfce4-commits] <xfce4-notifyd:master> add support for the 'value' hint to show a gauge
Brian J. Tarricone
noreply at xfce.org
Sat Oct 31 11:12:03 CET 2009
Updating branch refs/heads/master
to 5857f821ba4b0c1ea03ec11b7494c8e42af54aeb (commit)
from f756d429ce3737874b9e8eb32791520cce871320 (commit)
commit 5857f821ba4b0c1ea03ec11b7494c8e42af54aeb
Author: Brian J. Tarricone <brian at tarricone.org>
Date: Sat Oct 31 02:59:16 2009 -0700
add support for the 'value' hint to show a gauge
xfce4-notifyd/xfce-notify-daemon.c | 9 +++-
xfce4-notifyd/xfce-notify-window.c | 90 ++++++++++++++++++++++++++++++++++--
xfce4-notifyd/xfce-notify-window.h | 4 ++
3 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/xfce4-notifyd/xfce-notify-daemon.c b/xfce4-notifyd/xfce-notify-daemon.c
index 749865c..a7f99b1 100644
--- a/xfce4-notifyd/xfce-notify-daemon.c
+++ b/xfce4-notifyd/xfce-notify-daemon.c
@@ -305,7 +305,7 @@ notify_notify(XfceNotifyDaemon *xndaemon,
{
XfceNotifyWindow *window;
GdkPixbuf *pix;
- GValue *urgency_data;
+ GValue *urgency_data, *value_data;
if((urgency_data = g_hash_table_lookup(hints, "urgency"))
&& G_VALUE_HOLDS(urgency_data, G_TYPE_UCHAR)
@@ -404,6 +404,13 @@ notify_notify(XfceNotifyDaemon *xndaemon,
else
xfce_notify_window_set_icon_only(window, FALSE);
+ if((value_data = g_hash_table_lookup(hints, "value"))
+ && G_VALUE_HOLDS_INT(value_data))
+ {
+ xfce_notify_window_set_gauge_value(window, g_value_get_int(value_data));
+ } else
+ xfce_notify_window_unset_gauge_value(window);
+
gtk_widget_realize(GTK_WIDGET(window));
xfce_notify_daemon_window_size_allocate(GTK_WIDGET(window),
>K_WIDGET(window)->allocation,
diff --git a/xfce4-notifyd/xfce-notify-window.c b/xfce4-notifyd/xfce-notify-window.c
index f235442..98efa08 100644
--- a/xfce4-notifyd/xfce-notify-window.c
+++ b/xfce4-notifyd/xfce-notify-window.c
@@ -58,11 +58,15 @@ struct _XfceNotifyWindow
gdouble normal_opacity;
guint32 fade_transparent:1,
- icon_only:1;
+ icon_only:1,
+ has_summary_text:1,
+ has_body_text:1,
+ has_actions;
GtkWidget *icon_box;
GtkWidget *icon;
GtkWidget *content_box;
+ GtkWidget *gauge;
GtkWidget *summary;
GtkWidget *body;
GtkWidget *button_box;
@@ -977,10 +981,13 @@ xfce_notify_window_set_summary(XfceNotifyWindow *window,
g_return_if_fail(XFCE_IS_NOTIFY_WINDOW(window));
gtk_label_set_text(GTK_LABEL(window->summary), summary);
- if(summary && *summary)
+ if(summary && *summary) {
gtk_widget_show(window->summary);
- else
+ window->has_summary_text = TRUE;
+ } else {
gtk_widget_hide(window->summary);
+ window->has_summary_text = FALSE;
+ }
if(window->bg_path) {
cairo_path_destroy(window->bg_path);
@@ -1007,9 +1014,11 @@ xfce_notify_window_set_body(XfceNotifyWindow *window,
#endif
gtk_widget_show(window->body);
g_free(markup);
+ window->has_body_text = TRUE;
} else {
gtk_label_set_markup(GTK_LABEL(window->body), "");
gtk_widget_hide(window->body);
+ window->has_body_text = FALSE;
}
if(window->bg_path) {
@@ -1138,10 +1147,13 @@ xfce_notify_window_set_actions(XfceNotifyWindow *window,
gtk_widget_destroy(GTK_WIDGET(l->data));
g_list_free(children);
- if(!actions)
+ if(!actions) {
gtk_widget_hide(window->button_box);
- else
+ window->has_actions = FALSE;
+ } else {
gtk_widget_show(window->button_box);
+ window->has_actions = TRUE;
+ }
for(i = 0; actions && actions[i]; i += 2) {
const gchar *cur_action_id = actions[i];
@@ -1263,6 +1275,74 @@ xfce_notify_window_set_icon_only(XfceNotifyWindow *window,
}
void
+xfce_notify_window_set_gauge_value(XfceNotifyWindow *window,
+ gint value)
+{
+ g_return_if_fail(XFCE_IS_NOTIFY_WINDOW(window));
+
+ /* maybe want to do some kind of effect if the value is out of bounds */
+ if(value > 100)
+ value = 100;
+ else if(value < 0)
+ value = 0;
+
+ gtk_widget_hide(window->summary);
+ gtk_widget_hide(window->body);
+ gtk_widget_hide(window->button_box);
+
+ if(!window->gauge) {
+ GtkWidget *align;
+ gint width;
+
+ if(GTK_WIDGET_VISIBLE(window->icon)) {
+ /* size the pbar in relation to the icon */
+ GtkRequisition req;
+
+ gtk_widget_realize(window->icon);
+ gtk_widget_size_request(window->icon, &req);
+ width = req.width * 4;
+ } else {
+ /* FIXME: do something less arbitrary */
+ width = 120;
+ }
+
+ align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
+ gtk_widget_show(align);
+ gtk_box_pack_start(GTK_BOX(window->content_box), align, TRUE, TRUE, 0);
+
+ window->gauge = gtk_progress_bar_new();
+ gtk_widget_set_size_request(window->gauge, width, -1);
+ gtk_widget_show(window->gauge);
+ gtk_container_add(GTK_CONTAINER(align), window->gauge);
+ }
+
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(window->gauge),
+ value / 100.0);
+}
+
+void
+xfce_notify_window_unset_gauge_value(XfceNotifyWindow *window)
+{
+ g_return_if_fail(XFCE_IS_NOTIFY_WINDOW(window));
+
+ if(window->gauge) {
+ GtkWidget *align = gtk_widget_get_parent(window->gauge);
+
+ g_assert(align);
+
+ gtk_widget_destroy(align);
+ window->gauge = NULL;
+
+ if(window->has_summary_text)
+ gtk_widget_show(window->summary);
+ if(window->has_body_text)
+ gtk_widget_show(window->body);
+ if(window->has_actions)
+ gtk_widget_show(window->button_box);
+ }
+}
+
+void
xfce_notify_window_closed(XfceNotifyWindow *window,
XfceNotifyCloseReason reason)
{
diff --git a/xfce4-notifyd/xfce-notify-window.h b/xfce4-notifyd/xfce-notify-window.h
index f0fad4d..5dc4572 100644
--- a/xfce4-notifyd/xfce-notify-window.h
+++ b/xfce4-notifyd/xfce-notify-window.h
@@ -80,6 +80,10 @@ gdouble xfce_notify_window_get_opacity(XfceNotifyWindow *window);
void xfce_notify_window_set_icon_only(XfceNotifyWindow *window,
gboolean icon_only);
+void xfce_notify_window_set_gauge_value(XfceNotifyWindow *window,
+ gint value);
+void xfce_notify_window_unset_gauge_value(XfceNotifyWindow *window);
+
/* signal trigger */
void xfce_notify_window_closed(XfceNotifyWindow *window,
XfceNotifyCloseReason reason);
More information about the Xfce4-commits
mailing list