1 /* $Header: /home/yav/xpx/RCS/grid.c,v 1.13 1995/11/23 16:28:39 yav Exp $
2  * xpx gird
3  * written by yav (UHD98984@pcvan.or.jp)
4  */
5 
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8 #include <X11/keysym.h>
9 
10 #include "headers.h"
11 #include "xpx.h"
12 #include "work.h"
13 #include "griddef.h"
14 #define PUBLIC_GRID_C
15 #include "extern.h"
16 
17 #define GRIDN	3
18 #define GRIDW	24
19 #define GRIDH	18
20 #define MAXGRID	32
21 
22 char rcsid_grid[] = "$Id: grid.c,v 1.13 1995/11/23 16:28:39 yav Exp $";
23 
24 int gridev();
25 
26 #define IMASK (ExposureMask|EnterWindowMask|LeaveWindowMask|ButtonPressMask)
27 static MENU gridmenu[] = {
28   {
29     GRID_OUT,	MenuModeMaskBorder,
30     0, 0, GRIDW, GRIDH,
31     0, IMASK, 0,
32     gridev, NULL, 0, 0, "<"},
33   {
34     GRID_NUM,	MenuModeMaskBorder,
35     GRIDW+BDW, 0, GRIDW, GRIDH,
36     0, IMASK|KeyPressMask, 0,
37     gridev, NULL, 0, 8, NULL},
38   {
39     GRID_IN,	MenuModeMaskBorder,
40     (GRIDW+BDW)*2, 0, GRIDW, GRIDH,
41     0, IMASK, 0,
42     gridev, NULL, 0, 0, ">"},
43   {
44     -1,	0,
45     0, 0, 0, 0,
46     0, 0, 0,
47     NULL, NULL, 0, 0, NULL}};
48 
49 /* return 0: no changed */
set_grid_size(int n)50 int set_grid_size(
51 #if NeedFunctionPrototypes
52 		  int n)
53 #else
54      n)
55      int n;
56 #endif
57 {
58   int last_grid_size;
59 
60   last_grid_size = grid_size;
61   if (0 < n && n <= MAXGRID)
62     grid_size = n;
63   sprintf(gridmenu[GRID_NUM].str, "%d", grid_size);
64   gridmenu[GRID_NUM].cursor = strlen(gridmenu[GRID_NUM].str);
65   redraw_window(gridmenu[GRID_NUM].win);
66   return grid_size - last_grid_size;
67 }
68 
create_grid_window(win,x,y)69 void create_grid_window(win, x, y)
70      Window win;
71      int x;
72      int y;
73 {
74   topmenuwin_create(gridmenu, x, y);
75   set_grid_size(grid_size);
76 }
77 
grid_in()78 void grid_in()
79 {
80   gridmenu[GRID_IN].mode |= MenuModeMaskOn;
81   menuwin_expose_default(&gridmenu[GRID_IN]);
82   if (set_grid_size(grid_size+1) && grid_mode)
83     img_expose(0, 0, imgwinwidth, imgwinheight);
84   gridmenu[GRID_IN].mode &= ~MenuModeMaskOn;
85   menuwin_expose_default(&gridmenu[GRID_IN]);
86 }
87 
grid_out()88 void grid_out()
89 {
90   gridmenu[GRID_OUT].mode |= MenuModeMaskOn;
91   menuwin_expose_default(&gridmenu[GRID_OUT]);
92   if (set_grid_size(grid_size-1) && grid_mode)
93     img_expose(0, 0, imgwinwidth, imgwinheight);
94   gridmenu[GRID_OUT].mode &= ~MenuModeMaskOn;
95   menuwin_expose_default(&gridmenu[GRID_OUT]);
96 }
97 
gridev(MENU * p,XEvent * ev)98 int gridev(
99 #if NeedFunctionPrototypes
100 	   MENU *p, XEvent *ev)
101 #else
102      p, ev)
103      MENU *p;
104      XEvent *ev;
105 #endif
106 {
107   int i;
108   KeySym key;
109   char buf[16];
110 
111   switch(ev->type) {
112   case ButtonPress:
113     p->mode ^= MenuModeMaskOn;
114     switch(p->n) {
115     case GRID_OUT:
116       grid_out();
117       break;
118     case GRID_NUM:
119       grid_mode = p->mode & MenuModeMaskOn ? True : False;
120       img_expose(0, 0, imgwinwidth, imgwinheight);
121       break;
122     case GRID_IN:
123       grid_in();
124       break;
125     }
126     redraw_window(p->win);
127     return 1;
128   case KeyPress:
129     switch(p->n) {
130     case GRID_NUM:
131       i = XLookupString((XKeyEvent *)ev, buf, sizeof(buf)-1, &key, NULL);
132       buf[i] = '\0';
133       switch(key) {
134       case XK_KP_Enter:
135       case XK_Return:
136 	i = strtol(p->str, NULL, 0);
137 	if (set_grid_size(i) && grid_mode)
138 	  img_expose(0, 0, imgwinwidth, imgwinheight);
139 	break;
140       }
141       break;
142     }
143     break;
144   }
145   return 0;
146 }
147 
148 /* End of file */
149