Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add setting for autolock delay length
When the display blanks automatically via dimming, the autolock is
not applied immediately. During this so called grace period users can
get back to the app that was active before display was blanked.

While having this grace period is useful from user's point of view,
it also means applications do not get backgrounded and thus stay in
active state - which can cause issues. The hardcoded 30 second grace
period is a compromise between these conflicting needs.

Making the length of the grace period changeable at runtime allows users
to choose which of the two is more important for them.

Default stays at 30 seconds, but can be changed via:
  mcetool --set-autolock-delay=<seconds[.fraction]>

[mce] Add setting for autolock delay length. Fixes NEMO#787
  • Loading branch information
spiiroin committed Mar 16, 2015
1 parent 9c7c33c commit 147875a
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 18 deletions.
5 changes: 5 additions & 0 deletions builtin-gconf.c
Expand Up @@ -1214,6 +1214,11 @@ static const setting_t gconf_defaults[] =
.type = "b",
.def = G_STRINGIFY(DEFAULT_DEVICELOCK_IN_LOCKSCREEN),
},
{
.key = MCE_GCONF_AUTOLOCK_DELAY,
.type = "i",
.def = G_STRINGIFY(DEFAULT_AUTOLOCK_DELAY),
},
{
// MCE_GCONF_BLANKING_INHIBIT_MODE @ modules/display.h
.key = "/system/osso/dsm/display/inhibit_blank_mode",
Expand Down
64 changes: 49 additions & 15 deletions tklock.c
Expand Up @@ -204,7 +204,7 @@ static void tklock_datapipe_quit(void);
static gboolean tklock_autolock_cb(gpointer aptr);
static bool tklock_autolock_exceeded(void);
static void tklock_autolock_reschedule(void);
static void tklock_autolock_schedule(int delay);
static void tklock_autolock_schedule(void);
static void tklock_autolock_cancel(void);
static void tklock_autolock_rethink(void);
static void tklock_autolock_pre_transition_actions(void);
Expand Down Expand Up @@ -364,6 +364,11 @@ static gboolean tk_autolock_enabled = DEFAULT_TK_AUTOLOCK;
/** GConf callback ID for tk_autolock_enabled */
static guint tk_autolock_enabled_cb_id = 0;

/** Delay for automatick locking (after ON->DIM->OFF cycle) */
static gint tklock_autolock_delay = DEFAULT_AUTOLOCK_DELAY;
/** GConf notifier id for tklock_autolock_delay */
static guint tklock_autolock_delay_cb_id = 0;

/** Flag: Proximity sensor can block touch input */
static gboolean proximity_blocks_touch = PROXIMITY_BLOCKS_TOUCH_DEFAULT;
/** GConf callback ID for proximity_blocks_touch */
Expand Down Expand Up @@ -1239,8 +1244,18 @@ static void tklock_datapipe_submode_cb(gconstpointer data)

tklock_evctrl_rethink();

// was tklock removed?
if( (prev & MCE_TKLOCK_SUBMODE) && !(submode & MCE_TKLOCK_SUBMODE) ) {
// skip the rest if tklock did not change
if( !((prev ^ submode) & MCE_TKLOCK_SUBMODE) )
goto EXIT;

if( submode & MCE_TKLOCK_SUBMODE ) {
// tklock added

/* Stop autolock timer since we are already locked */
tklock_autolock_cancel();
}
else {
// tklock removed
switch( display_state_next ) {
case MCE_DISPLAY_LPM_ON:
case MCE_DISPLAY_LPM_OFF:
Expand All @@ -1266,6 +1281,7 @@ static void tklock_datapipe_submode_cb(gconstpointer data)
break;
}
}

EXIT:
return;
}
Expand Down Expand Up @@ -2031,9 +2047,6 @@ static void tklock_autolock_on_devlock_trigger(void)
* AUTOLOCK STATE MACHINE
* ========================================================================= */

/** Maximum time to delay enabling tklock after display is blanked */
#define AUTOLOCK_DELAY_MS (30 * 1000)

static int64_t tklock_autolock_tick = MAX_TICK;
static guint tklock_autolock_id = 0;

Expand Down Expand Up @@ -2096,14 +2109,18 @@ static void tklock_autolock_reschedule(void)
return;
}

