/* Copyright (c) 1994-1996 David Hogan, see README for licence details */ #include #include #include #include #include #include #include "dat.h" #include "fns.h" Client *hiddenc[MAXHIDDEN]; int numhidden; char *b3items[B3FIXED+MAXHIDDEN+1] = { "New", "Reshape", "Move", "Delete", "Hide", "Lower", "Raise", 0, }; Menu b3menu = { b3items, }; void button(e) XButtonEvent *e; { Client *c; Window dw; ScreenInfo *s; curtime = e->time; s = getscreen(e->root); if (s == 0) return; switch (e->button) { case Button1: c = getclient(e->window, 0); if (c) { // XRaiseWindow(dpy, c->parent); // top(c); active(c); } break; case Button3: if (e->window != s->menuwin) menu(s, e->x_root, e->y_root); break; } } void key(e) XKeyEvent *e; { Client *c; Window dw; ScreenInfo *s; curtime = e->time; s = getscreen(e->root); if (s == 0) return; switch (XKeycodeToKeysym(dpy, e->keycode, 0)) { case XK_Menu: if (e->window != s->menuwin) menu(s, e->x_root, e->y_root); break; } } void menu(s, ex, ey) ScreenInfo *s; { int n, shift; Client *c; if (current && current->screen == s) cmapnofocus(s); switch (n = menuhit(s, ex, ey, &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; case 5: /* Lower */ lower(selectwin(1, 0, s)); break; case 6: /* Raise */ raise_window(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(s) 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", "-9wm", 0); execlp("xterm", "xterm", "-ut", 0); perror("9wm: exec 9term/xterm failed"); exit(1); } exit(0); } wait((int *) 0); } void reshape(c) 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, c->y, c->dx + c->border * 2, c->dy + c->border * 2); if (c->dx == odx && c->dy == ody) sendconfig(c); else XMoveResizeWindow(dpy, c->window, 0, 0, c->dx, c->dy); } void move(c) 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, c->y); sendconfig(c); } void delete(c, shift) 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(c) 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 lower(c) Client *c; { if (c == 0) return; XLowerWindow(dpy, c->parent); } void raise_window(c) Client *c; { if (c == 0) return; XRaiseWindow(dpy, c->parent); active(c); top(c); } void unhide(n, map) 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(c, map) 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(c, name) 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; } }