diff options
-rw-r--r-- | uisimulator/screenhack.c | 135 | ||||
-rw-r--r-- | uisimulator/screenhack.h | 4 |
2 files changed, 70 insertions, 69 deletions
diff --git a/uisimulator/screenhack.c b/uisimulator/screenhack.c index f234a9711b..f4f5aaa348 100644 --- a/uisimulator/screenhack.c +++ b/uisimulator/screenhack.c | |||
@@ -91,6 +91,8 @@ static char *default_defaults[] = { | |||
91 | 0 | 91 | 0 |
92 | }; | 92 | }; |
93 | 93 | ||
94 | extern Display* dpy; | ||
95 | |||
94 | static XrmOptionDescRec *merged_options; | 96 | static XrmOptionDescRec *merged_options; |
95 | static int merged_options_size; | 97 | static int merged_options_size; |
96 | static char **merged_defaults; | 98 | static char **merged_defaults; |
@@ -179,83 +181,82 @@ static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; | |||
179 | /* Dead-trivial event handling: exits if "q" or "ESC" are typed. | 181 | /* Dead-trivial event handling: exits if "q" or "ESC" are typed. |
180 | Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. | 182 | Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. |
181 | */ | 183 | */ |
182 | void | 184 | int |
183 | screenhack_handle_event (Display *dpy, XEvent *event) | 185 | screenhack_handle_event (Display *dpy, XEvent *event) |
184 | { | 186 | { |
185 | switch (event->xany.type) | 187 | int key=0; |
188 | switch (event->xany.type) | ||
186 | { | 189 | { |
187 | case KeyPress: | 190 | case KeyPress: |
188 | { | 191 | { |
189 | KeySym keysym; | 192 | KeySym keysym; |
190 | unsigned char c = 0; | 193 | unsigned char c = 0; |
191 | XLookupString (&event->xkey, &c, 1, &keysym, 0); | 194 | XLookupString (&event->xkey, &c, 1, &keysym, 0); |
192 | if (c == 'q' || | 195 | if (! (keysym >= XK_Shift_L && keysym <= XK_Hyper_R)) |
193 | c == 'Q' || | 196 | XBell (dpy, 0); /* beep for non-chord keys */ |
194 | c == 3 || /* ^C */ | 197 | key = keysym; |
195 | c == 27) /* ESC */ | 198 | fprintf(stderr, "KEY PRESSED: %c (%02x)\n", c, c); |
196 | exit (0); | 199 | } |
197 | else if (! (keysym >= XK_Shift_L && keysym <= XK_Hyper_R)) | 200 | break; |
198 | XBell (dpy, 0); /* beep for non-chord keys */ | 201 | case ResizeRequest: |
199 | 202 | screen_resized(event->xresizerequest.width, event->xresizerequest.height); | |
200 | fprintf(stderr, "KEY PRESSED: %c (%02x)\n", c, c); | 203 | screen_redraw(); |
201 | } | 204 | fprintf(stderr, "WINDOW RESIZED to width %d height %d\n", |
202 | break; | 205 | event->xresizerequest.width, event->xresizerequest.height); |
203 | case ResizeRequest: | 206 | break; |
204 | screen_resized(event->xresizerequest.width, event->xresizerequest.height); | 207 | default: |
205 | screen_redraw(); | 208 | fprintf(stderr, "EVENT: %d (see /usr/include/X11/X.h)\n", |
206 | fprintf(stderr, "WINDOW RESIZED to width %d height %d\n", | 209 | event->xany.type); |
207 | event->xresizerequest.width, event->xresizerequest.height); | 210 | break; |
208 | break; | 211 | case Expose: |
209 | default: | 212 | screen_redraw(); |
210 | fprintf(stderr, "EVENT: %d (see /usr/include/X11/X.h)\n", | 213 | fprintf(stderr, "EXPOSE: x: %d y: %d width: %d height: %d\n", |
211 | event->xany.type); | 214 | event->xexpose.x, event->xexpose.y, |
212 | break; | 215 | event->xexpose.width, event->xexpose.height); |
213 | case Expose: | 216 | break; |
214 | screen_redraw(); | 217 | case ButtonPress: |
215 | fprintf(stderr, "EXPOSE: x: %d y: %d width: %d height: %d\n", | 218 | fprintf(stderr, "BUTTON PRESSED\n"); |
216 | event->xexpose.x, event->xexpose.y, | 219 | break; |
217 | event->xexpose.width, event->xexpose.height); | 220 | case ClientMessage: |
218 | break; | 221 | { |
219 | case ButtonPress: | 222 | if (event->xclient.message_type != XA_WM_PROTOCOLS) |
220 | fprintf(stderr, "BUTTON PRESSED\n"); | 223 | { |
221 | break; | 224 | char *s = XGetAtomName(dpy, event->xclient.message_type); |
222 | case ClientMessage: | 225 | if (!s) s = "(null)"; |
223 | { | 226 | fprintf (stderr, "%s: unknown ClientMessage %s received!\n", |
224 | if (event->xclient.message_type != XA_WM_PROTOCOLS) | 227 | progname, s); |
225 | { | 228 | } |
226 | char *s = XGetAtomName(dpy, event->xclient.message_type); | 229 | else if (event->xclient.data.l[0] != XA_WM_DELETE_WINDOW) |
227 | if (!s) s = "(null)"; | 230 | { |
228 | fprintf (stderr, "%s: unknown ClientMessage %s received!\n", | 231 | char *s1 = XGetAtomName(dpy, event->xclient.message_type); |
229 | progname, s); | 232 | char *s2 = XGetAtomName(dpy, event->xclient.data.l[0]); |
230 | } | 233 | if (!s1) s1 = "(null)"; |
231 | else if (event->xclient.data.l[0] != XA_WM_DELETE_WINDOW) | 234 | if (!s2) s2 = "(null)"; |
232 | { | 235 | fprintf (stderr, "%s: unknown ClientMessage %s[%s] received!\n", |
233 | char *s1 = XGetAtomName(dpy, event->xclient.message_type); | 236 | progname, s1, s2); |
234 | char *s2 = XGetAtomName(dpy, event->xclient.data.l[0]); | 237 | } |
235 | if (!s1) s1 = "(null)"; | 238 | else |
236 | if (!s2) s2 = "(null)"; | 239 | { |
237 | fprintf (stderr, "%s: unknown ClientMessage %s[%s] received!\n", | 240 | exit (0); |
238 | progname, s1, s2); | 241 | } |
239 | } | 242 | } |
240 | else | 243 | break; |
241 | { | ||
242 | exit (0); | ||
243 | } | ||
244 | } | ||
245 | break; | ||
246 | } | 244 | } |
245 | return key; | ||
247 | } | 246 | } |
248 | 247 | ||
249 | 248 | ||
250 | void | 249 | int |
251 | screenhack_handle_events (Display *dpy) | 250 | screenhack_handle_events (void) |
252 | { | 251 | { |
253 | while (XPending (dpy)) | 252 | int key=0; |
253 | while (XPending (dpy)) | ||
254 | { | 254 | { |
255 | XEvent event; | 255 | XEvent event; |
256 | XNextEvent (dpy, &event); | 256 | XNextEvent (dpy, &event); |
257 | screenhack_handle_event (dpy, &event); | 257 | key=screenhack_handle_event (dpy, &event); |
258 | } | 258 | } |
259 | return key; | ||
259 | } | 260 | } |
260 | 261 | ||
261 | 262 | ||
diff --git a/uisimulator/screenhack.h b/uisimulator/screenhack.h index fe68bc603e..12cd873e22 100644 --- a/uisimulator/screenhack.h +++ b/uisimulator/screenhack.h | |||
@@ -89,8 +89,8 @@ extern XrmOptionDescRec options []; | |||
89 | extern char *defaults []; | 89 | extern char *defaults []; |
90 | 90 | ||
91 | extern void screenhack (Display*,Window); | 91 | extern void screenhack (Display*,Window); |
92 | extern void screenhack_handle_event (Display*, XEvent*); | 92 | extern int screenhack_handle_event (Display*, XEvent*); |
93 | extern void screenhack_handle_events (Display*); | 93 | extern int screenhack_handle_events (void); |
94 | extern void screen_redraw(); | 94 | extern void screen_redraw(); |
95 | extern void screen_resized(); | 95 | extern void screen_resized(); |
96 | 96 | ||