1 /* $Header: /home/yav/xpx/RCS/menu.c,v 1.25 1995/11/25 19:20:59 yav Exp $
2  * xpx main menu
3  * written by yav (UHD98984@pcvan.or.jp)
4  */
5 
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8 
9 #include "headers.h"
10 #include "xpx.h"
11 #include "work.h"
12 #include "menudef.h"
13 #define PUBLIC_MENU_C
14 #include "extern.h"
15 
16 
17 #define MAXMENU	4
18 #define MENUW	52
19 #define MENUH	18
20 
21 char rcsid_menu[] = "$Id: menu.c,v 1.25 1995/11/25 19:20:59 yav Exp $";
22 
23 int mnev(
24 #if NeedFunctionPrototypes
25 	 MENU *,
26 	 XEvent *
27 #endif
28 	 );
29 
30 #define IMASK (ExposureMask|EnterWindowMask|LeaveWindowMask|ButtonPressMask)
31 static MENU menutbl[] = {
32   {
33     MENU_QUIT,	MenuModeMaskBorder,
34     (MENUW+BDW*2+4)*0, 0, MENUW, MENUH,
35     0, IMASK, 0,
36     mnev, NULL, 0, 0, "Quit"},
37   {
38     MENU_FILE,	MenuModeMaskBorder,
39     (MENUW+BDW*2+4)*1, 0, MENUW, MENUH,
40     0, IMASK, 0,
41     mnev, NULL, 0, 0, "File"},
42   {
43     MENU_INFO,	MenuModeMaskBorder,
44     (MENUW+BDW*2+4)*2, 0, MENUW, MENUH,
45     0, IMASK, 0,
46     mnev, NULL, 0, 0, "Info"},
47   {
48     MENU_EDIT,	MenuModeMaskBorder,
49     (MENUW+BDW*2+4)*3, 0, MENUW, MENUH,
50     0, IMASK, 0,
51     mnev, NULL, 0, 0, "Edit"},
52   {
53     -1,	0,
54     0, 0, 0, 0,
55     0, 0, 0,
56     NULL, NULL, 0, 0, NULL}};
57 
58 #define SURE_MESSAGE	0
59 #define SURE_YES	1
60 #define SURE_NO		2
61 
62 int sureev(
63 #if NeedFunctionPrototypes
64 	   MENU *,
65 	   XEvent *
66 #endif
67 	   );
68 
69 static MENU sure_menu[] = {
70   {
71     SURE_MESSAGE,	0,
72     0, 0, 120, 20,
73     0, ExposureMask, 0,
74     NULL, NULL, 0, 0, "Quit xpx?"},
75   {
76     SURE_YES,	MenuModeMaskBorder,
77     80, 20, 32, 20,
78     0, IMASK, 0,
79     sureev, NULL, 0, 0, "Yes"},
80   {
81     SURE_NO,	MenuModeMaskBorder,
82     80+(32+BDW*2+8), 20, 32, 20,
83     0, IMASK, 0,
84     sureev, NULL, 0, 0, "No"},
85   {
86     -1,	0,
87     0, 0, 0, 0,
88     0, 0, 0,
89     NULL, NULL, 0, 0, NULL}};
90 
91 static Window surewin;
92 static int surewin_opened = 0;
93 
create_dialog(p,w,h)94 Window create_dialog(p, w, h)
95      MENU *p;
96      int w;
97      int h;
98 {
99   Window root, child, wd;
100   int root_x, root_y, win_x, win_y;
101   unsigned int keys_buttons;
102   char buf[128];
103 
104   XQueryPointer(dsp, win, &root, &child, &root_x, &root_y,
105 		&win_x, &win_y, &keys_buttons);
106   sprintf(buf, "+%d+%d", root_x, root_y);
107   create_toplevel_window(&wd, "Quit?", buf, w, h);
108   menuwin_create(p, wd, 0, 0);
109   return wd;
110 }
111 
create_sure_window()112 void create_sure_window()
113 {
114   surewin = create_dialog(sure_menu, 180, 50);
115   surewin_opened = 1;
116 }
117 
map_sure_window(void)118 void map_sure_window(
119 #if NeedFunctionPrototypes
120 		     void
121 #endif
122 		     )
123 {
124   if (!surewin_opened)
125     create_sure_window();
126   sure_menu[SURE_NO].mode &= ~MenuModeMaskOn; /* already off */
127   XMapRaised(dsp, surewin);
128 }
129 
unmap_sure_window(void)130 void unmap_sure_window(
131 #if NeedFunctionPrototypes
132 		       void
133 #endif
134 		       )
135 {
136   XUnmapWindow(dsp, surewin);
137 }
138 
139 
create_menu_window(win,x,y)140 int create_menu_window(win, x, y)
141      Window win;
142      int x;
143      int y;
144 {
145   topmenuwin_create(menutbl, x, y);
146   return 0;
147 }
148 
menu_stat_change(i,s)149 void menu_stat_change(i, s)
150      int i;
151      int s;
152 {
153   switch(s) {
154   case 0:
155     menutbl[i].mode &= ~MenuModeMaskOn;
156     break;
157   case 1:
158     menutbl[i].mode |= MenuModeMaskOn;
159     break;
160   case 2:
161     menutbl[i].mode ^= MenuModeMaskOn;
162     break;
163   }
164   redraw_window(menutbl[i].win);
165   switch(i) {
166   case MENU_QUIT:
167     if (menutbl[i].mode & MenuModeMaskOn) {
168       if (imgchanged||colchanged)
169 	map_sure_window();
170       else
171 	sw_quit = 1;
172     } else {
173       unmap_sure_window();
174     }
175     break;
176   case MENU_FILE:
177     if (menutbl[i].mode & MenuModeMaskOn)
178       map_file_window();
179     else
180       unmap_file_window();
181     break;
182   case MENU_INFO:
183     if (menutbl[i].mode & MenuModeMaskOn)
184       map_info_window();
185     else
186       unmap_info_window();
187     break;
188   case MENU_EDIT:
189     if (menutbl[i].mode & MenuModeMaskOn)
190       map_edit_window();
191     else
192       unmap_edit_window();
193     break;
194   }
195 }
196 
sureev(p,ev)197 int sureev(p, ev)
198      MENU *p;
199      XEvent *ev;
200 {
201   switch(ev->type) {
202   case ButtonPress:
203     switch(p->n) {
204     case SURE_YES:
205       sw_quit = 1;
206     case SURE_NO:
207       menu_stat_change(MENU_QUIT, 0);
208       break;
209     }
210   }
211   return 0;
212 }
213 
mnev(p,ev)214 int mnev(p, ev)
215      MENU *p;
216      XEvent *ev;
217 {
218   switch(ev->type) {
219   case ButtonPress:
220     menu_stat_change(p->n, 2);
221     return 1;
222   }
223   return 0;
224 }
225 
226 /* End of file */
227