Index: apps/settings.c =================================================================== --- apps/settings.c (revision 17647) +++ apps/settings.c (working copy) @@ -929,6 +929,10 @@ #endif #endif /* HAVE_BACKLIGHT */ +#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING + touchpad_set_sensitivity(global_settings.touchpad_sensitivity); +#endif + /* This should stay last */ #if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC enc_global_settings_apply(); Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 17647) +++ apps/lang/english.lang (working copy) @@ -11716,3 +11716,37 @@ recording: "Stop Recording And Shutdown" + + id: LANG_TOUCHPAD_SENSITIVITY + desc: touchpad sensitivity setting + user: + + *: none + gigabeatf: "Touchpad Sensitivity" + + + *: none + gigabeatf: "Touchpad Sensitivity" + + + *: none + gigabeatf: "Touchpad Sensitivity" + + + + id: LANG_HIGH + desc: in settings_menu + user: + + *: none + gigabeatf: "High" + + + *: none + gigabeatf: "High" + + + *: none + gigabeatf: "High" + + Index: apps/settings.h =================================================================== --- apps/settings.h (revision 17647) +++ apps/settings.h (working copy) @@ -740,6 +740,9 @@ unsigned char playlist_catalog_dir[MAX_FILENAME+1]; bool study_mode; /* study mode enabled */ int study_hop_step; /* hop step in study mode, in seconds */ +#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING + int touchpad_sensitivity; +#endif }; /** global variables **/ Index: apps/menus/settings_menu.c =================================================================== --- apps/menus/settings_menu.c (revision 17647) +++ apps/menus/settings_menu.c (working copy) @@ -361,7 +361,11 @@ MENUITEM_SETTING(buttonlight_brightness, &global_settings.buttonlight_brightness, NULL); #endif +#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING +MENUITEM_SETTING(touchpad_sensitivity, &global_settings.touchpad_sensitivity, NULL); +#endif + MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), 0, Icon_System_menu, &start_screen, @@ -400,6 +404,9 @@ #if CONFIG_CODEC == SWCODEC &keyclick_menu, #endif +#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING + &touchpad_sensitivity, +#endif ); /* SYSTEM MENU */ Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (revision 17647) +++ apps/settings_list.c (working copy) @@ -1321,6 +1321,11 @@ #endif /* CONFIG_CODEC == SWCODEC */ FILENAME_SETTING(0, playlist_catalog_dir, "playlist catalog directory", PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL, MAX_FILENAME+1), +#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING + CHOICE_SETTING(0, touchpad_sensitivity, LANG_TOUCHPAD_SENSITIVITY, 0, + "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2, + ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), +#endif }; const int nb_settings = sizeof(settings)/sizeof(*settings); Index: firmware/export/config-gigabeat.h =================================================================== --- firmware/export/config-gigabeat.h (revision 17647) +++ firmware/export/config-gigabeat.h (working copy) @@ -48,6 +48,8 @@ /* We don't use a setting but a fixed delay after the backlight has * turned off */ #define LCD_SLEEP_TIMEOUT (5*HZ) + +#define HAVE_TOUCHPAD_SENSITIVITY_SETTING #endif /* BOOTLOADER */ #define CONFIG_KEYPAD GIGABEAT_PAD Index: firmware/target/arm/s3c2440/gigabeat-fx/button-target.h =================================================================== --- firmware/target/arm/s3c2440/gigabeat-fx/button-target.h (revision 17647) +++ firmware/target/arm/s3c2440/gigabeat-fx/button-target.h (working copy) @@ -27,6 +27,7 @@ bool button_hold(void); void button_init_device(void); int button_read_device(void); +void touchpad_set_sensitivity(int level); /* Toshiba Gigabeat specific button codes */ Index: firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c =================================================================== --- firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c (revision 17647) +++ firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c (working copy) @@ -30,6 +30,20 @@ static bool headphones_detect; static bool hold_button = false; +#define TOUCHPAD_SENS_NORMAL ((1 << 12) | /* right++ */ \ + (1 << 7) | /* left++ */ \ + (1 << 6) | /* down++*/ \ + (1 << 0) | /* up++ */ \ + (1 << 3)) /* center */ + +#define TOUCHPAD_SENS_HIGH (((1 << 12) | (1 << 11)) | /* right++, right+ */ \ + ((1 << 8) | (1 << 7)) | /* left+, left++ */ \ + ((1 << 6) | (1 << 5)) | /* down++, down+ */ \ + ((1 << 1) | (1 << 0)) | /* up+, up++ */ \ + (1 << 3)) /* Center */ + +static int touchpad_mask = TOUCHPAD_SENS_NORMAL; + static int const remote_buttons[] = { BUTTON_NONE, /* Headphones connected - remote disconnected */ @@ -123,30 +137,29 @@ } /* the touchpad - only watch the lines we actually read */ - touchpad = GPJDAT & (((1 << 12) | (1 << 11)) | /* right++, right+ */ - ((1 << 8) | (1 << 7)) | /* left+, left++ */ - ((1 << 6) | (1 << 5)) | /* down++, down+ */ - ((1 << 1) | (1 << 0)) | /* up+, up++ */ - (1 << 3)); /* center */ + touchpad = GPJDAT & touchpad_mask; + if (touchpad) { if (touchpad & (1 << 3)) { btn |= BUTTON_SELECT; - /* Desensitize middle (+) detectors one level */ - touchpad &= ~((1 << 11) | (1 << 8) | (1 << 5) | (1 << 1)); + /* Desensitize other detectors */ + touchpad &= TOUCHPAD_SENS_NORMAL; } - if (touchpad & ((1 << 1) | (1 << 0))) + /* Simply include all lines in checks since "touchpad" has been + * masked to desired sensitivity already */ + if (touchpad & ((1 << 2) | (1 << 1) | (1 << 0))) btn |= BUTTON_UP; - if (touchpad & ((1 << 12) | (1 << 11))) + if (touchpad & ((1 << 12) | (1 << 11) | (1 << 10))) btn |= BUTTON_RIGHT; - if (touchpad & ((1 << 6) | (1 << 5))) + if (touchpad & ((1 << 6) | (1 << 5) | (1 << 4))) btn |= BUTTON_DOWN; - if (touchpad & ((1 << 8) | (1 << 7))) + if (touchpad & ((1 << 9) | (1 << 8) | (1 << 7))) btn |= BUTTON_LEFT; buttonlight_on(); @@ -155,6 +168,20 @@ return btn; } +void touchpad_set_sensitivity(int level) +{ + static const int masks[] = + { + TOUCHPAD_SENS_NORMAL, + TOUCHPAD_SENS_HIGH + }; + + if ((unsigned)level >= ARRAYLEN(masks)) + level = 0; + + touchpad_mask = masks[level]; +} + bool headphones_inserted(void) { return headphones_detect;