static void tklock_autolock_schedule(int delay)
static void tklock_autolock_schedule(void)
{
int delay = mce_clip_int(MINIMUM_AUTOLOCK_DELAY,
MAXIMUM_AUTOLOCK_DELAY,
tklock_autolock_delay);

if( tklock_autolock_id )
g_source_remove(tklock_autolock_id);

tklock_autolock_id = g_timeout_add(delay, tklock_autolock_cb, 0);
tklock_autolock_tick = tklock_monotick_get() + delay;
mce_log(LL_DEBUG, "autolock timer started");
mce_log(LL_DEBUG, "autolock timer started (%d ms)", delay);
}

/** React to display state transitios that are about to be made
Expand Down Expand Up @@ -2200,7 +2217,7 @@ static void tklock_autolock_rethink(void)
if( device_lock_state == DEVICE_LOCK_LOCKED )
tklock_ui_set(true);
else if( !was_off )
tklock_autolock_schedule(AUTOLOCK_DELAY_MS);
tklock_autolock_schedule();
break;

case MCE_DISPLAY_ON:
Expand Down Expand Up @@ -3585,6 +3602,12 @@ static void tklock_gconf_cb(GConfClient *const gcc, const guint id,
tk_autolock_enabled = gconf_value_get_bool(gcv) ? 1 : 0;
tklock_autolock_rethink();
}
else if( id == tklock_autolock_delay_cb_id ) {
gint old = tklock_autolock_delay;
tklock_autolock_delay = gconf_value_get_int(gcv);
mce_log(LL_NOTICE, "tklock_autolock_delay: %d -> %d",
old, tklock_autolock_delay);
}
else if( id == proximity_blocks_touch_cb_id ) {
proximity_blocks_touch = gconf_value_get_bool(gcv) ? 1 : 0;
tklock_evctrl_rethink();
Expand Down Expand Up @@ -3653,13 +3676,20 @@ static void tklock_gconf_init(void)
tklock_gconf_cb,
&tklock_blank_disable_id);

/* Touchscreen/keypad autolock */
/* Touchscreen/keypad autolock enabled */
mce_gconf_track_bool(MCE_GCONF_TK_AUTOLOCK_ENABLED_PATH,
&tk_autolock_enabled,
DEFAULT_TK_AUTOLOCK,
tklock_gconf_cb,
&tk_autolock_enabled_cb_id);

/* Touchscreen/keypad autolock delay */
mce_gconf_track_int(MCE_GCONF_AUTOLOCK_DELAY,
&tklock_autolock_delay,
DEFAULT_AUTOLOCK_DELAY,
tklock_gconf_cb,
&tklock_autolock_delay_cb_id);

/* Touchscreen/keypad double-tap gesture policy */
mce_gconf_track_int(MCE_GCONF_TK_DOUBLE_TAP_GESTURE_PATH,
&doubletap_gesture_policy,
Expand Down Expand Up @@ -3708,6 +3738,9 @@ static void tklock_gconf_quit(void)
mce_gconf_notifier_remove(tk_autolock_enabled_cb_id),
tk_autolock_enabled_cb_id = 0;

mce_gconf_notifier_remove(tklock_autolock_delay_cb_id),
tklock_autolock_delay_cb_id = 0;

mce_gconf_notifier_remove(tklock_blank_disable_id),
tklock_blank_disable_id = 0;

Expand Down Expand Up @@ -4244,14 +4277,15 @@ static gboolean tklock_dbus_send_tklock_mode(DBusMessage *const method_call)
MCE_TK_LOCKED : MCE_TK_UNLOCKED);

/* If method_call is set, send a reply. Otherwise, send a signal. */
if( method_call )
if( method_call ) {
msg = dbus_new_method_reply(method_call);
else
mce_log(LL_DEBUG, "send tklock mode reply: %s", mode);
}
else {
msg = dbus_new_signal(MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
MCE_TKLOCK_MODE_SIG);

mce_log(LL_DEBUG, "send tklock mode %s: %s",
method_call ? "reply" : "signal", mode);
mce_log(LL_DEVEL, "send tklock mode signal: %s", mode);
}

