#include "recovery-rui-skin.h"
#include "process-util.h"
+/* if user does not do anything, default action will be taken after this timeout*/
+#define DEFAULT_ACTION_TIMEOUT 4
+
+#define BUFFER_SIZE 512
+
bool volatile running = true;
+static const char *original_description = NULL;
+static char description_buffer[BUFFER_SIZE];
+static char *rui_default_action = NULL;
+static const char *rui_default_handler = NULL;
+
+static int timer_count = 0;
+static bool user_idle = true;
+
+static void timeout_handler(rui_screen *cs)
+{
+ int ret;
+
+ if (rui_default_action && user_idle) {
+ if (!original_description) {
+ original_description = cs->description->text;
+ cs->description->text = description_buffer;
+ }
+
+ snprintf(description_buffer, BUFFER_SIZE,
+ "%s\nDefault action (%s) will be taken after %d seconds",
+ original_description, rui_default_action,
+ DEFAULT_ACTION_TIMEOUT - timer_count/TIMER_INTERVAL);
+
+ if (timer_count/TIMER_INTERVAL == DEFAULT_ACTION_TIMEOUT) {
+ ret = system(rui_default_handler);
+ if (ret < 0)
+ LOGD("Could not run action: %s\n", rui_default_handler);
+ }
+ }
+
+ if (!user_idle) {
+ cs->description->text = original_description;
+ }
+
+ timer_count++;
+}
void recovery_rui_input_callback(user_action action, user_action_type action_type)
{
/* We interested only in button downs, long presses and idle events */
if (action_type != ACTION_TYPE_BEGIN &&
action_type != ACTION_TYPE_LONGPRESS &&
- action_type != ACTION_TYPE_IDLE)
+ action_type != ACTION_TYPE_IDLE &&
+ action_type != ACTION_TYPE_TIMER)
return;
cs = get_current_screen();
+ if (action_type != ACTION_TYPE_TIMER &&
+ action_type != ACTION_TYPE_IDLE &&
+ user_idle) {
+ user_idle = false;
+ timeout_handler(cs);
+ }
+
if (action == ACTION_DOWN && cs->menu)
rui_menu_cursor_down(cs->menu);
else if (action == ACTION_UP && cs->menu)
rui_menu_action_run(cs->menu);
else if (action == ACTION_BACK)
rui_screen_switch(RUI_SCREEN_BACK);
+ else if (action == ACTION_TIMEOUT)
+ timeout_handler(cs);
else if (action != ACTION_NONE || action_type != ACTION_TYPE_IDLE ||
!cs->animations)
need_repaint = 0;
free(rui_config_labels.rui_colors);
free(rui_config_labels.rui_rulers);
free(rui_config_labels.rui_descriptions);
+
+ free(rui_default_action);
}
return 1;
}
+ rui_default_action = get_action_from_cmdline();
+ if (rui_default_action) {
+ int idx = find_string(rui_config_labels.rui_action_handlers, rui_default_action);
+ if (idx < 0) {
+ LOGD("Invalid action: %s\n", rui_default_action);
+ free(rui_default_action);
+ rui_default_action = NULL;
+ } else
+ rui_default_handler = rui_action_handlers[idx];
+ }
+
if (!ev_init()) {
LOGD("Can't initialize input subsystem.\n");
recovery_rui_exit();