diff options
| author | Mirco Müller <mirco.mueller@ubuntu.com> | 2011-03-07 18:23:15 +0100 |
|---|---|---|
| committer | Mirco Müller <mirco.mueller@ubuntu.com> | 2011-03-07 18:23:15 +0100 |
| commit | a026f3fbc446b9e794b9938cd17087cdc966355d (patch) | |
| tree | 1aac5c66ee003490c35577d4fc760f3bff7d510a | |
| parent | 5df4651c79ff3b5975fd99d57b304182985b38c0 (diff) | |
| parent | d4e6bce38765a0e9846b26fac7a35d17644e5428 (diff) | |
modified:
src/Launcher.cpp src/Launcher.h This adds a trigger for opening an icons quicklist, when the user presses and hold the LMB over an icon. At the moment the single-finger-hold duration is set to 1000 ms. We might need to tweak that value depending on user-feedback. Fixes LP: #702486 (bzr r929)
| -rw-r--r-- | src/Launcher.cpp | 86 | ||||
| -rw-r--r-- | src/Launcher.h | 8 |
2 files changed, 92 insertions, 2 deletions
diff --git a/src/Launcher.cpp b/src/Launcher.cpp index 71df839ee..dec84f8c5 100644 --- a/src/Launcher.cpp +++ b/src/Launcher.cpp @@ -304,6 +304,8 @@ Launcher::Launcher (nux::BaseWindow* parent, _autoscroll_handle = 0; _redraw_handle = 0; _focus_keynav_handle = 0; + _single_finger_hold_handle = 0; + _single_finger_hold_timer = NULL; _floating = false; _hovered = false; _hidden = false; @@ -321,7 +323,7 @@ Launcher::Launcher (nux::BaseWindow* parent, _backlight_mode = BACKLIGHT_NORMAL; _last_button_press = 0; _selection_atom = 0; - + // set them to 1 instead of 0 to avoid :0 in case something is racy _trigger_width = 1; _trigger_height = 1; @@ -1473,6 +1475,31 @@ gboolean Launcher::OnAutohideTimeout (gpointer data) return false; } +int +Launcher::GetMouseX () +{ + return _mouse_position.x; +} + +int +Launcher::GetMouseY () +{ + return _mouse_position.y; +} + +gboolean +Launcher::SingleFingerHoldTimeout (gpointer data) +{ + Launcher* self = (Launcher*) data; + + LauncherIcon* launcher_icon = 0; + launcher_icon = self->MouseIconIntersection (self->GetMouseX (), + self->GetMouseY ()); + launcher_icon->OpenQuicklist (); + + return false; +} + gboolean Launcher::DrawLauncherTimeout (gpointer data) { Launcher *self = (Launcher*) data; @@ -2835,6 +2862,18 @@ void Launcher::MouseDownLogic (int x, int y, unsigned long button_flags, unsigne LauncherIcon* launcher_icon = 0; launcher_icon = MouseIconIntersection (_mouse_position.x, _mouse_position.y); + // this takes care of the one-finger-hold "event" on a launcher-icon + if (_single_finger_hold_handle == 0) + { + _single_finger_hold_handle = g_timeout_add (SINGLE_FINGER_HOLD_DURATION, + &Launcher::SingleFingerHoldTimeout, + this); + if (_single_finger_hold_timer) + g_timer_destroy (_single_finger_hold_timer); + + _single_finger_hold_timer = g_timer_new (); + } + if (launcher_icon) { _icon_mouse_down = launcher_icon; @@ -2847,6 +2886,51 @@ void Launcher::MouseUpLogic (int x, int y, unsigned long button_flags, unsigned LauncherIcon* launcher_icon = 0; launcher_icon = MouseIconIntersection (_mouse_position.x, _mouse_position.y); + // this takes care of the one-finger-hold "event" on a launcher-icon + if (_single_finger_hold_timer) + { + // user "released" before single-finger-hold threshold + if (g_timer_elapsed (_single_finger_hold_timer, NULL) < (float) SINGLE_FINGER_HOLD_DURATION / 1000.0) + { + + // remove callback + if (_single_finger_hold_handle > 0) + { + g_source_remove (_single_finger_hold_handle); + _single_finger_hold_handle = 0; + } + } + // user "released" after single-finger-hold threshold... + else + { + // remove timer + g_timer_destroy (_single_finger_hold_timer); + _single_finger_hold_timer = NULL; + + // remove callback + if (_single_finger_hold_handle > 0) + { + g_source_remove (_single_finger_hold_handle); + _single_finger_hold_handle = 0; + } + + // ... don't start app, just return + _icon_mouse_down = 0; + return; + } + + // remove timer + g_timer_destroy (_single_finger_hold_timer); + _single_finger_hold_timer = NULL; + + // remove callback + if (_single_finger_hold_handle > 0) + { + g_source_remove (_single_finger_hold_handle); + _single_finger_hold_handle = 0; + } + } + if (_icon_mouse_down && (_icon_mouse_down == launcher_icon)) { _icon_mouse_down->MouseUp.emit (nux::GetEventButton (button_flags)); diff --git a/src/Launcher.h b/src/Launcher.h index f6d84731f..758370162 100644 --- a/src/Launcher.h +++ b/src/Launcher.h @@ -39,6 +39,7 @@ #define ANIM_DURATION_LONG 350 #define SUPER_TAP_DURATION 250 +#define SINGLE_FINGER_HOLD_DURATION 1000 #define MAX_SUPERKEY_LABELS 10 @@ -151,6 +152,8 @@ public: void exitKeyNavMode (); // Connected to signal OnEndFocus + int GetMouseX (); + int GetMouseY (); sigc::signal<void, char *, LauncherIcon *> launcher_dropped; sigc::signal<void> selection_change; @@ -220,7 +223,8 @@ private: static gboolean DrawLauncherTimeout (gpointer data); static gboolean StrutHack (gpointer data); static gboolean MoveFocusToKeyNavModeTimeout (gpointer data); - + static gboolean SingleFingerHoldTimeout (gpointer data); + void SetMousePosition (int x, int y); bool MouseBeyondDragThreshold (); @@ -457,6 +461,8 @@ private: guint _autoscroll_handle; guint _focus_keynav_handle; guint _redraw_handle; + guint _single_finger_hold_handle; + GTimer* _single_finger_hold_timer; nux::Point2 _mouse_position; nux::Point2 _trigger_mouse_position; |
