summaryrefslogtreecommitdiff
diff options
-rw-r--r--src/Launcher.cpp86
-rw-r--r--src/Launcher.h8
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;