Commit Diff


commit - df49b303431ef0b62c4f6fc4d790a1fd2d2f7e77
commit + 3ddda82110bcba5a7c27734e1938363877c41124
blob - 22d74dd988a7a49eebaf7e858f9fb1860e8bd5ee
blob + 077106b40397d3b5b3acc33717879ecabfb72fc9
--- src/cmd/rio/client.c
+++ src/cmd/rio/client.c
@@ -166,6 +166,7 @@ getclient(Window w, int create)
 	c->cmapwins = 0;
 	c->wmcmaps = 0;
 	c->next = clients;
+	c->virt = virt;
 	clients = c;
 	return c;
 }
blob - df4f1ea52564f54d1ac89750270a02a0c42fd5b6
blob + e590384fcd5bdf11025b19e00b3f3725c7afc775
--- src/cmd/rio/dat.h
+++ src/cmd/rio/dat.h
@@ -5,6 +5,7 @@
 #define	INSET		_inset
 #define MAXHIDDEN	128
 #define B3FIXED 	5
+#define NUMVIRTUALS	12
 
 #define AllButtonMask	(Button1Mask|Button2Mask|Button3Mask \
 			|Button4Mask|Button5Mask)
@@ -46,6 +47,7 @@ struct Client {
 	int 		is9term;
 	int 		hold;
 	int 		proto;
+	int			virt;
 
 	char		*label;
 	char		*instance;
@@ -146,6 +148,7 @@ extern int			_inset;
 extern int			curtime;
 extern int			debug;
 extern int			solidsweep;
+extern int			numvirtuals;
 
 extern Atom		exit_rio;
 extern Atom		restart_rio;
@@ -161,12 +164,16 @@ extern Atom 		wm_colormaps;
 /* client.c */
 extern Client		*clients;
 extern Client		*current;
+extern Client		*currents[];
 
 /* menu.c */
 extern Client		*hiddenc[];
 extern int 			numhidden;
+extern char 		*b2items[];
+extern Menu 		b2menu;
 extern char 		*b3items[];
 extern Menu 		b3menu;
+extern int			virt;
 
 /* manage.c */
 extern int			isNew;
blob - 5b13e871a3ccd450069f1a9a9a9b14e75eeb0fc5
blob + 2e72889079cae1657c306739976bd72100550984
--- src/cmd/rio/event.c
+++ src/cmd/rio/event.c
@@ -514,7 +514,7 @@ borderorient(Client *c, int x, int y)
 			return BorderWSW;
 		}
 		if (y > CORNER &&
-	        y < (c->dy + 2*BORDER) - CORNER) {
+			y < (c->dy + 2*BORDER) - CORNER) {
 			if (debug) fprintf(stderr, "left\n");
 			return BorderW;
 		}
@@ -551,7 +551,7 @@ borderorient(Client *c, int x, int y)
 			return BorderSSE;
 		}
 	} else if (x > CORNER &&
-		       x < (c->dx + 2*BORDER) - CORNER) {
+			x < (c->dx + 2*BORDER) - CORNER) {
 		if (y <= BORDER) {
 			if (debug) fprintf(stderr, "top\n");
 			return BorderN;
blob - 59422d6c7fee151216d2e74b9abfcc95dee24dd0
blob + a9693f49a84f057364baf8d34a2add81e738d695
--- src/cmd/rio/fns.h
+++ src/cmd/rio/fns.h
@@ -71,7 +71,13 @@ void	hide();
 void	unhide();
 void	unhidec();
 void	renamec();
+void	button2();
+void	initb2menu();
+void	switch_to();
+void	switch_to_c();
 
+
+
 /* client.c */
 void	setactive();
 void	draw_border();
blob - dc1e2e580709305b6cd22539e731ce68f1c9ed10
blob + 3a1f031150a45c9a4a2be069b3ba9489fc4efe1a
--- src/cmd/rio/grab.c
+++ src/cmd/rio/grab.c
@@ -366,8 +366,8 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int
 		break;
 	}
 	if (!init
-	    || xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
-	    || yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)) {
+		|| xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
+		|| yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)) {
 		xoff = 0;
 		yoff = 0;
 		init = 0;
@@ -385,8 +385,8 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int
 	}
 
 	/* remember requested size;
-           * after applying size hints we may have to correct position
-	  */
+	 * after applying size hints we may have to correct position
+	 */
 	rdx = sx*dx;
 	rdy = sy*dy;
 
blob - d2da22b3aa247a05c1391ea6e8c3078ebbc79ac1
blob + 0e6490544624501249b188daddaf92c1d7ae9398
--- src/cmd/rio/main.c
+++ src/cmd/rio/main.c
@@ -38,6 +38,7 @@ int 			debug;
 int 			signalled;
 int 			num_screens;
 int			solidsweep = 0;
+int			numvirtuals = 0;
 
 Atom		exit_rio;
 Atom		restart_rio;
