[Xfce4-commits] <xfce4-netload-plugin:master> Bug 8842: Update monitor labels sizes gracefully
Mike Massonnet
noreply at xfce.org
Sun Jul 15 14:46:02 CEST 2012
Updating branch refs/heads/master
to dd0c73ff94c9697760831a13f0d12cbb33f5cabf (commit)
from 005d94bf49ff66fca30c35d1ce8ee79fe63a2788 (commit)
commit dd0c73ff94c9697760831a13f0d12cbb33f5cabf
Author: Mike Massonnet <mmassonnet at gmail.com>
Date: Sun Jul 15 14:30:51 2012 +0200
Bug 8842: Update monitor labels sizes gracefully
New label class XnlpMonitorLabel that sets the requisition size
dynamically, in order to avoid flickering in the panel.
This class is only useful for labels that change periodically.
When the 10 last changes requested a smaller size than the actual
it will adapt to this new size.
panel-plugin/Makefile.am | 14 +++--
panel-plugin/monitor-label.c | 137 ++++++++++++++++++++++++++++++++++++++++++
panel-plugin/monitor-label.h | 36 +++++++++++
panel-plugin/netload.c | 16 ++---
4 files changed, 187 insertions(+), 16 deletions(-)
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
index 2163277..92e1d26 100644
--- a/panel-plugin/Makefile.am
+++ b/panel-plugin/Makefile.am
@@ -5,13 +5,15 @@ LIBS = @LIBS@ @SOLLIBS@
xfce4_netload_plugin_SOURCES = \
netload.c \
- utils.c \
- utils.h \
+ monitor-label.c \
+ monitor-label.h \
+ utils.c \
+ utils.h \
net.h \
- net.c \
- os.h \
- wormulon.h \
- global.h \
+ net.c \
+ os.h \
+ wormulon.h \
+ global.h \
slurm.h
xfce4_netload_plugin_CFLAGS = \
diff --git a/panel-plugin/monitor-label.c b/panel-plugin/monitor-label.c
new file mode 100644
index 0000000..0e0d409
--- /dev/null
+++ b/panel-plugin/monitor-label.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2012 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ * 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.
+ *
+ * See the file COPYING for the full license text.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "monitor-label.h"
+
+
+
+typedef struct _XnlpMonitorLabelClass XnlpMonitorLabelClass;
+struct _XnlpMonitorLabelClass
+{
+ GtkLabelClass parent_class;
+};
+struct _XnlpMonitorLabel
+{
+ GtkLabel parent;
+ /*<private>*/
+ gint count_width;
+ gint count_height;
+ gint width;
+ gint height;
+};
+
+G_DEFINE_TYPE (XnlpMonitorLabel, xnlp_monitor_label, GTK_TYPE_LABEL)
+
+static void xnlp_monitor_label_constructed (GObject *object);
+
+static void cb_label_changed (GObject *object,
+ GParamSpec *pspec,
+ gpointer user_data);
+
+
+
+static void
+xnlp_monitor_label_class_init (XnlpMonitorLabelClass *klass)
+{
+ GObjectClass *class = G_OBJECT_CLASS (klass);
+ xnlp_monitor_label_parent_class = g_type_class_peek_parent (klass);
+}
+
+static void
+xnlp_monitor_label_init (XnlpMonitorLabel *label)
+{
+ label->count_width = 0;
+ label->count_height = 0;
+ label->width = 0;
+ label->height = 0;
+
+ g_signal_connect (label, "notify::label", G_CALLBACK (cb_label_changed), NULL);
+}
+
+
+
+static void
+cb_label_changed (GObject *object, GParamSpec *pspec, gpointer user_data)
+{
+ XnlpMonitorLabel *label = XNLP_MONITOR_LABEL (object);
+ GtkWidget *widget = GTK_WIDGET (object);
+ GtkRequisition req;
+
+ gtk_widget_set_size_request (widget, -1, -1);
+ gtk_widget_size_request (widget, &req);
+
+ if (req.width >= label->width)
+ {
+ label->width = req.width;
+ label->count_width = 0;
+ }
+ else if (label->count_width > 10)
+ {
+ label->width = req.width;
+ label->count_width = 0;
+ }
+ else
+ {
+ req.width = label->width;
+ label->count_width++;
+ }
+
+ if (req.height >= label->height)
+ {
+ label->height = req.height;
+ label->count_height = 0;
+ }
+ else if (label->count_height > 10)
+ {
+ label->height = req.height;
+ label->count_height = 0;
+ }
+ else
+ {
+ req.height = label->height;
+ label->count_height++;
+ }
+
+ gtk_widget_set_size_request (label, req.width, req.height);
+}
+
+
+
+GtkWidget *
+xnlp_monitor_label_new (const gchar *str)
+{
+ GtkLabel *label;
+
+ label = g_object_new (XNLP_TYPE_MONITOR_LABEL, NULL);
+
+ if (str && *str)
+ gtk_label_set_text (label, str);
+
+ return GTK_WIDGET (label);
+}
+
+void
+xnlp_monitor_label_reinit_size_request (XnlpMonitorLabel *label)
+{
+ label->count_width = 0;
+ label->count_height = 0;
+ label->width = 0;
+ label->height = 0;
+
+ gtk_widget_set_size_request (label, -1, -1);
+}
+
diff --git a/panel-plugin/monitor-label.h b/panel-plugin/monitor-label.h
new file mode 100644
index 0000000..4f8e267
--- /dev/null
+++ b/panel-plugin/monitor-label.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2012 Mike Massonnet <mmassonnet at xfce.org>
+ *
+ * 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.
+ *
+ * See the file COPYING for the full license text.
+ */
+
+#ifndef MONITOR_LABEL_H
+#define MONITOR_LABEL_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#define XNLP_TYPE_MONITOR_LABEL (xnlp_monitor_label_get_type ())
+#define XNLP_MONITOR_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XNLP_TYPE_MONITOR_LABEL, XnlpMonitorLabel))
+#define XNLP_MONITOR_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XNLP_TYPE_MONITOR_LABEL, XnlpMonitorLabelClass))
+#define XNLP_IS_MONITOR_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XNLP_TYPE_MONITOR_LABEL))
+#define XNLP_IS_MONITOR_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XNLP_TYPE_MONITOR_LABEL))
+#define XNLP_MONITOR_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XNLP_TYPE_MONITOR_LABEL, XnlpMonitorLabelClass))
+
+typedef struct _XnlpMonitorLabel XnlpMonitorLabel;
+
+GType xnlp_monitor_label_get_type (void);
+GtkWidget * xnlp_monitor_label_new (const gchar *str);
+void xnlp_monitor_label_reinit_size_request (XnlpMonitorLabel *label);
+
+#endif /* !MONITOR_LABEL_H */
+
diff --git a/panel-plugin/netload.c b/panel-plugin/netload.c
index 20480b0..015ff06 100644
--- a/panel-plugin/netload.c
+++ b/panel-plugin/netload.c
@@ -33,9 +33,10 @@
#include <libxfce4ui/libxfce4ui.h>
#include <libxfce4panel/libxfce4panel.h>
+#include "monitor-label.h"
+
#define BORDER 8
-#define LABEL_SIZE 60
/* Defaults */
#define DEFAULT_TEXT "Net"
@@ -258,7 +259,6 @@ static gboolean update_monitors(t_global_monitor *global)
{
g_snprintf(received, sizeof(received), "%s", buffer_panel[IN]);
gtk_label_set_text(GTK_LABEL(global->monitor->rcv_label), received);
-
g_snprintf(sent, sizeof(sent), "%s", buffer_panel[OUT]);
gtk_label_set_text(GTK_LABEL(global->monitor->sent_label), sent);
}
@@ -297,27 +297,23 @@ static gboolean monitor_set_size(XfcePanelPlugin *plugin, int size, t_global_mon
{
for (i = 0; i < SUM; i++)
gtk_widget_set_size_request(GTK_WIDGET(global->monitor->status[i]), BORDER, BORDER);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->rcv_label), -1, -1);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->sent_label), -1, -1);
gtk_widget_set_size_request(GTK_WIDGET(plugin), size, -1);
}
else if (mode == XFCE_PANEL_PLUGIN_MODE_VERTICAL)
{
for (i = 0; i < SUM; i++)
gtk_widget_set_size_request(GTK_WIDGET(global->monitor->status[i]), -1, BORDER);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->rcv_label), -1, LABEL_SIZE);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->sent_label), -1, LABEL_SIZE);
gtk_widget_set_size_request(GTK_WIDGET(plugin), size, -1);
}
else /* mode == XFCE_PANEL_PLUGIN_MODE_HORIZONTAL */
{
for (i = 0; i < SUM; i++)
gtk_widget_set_size_request(GTK_WIDGET(global->monitor->status[i]), BORDER, -1);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->rcv_label), LABEL_SIZE, -1);
- gtk_widget_set_size_request(GTK_WIDGET(global->monitor->sent_label), LABEL_SIZE, -1);
gtk_widget_set_size_request(GTK_WIDGET(plugin), -1, size);
}
+ xnlp_monitor_label_reinit_size_request(XNLP_MONITOR_LABEL(global->monitor->rcv_label));
+ xnlp_monitor_label_reinit_size_request(XNLP_MONITOR_LABEL(global->monitor->sent_label));
gtk_container_set_border_width(GTK_CONTAINER(global->box), size > 26 ? 2 : 1);
return TRUE;
@@ -469,8 +465,8 @@ static t_global_monitor * monitor_new(XfcePanelPlugin *plugin)
TRUE, FALSE, 2);
/* Create sent and received labels */
- global->monitor->rcv_label = gtk_label_new("-");
- global->monitor->sent_label = gtk_label_new("-");
+ global->monitor->rcv_label = xnlp_monitor_label_new("-");
+ global->monitor->sent_label = xnlp_monitor_label_new("-");
gtk_box_pack_start(GTK_BOX(global->box),
GTK_WIDGET(global->monitor->rcv_label),
TRUE, FALSE, 2);
More information about the Xfce4-commits
mailing list