Index: trunk/firmware/drivers/button.c =================================================================== --- trunk.orig/firmware/drivers/button.c +++ trunk/firmware/drivers/button.c @@ -54,6 +54,8 @@ static intptr_t button_data; /* data val #ifdef HAVE_LCD_BITMAP static bool flipped; /* buttons can be flipped to match the LCD flip */ #endif +static bool do_poweroff_on_hold = false; +static bool signaled_poweroff_on_hold = false; #ifdef HAVE_BACKLIGHT static bool filter_first_keypress; #ifdef HAVE_REMOTE_LCD @@ -139,6 +141,21 @@ static void button_tick(void) } #endif + static long shutdown_tick = 0; + if(signaled_poweroff_on_hold +#if CONFIG_CHARGING && !defined(HAVE_POWEROFF_WHILE_CHARGING) + && !charger_inserted() +#endif + && shutdown_tick == 0) + { + shutdown_tick = current_tick; + sys_poweroff(); + } + signaled_poweroff_on_hold = false; + if(shutdown_tick && TIME_AFTER(current_tick, shutdown_tick +10*HZ)) + /* Safety net */ + power_off(); + /* Find out if a key has been released */ diff = btn ^ lastbtn; if(diff && (btn & diff) == 0) @@ -474,6 +491,17 @@ void button_set_flip(bool flip) } #endif /* HAVE_LCD_BITMAP */ +void set_poweroff_on_hold(bool yesno) +{ + do_poweroff_on_hold = yesno; +} + +void signal_hold_button_on(void) +{ + if(do_poweroff_on_hold) + signaled_poweroff_on_hold = true; +} + #ifdef HAVE_BACKLIGHT void set_backlight_filter_keypress(bool value) { Index: trunk/apps/menus/settings_menu.c =================================================================== --- trunk.orig/apps/menus/settings_menu.c +++ trunk/apps/menus/settings_menu.c @@ -351,6 +351,7 @@ MENUITEM_SETTING(car_adapter_mode, &glob #ifdef HAVE_ACCESSORY_SUPPLY MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL); #endif +MENUITEM_SETTING(poweroff_on_hold, &global_settings.poweroff_on_hold, NULL); MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); #ifdef HAVE_BUTTON_LIGHT @@ -391,6 +392,7 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM) #ifdef HAVE_ACCESSORY_SUPPLY &accessory_supply, #endif + &poweroff_on_hold, #ifdef HAVE_BUTTON_LIGHT &buttonlight_timeout, #endif Index: trunk/apps/settings.c =================================================================== --- trunk.orig/apps/settings.c +++ trunk/apps/settings.c @@ -778,6 +778,9 @@ void settings_apply(bool read_disk) #if BATTERY_TYPES_COUNT > 1 set_battery_type(global_settings.battery_type); #endif +#ifndef SIMULATOR + set_poweroff_on_hold(global_settings.poweroff_on_hold); +#endif #ifdef HAVE_LCD_BITMAP lcd_set_invert_display(global_settings.invert); Index: trunk/apps/settings.h =================================================================== --- trunk.orig/apps/settings.h +++ trunk/apps/settings.h @@ -459,6 +459,7 @@ struct user_settings #ifdef HAVE_ACCESSORY_SUPPLY bool accessory_supply; /* 0=off 1=on, accessory power supply for iPod */ #endif + bool poweroff_on_hold; /* 0=no 1=yes */ /* show status bar */ bool statusbar; /* 0=hide, 1=show */ Index: trunk/apps/settings_list.c =================================================================== --- trunk.orig/apps/settings_list.c +++ trunk/apps/settings_list.c @@ -516,6 +516,10 @@ const struct settings_list settings[] = OFFON_SETTING(0, accessory_supply, LANG_ACCESSORY_SUPPLY, false, "accessory power supply", accessory_supply_set), #endif +#ifndef SIMULATOR + OFFON_SETTING(0, poweroff_on_hold, LANG_POWEROFF_ON_HOLD, false, + "poweroff on hold", set_poweroff_on_hold), +#endif /* tuner */ #if CONFIG_TUNER OFFON_SETTING(0,fm_force_mono, LANG_FM_MONO_MODE, Index: trunk/firmware/export/button.h =================================================================== --- trunk.orig/firmware/export/button.h +++ trunk/firmware/export/button.h @@ -38,6 +38,8 @@ void button_clear_queue(void); #ifdef HAVE_LCD_BITMAP void button_set_flip(bool flip); /* turn 180 degrees */ #endif +void signal_hold_button_on(void); +void set_poweroff_on_hold(bool yesno); #ifdef HAVE_BACKLIGHT void set_backlight_filter_keypress(bool value); #ifdef HAVE_REMOTE_LCD Index: trunk/apps/lang/english.lang =================================================================== --- trunk.orig/apps/lang/english.lang +++ trunk/apps/lang/english.lang @@ -12626,3 +12626,17 @@ *: "unknown char" + + id: LANG_POWEROFF_ON_HOLD + desc: system setting + user: + + *: "Poweroff on hold" + + + *: "Poweroff on hold" + + + *: "Power off on hold" + + Index: trunk/firmware/backlight.c =================================================================== --- trunk.orig/firmware/backlight.c +++ trunk/firmware/backlight.c @@ -665,6 +665,8 @@ void backlight_set_timeout_plugged(int v /* Hold button change event handler. */ void backlight_hold_changed(bool hold_button) { + if(hold_button) + signal_hold_button_on(); if (!hold_button || (backlight_on_button_hold > 0)) /* if unlocked or override in effect */ backlight_on();