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:
parent
4ccffb6589
commit
eae511030c
3 changed files with 54 additions and 26 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue