diff -ur irssi-0.8.11-mouse_xterm/src/fe-text/gui-readline.c irssi-0.8.11-mouse_xterm_act/src/fe-text/gui-readline.c
--- irssi-0.8.11-mouse_xterm/src/fe-text/gui-readline.c	2007-10-03 10:55:39.000000000 +0100
+++ irssi-0.8.11-mouse_xterm_act/src/fe-text/gui-readline.c	2007-10-03 11:02:13.000000000 +0100
@@ -38,6 +38,10 @@
 #include "gui-windows.h"
 #include "utf8.h"
 
+#include "statusbar.h"
+char *get_activity_list(MAIN_WINDOW_REC *window, int normal, int hilight);
+static void key_change_window(const char *data);
+
 #include <signal.h>
 
 typedef void (*ENTRY_REDIRECT_KEY_FUNC) (int key, void *data, SERVER_REC *server, WI_ITEM_REC *item);
@@ -73,6 +77,8 @@
 static int mouse_xterm_status = -1; /* -1:off 0,1,2:filling mouse_xterm_combo */
 static unichar mouse_xterm_combo[3]; /* 0:button 1:x 2:y */
 static unichar mouse_xterm_previous[3]; /* previous contents of mouse_xterm_combo */
+#define MOUSE_LEFT_BUTTON		0
+#define MOUSE_MIDDLE_BUTTON		1
 #define MOUSE_WHEEL_UP			64
 #define MOUSE_WHEEL_DOWN		65
 #define MOUSE_MIN_DISTANCE		3
@@ -459,6 +465,61 @@
 	return paste_state == 2;
 }
 
+/* Check if the "act" item exists in the statusbar and if the mouse is over
+   it. If it is, then set the current window to the window with the number
+   which has been clicked, if any. */
+static void mouse_check_act(STATUSBAR_REC *bar, int mouse_xpos)
+{
+	GSList *l_item;
+	char *actlist;
+	SBAR_ITEM_REC *item;
+	int i, status, pos;
+
+	for (l_item = bar->items; l_item != NULL; l_item = l_item->next) {
+		item = l_item->data;
+		if (strcmp (item->config->name, "act") != 0 || item->size == 0 || mouse_xpos <= item->xpos || mouse_xpos >= item->xpos+item->size)
+			continue;
+		actlist = get_activity_list(item->bar->parent_window, TRUE, TRUE);
+		if (actlist == NULL)
+			continue;
+		/* Match mouse coordinates with window numbers in actlist.
+		   FIXME: it assumes the default act template "{sb Act: $0-}"
+		   is used. To minimize things, I assume $0- is at the end
+		   anyway, and parse actlist in reverse order. */
+		status = -1;
+		pos = 0;
+		/* Parse from the end to the beginning */
+		for (i = strlen(actlist)-1; i >= 0; i--) {
+			/* Tricky because it may be part of a window number >10 */
+			if (isdigit(actlist[i])) {
+				if (status == -1) {
+					status = actlist[i]-'0';
+				} else
+					status = status + (actlist[i]-'0')*10;
+				if (item->xpos+item->size-2-pos == mouse_xpos) {
+					/* look-ahead */
+					while (i > 0 && isdigit(actlist[i-1])) {
+						status = status + (actlist[i-1]-'0')*10;
+						i--;
+					}
+					ltoa(actlist, status);
+					key_change_window(actlist);
+					i = -1;
+					break;
+				}
+				pos++;
+			} else if (actlist[i] == ',') {
+				if (item->xpos-2-pos == mouse_xpos)
+					break;
+				status = -1;
+				pos++;
+			}
+		}
+		g_free_not_null(actlist);
+		break;
+	}
+}
+
 /* Handle mouse event (button press or release) */
 static void sig_mouse_event(int b, int x, int y, int oldb, int oldx, int oldy)
 {
@@ -518,6 +579,17 @@
 	GSList *l_bar;
 
 	switch (b) {
+	case MOUSE_LEFT_BUTTON:
+		for (l_bar = active_mainwin->statusbars; l_bar != NULL; l_bar = l_bar->next) {
+			STATUSBAR_REC *bar = l_bar->data;
+			/* mouse is somewhere over the statusbar */
+			if (bar->real_ypos == y)
+				/* but is it over the "act" item? */
+				mouse_check_act (bar, x);
+		}
+		break;
+	case MOUSE_MIDDLE_BUTTON:
+		break;
 	case MOUSE_WHEEL_UP:
 		window_prev_page();
 		break;
diff -ur irssi-0.8.11-mouse_xterm/src/fe-text/statusbar-items.c irssi-0.8.11-mouse_xterm_act/src/fe-text/statusbar-items.c
--- irssi-0.8.11-mouse_xterm/src/fe-text/statusbar-items.c	2007-04-25 19:15:07.000000000 +0100
+++ irssi-0.8.11-mouse_xterm_act/src/fe-text/statusbar-items.c	2007-10-03 11:10:33.000000000 +0100
@@ -68,7 +68,7 @@
 	}
 }
 
-static char *get_activity_list(MAIN_WINDOW_REC *window, int normal, int hilight)
+char *get_activity_list(MAIN_WINDOW_REC *window, int normal, int hilight)
 {
         THEME_REC *theme;
 	GString *str;
