From aca137519199f1e20a995c57bf0759e5ad88dc78 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 8 Aug 2009 03:06:32 +0000 Subject: [PATCH] Added a CPU activity monitoring plugin (only works on NetBSD for now) --- src/applets/Makefile | 27 +++++++- src/applets/cpu.c | 136 +++++++++++++++++++++++++++++++++++++++ src/applets/project.conf | 8 ++- src/panel.c | 5 +- 4 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 src/applets/cpu.c diff --git a/src/applets/Makefile b/src/applets/Makefile index 3e706cd..abfa6bc 100644 --- a/src/applets/Makefile +++ b/src/applets/Makefile @@ -1,4 +1,4 @@ -TARGETS = clock.a clock.so lock.a lock.so logout.a logout.so main.a main.so +TARGETS = clock.a clock.so cpu.a cpu.so lock.a lock.so logout.a logout.so main.a main.so PREFIX = /usr/local DESTDIR = LIBDIR = $(PREFIX)/lib @@ -29,6 +29,17 @@ clock.a: $(clock_OBJS) clock.so: $(clock_OBJS) $(LD) -o clock.so -Wl,-soname,clock.so.0 $(clock_OBJS) +cpu_OBJS = cpu.o +cpu_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) +cpu_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) + +cpu.a: $(cpu_OBJS) + $(AR) cpu.a $(cpu_OBJS) + $(RANLIB) cpu.a + +cpu.so: $(cpu_OBJS) + $(LD) -o cpu.so -Wl,-soname,cpu.so.0 $(cpu_OBJS) + lock_OBJS = lock.o lock_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) lock_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) @@ -65,6 +76,9 @@ main.so: $(main_OBJS) clock.o: clock.c $(CC) $(clock_CFLAGS) -c clock.c +cpu.o: cpu.c + $(CC) $(cpu_CFLAGS) -c cpu.c + lock.o: lock.c $(CC) $(lock_CFLAGS) -c lock.c @@ -75,7 +89,7 @@ main.o: main.c $(CC) $(main_CFLAGS) -c main.c clean: - $(RM) $(clock_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) + $(RM) $(clock_OBJS) $(cpu_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) distclean: clean $(RM) $(TARGETS) @@ -87,6 +101,11 @@ install: all $(LN) -s clock.so.0.0 $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so.0 $(LN) -s clock.so.0.0 $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets + $(INSTALL) -m 0644 cpu.a $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.a + $(INSTALL) -m 0755 cpu.so $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so.0.0 + $(LN) -s cpu.so.0.0 $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so.0 + $(LN) -s cpu.so.0.0 $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so + $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets $(INSTALL) -m 0644 lock.a $(DESTDIR)$(LIBDIR)/Panel/applets/lock.a $(INSTALL) -m 0755 lock.so $(DESTDIR)$(LIBDIR)/Panel/applets/lock.so.0.0 $(LN) -s lock.so.0.0 $(DESTDIR)$(LIBDIR)/Panel/applets/lock.so.0 @@ -107,6 +126,10 @@ uninstall: $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so.0.0 $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so.0 $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/clock.so + $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.a + $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so.0.0 + $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so.0 + $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/cpu.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/lock.a $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/lock.so.0.0 $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/lock.so.0 diff --git a/src/applets/cpu.c b/src/applets/cpu.c new file mode 100644 index 0000000..b62d372 --- /dev/null +++ b/src/applets/cpu.c @@ -0,0 +1,136 @@ +/* $Id$ */ +/* Copyright (c) 2009 Pierre Pronchery */ +/* This file is part of DeforaOS Desktop Panel */ +/* 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, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#include +#include +#include +#include +#include +#ifdef __NetBSD__ +# include +#endif +#include "panel.h" +#include "../../config.h" + + +/* Cpu */ +/* private */ +/* types */ +typedef struct _Cpu +{ + GtkWidget * scale; + guint timeout; +#ifdef __NetBSD__ + int used; + int total; +#endif +} Cpu; + + +/* prototypes */ +static GtkWidget * _cpu_init(PanelApplet * applet); +static void _cpu_destroy(PanelApplet * applet); + +/* callbacks */ +static gboolean _on_timeout(gpointer data); + + +/* public */ +/* variables */ +PanelApplet applet = +{ + NULL, + _cpu_init, + _cpu_destroy, + PANEL_APPLET_POSITION_END, + NULL +}; + + +/* private */ +/* functions */ +/* cpu_init */ +static GtkWidget * _cpu_init(PanelApplet * applet) +{ + GtkWidget * ret; + Cpu * cpu; + PangoFontDescription * desc; + GtkWidget * widget; + + if((cpu = malloc(sizeof(*cpu))) == NULL) + return NULL; + applet->priv = cpu; + ret = gtk_hbox_new(FALSE, 0); + desc = pango_font_description_new(); + pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); + widget = gtk_label_new("CPU:"); + gtk_widget_modify_font(widget, desc); + gtk_box_pack_start(GTK_BOX(ret), widget, FALSE, FALSE, 0); + cpu->scale = gtk_vscale_new_with_range(0, 100, 1); + gtk_widget_set_sensitive(cpu->scale, FALSE); + gtk_range_set_inverted(GTK_RANGE(cpu->scale), TRUE); + gtk_scale_set_value_pos(GTK_SCALE(cpu->scale), GTK_POS_RIGHT); + gtk_box_pack_start(GTK_BOX(ret), cpu->scale, FALSE, FALSE, 0); + cpu->timeout = g_timeout_add(500, _on_timeout, cpu); +#ifdef __NetBSD__ + cpu->used = 0; + cpu->total = 0; +#endif + _on_timeout(cpu); + pango_font_description_free(desc); + return ret; +} + + +/* cpu_destroy */ +static void _cpu_destroy(PanelApplet * applet) +{ + Cpu * cpu = applet->priv; + + g_source_remove(cpu->timeout); + free(cpu); +} + + +/* callbacks */ +/* on_timeout */ +static gboolean _on_timeout(gpointer data) +{ +#ifdef __NetBSD__ + Cpu * cpu = data; + int mib[] = { CTL_KERN, KERN_CP_TIME }; + uint64_t cpu_time[CPUSTATES]; + size_t size = sizeof(cpu_time); + int used; + int total; + gdouble value; + + if(sysctl(mib, 2, &cpu_time, &size, NULL, 0) < 0) + return TRUE; + used = cpu_time[CP_USER] + cpu_time[CP_SYS] + cpu_time[CP_NICE] + + cpu_time[CP_INTR]; + total = used + cpu_time[CP_IDLE]; + if(cpu->used == 0) + value = 0; + else + value = 100 * (used - cpu->used) / (total - cpu->total); + cpu->used = used; + cpu->total = total; + gtk_range_set_value(GTK_RANGE(cpu->scale), value); +#endif + return TRUE; +} diff --git a/src/applets/project.conf b/src/applets/project.conf index 582d7be..4bee846 100644 --- a/src/applets/project.conf +++ b/src/applets/project.conf @@ -1,4 +1,4 @@ -targets=clock,lock,logout,main +targets=clock,cpu,lock,logout,main cppflags_force=-I ../../include cflags_force=`pkg-config --cflags gtk+-2.0` -fPIC cflags=-Wall -g -O2 -pedantic @@ -8,6 +8,12 @@ type=library sources=clock.c install=$(LIBDIR)/Panel/applets + +[cpu] +type=library +sources=cpu.c +install=$(LIBDIR)/Panel/applets + [lock] type=library sources=lock.c diff --git a/src/panel.c b/src/panel.c index e0cc7df..b4155f0 100644 --- a/src/panel.c +++ b/src/panel.c @@ -118,7 +118,8 @@ static gboolean _on_idle(gpointer data) { Panel * panel = data; /* FIXME load all plugins, a configuration file or ask the user */ - const char * plugins[] = { "main", "lock", "logout", "clock", NULL }; + const char * plugins[] = { "cpu", "clock", "lock", "logout", "main", + NULL }; size_t i; Plugin * plugin; PanelApplet * applet; @@ -151,7 +152,7 @@ static gboolean _on_idle(gpointer data) widget, FALSE, TRUE, 2); gtk_box_reorder_child(GTK_BOX( panel->hbox), - widget, -1); + widget, 0); break; case PANEL_APPLET_POSITION_START: gtk_box_pack_start(GTK_BOX(panel->hbox),