home *** CD-ROM | disk | FTP | other *** search
/ ftp.freefriends.org / ftp.freefriends.org.tar / ftp.freefriends.org / arnold / Source / 9wm-1.1.shar.gz / 9wm-1.1.shar / menu.c < prev    next >
C/C++ Source or Header  |  1995-01-15  |  5KB  |  259 lines

  1. /* Copyright (c) 1994 David Hogan, see README for licence details */
  2. #include <stdio.h>
  3. #include <X11/X.h>
  4. #include <X11/Xlib.h>
  5. #include <X11/Xutil.h>
  6. #include "dat.h"
  7. #include "fns.h"
  8.  
  9. Client  *hiddenc[MAXHIDDEN];
  10.  
  11. int numhidden;
  12.  
  13. char    *b3items[B3FIXED+MAXHIDDEN+1] = 
  14. {
  15.     "New",
  16.     "Reshape",
  17.     "Move",
  18.     "Delete",
  19.     "Hide",
  20.     0,
  21. };
  22.  
  23. Menu    b3menu =
  24. {
  25.     b3items,
  26. };
  27.  
  28. Menu    egg =
  29. {
  30.     version,
  31. };
  32.  
  33. void
  34. button(e)
  35. XButtonEvent *e;
  36. {
  37.     int n, shift;
  38.     Client *c;
  39.     Window dw;
  40.  
  41.     curtime = e->time;
  42.     c = getclient(e->window, 0);
  43.     if (c) {
  44.         e->x += c->x - BORDER + 1;
  45.         e->y += c->y - BORDER + 1;
  46.     }
  47.     else if (e->window != root)
  48.         XTranslateCoordinates(dpy, e->window, root, e->x, e->y,
  49.                 &e->x, &e->y, &dw);
  50.     switch (e->button) {
  51.     case Button1:
  52.         if (c) {
  53.             XMapRaised(dpy, c->parent);
  54.             active(c);
  55.         }
  56.         return;
  57.     case Button2:
  58.         if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask))
  59.             menuhit(e, &egg);
  60.         return;
  61.     default:
  62.         return;
  63.     case Button3:
  64.         break;
  65.     }
  66.  
  67.     cmapfocus(0);
  68.     switch (n = menuhit(e, &b3menu)) {
  69.     case 0:     /* New */
  70.         spawn();
  71.         break;
  72.     case 1:     /* Reshape */
  73.         reshape(selectwin(1, 0));
  74.         break;
  75.     case 2:     /* Move */
  76.         move(selectwin(0, 0));
  77.         break;
  78.     case 3:     /* Delete */
  79.         shift = 0;
  80.         c = selectwin(1, &shift);
  81.         delete(c, shift);
  82.         break;
  83.     case 4:     /* Hide */
  84.         hide(selectwin(1, 0));
  85.         break;
  86.     default:    /* unhide window */
  87.         unhide(n - B3FIXED, 1);
  88.         break;
  89.     case -1:    /* nothing */
  90.         break;
  91.     }
  92.     if (current)
  93.         cmapfocus(current);
  94. }
  95.  
  96. void
  97. spawn()
  98. {
  99.     /*
  100.      * ugly dance to avoid leaving zombies.  Could use SIGCHLD,
  101.      * but it's not very portable, and I'm in a hurry...
  102.      */
  103.     if (fork() == 0) {
  104.         if (fork() == 0) {
  105.             close(ConnectionNumber(dpy));
  106.             if (termprog != NULL) {
  107.                 execl(shell, shell, "-c", termprog, 0);
  108.                 fprintf(stderr, "9wm: exec %s", shell);
  109.                 perror(" failed");
  110.             }
  111.             execlp("9term", "9term", "-9wm", 0);
  112.             execlp("xterm", "xterm", "-ut", 0);
  113.             perror("9wm: exec 9term/xterm failed");
  114.             exit(1);
  115.         }
  116.         exit(0);
  117.     }
  118.     wait((int *) 0);
  119. }
  120.  
  121. void
  122. reshape(c)
  123. Client *c;
  124. {
  125.     int odx, ody;
  126.  
  127.     if (c == 0)
  128.         return;
  129.     odx = c->dx;
  130.     ody = c->dy;
  131.     if (sweep(c) == 0)
  132.         return;
  133.     active(c);
  134.     XRaiseWindow(dpy, c->parent);
  135.     XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
  136.                     c->dx+2*(BORDER-1), c->dy+2*(BORDER-1));
  137.     if (c->dx == odx && c->dy == ody)
  138.         sendconfig(c);
  139.     else
  140.         XMoveResizeWindow(dpy, c->window, BORDER-1, BORDER-1, c->dx, c->dy);
  141. }
  142.  
  143. void
  144. move(c)
  145. Client *c;
  146. {
  147.     if (c == 0)
  148.         return;
  149.     if (drag(c) == 0)
  150.         return;
  151.     active(c);
  152.     XRaiseWindow(dpy, c->parent);
  153.     XMoveWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER);
  154.     sendconfig(c);
  155. }
  156.  
  157. void
  158. delete(c, shift)
  159. Client *c;
  160. int shift;
  161. {
  162.     if (c == 0)
  163.         return;
  164.     if ((c->proto & Pdelete) && !shift)
  165.         sendcmessage(c->window, wm_protocols, wm_delete);
  166.     else
  167.         XKillClient(dpy, c->window);        /* let event clean up */
  168. }
  169.  
  170. void
  171. hide(c)
  172. Client *c;
  173. {
  174.     if (c == 0 || numhidden == MAXHIDDEN)
  175.         return;
  176.     if (hidden(c)) {
  177.         fprintf(stderr, "9wm: already hidden: %s\n", c->label);
  178.         return;
  179.     }
  180.     XUnmapWindow(dpy, c->parent);
  181.     XUnmapWindow(dpy, c->window);
  182.     setstate(c, IconicState);
  183.     if (c == current)
  184.         nofocus();
  185.     hiddenc[numhidden] = c;
  186.     b3items[B3FIXED+numhidden] = c->label;
  187.     numhidden++;
  188.     b3items[B3FIXED+numhidden] = 0;
  189. }
  190.  
  191. void
  192. unhide(n, map)
  193. int n;
  194. int map;
  195. {
  196.     Client *c;
  197.     int i;
  198.  
  199.     if (n >= numhidden) {
  200.         fprintf(stderr, "9wm: unhide: n %d numhidden %d\n", n, numhidden);
  201.         return;
  202.     }
  203.     c = hiddenc[n];
  204.     if (!hidden(c)) {
  205.         fprintf(stderr, "9wm: unhide: not hidden: %s(0x%x)\n",
  206.             c->label, c->window);
  207.         return;
  208.     }
  209.  
  210.     if (map) {
  211.         XMapWindow(dpy, c->window);
  212.         XMapRaised(dpy, c->parent);
  213.         setstate(c, NormalState);
  214.         active(c);
  215.     }
  216.  
  217.     numhidden--;
  218.     for (i = n; i < numhidden; i ++) {
  219.         hiddenc[i] = hiddenc[i+1];
  220.         b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
  221.     }
  222.     b3items[B3FIXED+numhidden] = 0;
  223. }
  224.  
  225. void
  226. unhidec(c, map)
  227. Client *c;
  228. int map;
  229. {
  230.     int i;
  231.  
  232.     for (i = 0; i < numhidden; i++)
  233.         if (c == hiddenc[i]) {
  234.             unhide(i, map);
  235.             return;
  236.         }
  237.     fprintf(stderr, "9wm: unhidec: not hidden: %s(0x%x)\n",
  238.         c->label, c->window);
  239. }
  240.  
  241. void
  242. renamec(c, name)
  243. Client *c;
  244. char *name;
  245. {
  246.     int i;
  247.  
  248.     if (name == 0)
  249.         name = "???";
  250.     c->label = name;
  251.     if (!hidden(c))
  252.         return;
  253.     for (i = 0; i < numhidden; i++)
  254.         if (c == hiddenc[i]) {
  255.             b3items[B3FIXED+i] = name;
  256.             return;
  257.         }
  258. }
  259.