diff options
author | Daniel Stenberg <daniel@haxx.se> | 2003-04-23 18:49:57 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2003-04-23 18:49:57 +0000 |
commit | eae511030cd7540e37a11d4c6d5147fd5c186a1a (patch) | |
tree | f5658e9f0bd569faa840cba8d877be00cc3cdaac /uisimulator | |
parent | 4ccffb658931503b3badb70a99d72a0cfb9834b1 (diff) | |
download | rockbox-eae511030cd7540e37a11d4c6d5147fd5c186a1a.tar.gz rockbox-eae511030cd7540e37a11d4c6d5147fd5c186a1a.zip |
Now supports key-repeat in the simulator!
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3594 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator')
-rw-r--r-- | uisimulator/x11/button-x11.c | 16 | ||||
-rw-r--r-- | uisimulator/x11/screenhack.c | 60 | ||||
-rw-r--r-- | uisimulator/x11/screenhack.h | 4 |
3 files changed, 54 insertions, 26 deletions
diff --git a/uisimulator/x11/button-x11.c b/uisimulator/x11/button-x11.c index 9f009f0e72..ae16e2e891 100644 --- a/uisimulator/x11/button-x11.c +++ b/uisimulator/x11/button-x11.c | |||
@@ -18,6 +18,7 @@ | |||
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include "button.h" | 19 | #include "button.h" |
20 | #include "kernel.h" | 20 | #include "kernel.h" |
21 | #include "debug.h" | ||
21 | 22 | ||
22 | #include "X11/keysym.h" | 23 | #include "X11/keysym.h" |
23 | 24 | ||
@@ -62,15 +63,15 @@ int button_set_release(int newmask) | |||
62 | * Q=On Return=Menu | 63 | * Q=On Return=Menu |
63 | */ | 64 | */ |
64 | 65 | ||
65 | /* from uibasic.c */ | 66 | extern int screenhack_handle_events(bool *release, bool *repeat); |
66 | extern int screenhack_handle_events(bool *release); | ||
67 | 67 | ||
68 | static int get_raw_button (void) | 68 | static int get_raw_button (void) |
69 | { | 69 | { |
70 | int k; | 70 | int k; |
71 | bool release=false; /* is this a release event */ | 71 | bool release=false; /* is this a release event */ |
72 | 72 | bool repeat=false; /* is the key a repeated one */ | |
73 | switch(screenhack_handle_events(&release)) | 73 | int ev=screenhack_handle_events(&release, &repeat); |
74 | switch(ev) | ||
74 | { | 75 | { |
75 | case XK_KP_Left: | 76 | case XK_KP_Left: |
76 | case XK_Left: | 77 | case XK_Left: |
@@ -145,13 +146,18 @@ static int get_raw_button (void) | |||
145 | 146 | ||
146 | default: | 147 | default: |
147 | k = 0; | 148 | k = 0; |
149 | if(ev) | ||
150 | DEBUGF("received ev %d\n", ev); | ||
148 | break; | 151 | break; |
149 | } | 152 | } |
150 | 153 | ||
151 | if ( release ) | 154 | if(release) |
152 | /* return a release event */ | 155 | /* return a release event */ |
153 | k |= BUTTON_REL; | 156 | k |= BUTTON_REL; |
154 | 157 | ||
158 | if(repeat) | ||
159 | k |= BUTTON_REPEAT; | ||
160 | |||
155 | return k; | 161 | return k; |
156 | } | 162 | } |
157 | 163 | ||
diff --git a/uisimulator/x11/screenhack.c b/uisimulator/x11/screenhack.c index 81650b57d7..c4d43e5eb7 100644 --- a/uisimulator/x11/screenhack.c +++ b/uisimulator/x11/screenhack.c | |||
@@ -57,6 +57,8 @@ | |||
57 | #include "version.h" | 57 | #include "version.h" |
58 | #include "vroot.h" | 58 | #include "vroot.h" |
59 | 59 | ||
60 | #include "debug.h" | ||
61 | |||
60 | #ifndef isupper | 62 | #ifndef isupper |
61 | # define isupper(c) ((c) >= 'A' && (c) <= 'Z') | 63 | # define isupper(c) ((c) >= 'A' && (c) <= 'Z') |
62 | #endif | 64 | #endif |
@@ -207,14 +209,28 @@ static Bool MapNotify_event_p (Display *dpy, XEvent *event, XPointer window) | |||
207 | 209 | ||
208 | static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; | 210 | static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; |
209 | 211 | ||
210 | /* Dead-trivial event handling: exits if "q" or "ESC" are typed. | 212 | static Bool checkrepeat(time_t prev, |
213 | time_t now) | ||
214 | { | ||
215 | if(now-prev < 50) { | ||
216 | DEBUGF("Consider this a button repeat\n"); | ||
217 | return true; | ||
218 | } | ||
219 | return false; | ||
220 | } | ||
221 | |||
222 | /* Dead-trivial event handling. | ||
211 | Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. | 223 | Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. |
212 | */ | 224 | */ |
213 | int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) | 225 | int screenhack_handle_event(Display *dpy, XEvent *event, |
226 | bool *release, bool *repeat) | ||
214 | { | 227 | { |
215 | int key=0; | 228 | int key=0; |
229 | static time_t lasttime; | ||
230 | static unsigned int lastkeycode; | ||
216 | 231 | ||
217 | *release = FALSE; | 232 | *release = FALSE; |
233 | *repeat = false; | ||
218 | 234 | ||
219 | switch (event->xany.type) { | 235 | switch (event->xany.type) { |
220 | case KeyPress: | 236 | case KeyPress: |
@@ -223,7 +239,15 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) | |||
223 | unsigned char c = 0; | 239 | unsigned char c = 0; |
224 | XLookupString (&event->xkey, &c, 1, &keysym, 0); | 240 | XLookupString (&event->xkey, &c, 1, &keysym, 0); |
225 | key = keysym; | 241 | key = keysym; |
226 | /* fprintf(stderr, "KEY PRESSED: %c (%02x)\n", c, c); */ | 242 | #if 0 |
243 | DEBUGF("Got keypress: %02x %x, time %lx\n", c, | ||
244 | event->xkey.keycode, | ||
245 | event->xkey.time); | ||
246 | #endif | ||
247 | if(lastkeycode == event->xkey.keycode) | ||
248 | *repeat = checkrepeat(lasttime, event->xkey.time); | ||
249 | lasttime = event->xkey.time; | ||
250 | lastkeycode = event->xkey.keycode; | ||
227 | } | 251 | } |
228 | break; | 252 | break; |
229 | case KeyRelease: | 253 | case KeyRelease: |
@@ -232,29 +256,27 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) | |||
232 | unsigned char c = 0; | 256 | unsigned char c = 0; |
233 | XLookupString (&event->xkey, &c, 1, &keysym, 0); | 257 | XLookupString (&event->xkey, &c, 1, &keysym, 0); |
234 | key = keysym; | 258 | key = keysym; |
235 | /* fprintf(stderr, "KEY RELEASED: %c (%02x) %x\n", c, c, | 259 | #if 0 |
236 | event->xkey.keycode); */ | 260 | DEBUGF("Got keyrelease: %c (%02x) %x\n", c, c, |
237 | 261 | event->xkey.keycode); | |
262 | #endif | ||
263 | if(lastkeycode == event->xkey.keycode) | ||
264 | *repeat = checkrepeat(lasttime, event->xkey.time); | ||
265 | lasttime = event->xkey.time; | ||
266 | lastkeycode = event->xkey.keycode; | ||
267 | if(*repeat) | ||
268 | return 0; /* on repeats, return nothing on release */ | ||
269 | |||
238 | *release = TRUE; | 270 | *release = TRUE; |
239 | } | 271 | } |
240 | break; | 272 | break; |
241 | case Expose: | 273 | case Expose: |
242 | { | 274 | { |
243 | /* | ||
244 | int x=event->xexpose.width+event->xexpose.x; | ||
245 | int y=event->xexpose.height+event->xexpose.y; | ||
246 | screen_resized(x, y); | ||
247 | fprintf(stderr, "WINDOW RESIZED to width %d height %d\n", | ||
248 | x, y); | ||
249 | */ | ||
250 | screen_redraw(); | 275 | screen_redraw(); |
251 | } | 276 | } |
252 | break; | 277 | break; |
253 | default: | 278 | default: |
254 | break; | 279 | break; |
255 | case ButtonPress: | ||
256 | fprintf(stderr, "BUTTON PRESSED: x: %d y:%d\n",event->xbutton.x,event->xbutton.y); | ||
257 | break; | ||
258 | case ClientMessage: | 280 | case ClientMessage: |
259 | { | 281 | { |
260 | if (event->xclient.message_type != XA_WM_PROTOCOLS) { | 282 | if (event->xclient.message_type != XA_WM_PROTOCOLS) { |
@@ -281,14 +303,14 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) | |||
281 | } | 303 | } |
282 | 304 | ||
283 | 305 | ||
284 | int screenhack_handle_events(bool *release) | 306 | int screenhack_handle_events(bool *release, bool *repeat) |
285 | { | 307 | { |
286 | int key=0; | 308 | int key=0; |
287 | while (XPending(dpy)) | 309 | if(XPending(dpy)) |
288 | { | 310 | { |
289 | XEvent event; | 311 | XEvent event; |
290 | XNextEvent(dpy, &event); | 312 | XNextEvent(dpy, &event); |
291 | key=screenhack_handle_event(dpy, &event, release); | 313 | key=screenhack_handle_event(dpy, &event, release, repeat); |
292 | } | 314 | } |
293 | return key; | 315 | return key; |
294 | } | 316 | } |
diff --git a/uisimulator/x11/screenhack.h b/uisimulator/x11/screenhack.h index ac9b01bf75..f4496d69c5 100644 --- a/uisimulator/x11/screenhack.h +++ b/uisimulator/x11/screenhack.h | |||
@@ -40,8 +40,8 @@ extern XrmOptionDescRec options []; | |||
40 | extern char *defaults []; | 40 | extern char *defaults []; |
41 | 41 | ||
42 | extern void screenhack (Display*,Window); | 42 | extern void screenhack (Display*,Window); |
43 | extern int screenhack_handle_event(Display*, XEvent*, bool *); | 43 | extern int screenhack_handle_event(Display*, XEvent*, bool *, bool *); |
44 | extern int screenhack_handle_events(bool *); | 44 | extern int screenhack_handle_events(bool *, bool *); |
45 | extern void screen_redraw(); | 45 | extern void screen_redraw(); |
46 | extern void screen_resized(); | 46 | extern void screen_resized(); |
47 | 47 | ||