static void mouse_event(SDL_MouseButtonEvent *event, bool button_up) { #define SQUARE(x) ((x)*(x)) static int x,y; #ifdef SIMULATOR static int xybutton = 0; #endif if(button_up) { switch ( event->button ) { #ifdef HAVE_SCROLLWHEEL case SDL_BUTTON_WHEELUP: case SDL_BUTTON_WHEELDOWN: #endif case SDL_BUTTON_MIDDLE: case SDL_BUTTON_RIGHT: button_event( event->button, false ); break; /* The scrollwheel button up events are ignored as they are queued immediately */ case SDL_BUTTON_LEFT: if ( mapping && background ) { printf(" { SDLK_, %d, %d, %d, \"\" },\n", x, y, (int)sqrt( SQUARE(x-(int)event->x) + SQUARE(y-(int)event->y)) ); } #ifdef SIMULATOR if ( background && xybutton ) { button_event( xybutton, false ); xybutton = 0; } #endif #ifdef HAVE_TOUCHSCREEN else button_event(BUTTON_TOUCHSCREEN, false); #endif break; } } else { /* button down */ switch ( event->button ) { #ifdef HAVE_SCROLLWHEEL case SDL_BUTTON_WHEELUP: case SDL_BUTTON_WHEELDOWN: #endif case SDL_BUTTON_MIDDLE: case SDL_BUTTON_RIGHT: button_event( event->button, true ); break; case SDL_BUTTON_LEFT: if ( mapping && background ) { x = event->x; y = event->y; } #ifdef SIMULATOR if ( background ) { xybutton = xy2button( event->x, event->y ); if( xybutton ) { button_event( xybutton, true ); break; } } #endif #ifdef HAVE_TOUCHSCREEN touchscreen_event(event->x, event->y); #endif break; } if (debug_wps && event->button == SDL_BUTTON_LEFT) { int m_x, m_y; if ( background ) { m_x = event->x - 1; m_y = event->y - 1; #ifdef HAVE_REMOTE if ( event->y >= UI_REMOTE_POSY ) /* Remote Screen */ { m_x -= UI_REMOTE_POSX; m_y -= UI_REMOTE_POSY; } else #endif { m_x -= UI_LCD_POSX; m_y -= UI_LCD_POSY; } } else { m_x = event->x; m_y = event->y; #ifdef HAVE_REMOTE if ( m_y >= LCD_HEIGHT ) /* Remote Screen */ m_y -= LCD_HEIGHT; #endif } printf("Mouse at 2: (%d, %d)\n", m_x, m_y); } } #undef SQUARE }
static bool event_handler(SDL_Event *event) { SDLKey ev_key; switch(event->type) { case SDL_ACTIVEEVENT: if (event->active.state & SDL_APPINPUTFOCUS) { if (event->active.gain == 1) sdl_app_has_input_focus = 1; else sdl_app_has_input_focus = 0; } break; case SDL_KEYDOWN: case SDL_KEYUP: ev_key = event->key.keysym.sym; #if (CONFIG_PLATFORM & PLATFORM_MAEMO5) /* N900 with shared up/down cursor mapping. Seen on the German, Finnish, Italian, French and Russian version. Probably more. */ if (event->key.keysym.mod & KMOD_MODE || n900_updown_key_pressed) { /* Prevent stuck up/down keys: If you release the ALT key before the cursor key, rockbox will see a KEYUP event for left/right instead of up/down and the previously pressed up/down key would stay active. */ if (ev_key == SDLK_LEFT || ev_key == SDLK_RIGHT) { if (event->type == SDL_KEYDOWN) n900_updown_key_pressed = 1; else n900_updown_key_pressed = 0; } if (ev_key == SDLK_LEFT) ev_key = SDLK_UP; else if (ev_key == SDLK_RIGHT) ev_key = SDLK_DOWN; } #endif button_event(ev_key, event->type == SDL_KEYDOWN); break; #ifdef HAVE_TOUCHSCREEN case SDL_MOUSEMOTION: if (event->motion.state & SDL_BUTTON(1)) { int x = event->motion.x / display_zoom; int y = event->motion.y / display_zoom; touchscreen_event(x, y); } break; #endif case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: { SDL_MouseButtonEvent *mev = &event->button; mev->x /= display_zoom; mev->y /= display_zoom; mouse_event(mev, event->type == SDL_MOUSEBUTTONUP); break; } case SDL_QUIT: /* Will post SDL_USEREVENT in shutdown_hw() if successful. */ sys_poweroff(); break; case SDL_USEREVENT: return true; break; } return false; }
bool gui_message_loop(void) { SDL_Event event; static int x,y,xybutton = 0; while (SDL_WaitEvent(&event)) { sim_enter_irq_handler(); switch(event.type) { case SDL_KEYDOWN: case SDL_KEYUP: button_event(event.key.keysym.sym, event.type == SDL_KEYDOWN); 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: switch ( event.button.button ) { #ifdef HAVE_SCROLLWHEEL case SDL_BUTTON_WHEELUP: button_event( SDLK_UP, true ); break; case SDL_BUTTON_WHEELDOWN: button_event( SDLK_DOWN, true ); break; #endif case SDL_BUTTON_LEFT: case SDL_BUTTON_MIDDLE: if ( mapping && background ) { x = event.button.x; y = event.button.y; } if ( background ) { xybutton = xy2button( event.button.x, event.button.y ); if( xybutton ) { button_event( xybutton, true ); break; } } #ifdef HAVE_TOUCHSCREEN touchscreen_event(event.button.x, event.button.y); #endif break; default: break; } if (debug_wps && event.button.button == 1) { if ( background ) #ifdef HAVE_REMOTE if ( event.button.y < UI_REMOTE_POSY ) /* Main Screen */ printf("Mouse at: (%d, %d)\n", event.button.x - UI_LCD_POSX -1 , event.button.y - UI_LCD_POSY - 1 ); else printf("Mouse at: (%d, %d)\n", event.button.x - UI_REMOTE_POSX -1 , event.button.y - UI_REMOTE_POSY - 1 ); #else printf("Mouse at: (%d, %d)\n", event.button.x - UI_LCD_POSX -1 , event.button.y - UI_LCD_POSY - 1 ); #endif else if ( event.button.y/display_zoom < LCD_HEIGHT ) /* Main Screen */ printf("Mouse at: (%d, %d)\n", event.button.x/display_zoom, event.button.y/display_zoom ); #ifdef HAVE_REMOTE else printf("Mouse at: (%d, %d)\n", event.button.x/display_zoom, event.button.y/display_zoom - LCD_HEIGHT ); #endif } break; case SDL_MOUSEBUTTONUP: switch ( event.button.button ) { /* The scrollwheel button up events are ignored as they are queued immediately */ case SDL_BUTTON_LEFT: case SDL_BUTTON_MIDDLE: if ( mapping && background ) { printf(" { SDLK_, %d, %d, %d, \"\" },\n", x, #define SQUARE(x) ((x)*(x)) y, (int)sqrt( SQUARE(x-(int)event.button.x) + SQUARE(y-(int)event.button.y)) ); } if ( background && xybutton ) { button_event( xybutton, false ); xybutton = 0; } #ifdef HAVE_TOUCHSCREEN else button_event(BUTTON_TOUCHSCREEN, false); #endif break; default: break; } break; case SDL_QUIT: { sim_exit_irq_handler(); return false; } default: /*printf("Unhandled event\n"); */ break; } sim_exit_irq_handler(); }