1
0
Fork 0
forked from len0rd/rockbox

Now supports key-repeat in the simulator!

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3594 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Daniel Stenberg 2003-04-23 18:49:57 +00:00
parent 4ccffb6589
commit eae511030c
3 changed files with 54 additions and 26 deletions

View file

@ -18,6 +18,7 @@
****************************************************************************/ ****************************************************************************/
#include "button.h" #include "button.h"
#include "kernel.h" #include "kernel.h"
#include "debug.h"
#include "X11/keysym.h" #include "X11/keysym.h"
@ -62,15 +63,15 @@ int button_set_release(int newmask)
* Q=On Return=Menu * Q=On Return=Menu
*/ */
/* from uibasic.c */ extern int screenhack_handle_events(bool *release, bool *repeat);
extern int screenhack_handle_events(bool *release);
static int get_raw_button (void) static int get_raw_button (void)
{ {
int k; int k;
bool release=false; /* is this a release event */ bool release=false; /* is this a release event */
bool repeat=false; /* is the key a repeated one */
switch(screenhack_handle_events(&release)) int ev=screenhack_handle_events(&release, &repeat);
switch(ev)
{ {
case XK_KP_Left: case XK_KP_Left:
case XK_Left: case XK_Left:
@ -145,6 +146,8 @@ static int get_raw_button (void)
default: default:
k = 0; k = 0;
if(ev)
DEBUGF("received ev %d\n", ev);
break; break;
} }
@ -152,6 +155,9 @@ static int get_raw_button (void)
/* return a release event */ /* return a release event */
k |= BUTTON_REL; k |= BUTTON_REL;
if(repeat)
k |= BUTTON_REPEAT;
return k; return k;
} }

View file

@ -57,6 +57,8 @@
#include "version.h" #include "version.h"
#include "vroot.h" #include "vroot.h"
#include "debug.h"
#ifndef isupper #ifndef isupper
# define isupper(c) ((c) >= 'A' && (c) <= 'Z') # define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#endif #endif
@ -207,14 +209,28 @@ static Bool MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW;
/* Dead-trivial event handling: exits if "q" or "ESC" are typed. static Bool checkrepeat(time_t prev,
time_t now)
{
if(now-prev < 50) {
DEBUGF("Consider this a button repeat\n");
return true;
}
return false;
}
/* Dead-trivial event handling.
Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received. Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received.
*/ */
int screenhack_handle_event(Display *dpy, XEvent *event, bool *release) int screenhack_handle_event(Display *dpy, XEvent *event,
bool *release, bool *repeat)
{ {
int key=0; int key=0;
static time_t lasttime;
static unsigned int lastkeycode;
*release = FALSE; *release = FALSE;
*repeat = false;
switch (event->xany.type) { switch (event->xany.type) {
case KeyPress: case KeyPress:
@ -223,7 +239,15 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release)
unsigned char c = 0; unsigned char c = 0;
XLookupString (&event->xkey, &c, 1, &keysym, 0); XLookupString (&event->xkey, &c, 1, &keysym, 0);
key = keysym; key = keysym;
/* fprintf(stderr, "KEY PRESSED: %c (%02x)\n", c, c); */ #if 0
DEBUGF("Got keypress: %02x %x, time %lx\n", c,
event->xkey.keycode,
event->xkey.time);
#endif
if(lastkeycode == event->xkey.keycode)
*repeat = checkrepeat(lasttime, event->xkey.time);
lasttime = event->xkey.time;
lastkeycode = event->xkey.keycode;
} }
break; break;
case KeyRelease: case KeyRelease:
@ -232,29 +256,27 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release)
unsigned char c = 0; unsigned char c = 0;
XLookupString (&event->xkey, &c, 1, &keysym, 0); XLookupString (&event->xkey, &c, 1, &keysym, 0);
key = keysym; key = keysym;
/* fprintf(stderr, "KEY RELEASED: %c (%02x) %x\n", c, c, #if 0
event->xkey.keycode); */ DEBUGF("Got keyrelease: %c (%02x) %x\n", c, c,
event->xkey.keycode);
#endif
if(lastkeycode == event->xkey.keycode)
*repeat = checkrepeat(lasttime, event->xkey.time);
lasttime = event->xkey.time;
lastkeycode = event->xkey.keycode;
if(*repeat)
return 0; /* on repeats, return nothing on release */
*release = TRUE; *release = TRUE;
} }
break; break;
case Expose: case Expose:
{ {
/*
int x=event->xexpose.width+event->xexpose.x;
int y=event->xexpose.height+event->xexpose.y;
screen_resized(x, y);
fprintf(stderr, "WINDOW RESIZED to width %d height %d\n",
x, y);
*/
screen_redraw(); screen_redraw();
} }
break; break;
default: default:
break; break;
case ButtonPress:
fprintf(stderr, "BUTTON PRESSED: x: %d y:%d\n",event->xbutton.x,event->xbutton.y);
break;
case ClientMessage: case ClientMessage:
{ {
if (event->xclient.message_type != XA_WM_PROTOCOLS) { if (event->xclient.message_type != XA_WM_PROTOCOLS) {
@ -281,14 +303,14 @@ int screenhack_handle_event(Display *dpy, XEvent *event, bool *release)
} }
int screenhack_handle_events(bool *release) int screenhack_handle_events(bool *release, bool *repeat)
{ {
int key=0; int key=0;
while (XPending(dpy)) if(XPending(dpy))
{ {
XEvent event; XEvent event;
XNextEvent(dpy, &event); XNextEvent(dpy, &event);
key=screenhack_handle_event(dpy, &event, release); key=screenhack_handle_event(dpy, &event, release, repeat);
} }
return key; return key;
} }

View file

@ -40,8 +40,8 @@ extern XrmOptionDescRec options [];
extern char *defaults []; extern char *defaults [];
extern void screenhack (Display*,Window); extern void screenhack (Display*,Window);
extern int screenhack_handle_event(Display*, XEvent*, bool *); extern int screenhack_handle_event(Display*, XEvent*, bool *, bool *);
extern int screenhack_handle_events(bool *); extern int screenhack_handle_events(bool *, bool *);
extern void screen_redraw(); extern void screen_redraw();
extern void screen_resized(); extern void screen_resized();