SDL target: remove mouse polling and replace it with an event-based mechanism, this makes touchscreen on the sim much smoother

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26860 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Maurus Cuelenaere 2010-06-15 18:33:56 +00:00
parent c6cac023fd
commit a8c35f4d56

View file

@ -86,6 +86,23 @@ static void button_event(int key, bool pressed);
extern bool debug_wps; extern bool debug_wps;
extern bool mapping; extern bool mapping;
#ifdef HAVE_TOUCHSCREEN
static void touchscreen_event(int x, int y)
{
if(background) {
x -= UI_LCD_POSX;
y -= UI_LCD_POSY;
}
if(x >= 0 && y >= 0 && x < SIM_LCD_WIDTH && y < SIM_LCD_HEIGHT) {
mouse_coords = (x << 16) | y;
button_event(BUTTON_TOUCHSCREEN, true);
if (debug_wps)
printf("Mouse at: (%d, %d)\n", x, y);
}
}
#endif
bool gui_message_loop(void) bool gui_message_loop(void)
{ {
SDL_Event event; SDL_Event event;
@ -100,6 +117,12 @@ bool gui_message_loop(void)
case SDL_KEYUP: case SDL_KEYUP:
button_event(event.key.keysym.sym, event.type == SDL_KEYDOWN); button_event(event.key.keysym.sym, event.type == SDL_KEYDOWN);
break; break;
#ifdef HAVE_TOUCHSCREEN
case SDL_MOUSEMOTION:
if (event.motion.state & SDL_BUTTON(1))
touchscreen_event(event.motion.x, event.motion.y);
break;
#endif
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
switch ( event.button.button ) { switch ( event.button.button ) {
#ifdef HAVE_SCROLLWHEEL #ifdef HAVE_SCROLLWHEEL
@ -118,10 +141,16 @@ bool gui_message_loop(void)
} }
if ( background ) { if ( background ) {
xybutton = xy2button( event.button.x, event.button.y ); xybutton = xy2button( event.button.x, event.button.y );
if( xybutton ) if( xybutton ) {
button_event( xybutton, true ); button_event( xybutton, true );
break;
}
} }
#ifdef HAVE_TOUCHSCREEN
touchscreen_event(event.button.x, event.button.y);
#endif
break; break;
default: default:
break; break;
} }
@ -162,9 +191,8 @@ bool gui_message_loop(void)
xybutton = 0; xybutton = 0;
} }
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
else { else
button_event(BUTTON_TOUCHSCREEN, false); button_event(BUTTON_TOUCHSCREEN, false);
}
#endif #endif
break; break;
default: default:
@ -335,39 +363,7 @@ int button_read_device(void)
return btn; return btn;
} }
#ifdef HAVE_TOUCHSCREEN
extern bool debug_wps;
void mouse_tick_task(void)
{
static int last_check = 0;
int x,y;
if (TIME_BEFORE(current_tick, last_check+(HZ/10)))
return;
last_check = current_tick;
if (SDL_GetMouseState(&x, &y) & SDL_BUTTON(SDL_BUTTON_LEFT))
{
if(background)
{
x -= UI_LCD_POSX;
y -= UI_LCD_POSY;
if(x<0 || y<0 || x>SIM_LCD_WIDTH || y>SIM_LCD_HEIGHT)
return;
}
mouse_coords = (x<<16)|y;
button_event(BUTTON_TOUCHSCREEN, true);
if (debug_wps)
printf("Mouse at: (%d, %d)\n", x, y);
}
}
#endif
void button_init_device(void) void button_init_device(void)
{ {
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
#ifdef HAVE_TOUCHSCREEN
tick_add_task(mouse_tick_task);
#endif
} }