if( !dbus_message_append_args(msg,
DBUS_TYPE_STRING, &mode,
Expand Down
6 changes: 6 additions & 0 deletions tklock.h
Expand Up @@ -114,6 +114,12 @@ typedef enum
/** Default value for MCE_GCONF_DEVICELOCK_IN_LOCKSCREEN */
# define DEFAULT_DEVICELOCK_IN_LOCKSCREEN false

/** Autolock delay GConf setting [ms]*/
# define MCE_GCONF_AUTOLOCK_DELAY MCE_GCONF_LOCK_PATH "/autolock_delay"
# define DEFAULT_AUTOLOCK_DELAY 30000
# define MINIMUM_AUTOLOCK_DELAY 0
# define MAXIMUM_AUTOLOCK_DELAY 600000

/** Automatic lpm triggering modes */
enum
{
Expand Down
60 changes: 57 additions & 3 deletions tools/mcetool.c
Expand Up @@ -56,10 +56,10 @@
#define MCE_DBUS_SET_CONFIG_REQ "set_config"

/** Default padding for left column of status reports */
#define PAD1 "30"
#define PAD1 "36"

/** Padding used for radio state bits */
#define PAD2 "22"
#define PAD2 "28"

#if MCETOOL_ENABLE_EXTRA_DEBUG
# define debugf(FMT, ARGS...) fprintf(stderr, PROG_NAME": D: "FMT, ##ARGS)
Expand Down Expand Up @@ -1516,13 +1516,30 @@ static int xmce_parse_integer(const char *args)
{
char *end = 0;
int res = strtol(args, &end, 0);
if( end <= args ) {
if( end <= args || *end != 0 ) {
errorf("%s: not a valid integer value\n", args);
exit(EXIT_FAILURE);
}
return res;
}

/** Convert string to double
*
* @param args string from user
*
* @return double precision floating point number, or terminate on errors
*/
static double xmce_parse_double(const char *args)
{
char *end = 0;
double res = strtod(args, &end);
if( end <= args || *end != 0 ) {
errorf("%s: not a valid double value\n", args);
exit(EXIT_FAILURE);
}
return res;
}

/** Convert a comma separated string in to gint array
*
* @param text string to split
Expand Down Expand Up @@ -2583,6 +2600,35 @@ static void xmce_get_autolock_mode(void)
printf("%-"PAD1"s %s\n", "Touchscreen/Keypad autolock:", txt);
}

/* Set autolock delay
*
* @param args string suitable for interpreting as time in msec
*/
static bool xmce_set_autolock_delay(const char *args)
{
gint val = (int)(xmce_parse_double(args) * 1000.0);

if( val < MINIMUM_AUTOLOCK_DELAY || val > MAXIMUM_AUTOLOCK_DELAY ) {
errorf("%d: invalid autolock delay\n", val);
return false;
}

mcetool_gconf_set_int(MCE_GCONF_AUTOLOCK_DELAY, val);
return true;
}

/** Get current autolock delay from mce and print it out
*/
static void xmce_get_autolock_delay(void)
{
gint val = 0;
char txt[32] = "unknown";

if( mcetool_gconf_get_int(MCE_GCONF_AUTOLOCK_DELAY, &val) )
snprintf(txt, sizeof txt, "%g [s]", val / 1000.0);
printf("%-"PAD1"s %s\n", "Touchscreen/Keypad autolock delay:", txt);
}

/* ------------------------------------------------------------------------- *
* devicelock_in_lockscreen
* ------------------------------------------------------------------------- */
Expand Down Expand Up @@ -4102,6 +4148,7 @@ static bool xmce_get_status(const char *args)
xmce_get_psm_threshold();
xmce_get_tklock_mode();
xmce_get_autolock_mode();
xmce_get_autolock_delay();
xmce_get_devicelock_in_lockscreen();
xmce_get_doubletap_mode();
xmce_get_doubletap_wakeup();
Expand Down Expand Up @@ -4383,6 +4430,13 @@ static const mce_opt_t options[] =
"set the autolock mode; valid modes are:\n"
"'enabled' and 'disabled'\n"
},
{
.name = "set-autolock-delay",
.with_arg = xmce_set_autolock_delay,
.values = "seconds[.fraction]",
.usage =
"set autolock delay after automatic display blanking\n"
},
{
.name = "set-devicelock-in-lockscreen",
.with_arg = xmce_set_devicelock_in_lockscreen,
Expand Down

0 comments on commit 147875a

Please sign in to comment.