void gui_usb_screen_run(bool early_usb) { (void) early_usb; struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS]; #if defined HAVE_TOUCHSCREEN enum touchscreen_mode old_mode = touchscreen_get_mode(); /* TODO: Paint buttons on screens OR switch to point mode and use * touchscreen as a touchpad to move the host's mouse cursor */ touchscreen_set_mode(TOUCHSCREEN_BUTTON); #endif push_current_activity(ACTIVITY_USBSCREEN); #ifdef USB_ENABLE_HID usb_hid = global_settings.usb_hid; usb_keypad_mode = global_settings.usb_keypad_mode; #endif FOR_NB_SCREENS(i) { struct screen *screen = &screens[i]; screen->set_viewport(NULL); #ifdef HAVE_LCD_CHARCELLS /* Quick fix. Viewports should really be enabled proper for charcell */ viewport_set_defaults(&usb_screen_vps_ar[i].parent, i); #else usb_screen_fix_viewports(screen, &usb_screen_vps_ar[i]); #endif } /* update the UI before disabling fonts, this maximizes the propability * that font cache lookups succeed during USB */ send_event(GUI_EVENT_ACTIONUPDATE, NULL); #ifdef HAVE_LCD_BITMAP if(!early_usb) { /* The font system leaves the .fnt fd's open, so we need for force close them all */ font_disable_all(); } #endif usb_acknowledge(SYS_USB_CONNECTED_ACK); while (1) { usb_screens_draw(usb_screen_vps_ar); #ifdef SIMULATOR if (button_get_w_tmo(HZ/2)) break; send_event(GUI_EVENT_ACTIONUPDATE, NULL); #else if (handle_usb_events()) break; #endif /* SIMULATOR */ } FOR_NB_SCREENS(i) { const struct viewport* vp = NULL; #if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID) vp = usb_hid ? &usb_screen_vps_ar[i].title : NULL; #elif !defined(HAVE_LCD_BITMAP) vp = &usb_screen_vps_ar[i].parent; #endif if (vp) screens[i].scroll_stop_viewport(vp); } #ifdef USB_ENABLE_HID if (global_settings.usb_keypad_mode != usb_keypad_mode) { global_settings.usb_keypad_mode = usb_keypad_mode; settings_save(); } #endif #ifdef HAVE_TOUCHSCREEN touchscreen_set_mode(old_mode); #endif #ifdef HAVE_LCD_CHARCELLS status_set_usb(false); #endif /* HAVE_LCD_CHARCELLS */ #ifdef HAVE_LCD_BITMAP if(!early_usb) { font_enable_all(); /* Not pretty, reload all settings so fonts are loaded again correctly */ settings_apply(true); /* Reload playlist */ playlist_resume(); } #endif FOR_NB_SCREENS(i) { screens[i].backlight_on(); viewportmanager_theme_undo(i, false); } pop_current_activity(); }
static void button_tick(void) { static int count = 0; static int repeat_speed = REPEAT_INTERVAL_START; static int repeat_count = 0; static bool repeat = false; static bool post = false; #ifdef HAVE_BACKLIGHT static bool skip_release = false; #ifdef HAVE_REMOTE_LCD static bool skip_remote_release = false; #endif #endif int diff; int btn; #ifdef HAVE_BUTTON_DATA int data = 0; #else const int data = 0; #endif #if defined(HAS_SERIAL_REMOTE) && !defined(SIMULATOR) /* Post events for the remote control */ btn = remote_control_rx(); if(btn) button_try_post(btn, 0); #endif #ifdef HAVE_BUTTON_DATA btn = button_read(&data); #else btn = button_read(); #endif #if defined(HAVE_HEADPHONE_DETECTION) if (headphones_inserted() != phones_present) { /* Use the autoresetting oneshot to debounce the detection signal */ phones_present = !phones_present; timeout_register(&hp_detect_timeout, btn_detect_callback, HZ/2, phones_present); } #endif /* Find out if a key has been released */ diff = btn ^ lastbtn; if(diff && (btn & diff) == 0) { #ifdef HAVE_BACKLIGHT #ifdef HAVE_REMOTE_LCD if(diff & BUTTON_REMOTE) if(!skip_remote_release) button_try_post(BUTTON_REL | diff, data); else skip_remote_release = false; else #endif if(!skip_release) button_try_post(BUTTON_REL | diff, data); else skip_release = false; #else button_try_post(BUTTON_REL | diff, data); #endif } else { if ( btn ) { /* normal keypress */ if ( btn != lastbtn ) { post = true; repeat = false; repeat_speed = REPEAT_INTERVAL_START; } else /* repeat? */ { if ( repeat ) { if (!post) count--; if (count == 0) { post = true; /* yes we have repeat */ if (repeat_speed > REPEAT_INTERVAL_FINISH) repeat_speed--; count = repeat_speed; repeat_count++; /* Send a SYS_POWEROFF event if we have a device which doesn't shut down easily with the OFF key */ #ifdef HAVE_SW_POWEROFF if ((btn & POWEROFF_BUTTON #ifdef RC_POWEROFF_BUTTON || btn == RC_POWEROFF_BUTTON #endif ) && #if CONFIG_CHARGING && !defined(HAVE_POWEROFF_WHILE_CHARGING) !charger_inserted() && #endif repeat_count > POWEROFF_COUNT) { /* Tell the main thread that it's time to power off */ sys_poweroff(); /* Safety net for players without hardware poweroff */ #if (CONFIG_PLATFORM & PLATFORM_NATIVE) if(repeat_count > POWEROFF_COUNT * 10) power_off(); #endif } #endif } } else { if (count++ > REPEAT_START) { post = true; repeat = true; repeat_count = 0; /* initial repeat */ count = REPEAT_INTERVAL_START; } #ifdef HAVE_TOUCHSCREEN else if (lastdata != data && btn == lastbtn) { /* only coordinates changed, post anyway */ if (touchscreen_get_mode() == TOUCHSCREEN_POINT) post = true; } #endif } } if ( post ) { if (repeat) { /* Only post repeat events if the queue is empty, * to avoid afterscroll effects. */ if (button_try_post(BUTTON_REPEAT | btn, data)) { #ifdef HAVE_BACKLIGHT #ifdef HAVE_REMOTE_LCD skip_remote_release = false; #endif skip_release = false; #endif post = false; } } else { #ifdef HAVE_BACKLIGHT #ifdef HAVE_REMOTE_LCD if (btn & BUTTON_REMOTE) { if (!remote_filter_first_keypress || is_remote_backlight_on(false) #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) || (remote_type()==REMOTETYPE_H300_NONLCD) #endif ) button_try_post(btn, data); else skip_remote_release = true; } else #endif if (!filter_first_keypress || is_backlight_on(false) #if BUTTON_REMOTE || (btn & BUTTON_REMOTE) #endif ) button_try_post(btn, data); else skip_release = true; #else /* no backlight, nothing to skip */ button_try_post(btn, data); #endif post = false; } #ifdef HAVE_REMOTE_LCD if(btn & BUTTON_REMOTE) remote_backlight_on(); else #endif { backlight_on(); #ifdef HAVE_BUTTON_LIGHT buttonlight_on(); #endif } reset_poweroff_timer(); } } else { repeat = false; count = 0; } } lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); #ifdef HAVE_BUTTON_DATA lastdata = data; #endif }
void button_event(int key, bool pressed) { int new_btn = 0; static bool usb_connected = false; if (usb_connected && key != SDLK_u) 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: new_btn = BUTTON_TOPLEFT; break; case SDLK_KP8: new_btn = BUTTON_TOPMIDDLE; break; case SDLK_KP9: new_btn = BUTTON_TOPRIGHT; break; case SDLK_KP4: new_btn = BUTTON_MIDLEFT; break; case SDLK_KP5: new_btn = BUTTON_CENTER; break; case SDLK_KP6: new_btn = BUTTON_MIDRIGHT; break; case SDLK_KP1: new_btn = BUTTON_BOTTOMLEFT; break; case SDLK_KP2: new_btn = BUTTON_BOTTOMMIDDLE; break; case SDLK_KP3: 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 SDLK_u: 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 == COWOND2_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; }
static 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) { 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; #if (CONFIG_PLATFORM & PLATFORM_PANDORA) case SDLK_LCTRL: /* Will post SDL_USEREVENT in shutdown_hw() if successful. */ sys_poweroff(); break; #endif #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 defined(IRIVER_H100_SERIES) || defined (IRIVER_H300_SERIES) 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; #endif case SDLK_KP0: case SDLK_F5: if(pressed) { sim_trigger_screendump(); return; } break; #ifdef HAVE_TOUCHSCREEN 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"); } #endif default: #ifdef HAVE_TOUCHSCREEN new_btn = key_to_touch(key, mouse_coords); if (!new_btn) #endif new_btn = key_to_button(key); 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. */ #ifdef HAVE_BACKLIGHT backlight_on(); #endif #ifdef HAVE_BUTTON_LIGHT buttonlight_on(); #endif 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; }
void gui_usb_screen_run(void) { int i; struct usb_screen_vps_t usb_screen_vps_ar[NB_SCREENS]; #if defined HAVE_TOUCHSCREEN enum touchscreen_mode old_mode = touchscreen_get_mode(); /* TODO: Paint buttons on screens OR switch to point mode and use * touchscreen as a touchpad to move the host's mouse cursor */ touchscreen_set_mode(TOUCHSCREEN_BUTTON); #endif #ifndef SIMULATOR usb_acknowledge(SYS_USB_CONNECTED_ACK); #endif #ifdef USB_ENABLE_HID usb_hid = global_settings.usb_hid; usb_keypad_mode = global_settings.usb_keypad_mode; #endif FOR_NB_SCREENS(i) { struct screen *screen = &screens[i]; screen->set_viewport(NULL); #ifdef HAVE_LCD_BITMAP usb_screen_fix_viewports(screen, &usb_screen_vps_ar[i]); #endif } while (1) { usb_screens_draw(usb_screen_vps_ar); #ifdef SIMULATOR if (button_get_w_tmo(HZ/2)) break; send_event(GUI_EVENT_ACTIONUPDATE, NULL); #else if (handle_usb_events()) break; #endif /* SIMULATOR */ } FOR_NB_SCREENS(i) { const struct viewport* vp = NULL; #if defined(HAVE_LCD_BITMAP) && defined(USB_ENABLE_HID) vp = usb_hid ? &usb_screen_vps_ar[i].title : NULL; #elif !defined(HAVE_LCD_BITMAP) vp = &usb_screen_vps_ar[i].parent; #endif if (vp) screens[i].scroll_stop(vp); } #ifdef USB_ENABLE_HID if (global_settings.usb_keypad_mode != usb_keypad_mode) { global_settings.usb_keypad_mode = usb_keypad_mode; settings_save(); } #endif #ifdef HAVE_TOUCHSCREEN touchscreen_set_mode(old_mode); #endif #ifdef HAVE_LCD_CHARCELLS status_set_usb(false); #endif /* HAVE_LCD_CHARCELLS */ FOR_NB_SCREENS(i) { screens[i].backlight_on(); viewportmanager_theme_undo(i, false); } }