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 [email protected] https://maemo.org/mailman/listinfo/maemo-developers
