aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rio/menu.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-21 04:27:28 +0000
committerrsc <devnull@localhost>2004-03-21 04:27:28 +0000
commit038e9089b354385cada2a35663c863d43dd5b20d (patch)
tree029fadfc751f82e693daef7a66bc22c87e85479c /src/cmd/rio/menu.c
parentba9ffa53c4825e115078ed098205d75aa7a77eb0 (diff)
downloadplan9port-038e9089b354385cada2a35663c863d43dd5b20d.tar.gz
plan9port-038e9089b354385cada2a35663c863d43dd5b20d.tar.bz2
plan9port-038e9089b354385cada2a35663c863d43dd5b20d.zip
Change 9wm to look like rio.
Diffstat (limited to 'src/cmd/rio/menu.c')
-rw-r--r--src/cmd/rio/menu.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/cmd/rio/menu.c b/src/cmd/rio/menu.c
new file mode 100644
index 00000000..54453954
--- /dev/null
+++ b/src/cmd/rio/menu.c
@@ -0,0 +1,258 @@
+/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
+#include <stdio.h>
+#include <signal.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include "dat.h"
+#include "fns.h"
+
+Client *hiddenc[MAXHIDDEN];
+
+int numhidden;
+
+char *b3items[B3FIXED+MAXHIDDEN+1] =
+{
+ "New",
+ "Reshape",
+ "Move",
+ "Delete",
+ "Hide",
+ 0,
+};
+
+Menu b3menu =
+{
+ b3items,
+};
+
+Menu egg =
+{
+ version,
+};
+
+void
+button(XButtonEvent *e)
+{
+ int n, shift;
+ Client *c;
+ Window dw;
+ ScreenInfo *s;
+
+ curtime = e->time;
+ s = getscreen(e->root);
+ if (s == 0)
+ return;
+ c = getclient(e->window, 0);
+ if (c) {
+ e->x += c->x - BORDER;
+ e->y += c->y - BORDER;
+ }
+ else if (e->window != e->root)
+ XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
+ &e->x, &e->y, &dw);
+ switch (e->button) {
+ case Button1:
+ if (c) {
+ XMapRaised(dpy, c->parent);
+ top(c);
+ active(c);
+ }
+ return;
+ case Button2:
+ if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask))
+ menuhit(e, &egg);
+ return;
+ default:
+ return;
+ case Button3:
+ break;
+ }
+
+ if (current && current->screen == s)
+ cmapnofocus(s);
+ switch (n = menuhit(e, &b3menu)) {
+ case 0: /* New */
+ spawn(s);
+ break;
+ case 1: /* Reshape */
+ reshape(selectwin(1, 0, s));
+ break;
+ case 2: /* Move */
+ move(selectwin(0, 0, s));
+ break;
+ case 3: /* Delete */
+ shift = 0;
+ c = selectwin(1, &shift, s);
+ delete(c, shift);
+ break;
+ case 4: /* Hide */
+ hide(selectwin(1, 0, s));
+ break;
+ default: /* unhide window */
+ unhide(n - B3FIXED, 1);
+ break;
+ case -1: /* nothing */
+ break;
+ }
+ if (current && current->screen == s)
+ cmapfocus(current);
+}
+
+void
+spawn(ScreenInfo *s)
+{
+ /*
+ * ugly dance to avoid leaving zombies. Could use SIGCHLD,
+ * but it's not very portable.
+ */
+ if (fork() == 0) {
+ if (fork() == 0) {
+ close(ConnectionNumber(dpy));
+ if (s->display[0] != '\0')
+ putenv(s->display);
+ if (termprog != NULL) {
+ execl(shell, shell, "-c", termprog, 0);
+ fprintf(stderr, "9wm: exec %s", shell);
+ perror(" failed");
+ }
+ execlp("9term", "9term", "-w", 0);
+ execlp("xterm", "xterm", "-ut", 0);
+ perror("9wm: exec 9term/xterm failed");
+ exit(1);
+ }
+ exit(0);
+ }
+ wait((int *) 0);
+}
+
+void
+reshape(Client *c)
+{
+ int odx, ody;
+
+ if (c == 0)
+ return;
+ odx = c->dx;
+ ody = c->dy;
+ if (sweep(c) == 0)
+ return;
+ active(c);
+ top(c);
+ XRaiseWindow(dpy, c->parent);
+ XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
+ c->dx+2*BORDER, c->dy+2*BORDER);
+ if (c->dx == odx && c->dy == ody)
+ sendconfig(c);
+ else
+ XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
+}
+
+void
+move(Client *c)
+{
+ if (c == 0)
+ return;
+ if (drag(c) == 0)
+ return;
+ active(c);
+ top(c);
+ XRaiseWindow(dpy, c->parent);
+ XMoveWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER);
+ sendconfig(c);
+}
+
+void
+delete(Client *c, int shift)
+{
+ if (c == 0)
+ return;
+ if ((c->proto & Pdelete) && !shift)
+ sendcmessage(c->window, wm_protocols, wm_delete, 0);
+ else
+ XKillClient(dpy, c->window); /* let event clean up */
+}
+
+void
+hide(Client *c)
+{
+ if (c == 0 || numhidden == MAXHIDDEN)
+ return;
+ if (hidden(c)) {
+ fprintf(stderr, "9wm: already hidden: %s\n", c->label);
+ return;
+ }
+ XUnmapWindow(dpy, c->parent);
+ XUnmapWindow(dpy, c->window);
+ setstate(c, IconicState);
+ if (c == current)
+ nofocus();
+ hiddenc[numhidden] = c;
+ b3items[B3FIXED+numhidden] = c->label;
+ numhidden++;
+ b3items[B3FIXED+numhidden] = 0;
+}
+
+void
+unhide(int n, int map)
+{
+ Client *c;
+ int i;
+
+ if (n >= numhidden) {
+ fprintf(stderr, "9wm: unhide: n %d numhidden %d\n", n, numhidden);
+ return;
+ }
+ c = hiddenc[n];
+ if (!hidden(c)) {
+ fprintf(stderr, "9wm: unhide: not hidden: %s(0x%x)\n",
+ c->label, c->window);
+ return;
+ }
+
+ if (map) {
+ XMapWindow(dpy, c->window);
+ XMapRaised(dpy, c->parent);
+ setstate(c, NormalState);
+ active(c);
+ top(c);
+ }
+
+ numhidden--;
+ for (i = n; i < numhidden; i ++) {
+ hiddenc[i] = hiddenc[i+1];
+ b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
+ }
+ b3items[B3FIXED+numhidden] = 0;
+}
+
+void
+unhidec(Client *c, int map)
+{
+ int i;
+
+ for (i = 0; i < numhidden; i++)
+ if (c == hiddenc[i]) {
+ unhide(i, map);
+ return;
+ }
+ fprintf(stderr, "9wm: unhidec: not hidden: %s(0x%x)\n",
+ c->label, c->window);
+}
+
+void
+renamec(Client *c, char *name)
+{
+ int i;
+
+ if (name == 0)
+ name = "???";
+ c->label = name;
+ if (!hidden(c))
+ return;
+ for (i = 0; i < numhidden; i++)
+ if (c == hiddenc[i]) {
+ b3items[B3FIXED+i] = name;
+ return;
+ }
+}