1
0
Fork 0
forked from len0rd/rockbox
foxbox/uisimulator/sdl/button.c
Tomer Shalev f7237af58d Simulator: Make touchscreen targets usable on keyboards w/o numpad (laptops)
Use 7,8,9,u,i,o,j,k,l as equivalent to the numpad keys used to simulate
touching in grid mode (3x3 buttons). These are the keys usually used on such
keyboards for numpad keys when the Num Lock is enabled.

The USB key on these targets is changed to 'c' (connect) to avoid conflict in
key mappings.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24252 a1c6a512-1295-4272-9138-f99709370657
2010-01-16 21:41:57 +00:00

1331 lines
30 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Felix Arends
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "uisdl.h"
#include "lcd-charcells.h"
#include "lcd-remote.h"
#include "config.h"
#include "button.h"
#include "kernel.h"
#include "backlight.h"
#include "misc.h"
#include "sim_tasks.h"
#include "button-sdl.h"
#include "debug.h"
#ifdef HAVE_TOUCHSCREEN
#include "touchscreen.h"
static int mouse_coords = 0;
#endif
/* how long until repeat kicks in */
#define REPEAT_START 6
/* the speed repeat starts at */
#define REPEAT_INTERVAL_START 4
/* speed repeat finishes at */
#define REPEAT_INTERVAL_FINISH 2
#ifdef HAVE_TOUCHSCREEN
#define USB_KEY SDLK_c /* SDLK_u is taken by BUTTON_MIDLEFT */
#else
#define USB_KEY SDLK_u
#endif
#if defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES)
int _remote_type=REMOTETYPE_H100_LCD;
int remote_type(void)
{
return _remote_type;
}
#endif
struct event_queue button_queue;
static int btn = 0; /* Hopefully keeps track of currently pressed keys... */
#ifdef HAS_BUTTON_HOLD
bool hold_button_state = false;
bool button_hold(void) {
return hold_button_state;
}
#endif
#ifdef HAS_REMOTE_BUTTON_HOLD
bool remote_hold_button_state = false;
bool remote_button_hold(void) {
return remote_hold_button_state;
}
#endif
void button_event(int key, bool pressed)
{
int new_btn = 0;
static bool usb_connected = false;
if (usb_connected && key != USB_KEY)
return;
switch (key)
{
#ifdef HAVE_TOUCHSCREEN
case BUTTON_TOUCHSCREEN:
switch (touchscreen_get_mode())
{
case TOUCHSCREEN_POINT:
new_btn = BUTTON_TOUCHSCREEN;
break;
case TOUCHSCREEN_BUTTON:
{
static int touchscreen_buttons[3][3] = {
{BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
{BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
{BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT},
};
int px_x = ((mouse_coords&0xffff0000)>>16);
int px_y = ((mouse_coords&0x0000ffff));
new_btn = touchscreen_buttons[px_y/(LCD_HEIGHT/3)][px_x/(LCD_WIDTH/3)];
break;
}
}
break;
case SDLK_KP7:
case SDLK_7:
new_btn = BUTTON_TOPLEFT;
break;
case SDLK_KP8:
case SDLK_8:
case SDLK_UP:
new_btn = BUTTON_TOPMIDDLE;
break;
case SDLK_KP9:
case SDLK_9:
new_btn = BUTTON_TOPRIGHT;
break;
case SDLK_KP4:
case SDLK_u:
case SDLK_LEFT:
new_btn = BUTTON_MIDLEFT;
break;
case SDLK_KP5:
case SDLK_i:
new_btn = BUTTON_CENTER;
break;
case SDLK_KP6:
case SDLK_o:
case SDLK_RIGHT:
new_btn = BUTTON_MIDRIGHT;
break;
case SDLK_KP1:
case SDLK_j:
new_btn = BUTTON_BOTTOMLEFT;
break;
case SDLK_KP2:
case SDLK_k:
case SDLK_DOWN:
new_btn = BUTTON_BOTTOMMIDDLE;
break;
case SDLK_KP3:
case SDLK_l:
new_btn = BUTTON_BOTTOMRIGHT;
break;
case SDLK_F4:
if(pressed)
{
touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT);
printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON");
}
break;
#endif
case USB_KEY:
if (!pressed)
{
usb_connected = !usb_connected;
if (usb_connected)
queue_post(&button_queue, SYS_USB_CONNECTED, 0);
else
queue_post(&button_queue, SYS_USB_DISCONNECTED, 0);
}
return;
#ifdef HAS_BUTTON_HOLD
case SDLK_h:
if(pressed)
{
hold_button_state = !hold_button_state;
DEBUGF("Hold button is %s\n", hold_button_state?"ON":"OFF");
}
return;
#endif
#ifdef HAS_REMOTE_BUTTON_HOLD
case SDLK_j:
if(pressed)
{
remote_hold_button_state = !remote_hold_button_state;
DEBUGF("Remote hold button is %s\n",
remote_hold_button_state?"ON":"OFF");
}
return;
#endif
#if CONFIG_KEYPAD == GIGABEAT_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_POWER;
break;
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_A;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
case SDLK_KP9:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_KP3:
new_btn = BUTTON_VOL_DOWN;
break;
#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_PLUS:
case SDLK_KP_ENTER:
case SDLK_RETURN:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP7:
new_btn = BUTTON_BACK;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP9:
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_PLAY;
break;
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_REC;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MODE;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_REC;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_PLAY;
break;
#elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
|| (CONFIG_KEYPAD == IPOD_4G_PAD)
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_SCROLL_BACK;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_SCROLL_FWD;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == IRIVER_H10_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_SCROLL_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_SCROLL_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_POWER;
break;
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_REW;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F2:
new_btn = BUTTON_FF;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_PLAY;
break;
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
case SDLK_t:
if(pressed)
switch(_remote_type)
{
case REMOTETYPE_UNPLUGGED:
_remote_type=REMOTETYPE_H100_LCD;
DEBUGF("Changed remote type to H100\n");
break;
case REMOTETYPE_H100_LCD:
_remote_type=REMOTETYPE_H300_LCD;
DEBUGF("Changed remote type to H300\n");
break;
case REMOTETYPE_H300_LCD:
_remote_type=REMOTETYPE_H300_NONLCD;
DEBUGF("Changed remote type to H300 NON-LCD\n");
break;
case REMOTETYPE_H300_NONLCD:
_remote_type=REMOTETYPE_UNPLUGGED;
DEBUGF("Changed remote type to none\n");
break;
}
break;
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_ON;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_OFF;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_REC;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MODE;
break;
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_EQ;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MODE;
break;
#elif CONFIG_KEYPAD == ONDIO_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_OFF;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == PLAYER_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_STOP;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_ON;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == RECORDER_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_ON;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_OFF;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_F1;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F2:
new_btn = BUTTON_F2;
break;
case SDLK_KP_MINUS:
case SDLK_F3:
new_btn = BUTTON_F3;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_PLAY;
break;
#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_PLUS:
case SDLK_F8:
new_btn = BUTTON_ON;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_OFF;
break;
case SDLK_KP_DIVIDE:
case SDLK_F1:
new_btn = BUTTON_F1;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F2:
new_btn = BUTTON_F2;
break;
case SDLK_KP_MINUS:
case SDLK_F3:
new_btn = BUTTON_F3;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
#elif CONFIG_KEYPAD == SANSA_E200_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_SCROLL_BACK;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_SCROLL_FWD;
break;
case SDLK_KP9:
case SDLK_PAGEUP:
new_btn = BUTTON_UP;
break;
case SDLK_KP3:
case SDLK_PAGEDOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP1:
case SDLK_HOME:
new_btn = BUTTON_POWER;
break;
case SDLK_KP7:
case SDLK_END:
new_btn = BUTTON_REC;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
#elif CONFIG_KEYPAD == SANSA_C200_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP3:
new_btn = BUTTON_POWER;
break;
case SDLK_KP1:
new_btn = BUTTON_REC;
break;
case SDLK_KP5:
case SDLK_KP_ENTER:
case SDLK_RETURN:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP7:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_KP9:
new_btn = BUTTON_VOL_UP;
break;
#elif CONFIG_KEYPAD == MROBE500_PAD
case SDLK_F9:
new_btn = BUTTON_RC_HEART;
break;
case SDLK_F10:
new_btn = BUTTON_RC_MODE;
break;
case SDLK_F11:
new_btn = BUTTON_RC_VOL_DOWN;
break;
case SDLK_F12:
new_btn = BUTTON_RC_VOL_UP;
break;
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_UP:
new_btn = BUTTON_RC_PLAY;
break;
case SDLK_DOWN:
new_btn = BUTTON_RC_DOWN;
break;
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == MROBE100_PAD
case SDLK_F9:
new_btn = BUTTON_RC_HEART;
break;
case SDLK_F10:
new_btn = BUTTON_RC_MODE;
break;
case SDLK_F11:
new_btn = BUTTON_RC_VOL_DOWN;
break;
case SDLK_F12:
new_btn = BUTTON_RC_VOL_UP;
break;
case SDLK_LEFT:
new_btn = BUTTON_RC_FF;
break;
case SDLK_RIGHT:
new_btn = BUTTON_RC_REW;
break;
case SDLK_UP:
new_btn = BUTTON_RC_PLAY;
break;
case SDLK_DOWN:
new_btn = BUTTON_RC_DOWN;
break;
case SDLK_KP1:
new_btn = BUTTON_DISPLAY;
break;
case SDLK_KP7:
new_btn = BUTTON_MENU;
break;
case SDLK_KP9:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP4:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == COWON_D2_PAD
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_PLUS:
new_btn = BUTTON_PLUS;
break;
case SDLK_KP_MINUS:
new_btn = BUTTON_MINUS;
break;
case SDLK_KP_ENTER:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == IAUDIO67_PAD
case SDLK_UP:
new_btn = BUTTON_RIGHT;
break;
case SDLK_DOWN:
new_btn = BUTTON_LEFT;
break;
case SDLK_LEFT:
new_btn = BUTTON_STOP;
break;
case SDLK_RETURN:
case SDLK_KP_ENTER:
case SDLK_RIGHT:
new_btn = BUTTON_PLAY;
break;
case SDLK_PLUS:
new_btn = BUTTON_VOLUP;
break;
case SDLK_MINUS:
new_btn = BUTTON_VOLDOWN;
break;
case SDLK_SPACE:
new_btn = BUTTON_MENU;
break;
case SDLK_BACKSPACE:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
case SDLK_KP1:
new_btn = BUTTON_BACK;
break;
case SDLK_KP3:
new_btn = BUTTON_MENU;
break;
case SDLK_KP7:
new_btn = BUTTON_CUSTOM;
break;
case SDLK_KP9:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == CREATIVEZV_PAD
case SDLK_KP1:
new_btn = BUTTON_PREV;
break;
case SDLK_KP3:
new_btn = BUTTON_NEXT;
break;
case SDLK_KP7:
new_btn = BUTTON_BACK;
break;
case SDLK_p:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP9:
new_btn = BUTTON_MENU;
break;
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_MULTIPLY:
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_z:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_s:
new_btn = BUTTON_VOL_UP;
#elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
case SDLK_KP1:
new_btn = BUTTON_PREV;
break;
case SDLK_KP3:
new_btn = BUTTON_NEXT;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
#elif CONFIG_KEYPAD == SANSA_FUZE_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_SCROLL_BACK;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_SCROLL_FWD;
break;
case SDLK_PAGEUP:
case SDLK_KP9:
new_btn = BUTTON_UP;
break;
case SDLK_PAGEDOWN:
case SDLK_KP3:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP_MINUS:
case SDLK_KP1:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_MULTIPLY:
new_btn = BUTTON_HOME;
break;
case SDLK_KP5:
case SDLK_SPACE:
case SDLK_KP_ENTER:
case SDLK_RETURN:
new_btn = BUTTON_SELECT;
break;
#elif CONFIG_KEYPAD == SANSA_CLIP_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_INSERT:
case SDLK_KP_MULTIPLY:
new_btn = BUTTON_HOME;
break;
case SDLK_SPACE:
case SDLK_KP5:
new_btn = BUTTON_SELECT;
break;
case SDLK_PAGEDOWN:
case SDLK_KP3:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_PAGEUP:
case SDLK_KP9:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_ESCAPE:
case SDLK_KP1:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == SANSA_M200_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_PLUS:
new_btn = BUTTON_POWER;
break;
case SDLK_KP5:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP7:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_KP9:
new_btn = BUTTON_VOL_UP;
break;
#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP7:
new_btn = BUTTON_PREV;
break;
case SDLK_KP9:
new_btn = BUTTON_NEXT;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
new_btn = BUTTON_POWER;
break;
case SDLK_PAGEUP:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_PAGEDOWN:
new_btn = BUTTON_VOL_DOWN;
break;
#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP7:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP1:
new_btn = BUTTON_PLAYLIST;
break;
case SDLK_KP9:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_KP3:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_KP_MINUS:
new_btn = BUTTON_MENU;
break;
case SDLK_KP_PLUS:
new_btn = BUTTON_VIEW;
break;
#elif CONFIG_KEYPAD == ONDAVX747_PAD
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_PLUS:
case SDLK_RIGHT:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_KP_MINUS:
case SDLK_LEFT:
new_btn = BUTTON_VOL_DOWN;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
new_btn = BUTTON_MENU;
break;
#elif CONFIG_KEYPAD == ONDAVX777_PAD
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
case SDLK_KP4:
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_KP6:
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_KP8:
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_KP2:
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_KP5:
case SDLK_KP_ENTER:
new_btn = BUTTON_PLAY;
break;
case SDLK_KP9:
case SDLK_PAGEUP:
new_btn = BUTTON_FFWD;
break;
#ifdef SAMSUNG_YH820
case SDLK_KP7:
#else
case SDLK_KP3:
#endif
case SDLK_PAGEDOWN:
new_btn = BUTTON_REW;
break;
case SDLK_KP_PLUS:
new_btn = BUTTON_REC;
break;
#elif CONFIG_KEYPAD == MINI2440_PAD
case SDLK_LEFT:
new_btn = BUTTON_LEFT;
break;
case SDLK_RIGHT:
new_btn = BUTTON_RIGHT;
break;
case SDLK_UP:
new_btn = BUTTON_UP;
break;
case SDLK_DOWN:
new_btn = BUTTON_DOWN;
break;
case SDLK_F8:
case SDLK_ESCAPE:
new_btn = BUTTON_POWER;
break;
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
new_btn = BUTTON_A;
break;
case SDLK_SPACE:
new_btn = BUTTON_SELECT;
break;
case SDLK_KP_PERIOD:
case SDLK_INSERT:
new_btn = BUTTON_MENU;
break;
case SDLK_KP_PLUS:
new_btn = BUTTON_VOL_UP;
break;
case SDLK_KP_MINUS:
new_btn = BUTTON_VOL_DOWN;
break;
#else
#error No keymap defined!
#endif /* CONFIG_KEYPAD */
case SDLK_KP0:
case SDLK_F5:
if(pressed)
{
sim_trigger_screendump();
return;
}
break;
}
/* Call to make up for scrollwheel target implementation. This is
* not handled in the main button.c driver, but on the target
* implementation (look at button-e200.c for example if you are trying to
* figure out why using button_get_data needed a hack before).
*/
#if defined(BUTTON_SCROLL_FWD) && defined(BUTTON_SCROLL_BACK)
if((new_btn == BUTTON_SCROLL_FWD || new_btn == BUTTON_SCROLL_BACK) &&
pressed)
{
/* Clear these buttons from the data - adding them to the queue is
* handled in the scrollwheel drivers for the targets. They do not
* store the scroll forward/back buttons in their button data for
* the button_read call.
*/
queue_post(&button_queue, new_btn, 1<<24);
new_btn &= ~(BUTTON_SCROLL_FWD | BUTTON_SCROLL_BACK);
}
#endif
if (pressed)
btn |= new_btn;
else
btn &= ~new_btn;
}
#if defined(HAVE_BUTTON_DATA) && defined(HAVE_TOUCHSCREEN)
int button_read_device(int* data)
{
*data = mouse_coords;
#else
int button_read_device(void)
{
#endif
#ifdef HAS_BUTTON_HOLD
int hold_button = button_hold();
#ifdef HAVE_BACKLIGHT
/* light handling */
static int hold_button_old = false;
if (hold_button != hold_button_old)
{
hold_button_old = hold_button;
backlight_hold_changed(hold_button);
}
#endif
if (hold_button)
return BUTTON_NONE;
#endif
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_sdl(void)
{
#ifdef HAVE_TOUCHSCREEN
tick_add_task(mouse_tick_task);
#endif
}