Hi, attached you find three patches for Jakub's Load-Plugin applet. I applied these changes to the source code downloaded from:
http://koti.welho.com/jpavelek/tmp/770/load-plugin_0.2.5-1.tar.gz My code-changes are split into three incremental steps to make it easier to understand (and improve ;-) them: - patch1 adds a 'swapfile' configuration string to the settings menu. - patch2 makes all configuration settings persistent via gconf. - patch3 adds the swapon/off menu-entry and logic. The Load-Plugin runs as 'user', swapon and swapoff need 'root', thus you have to add the following line to /etc/sudoers manually: user ALL = NOPASSWD: /sbin/swapon *, /sbin/swapoff * Hopefully my changes are picked up, cleaned up, tested, and make it into the next main release. (Btw., I dropped auto-discovery of active swaps, because I think there is no need to auto-activate a swap on reboot via /etc/rc2.d/ anymore, when swapon/off is just one click away...) Armin. P.S.: With 'dpkg-buildpackage -rfakeroot' - how can I make sure the produced shared object is 'stripped' before packaging occurs? -- --- May the Source be with you! Linux. --- --- http://www.arminwarda.mynetcologne.de/ --- secure eMail: http://www.gnupg.de/ ---
diff -Naur loadapplet/load-plugin.c loadapplet-aw1/load-plugin.c --- loadapplet/load-plugin.c 2006-02-17 22:52:45.000000000 +0100 +++ loadapplet-aw1/load-plugin.c 2006-02-25 08:19:44.000000000 +0100 @@ -108,6 +108,7 @@ #define MAX_SSHOT_NAME_LEN 64 #define SSHOT_DEFAULT_NAME "screenshot" gchar *sshotfilename = NULL; +gchar *swapname = NULL; char sshotname[MAX_SSHOT_NAME_LEN]; gint screenshot_delay = 7; @@ -326,7 +327,7 @@ GtkWidget *vbox, *hboxtop, *hboxbottom; GtkWidget *labeldelay, *labelfilename; GtkWidget *sb_seconds; - GtkWidget *entry_filename; + GtkWidget *entry_filename, *entry_filename2; gint result; dialog = gtk_dialog_new_with_buttons ("Applet Settings", @@ -384,6 +385,26 @@ TRUE, TRUE, 5); + /* swap name */ + hboxbottom = gtk_hbox_new (FALSE, 5); + gtk_box_pack_start (GTK_BOX(vbox), + hboxbottom, + TRUE, + TRUE, + 2); + labelfilename = gtk_label_new ("Swap device"); + gtk_box_pack_start (GTK_BOX(hboxbottom), + labelfilename, + TRUE, + TRUE, + 5); + entry_filename2 = gtk_entry_new_with_max_length(MAX_SSHOT_NAME_LEN - 5); + gtk_entry_set_text(GTK_ENTRY(entry_filename2), swapname); + gtk_box_pack_start (GTK_BOX(hboxbottom), + entry_filename2, + TRUE, + TRUE, + 5); gtk_widget_show_all(dialog); @@ -394,6 +415,10 @@ gtk_widget_destroy(dialog); break; case LOAD_DIALOG_ACCEPT: + /* Save new swapdev name */ + if (swapname) g_free(swapname); + swapname = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_filename2))); + /* Save new delay and screenshot name */ if (sshotfilename) g_free(sshotfilename); sshotfilename = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_filename)));
diff -Naur loadapplet-aw2/load-plugin.c loadapplet-aw3/load-plugin.c --- loadapplet-aw2/load-plugin.c 2006-02-25 08:26:38.000000000 +0100 +++ loadapplet-aw3/load-plugin.c 2006-02-25 08:53:08.395429000 +0100 @@ -66,6 +66,7 @@ #define CPUFILE "/proc/stat" #define MEMFILE "/proc/meminfo" +#define SWAPFILE "/proc/swaps" #define DEV_MAX_MEMORY 65535 #define MEMORY_LEVEL_LOW 59000 @@ -91,6 +92,7 @@ GtkWidget *menu_separator; GtkWidget *menu_screenshot; GtkWidget *menu_delayed_screenshot; + GtkWidget *menu_swap; GtkWidget *menu_settings; gboolean in_area; gboolean on_border; @@ -109,6 +111,11 @@ int width, height; #define MAX_READ_CHARS 128 char read_buffer[MAX_READ_CHARS]; +char dummy[MAX_READ_CHARS]; +#define MAX_SWAPNAME 64 +char activeswapname[MAX_SWAPNAME]; +gint swapused=0; +char label[64+MAX_SWAPNAME]; #define MAX_SSHOT_NAME_LEN 64 #define SSHOT_DEFAULT_NAME "screenshot" gchar *sshotfilename = NULL; @@ -135,6 +142,25 @@ +static gboolean +swapisactive(void) +{ /* side-effect: update global var swapused, if swap is active */ + FILE *fin; + + fin = fopen(SWAPFILE, "r"); + if (fin == NULL) g_error("Can't open "SWAPFILE"\n"); + if (! fgets(read_buffer, MAX_READ_CHARS, fin)) /* skip 1st line */ + return FALSE; + while (fgets(read_buffer, MAX_READ_CHARS, fin)) { + if (read_buffer) { + sscanf(read_buffer, "%s %s %s %d", activeswapname, dummy, dummy, &swapused); + if (strncmp(activeswapname, swapname, MAX_SWAPNAME) == 0) + return TRUE; + } + } + return FALSE; +} + static void close_window() { gtk_menu_popdown(GTK_MENU(info->menu)); @@ -302,6 +328,16 @@ } static void +activate_swap_item(GtkMenuItem *item, gpointer data) +{ + if (swapisactive()) + sprintf(label, "/usr/bin/sudo /sbin/swapoff %s", swapname); + else + sprintf(label, "/usr/bin/sudo /sbin/swapon %s", swapname); + system(label); +} + +static void activate_screenshot_item(GtkMenuItem *item, gpointer data) { make_screenshot(); @@ -453,7 +489,15 @@ static void load_icon_pressed(GtkWidget *widget, gpointer data) { - if (!GTK_IS_MENU(info->menu)) + if (GTK_IS_MENU(info->menu)) { /* is this a memory leak??? */ + gtk_widget_destroy(info->menu_screenshot); + gtk_widget_destroy(info->menu_delayed_screenshot); + gtk_widget_destroy(info->menu_separator); + gtk_widget_destroy(info->menu_swap); + gtk_widget_destroy(info->menu_settings); + gtk_widget_destroy(info->menu); + } + if (1 == 1) { info->menu = gtk_menu_new(); @@ -466,7 +510,7 @@ G_CALLBACK(activate_screenshot_item), data); /* And delayed screenshot */ - info->menu_delayed_screenshot = gtk_menu_item_new_with_label("Take delayed screenshot"); + info->menu_delayed_screenshot = gtk_menu_item_new_with_label("Take a delayed screenshot"); gtk_menu_shell_append(GTK_MENU_SHELL(info->menu), info->menu_delayed_screenshot); g_signal_connect(G_OBJECT(info->menu_delayed_screenshot), @@ -477,6 +521,19 @@ info->menu_separator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(info->menu), info->menu_separator); + /* Swap */ + if (swapisactive()) + sprintf(label, "swapoff %s (%d MB used)", swapname, (swapused+512)/1024); + else + sprintf(label, "swapon %s", swapname); + + info->menu_swap = gtk_menu_item_new_with_label(label); + gtk_menu_shell_append(GTK_MENU_SHELL(info->menu), + info->menu_swap); + g_signal_connect(G_OBJECT(info->menu_swap), + "activate", + G_CALLBACK(activate_swap_item), + data); /* Settings */ info->menu_settings = gtk_menu_item_new_with_label("Settings"); gtk_menu_shell_append(GTK_MENU_SHELL(info->menu),
diff -Naur loadapplet-aw1/configure.ac loadapplet-aw2/configure.ac --- loadapplet-aw1/configure.ac 2006-02-17 22:59:39.000000000 +0100 +++ loadapplet-aw2/configure.ac 2006-02-25 08:33:32.000000000 +0100 @@ -42,6 +42,10 @@ AC_SUBST(HILDON_LIBS) AC_SUBST(HILDON_CFLAGS) +PKG_CHECK_MODULES(GCONF, gconf-2.0 >= 2.6.4) +AC_SUBST(GCONF_LIBS) +AC_SUBST(GCONF_CFLAGS) + ALL_LINGUAS="de_DE en_GB en_US es_ES es_MX fi_FI fr_CA fr_FR it_IT pt_BR ru_RU" AC_SUBST(ALL_LINGUAS) diff -Naur loadapplet-aw1/load-plugin.c loadapplet-aw2/load-plugin.c --- loadapplet-aw1/load-plugin.c 2006-02-25 08:19:44.000000000 +0100 +++ loadapplet-aw2/load-plugin.c 2006-02-25 08:26:38.000000000 +0100 @@ -41,6 +41,10 @@ #include <dirent.h> #include <libosso.h> +/* Application settings */ +#include <gconf/gconf.h> +#include <gconf/gconf-client.h> + #include <hildon-widgets/gtk-infoprint.h> #include <hildon-status-bar-lib/hildon-status-bar-item.h> #include <hildon-widgets/hildon-input-mode-hint.h> @@ -116,6 +120,7 @@ gboolean include_user = TRUE; gboolean include_io = TRUE; +GConfClient *gc_client; /* Hildon Status Bar plugin API prototypes */ void *load_initialize(HildonStatusBarItem *item, GtkWidget **button); @@ -423,6 +428,11 @@ if (sshotfilename) g_free(sshotfilename); sshotfilename = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_filename))); screenshot_delay = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(sb_seconds)); + /* make settings persistent via gconf */ + gconf_client_set_string(gc_client, "/apps/maemo/loadapplet/swapname", swapname, NULL); + gconf_client_set_string(gc_client, "/apps/maemo/loadapplet/sshotfilename", sshotfilename, NULL); + gconf_client_set_int(gc_client, "/apps/maemo/loadapplet/screenshot_delay", screenshot_delay, NULL); + gtk_widget_destroy(dialog); break; default: @@ -727,7 +737,14 @@ /* Screenshot stuff too */ root_window = gdk_get_default_root_window (); gdk_drawable_get_size (root_window, &width, &height); - sshotfilename = g_strdup(SSHOT_DEFAULT_NAME); + + /* retrieve stored settings from gconf */ + g_type_init(); + gc_client = gconf_client_get_default(); + sshotfilename = gconf_client_get_string(gc_client, "/apps/maemo/loadapplet/sshotfilename", NULL); + screenshot_delay = gconf_client_get_int(gc_client, "/apps/maemo/loadapplet/screenshot_delay", NULL); + swapname = gconf_client_get_string(gc_client, "/apps/maemo/loadapplet/swapname", NULL); + return info; } diff -Naur loadapplet-aw1/Makefile.am loadapplet-aw2/Makefile.am --- loadapplet-aw1/Makefile.am 2005-11-24 17:24:11.000000000 +0100 +++ loadapplet-aw2/Makefile.am 2006-02-25 08:35:11.000000000 +0100 @@ -1,6 +1,6 @@ SUBDIRS = -INCLUDES = $(STATUSBARLIB_CFLAGS) $(GTK_CFLAGS) $(HILDON_CFLAGS) $(DBUS_CFLAGS)\ +INCLUDES = $(GCONF_CFLAGS) $(STATUSBARLIB_CFLAGS) $(GTK_CFLAGS) $(HILDON_CFLAGS) $(DBUS_CFLAGS)\ -DPREFIX=\"$(prefix)\" -DLOCALEDIR=\"$(localedir)\" AM_LDFLAGS = -module -avoid-version @@ -19,7 +19,7 @@ $(icon_DATA) hildonstatusbarplugin_LTLIBRARIES = libload.la -libload_la_LIBADD = $(STATUSBARLIB_LIBS) $(GTK_LIBS) $(HILDON_LIBS) +libload_la_LIBADD = $(STATUSBARLIB_LIBS) $(GTK_LIBS) $(HILDON_LIBS) $(GCONF_LIBS) libload_la_SOURCES = load-plugin.c deb: dist
pgp1ngNlmQX5X.pgp
Description: PGP signature
_______________________________________________ maemo-developers mailing list maemo-developers@maemo.org https://maemo.org/mailman/listinfo/maemo-developers