summaryrefslogtreecommitdiff
path: root/uisimulator
diff options
context:
space:
mode:
Diffstat (limited to 'uisimulator')
-rw-r--r--uisimulator/x11/button-x11.c16
-rw-r--r--uisimulator/x11/screenhack.c60
-rw-r--r--uisimulator/x11/screenhack.h4
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 */ 66extern int screenhack_handle_events(bool *release, bool *repeat);
66extern int screenhack_handle_events(bool *release);
67 67
68static int get_raw_button (void) 68static 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
208static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; 210static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW;
209 211
210/* Dead-trivial event handling: exits if "q" or "ESC" are typed. 212static 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 */
213int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) 225int 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
284int screenhack_handle_events(bool *release) 306int 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 [];
40extern char *defaults []; 40extern char *defaults [];
41 41
42extern void screenhack (Display*,Window); 42extern void screenhack (Display*,Window);
43extern int screenhack_handle_event(Display*, XEvent*, bool *); 43extern int screenhack_handle_event(Display*, XEvent*, bool *, bool *);
44extern int screenhack_handle_events(bool *); 44extern int screenhack_handle_events(bool *, bool *);
45extern void screen_redraw(); 45extern void screen_redraw();
46extern void screen_resized(); 46extern void screen_resized();
47 47