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