From: Alex Badea Date: Sun, 13 Jun 2010 11:06:24 +0000 (+0300) Subject: daemon: fix missed quick-double-press events X-Git-Url: http://git.maemo.org/git/?p=espeaktime;a=commitdiff_plain;h=045ba86190bfaf0e49369f9caea061583feff4c4 daemon: fix missed quick-double-press events Double-pressing the power button at a normal rate (such as, the rate used for locking the display) will usually result in the two ButtonPressed events being received before the display_status==on event. Speech would not play in this case. Work around this by monitoring ButtonPressed timing and triggering speech from the display_status signal. --- diff --git a/src/daemon.c b/src/daemon.c index 3330da0..de5f6d3 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -18,8 +19,16 @@ struct app_data { gboolean mode_locked; gboolean display_on; + time_t last_press; + unsigned press_count; }; +static void speak_time(struct app_data *app) +{ + int res = system("espeaktime-now.sh"); + g_debug("speak script: %d", res); +} + static void sig_tklock_mode(DBusGProxy *proxy, const char *mode, gpointer user_data) { struct app_data *app = user_data; @@ -32,6 +41,13 @@ static void sig_display_status(DBusGProxy *proxy, const char *status, gpointer u struct app_data *app = user_data; g_debug("sig_display_status [%s]", status); app->display_on = !strcmp(status, MCE_DISPLAY_ON_STRING); + + /* Double-pressing the button at a normal rate will usually result + * in the two ButtonPress events being received before the display_status==on + * event. Check here if that's the case. + */ + if (app->display_on && app->press_count > 1 && app->last_press - time(NULL) <= 1) + speak_time(app); } static void debug_log(const gchar *log_domain, @@ -42,11 +58,17 @@ static void debug_log(const gchar *log_domain, static void power_button(struct app_data *app) { - g_debug("power button"); - if (app->mode_locked && app->display_on) { - int res = system("espeaktime-now.sh"); - g_debug("speak script: %d", res); - } + time_t now; + + time(&now); + if (now - app->last_press > 1) + app->press_count = 0; + app->press_count++; + app->last_press = now; + + g_debug("power button: count=%d", app->press_count); + if (app->mode_locked && app->display_on) + speak_time(app); } /**