diff --git a/Makefile b/Makefile index a556197..525f12d 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ dist: $(PACKAGE)-$(VERSION)/src/applets/main.c \ $(PACKAGE)-$(VERSION)/src/applets/memory.c \ $(PACKAGE)-$(VERSION)/src/applets/pager.c \ + $(PACKAGE)-$(VERSION)/src/applets/swap.c \ $(PACKAGE)-$(VERSION)/src/applets/systray.c \ $(PACKAGE)-$(VERSION)/src/applets/tasks.c \ $(PACKAGE)-$(VERSION)/src/applets/volume.c \ diff --git a/src/applets/Makefile b/src/applets/Makefile index f2c0a84..43561fd 100644 --- a/src/applets/Makefile +++ b/src/applets/Makefile @@ -1,4 +1,4 @@ -TARGETS = battery.so bluetooth.so clock.so cpu.so cpufreq.so desktop.so gps.so gsm.so lock.so logout.so main.so memory.so pager.so systray.so tasks.so volume.so +TARGETS = battery.so bluetooth.so clock.so cpu.so cpufreq.so desktop.so gps.so gsm.so lock.so logout.so main.so memory.so pager.so swap.so systray.so tasks.so volume.so PREFIX = /usr/local DESTDIR = LIBDIR = $(PREFIX)/lib @@ -109,6 +109,13 @@ pager_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) pager.so: $(pager_OBJS) $(LD) -o pager.so $(pager_OBJS) +swap_OBJS = swap.o +swap_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) +swap_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) + +swap.so: $(swap_OBJS) + $(LD) -o swap.so $(swap_OBJS) + systray_OBJS = systray.o systray_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) systray_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) @@ -169,6 +176,9 @@ memory.o: memory.c ../../include/Panel.h pager.o: pager.c ../../include/Panel.h $(CC) $(pager_CFLAGS) -c pager.c +swap.o: swap.c ../../include/Panel.h + $(CC) $(swap_CFLAGS) -c swap.c + systray.o: systray.c ../../include/Panel.h $(CC) $(systray_CFLAGS) -c systray.c @@ -179,7 +189,7 @@ volume.o: volume.c ../../include/Panel.h $(CC) $(volume_CFLAGS) -c volume.c clean: - $(RM) $(battery_OBJS) $(bluetooth_OBJS) $(clock_OBJS) $(cpu_OBJS) $(cpufreq_OBJS) $(desktop_OBJS) $(gps_OBJS) $(gsm_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) $(memory_OBJS) $(pager_OBJS) $(systray_OBJS) $(tasks_OBJS) $(volume_OBJS) + $(RM) $(battery_OBJS) $(bluetooth_OBJS) $(clock_OBJS) $(cpu_OBJS) $(cpufreq_OBJS) $(desktop_OBJS) $(gps_OBJS) $(gsm_OBJS) $(lock_OBJS) $(logout_OBJS) $(main_OBJS) $(memory_OBJS) $(pager_OBJS) $(swap_OBJS) $(systray_OBJS) $(tasks_OBJS) $(volume_OBJS) distclean: clean $(RM) $(TARGETS) @@ -212,6 +222,8 @@ install: all $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets $(INSTALL) -m 0644 pager.so $(DESTDIR)$(LIBDIR)/Panel/applets/pager.so $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets + $(INSTALL) -m 0644 swap.so $(DESTDIR)$(LIBDIR)/Panel/applets/swap.so + $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets $(INSTALL) -m 0644 systray.so $(DESTDIR)$(LIBDIR)/Panel/applets/systray.so $(MKDIR) $(DESTDIR)$(LIBDIR)/Panel/applets $(INSTALL) -m 0644 tasks.so $(DESTDIR)$(LIBDIR)/Panel/applets/tasks.so @@ -232,6 +244,7 @@ uninstall: $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/main.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/memory.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/pager.so + $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/swap.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/systray.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/tasks.so $(RM) $(DESTDIR)$(LIBDIR)/Panel/applets/volume.so diff --git a/src/applets/project.conf b/src/applets/project.conf index bae4448..d991e94 100644 --- a/src/applets/project.conf +++ b/src/applets/project.conf @@ -1,4 +1,4 @@ -targets=battery,bluetooth,clock,cpu,cpufreq,desktop,gps,gsm,lock,logout,main,memory,pager,systray,tasks,volume +targets=battery,bluetooth,clock,cpu,cpufreq,desktop,gps,gsm,lock,logout,main,memory,pager,swap,systray,tasks,volume cppflags_force=-I $(PREFIX)/include -I ../../include #cppflags=-D EMBEDDED cflags_force=-W `pkg-config --cflags gtk+-2.0` -fPIC @@ -110,6 +110,14 @@ install=$(LIBDIR)/Panel/applets [pager.c] depends=../../include/Panel.h +[swap] +type=plugin +sources=swap.c +install=$(LIBDIR)/Panel/applets + +[swap.c] +depends=../../include/Panel.h + [systray] type=plugin sources=systray.c diff --git a/src/applets/swap.c b/src/applets/swap.c new file mode 100644 index 0000000..89dd2d2 --- /dev/null +++ b/src/applets/swap.c @@ -0,0 +1,148 @@ +/* $Id$ */ +/* Copyright (c) 2010 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 +#if defined(__linux__) +# include +#elif defined(__NetBSD__) +# include +#endif +#include "Panel.h" + + +/* Swap */ +/* private */ +/* types */ +typedef struct _Swap +{ + PanelAppletHelper * helper; + GtkWidget * scale; + guint timeout; +} Swap; + + +/* prototypes */ +static GtkWidget * _swap_init(PanelApplet * applet); +static void _swap_destroy(PanelApplet * applet); + +/* callbacks */ +#if defined(__linux__) || defined(__NetBSD__) +static gboolean _on_timeout(gpointer data); +#endif + + +/* public */ +/* variables */ +PanelApplet applet = +{ + NULL, + _swap_init, + _swap_destroy, + PANEL_APPLET_POSITION_END, + FALSE, + TRUE, + NULL +}; + + +/* private */ +/* functions */ +/* swap_init */ +static GtkWidget * _swap_init(PanelApplet * applet) +{ +#if defined(__linux__) || defined(__NetBSD__) + GtkWidget * ret; + Swap * swap; + PangoFontDescription * desc; + GtkWidget * widget; + + if((swap = malloc(sizeof(*swap))) == NULL) + { + applet->helper->error(applet->helper->priv, "malloc", 0); + return NULL; + } + applet->priv = swap; + swap->helper = applet->helper; + ret = gtk_hbox_new(FALSE, 0); + desc = pango_font_description_new(); + pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); + widget = gtk_label_new("Swap:"); + gtk_widget_modify_font(widget, desc); + gtk_box_pack_start(GTK_BOX(ret), widget, FALSE, FALSE, 0); + swap->scale = gtk_vscale_new_with_range(0, 100, 1); + gtk_widget_set_sensitive(swap->scale, FALSE); + gtk_range_set_inverted(GTK_RANGE(swap->scale), TRUE); + gtk_scale_set_value_pos(GTK_SCALE(swap->scale), GTK_POS_RIGHT); + gtk_box_pack_start(GTK_BOX(ret), swap->scale, FALSE, FALSE, 0); + swap->timeout = g_timeout_add(5000, _on_timeout, swap); + _on_timeout(swap); + pango_font_description_free(desc); + gtk_widget_show_all(ret); + return ret; +#else + error_set("%s", "swap: Unsupported platform"); + return NULL; +#endif +} + + +/* swap_destroy */ +static void _swap_destroy(PanelApplet * applet) +{ + Swap * swap = applet->priv; + + g_source_remove(swap->timeout); + free(swap); +} + + +/* callbacks */ +/* on_timeout */ +#if defined(__linux__) +static gboolean _on_timeout(gpointer data) +{ + Swap * swap = data; + struct sysinfo sy; + gdouble value; + + if(sysinfo(&sy) != 0) + return swap->helper->error(swap->helper->priv, "sysinfo", TRUE); + if((value = sy.totalswap - sy.freeswap) != 0.0 && sy.totalswap != 0) + value /= sy.totalswap; + gtk_range_set_value(GTK_RANGE(swap->scale), value); + return TRUE; +} +#elif defined(__NetBSD__) +static gboolean _on_timeout(gpointer data) +{ + Swap * swap = data; + int mib[] = { CTL_VM, VM_UVMEXP }; + struct uvmexp ue; + size_t size = sizeof(ue); + gdouble value; + + if(sysctl(mib, 2, &ue, &size, NULL, 0) < 0) + return TRUE; + if((value = ue.swpgonly) != 0.0 && ue.swpages != 0) + value /= ue.swpages; + gtk_range_set_value(GTK_RANGE(swap->scale), value); + return TRUE; +} +#endif diff --git a/src/panel.c b/src/panel.c index 197dccb..c3a1f4b 100644 --- a/src/panel.c +++ b/src/panel.c @@ -147,8 +147,8 @@ static gboolean _on_idle(gpointer data) /* FIXME load all plugins, a configuration file or ask the user */ #ifndef EMBEDDED const char * plugins[] = { "volume", "systray", "battery", "bluetooth", - "clock", "memory", "cpufreq", "cpu", "desktop", "gps", "gsm", - "lock", "logout", "main", "pager", "tasks", NULL }; + "clock", "swap", "memory", "cpufreq", "cpu", "desktop", "gps", + "gsm", "lock", "logout", "main", "pager", "tasks", NULL }; #else const char * plugins[] = { "volume", "systray", "battery", "bluetooth", "clock", "cpufreq", "gps", "gsm", "main", "pager", "tasks",