public signal void screen_lock_changed(bool state);
+ public signal void power_short_press();
+ public signal void power_long_press();
+ private uint button_press_timeout;
+
public Power()
{
screen_locked = false;
hide_after_closing_power_menu = false;
last_down.tv_sec = 0;
last_down.tv_usec = 0;
+ button_press_timeout = 0;
usage = zavai.registry.sbus.get_object(
"org.freesmartphone.ousaged",
zavai.input.power_button.power_button += on_power_button;
zavai.input.power_button.request("zavai.ui.powerbutton.power");
+
+ power_short_press += on_power_short_press;
+ power_long_press += on_power_long_press;
}
public void shutdown()
screen_lock_changed(locked);
}
+ private bool on_power_button_timeout()
+ {
+ last_down.tv_sec = 0;
+ last_down.tv_usec = 0;
+ power_long_press();
+ // Do not reschedule
+ return false;
+ }
+
private void on_power_button(Posix.timeval* t, bool pressed)
{
bool short_press = false;
{
stderr.printf(" FIRST PRESSED\n");
last_down = *t;
+ button_press_timeout = Timeout.add(1500, on_power_button_timeout);
}
else
{
long_press = diff >= 1500000;
}
} else {
- long diff = timediff(t, &last_down);
+ if (last_down.tv_sec == 0)
+ {
+ // Ignore: release has been simulated with the timeout
+ } else {
+ if (button_press_timeout != 0)
+ {
+ // Cancel the timeout
+ Source.remove(button_press_timeout);
+ button_press_timeout = 0;
+ }
+ long diff = timediff(t, &last_down);
stderr.printf(" RELEASED AFTER %ld\n", diff);
- if (diff >= 1500000)
- long_press = true;
- else
- short_press = true;
+ if (diff >= 1500000)
+ long_press = true;
+ else
+ short_press = true;
- last_down.tv_sec = 0;
- last_down.tv_usec = 0;
+ last_down.tv_sec = 0;
+ last_down.tv_usec = 0;
+ }
}
stderr.printf(" LP %d SP %d\n", (int)long_press, (int)short_press);
- if (short_press) {
- if (screen_locked)
- // Short press: turn on backlight for a bit
- backlight.wiggle();
- else
- // Short press: toggle power menu
- power_menu.toggle();
- } else if (long_press) {
- if (screen_locked)
- // Long press: unlock
- set_screen_lock(false);
- else
- // Long press: lock screen
- set_screen_lock(true);
- }
+ if (long_press) power_long_press();
+ if (short_press) power_short_press();
+ }
+
+ private void on_power_short_press()
+ {
+ if (screen_locked)
+ // Short press: turn on backlight for a bit
+ backlight.wiggle();
+ else
+ // Short press: toggle power menu
+ power_menu.toggle();
+ }
+
+ private void on_power_long_press()
+ {
+ if (screen_locked)
+ // Long press: unlock
+ set_screen_lock(false);
+ else
+ // Long press: lock screen
+ set_screen_lock(true);
}
}