@@ -65,7 +66,7 @@ char	*fontlist[] = {
 void
 usage(void)
 {
-	fprintf(stderr, "usage: rio [-grey] [-version] [-font fname] [-term prog] [exit|restart]\n");
+	fprintf(stderr, "usage: rio [-grey] [-version] [-font fname] [-term prog] [-virtuals num] [exit|restart]\n");
 	exit(1);
 }
 
@@ -99,7 +100,13 @@ main(int argc, char *argv[])
 		}
 		else if (strcmp(argv[i], "-term") == 0 && i+1<argc)
 			termprog = argv[++i];
-		else if (strcmp(argv[i], "-version") == 0) {
+		else if (strcmp(argv[i], "-virtuals") == 0 && i+1<argc) {
+			numvirtuals = atoi(argv[++i]);
+			if(numvirtuals < 0 || numvirtuals > 12) {
+				fprintf(stderr, "rio: wrong number of virtual displays, defaulting to 4\n");
+				numvirtuals = 4;
+			}
+		} else if (strcmp(argv[i], "-version") == 0) {
 			fprintf(stderr, "%s", version[0]);
 			if (PATCHLEVEL > 0)
 				fprintf(stderr, "; patch level %d", PATCHLEVEL);
@@ -196,6 +203,8 @@ main(int argc, char *argv[])
 
 	for (i = 0; i < num_screens; i++)
 		initscreen(&screens[i], i, background);
+
+	initb2menu(numvirtuals);
 
 	/* set selection so that 9term knows we're running */
 	curtime = CurrentTime;
blob - 81ad960f2a3a8ac3ddb25f437cc857f46959d361
blob + d313f5e427b524a75cd1c641ed49d51a380d4b0a
--- src/cmd/rio/menu.c
+++ src/cmd/rio/menu.c
@@ -13,6 +13,35 @@
 Client	*hiddenc[MAXHIDDEN];
 
 int	numhidden;
+
+int virt;
+
+Client * currents[NUMVIRTUALS] =
+{
+	NULL, NULL, NULL, NULL, 
+};
+
+char	*b2items[NUMVIRTUALS+1] =
+{
+	"One",
+	"Two",
+	"Three",
+	"Four",
+	"Five",
+	"Six",
+	"Seven",
+	"Eight",
+	"Nine",
+	"Ten",
+	"Eleven",
+	"Twelve",
+	0,
+};
+
+Menu b2menu = 
+{
+	b2items,
+};
 
 char	*b3items[B3FIXED+MAXHIDDEN+1] =
 {
@@ -80,8 +109,14 @@ button(XButtonEvent *e)
 		}
 		return;
 	case Button2:
-		if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask))
+		if (c) {
+			XMapRaised(dpy, c->parent);
+			active(c);
+			XAllowEvents (dpy, ReplayPointer, curtime);
+		} else if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)) {
 			menuhit(e, &egg);
+		} else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1) 
+				button2(n);
 		return;
 	default:
 		return;
@@ -130,7 +165,7 @@ spawn(ScreenInfo *s)
 	 */
 	isNew = 1;
 	/*
-	 * ugly dance to avoid leaving zombies.  Could use SIGCHLD,
+	 * ugly dance to avoid leaving zombies. Could use SIGCHLD,
 	 * but it's not very portable.
 	 */
 	if (fork() == 0) {
@@ -284,5 +319,62 @@ renamec(Client *c, char *name)
 		if (c == hiddenc[i]) {
 			b3items[B3FIXED+i] = name;
 			return;
+		}
+}
+
+void
+button2(int n)
+{
+	switch_to(n);
+	if (current)
+		cmapfocus(current);
+}
+
+void
+switch_to_c(int n, Client *c)
+{
+	if (c && c->next)
+		switch_to_c(n,c->next);
+
+	if (c->parent == DefaultRootWindow(dpy))
+		return;
+
+	if (c->virt != virt && c->state == NormalState) {
+		XUnmapWindow(dpy, c->parent);
+		XUnmapWindow(dpy, c->window);
+		setstate(c, IconicState);
+		if (c == current)
+			nofocus();
+	} else if (c->virt == virt && c->state == IconicState) {
+		int i;
+
+		for (i = 0; i < numhidden; i++)
+		if (c == hiddenc[i]) 
+			break;
+
+		if (i == numhidden) {
+			XMapWindow(dpy, c->window);
+			XMapWindow(dpy, c->parent);
+			setstate(c, NormalState);
+			if (currents[virt] == c)
+				active(c); 
 		}
+	}
 }
+
+void
+switch_to(int n)
+{
+	if (n == virt)
+		return;
+	currents[virt] = current;
+	virt = n;
+	switch_to_c(n, clients);
+	current = currents[virt];
+}
+
+void
+initb2menu(int n)
+{ 
+	b2items[n] = 0;
+}