diff -Nurb rockbox.orig/apps/lang/english.lang rockbox.bl/apps/lang/english.lang --- rockbox.orig/apps/lang/english.lang 2007-12-31 22:36:52.000000000 +0200 +++ rockbox.bl/apps/lang/english.lang 2008-01-01 19:59:11.000000000 +0200 @@ -11540,3 +11540,73 @@ *: "Save Sound Settings" + + id: LANG_BACKLIGHT_FILTER_BUTTONS + desc: in settings + user: + + *: "Which Buttons Turn Backlight On" + + + *: "Which Buttons Turn Backlight On" + + + *: "Which Buttons Turn Backlight On" + + + + id: LANG_BACKLIGHT_FILTER_BUTTONS_ALL + desc: in settings + user: + + *: "All" + + + *: "All" + + + *: "All" + + + + id: LANG_BACKLIGHT_FILTER_BUTTONS_SELECT + desc: in settings + user: + + *: "SELECT" + + + *: "SELECT" + + + *: "SELECT" + + + + id: LANG_BACKLIGHT_FILTER_BUTTONS_POWER + desc: in settings + user: + + *: "POWER" + + + *: "POWER" + + + *: "POWER" + + + + id: LANG_BACKLIGHT_FILTER_BUTTONS_SELECT_POWER + desc: in settings + user: + + *: "SELECT and POWER" + + + *: "SELECT and POWER" + + + *: "SELECT and POWER" + + diff -Nurb rockbox.orig/apps/menus/display_menu.c rockbox.bl/apps/menus/display_menu.c --- rockbox.orig/apps/menus/display_menu.c 2007-12-31 22:36:52.000000000 +0200 +++ rockbox.bl/apps/menus/display_menu.c 2007-12-31 22:43:13.000000000 +0200 @@ -57,6 +57,17 @@ } return action; } +int filterbuttons_callback(int action,const struct menu_item_ex *this_item) +{ + (void)this_item; + switch (action) + { + case ACTION_EXIT_MENUITEM: + set_backlight_filter_buttons(global_settings.bl_filter_buttons); + break; + } + return action; +} #endif #ifdef HAVE_LCD_BITMAP int flipdisplay_callback(int action,const struct menu_item_ex *this_item) @@ -97,6 +108,9 @@ MENUITEM_SETTING(bl_filter_first_keypress, &global_settings.bl_filter_first_keypress, filterfirstkeypress_callback); +MENUITEM_SETTING(bl_filter_buttons, + &global_settings.bl_filter_buttons, + filterbuttons_callback); #ifdef HAVE_LCD_SLEEP MENUITEM_SETTING(lcd_sleep_after_backlight_off, &global_settings.lcd_sleep_after_backlight_off, NULL); @@ -133,6 +147,7 @@ ,&backlight_fade_in, &backlight_fade_out # endif ,&bl_filter_first_keypress + ,&bl_filter_buttons # ifdef HAVE_LCD_SLEEP ,&lcd_sleep_after_backlight_off # endif diff -Nurb rockbox.orig/apps/settings.c rockbox.bl/apps/settings.c --- rockbox.orig/apps/settings.c 2007-12-31 22:36:53.000000000 +0200 +++ rockbox.bl/apps/settings.c 2007-12-31 22:43:13.000000000 +0200 @@ -915,6 +915,7 @@ #ifdef HAVE_BACKLIGHT set_backlight_filter_keypress(global_settings.bl_filter_first_keypress); + set_backlight_filter_buttons(global_settings.bl_filter_buttons); #ifdef HAVE_REMOTE_LCD set_remote_backlight_filter_keypress(global_settings.remote_bl_filter_first_keypress); #endif diff -Nurb rockbox.orig/apps/settings.h rockbox.bl/apps/settings.h --- rockbox.orig/apps/settings.h 2007-12-31 22:36:53.000000000 +0200 +++ rockbox.bl/apps/settings.h 2007-12-31 22:43:13.000000000 +0200 @@ -629,6 +629,8 @@ #ifdef HAVE_BACKLIGHT bool bl_filter_first_keypress; /* filter first keypress when dark? */ + int bl_filter_buttons; /* which buttons will turn bl on? 1=SELECT, 2=SELECT|POWER, + anything other -- all buttons */ #ifdef HAVE_REMOTE_LCD bool remote_bl_filter_first_keypress; /* filter first remote keypress when remote dark? */ #endif diff -Nurb rockbox.orig/apps/settings_list.c rockbox.bl/apps/settings_list.c --- rockbox.orig/apps/settings_list.c 2007-12-31 22:36:52.000000000 +0200 +++ rockbox.bl/apps/settings_list.c 2008-01-01 19:57:52.000000000 +0200 @@ -506,6 +506,12 @@ OFFON_SETTING(0,bl_filter_first_keypress, LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false, "backlight filters first keypress", NULL), + CHOICE_SETTING(0,bl_filter_buttons, LANG_BACKLIGHT_FILTER_BUTTONS, 0, + "backlight on buttons","all,select,power,select+power", NULL, 4, + ID2P(LANG_BACKLIGHT_FILTER_BUTTONS_ALL), + ID2P(LANG_BACKLIGHT_FILTER_BUTTONS_SELECT), + ID2P(LANG_BACKLIGHT_FILTER_BUTTONS_POWER), + ID2P(LANG_BACKLIGHT_FILTER_BUTTONS_SELECT_POWER)), #ifdef HAVE_REMOTE_LCD OFFON_SETTING(0,remote_bl_filter_first_keypress, LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false, diff -Nurb rockbox.orig/firmware/drivers/button.c rockbox.bl/firmware/drivers/button.c --- rockbox.orig/firmware/drivers/button.c 2007-12-31 22:37:04.000000000 +0200 +++ rockbox.bl/firmware/drivers/button.c 2008-01-01 20:05:47.000000000 +0200 @@ -56,6 +56,7 @@ #endif #ifdef HAVE_BACKLIGHT static bool filter_first_keypress; +static long backlight_on_button_mask = -1; #ifdef HAVE_REMOTE_LCD static bool remote_filter_first_keypress; #endif @@ -250,15 +251,16 @@ skip_remote_release = true; } else + { #endif - if (!filter_first_keypress || is_backlight_on() -#if BUTTON_REMOTE - || (btn&BUTTON_REMOTE) -#endif - ) + if (is_backlight_on() || !filter_first_keypress + || (filter_first_keypress && !(btn & backlight_on_button_mask))) queue_post(&button_queue, btn, data); else skip_release = true; +#ifdef HAVE_REMOTE_LCD + } +#endif #else /* no backlight, nothing to skip */ queue_post(&button_queue, btn, data); #endif @@ -270,11 +272,15 @@ else #endif { + /* any button press should keep backlight lit, + * but only some may turn it on */ + if(is_backlight_on() || (btn & backlight_on_button_mask)) { backlight_on(); #ifdef HAVE_BUTTON_LIGHT buttonlight_on(); #endif } + } reset_poweroff_timer(); } @@ -468,6 +474,41 @@ { filter_first_keypress = value; } + +#if defined BUTTON_SELECT +#define BACKLIGHT_BTN_SELECT BUTTON_SELECT +#elif defined BUTTON_PLAY +#define BACKLIGHT_BTN_SELECT BUTTON_PLAY +#else +#error Can't guess BACKLIGHT_BTN_SELECT for this target +#endif + +#if defined BUTTON_POWER +#define BACKLIGHT_BTN_POWER BUTTON_POWER +#elif defined BUTTON_ON && defined BUTTON_OFF +#define BACKLIGHT_BTN_POWER BUTTON_ON | BUTTON_OFF +#elif defined BUTTON_ON +#define BACKLIGHT_BTN_POWER BUTTON_ON +#else +#error Can't guess BACKLIGHT_BTN_POWER for this targer +#endif + +void set_backlight_filter_buttons(int value) +{ + switch(value) { + case 1: + backlight_on_button_mask = BACKLIGHT_BTN_SELECT; + break; + case 2: + backlight_on_button_mask = BACKLIGHT_BTN_POWER; + break; + case 3: + backlight_on_button_mask = BACKLIGHT_BTN_SELECT | BACKLIGHT_BTN_POWER; + break; + default: + backlight_on_button_mask = -1; + } +} #ifdef HAVE_REMOTE_LCD void set_remote_backlight_filter_keypress(bool value) { diff -Nurb rockbox.orig/firmware/export/button.h rockbox.bl/firmware/export/button.h --- rockbox.orig/firmware/export/button.h 2007-12-31 22:37:04.000000000 +0200 +++ rockbox.bl/firmware/export/button.h 2007-12-31 22:43:13.000000000 +0200 @@ -38,6 +38,7 @@ #endif #ifdef HAVE_BACKLIGHT void set_backlight_filter_keypress(bool value); +void set_backlight_filter_buttons(int value); #ifdef HAVE_REMOTE_LCD void set_remote_backlight_filter_keypress(bool value); #endif