Custom statusbar

The statusbar is created since a separate widget class and has three
different labels (settable through properties) for CPU, memory and
number of processes. This makes it more convenient to change one or
another value and it gives a nicer look.
This commit is contained in:
Mike Massonnet
2010-04-29 00:45:53 +02:00
parent cc6dbd8373
commit b83eb75002
5 changed files with 186 additions and 50 deletions

145
src/process-statusbar.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* Copyright (c) 2010 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.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib-object.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include "process-statusbar.h"
enum
{
PROP_CPU = 1,
PROP_MEMORY,
PROP_NUM_PROCESSES,
};
typedef struct _XtmProcessStatusbarClass XtmProcessStatusbarClass;
struct _XtmProcessStatusbarClass
{
GtkStatusbarClass parent_class;
};
struct _XtmProcessStatusbar
{
GtkStatusbar parent;
/*<private>*/
GtkWidget * label_num_processes;
GtkWidget * label_cpu;
GtkWidget * label_memory;
gushort cpu;
guint64 memory;
guint num_processes;
};
G_DEFINE_TYPE (XtmProcessStatusbar, xtm_process_statusbar, GTK_TYPE_STATUSBAR)
static void xtm_process_statusbar_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
static void
xtm_process_statusbar_class_init (XtmProcessStatusbarClass *klass)
{
GObjectClass *class = G_OBJECT_CLASS (klass);
xtm_process_statusbar_parent_class = g_type_class_peek_parent (klass);
class->set_property = xtm_process_statusbar_set_property;
g_object_class_install_property (class, PROP_CPU,
g_param_spec_uint ("cpu", "CPU", "CPU usage", 0, 100, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE));
g_object_class_install_property (class, PROP_MEMORY,
g_param_spec_uint64 ("memory", "Memory", "Memory usage", 0, G_MAXUINT64, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE));
g_object_class_install_property (class, PROP_NUM_PROCESSES,
g_param_spec_uint ("num-processes", "NumProcesses", "Number of processes", 0, G_MAXUINT, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE));
}
static void
xtm_process_statusbar_init (XtmProcessStatusbar *statusbar)
{
GtkWidget *area, *hbox;
#if GTK_CHECK_VERSION(2,20,0)
area = gtk_statusbar_get_message_area (GTK_STATUSBAR (statusbar));
#else
{
GtkShadowType shadow_type;
GtkWidget *frame;
gtk_widget_style_get (GTK_WIDGET (statusbar), "shadow-type", &shadow_type, NULL);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), shadow_type);
gtk_box_pack_start (GTK_BOX (statusbar), frame, TRUE, TRUE, 0);
area = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (frame), area);
gtk_widget_show_all (frame);
}
#endif
hbox = gtk_hbox_new (FALSE, 24);
gtk_box_pack_start (GTK_BOX (area), hbox, TRUE, TRUE, 0);
statusbar->label_num_processes = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->label_num_processes, FALSE, FALSE, 0);
statusbar->label_cpu = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->label_cpu, FALSE, FALSE, 0);
statusbar->label_memory = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox), statusbar->label_memory, FALSE, FALSE, 0);
gtk_widget_show_all (hbox);
}
static void
xtm_process_statusbar_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
{
XtmProcessStatusbar *statusbar = XTM_PROCESS_STATUSBAR (object);
gchar *text;
switch (property_id)
{
case PROP_CPU:
statusbar->cpu = g_value_get_uint (value);
text = g_strdup_printf (_("CPU: %d%%"), statusbar->cpu);
gtk_label_set_text (GTK_LABEL (statusbar->label_cpu), text);
g_free (text);
break;
case PROP_MEMORY:
statusbar->memory = g_value_get_uint64 (value);
text = g_strdup_printf (_("Memory: %d%%"), statusbar->memory);
gtk_label_set_text (GTK_LABEL (statusbar->label_memory), text);
g_free (text);
break;
case PROP_NUM_PROCESSES:
statusbar->num_processes = g_value_get_uint (value);
text = g_strdup_printf (_("Processes: %d"), statusbar->num_processes);
gtk_label_set_text (GTK_LABEL (statusbar->label_num_processes), text);
g_free (text);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
GtkWidget *
xtm_process_statusbar_new ()
{
return g_object_new (XTM_TYPE_PROCESS_STATUSBAR, NULL);
}