xfce4-speed-plugin/panel-plugin/monitor-label.c

138 lines
3.4 KiB
C
Raw Normal View History

/*
* Copyright (c) 2012 Mike Massonnet <mmassonnet@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);
}