// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
/*
* Copyright (C) 2011 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Authored by: Didier Roche
*/
#include "LauncherHoverMachine.h"
namespace unity
{
LauncherHoverMachine::LauncherHoverMachine()
: _should_hover(false)
, _latest_emit_should_hover(false)
, _quirks(DEFAULT)
{}
/* == Quick Quirk Reference : please keep up to date ==
DEFAULT = 0,
LAUNCHER_HIDDEN = 1 << 0, 1
MOUSE_OVER_LAUNCHER = 1 << 1, 2
MOUSE_OVER_BFB = 1 << 2, 4
QUICKLIST_OPEN = 1 << 3, 8
KEY_NAV_ACTIVE = 1 << 4, 16
LAUNCHER_IN_ACTION = 1 << 5, 32
PLACES_VISIBLE = 1 << 6, 64
*/
void
LauncherHoverMachine::EnsureHoverState()
{
bool should_hover;
if (GetQuirk(LAUNCHER_HIDDEN))
{
SetShouldHover(false);
return;
}
if (GetQuirk((HoverQuirk)(MOUSE_OVER_LAUNCHER | MOUSE_OVER_BFB |
KEY_NAV_ACTIVE | QUICKLIST_OPEN | LAUNCHER_IN_ACTION)))
should_hover = true;
else
should_hover = false;
SetShouldHover(should_hover);
}
void
LauncherHoverMachine::SetShouldHover(bool value)
{
_should_hover = value;
_hover_changed_emit_idle.reset(new glib::Idle(glib::Source::Priority::DEFAULT));
_hover_changed_emit_idle->Run(sigc::mem_fun(this, &LauncherHoverMachine::EmitShouldHoverChanged));
}
bool
LauncherHoverMachine::EmitShouldHoverChanged()
{
if (_should_hover == _latest_emit_should_hover)
return false;
_latest_emit_should_hover = _should_hover;
should_hover_changed.emit(_should_hover);
return false;
}
void
LauncherHoverMachine::SetQuirk(LauncherHoverMachine::HoverQuirk quirk, bool active)
{
if (GetQuirk(quirk) == active)
return;
if (active)
_quirks = (HoverQuirk)(_quirks | quirk);
else
_quirks = (HoverQuirk)(_quirks & ~quirk);
EnsureHoverState();
}
bool
LauncherHoverMachine::GetQuirk(LauncherHoverMachine::HoverQuirk quirk, bool allow_partial)
{
if (allow_partial)
return _quirks & quirk;
return (_quirks & quirk) == quirk;
}
std::string
LauncherHoverMachine::DebugHoverQuirks()
{
// Although I do wonder why we are returning a string representation
// of the enum value as an integer anyway.
return std::to_string(_quirks);
}
} //unity namespace