commit - df49b303431ef0b62c4f6fc4d790a1fd2d2f7e77
commit + 3ddda82110bcba5a7c27734e1938363877c41124
blob - 22d74dd988a7a49eebaf7e858f9fb1860e8bd5ee
blob + 077106b40397d3b5b3acc33717879ecabfb72fc9
--- src/cmd/rio/client.c
+++ src/cmd/rio/client.c
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
#define INSET _inset
#define MAXHIDDEN 128
#define B3FIXED 5
+#define NUMVIRTUALS 12
#define AllButtonMask (Button1Mask|Button2Mask|Button3Mask \
|Button4Mask|Button5Mask)
int is9term;
int hold;
int proto;
+ int virt;
char *label;
char *instance;
extern int curtime;
extern int debug;
extern int solidsweep;
+extern int numvirtuals;
extern Atom exit_rio;
extern Atom restart_rio;
/* 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
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;
}
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
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
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;
}
/* 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
int signalled;
int num_screens;
int solidsweep = 0;
+int numvirtuals = 0;
Atom exit_rio;
Atom restart_rio;
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);
}
}
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);
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
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] =
{
}
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;
*/
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) {
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;
+}