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

Attachment: pgp1ngNlmQX5X.pgp
Description: PGP signature

_______________________________________________
maemo-developers mailing list
maemo-developers@maemo.org
https://maemo.org/mailman/listinfo/maemo-developers

Reply via email to