revert desktopgrid realtime gestures port

This commit is contained in:
Jan Blackquill 2022-03-16 17:14:59 -04:00
parent 2de09fa249
commit ca7fc44814
2 changed files with 80 additions and 150 deletions

View file

@ -5,7 +5,6 @@
SPDX-FileCopyrightText: 2007 Lubos Lunak <l.lunak@kde.org>
SPDX-FileCopyrightText: 2008 Lucas Murray <lmurray@undefinedfire.com>
SPDX-FileCopyrightText: 2009 Martin Gräßlin <mgraesslin@kde.org>
SPDX-FileCopyrightText: 2021 Carson Black <uhhadd@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
@ -58,72 +57,19 @@ DesktopGridEffect::DesktopGridEffect()
, scaledSize()
, scaledOffset()
, m_proxy(nullptr)
, m_gestureAction(new QAction(this))
, m_shortcutAction(new QAction(this))
, m_activateAction(new QAction(this))
{
initConfig<DesktopGridConfig>();
// First we set up the gestures...
QAction* a = m_gestureAction;
connect(a, &QAction::triggered, this, [this]() {
if (effects->hasActiveFullScreenEffect() && effects->activeFullScreenEffect() != this) {
return;
}
if ((qreal(timeline.currentTime()) / qreal(timeline.duration())) > 0.5) {
if (effects->isScreenLocked()) {
return;
}
activated = true;
timeline.setDirection(QTimeLine::Forward);
timelineRunning = true;
} else if (timeline.currentTime() > 0) {
activated = false;
timeline.setDirection(QTimeLine::Backward);
timelineRunning = true;
} else {
finish();
}
});
effects->registerRealtimeTouchpadPinchShortcut(PinchDirection::Contracting, 4, a, [this](qreal cb) {
if (activated) {
return;
}
if (effects->hasActiveFullScreenEffect() && effects->activeFullScreenEffect() != this) {
return;
}
if (timeline.currentValue() == 0) {
activated = true;
setup();
activated = false;
}
timeline.setCurrentTime(timeline.duration() * cb);
effects->addRepaintFull();
});
connect(&timeline, &QTimeLine::frameChanged, this, []() {
effects->addRepaintFull();
});
connect(&timeline, &QTimeLine::finished, this, [this]() {
timelineRunning = false;
if (timeline.currentTime() == 0) {
finish();
}
});
// Now we set up the shortcut
QAction* s = m_shortcutAction;
s->setObjectName(QStringLiteral("ShowDesktopGrid"));
s->setText(i18n("Show Desktop Grid"));
KGlobalAccel::self()->setDefaultShortcut(s, QList<QKeySequence>() << (Qt::CTRL | Qt::Key_F8));
KGlobalAccel::self()->setShortcut(s, QList<QKeySequence>() << (Qt::CTRL | Qt::Key_F8));
shortcut = KGlobalAccel::self()->shortcut(s);
effects->registerGlobalShortcut(Qt::CTRL | Qt::Key_F8, s);
connect(s, &QAction::triggered, this, &DesktopGridEffect::toggle);
// Load shortcuts
QAction* a = m_activateAction;
a->setObjectName(QStringLiteral("ShowDesktopGrid"));
a->setText(i18n("Show Desktop Grid"));
KGlobalAccel::self()->setDefaultShortcut(a, QList<QKeySequence>() << Qt::CTRL + Qt::Key_F8);
KGlobalAccel::self()->setShortcut(a, QList<QKeySequence>() << Qt::CTRL + Qt::Key_F8);
shortcut = KGlobalAccel::self()->shortcut(a);
effects->registerGlobalShortcut(Qt::CTRL + Qt::Key_F8, a);
effects->registerTouchpadSwipeShortcut(SwipeDirection::Up, 4, a);
connect(a, &QAction::triggered, this, &DesktopGridEffect::toggle);
connect(KGlobalAccel::self(), &KGlobalAccel::globalShortcutChanged, this, &DesktopGridEffect::globalShortcutChanged);
connect(effects, &EffectsHandler::windowAdded, this, &DesktopGridEffect::slotWindowAdded);
connect(effects, &EffectsHandler::windowClosed, this, &DesktopGridEffect::slotWindowClosed);
@ -134,7 +80,7 @@ DesktopGridEffect::DesktopGridEffect()
connect(effects, &EffectsHandler::screenRemoved, this, &DesktopGridEffect::setup);
connect(effects, &EffectsHandler::screenAboutToLock, this, [this]() {
deactivate();
setActive(false);
windowMoveElevateTimer->stop();
if (keyboardGrab) {
effects->ungrabKeyboard();
@ -185,14 +131,14 @@ void DesktopGridEffect::reconfigure(ReconfigureFlags)
// deactivate and activate all touch border
const QVector<ElectricBorder> relevantBorders{ElectricLeft, ElectricTop, ElectricRight, ElectricBottom};
for (auto e : relevantBorders) {
effects->unregisterTouchBorder(e, m_shortcutAction);
effects->unregisterTouchBorder(e, m_activateAction);
}
const auto touchBorders = DesktopGridConfig::touchBorderActivate();
for (int i : touchBorders) {
if (!relevantBorders.contains(ElectricBorder(i))) {
continue;
}
effects->registerTouchBorder(ElectricBorder(i), m_shortcutAction);
effects->registerTouchBorder(ElectricBorder(i), m_activateAction);
}
}
@ -209,28 +155,18 @@ void DesktopGridEffect::prePaintScreen(ScreenPrePaintData& data, std::chrono::mi
time = 1;
}
lastPresentTime = presentTime;
if (timelineRunning) {
timeline.setCurrentTime(timeline.currentTime() + (timeline.direction() == QTimeLine::Forward ? time : -time));
if ((timeline.currentTime() <= 0 && timeline.direction() == QTimeLine::Backward)) {
timelineRunning = false;
// defer until the event loop to finish
QTimer::singleShot(0, [this]() {
finish();
});
}
}
for (int i = 0; i < effects->numberOfDesktops(); i++) {
auto item = hoverTimeline[i];
if (i == highlightedDesktop-1) { // if this is the highlighted desktop, we want to progress the animation from "not highlighted" to "highlight"
item->setCurrentTime(item->currentTime() + time);
} else { // otherwise we progress from "highlighted" to "not highlighted"
item->setCurrentTime(item->currentTime() - time);
}
}
if (timeline.currentValue() != 0 || activated || (isUsingPresentWindows() && isMotionManagerMovingWindows())) {
if (activated)
timeline.setCurrentTime(timeline.currentTime() + time);
else
timeline.setCurrentTime(timeline.currentTime() - time);
for (int i = 0; i < effects->numberOfDesktops(); i++) {
if (i == highlightedDesktop - 1)
hoverTimeline[i]->setCurrentTime(hoverTimeline[i]->currentTime() + time);
else
hoverTimeline[i]->setCurrentTime(hoverTimeline[i]->currentTime() - time);
}
if (isUsingPresentWindows()) {
for (auto i = m_managers.begin(); i != m_managers.end(); ++i) {
for (WindowMotionManager &manager : *i) {
@ -242,6 +178,8 @@ void DesktopGridEffect::prePaintScreen(ScreenPrePaintData& data, std::chrono::mi
// so with normal screen painting second screen paint would erase parts of the first paint
if (timeline.currentValue() != 0 || (isUsingPresentWindows() && isMotionManagerMovingWindows()))
data.mask |= PAINT_SCREEN_TRANSFORMED | PAINT_SCREEN_BACKGROUND_FIRST;
if (!activated && timeline.currentValue() == 0 && !(isUsingPresentWindows() && isMotionManagerMovingWindows()))
finish();
}
const EffectWindowList windows = effects->stackingOrder();
@ -316,7 +254,7 @@ void DesktopGridEffect::postPaintScreen()
{
bool resetLastPresentTime = true;
if (timelineRunning || activated ? timeline.currentValue() != 1 : timeline.currentValue() != 0) {
if (activated ? timeline.currentValue() != 1 : timeline.currentValue() != 0) {
effects->addRepaintFull(); // Repaint during zoom
resetLastPresentTime = false;
}
@ -691,7 +629,7 @@ void DesktopGridEffect::windowInputMouseEvent(QEvent* e)
if (desk > effects->numberOfDesktops())
return; // don't quit when missing desktop
setCurrentDesktop(desk);
deactivate();
setActive(false);
}
if (windowMove) {
if (wasWindowMove && isUsingPresentWindows()) {
@ -719,30 +657,6 @@ void DesktopGridEffect::windowInputMouseEvent(QEvent* e)
}
}
void DesktopGridEffect::activate()
{
activated = true;
setup();
timeline.setDirection(QTimeLine::Forward);
timelineRunning = true;
// timeline.resume();
effects->addRepaintFull();
}
void DesktopGridEffect::deactivate()
{
activated = false;
timeline.setDirection(QTimeLine::Backward);
timelineRunning = true;
// timeline.resume();
effects->addRepaintFull();
}
void DesktopGridEffect::toggle()
{
if (activated) deactivate(); else activate();
}
void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
{
if (timeline.currentValue() != 1) // Block user input during animations
@ -752,8 +666,8 @@ void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
if (e->type() == QEvent::KeyPress) {
// check for global shortcuts
// HACK: keyboard grab disables the global shortcuts so we have to check for global shortcut (bug 156155)
if (shortcut.contains(e->key() | e->modifiers())) {
deactivate();
if (shortcut.contains(e->key() + e->modifiers())) {
toggle();
return;
}
@ -767,7 +681,7 @@ void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
if (desktop <= effects->numberOfDesktops()) {
setHighlightedDesktop(desktop);
setCurrentDesktop(desktop);
deactivate();
setActive(false);
}
return;
}
@ -786,13 +700,13 @@ void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
setHighlightedDesktop(desktopDown(highlightedDesktop, !e->isAutoRepeat()));
break;
case Qt::Key_Escape:
deactivate();
setActive(false);
return;
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Space:
setCurrentDesktop(highlightedDesktop);
deactivate();
setActive(false);
return;
case Qt::Key_Plus:
slotAddDesktop();
@ -1087,6 +1001,50 @@ int DesktopGridEffect::desktopDown(int desktop, bool wrap) const
//-----------------------------------------------------------------------------
// Activation
void DesktopGridEffect::toggle()
{
setActive(!activated);
}
void DesktopGridEffect::setActive(bool active)
{
if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this)
return; // Only one fullscreen effect at a time thanks
if (active && isMotionManagerMovingWindows())
return; // Still moving windows from last usage - don't activate
if (activated == active)
return; // Already in that state
activated = active;
if (activated) {
effects->setShowingDesktop(false);
if (timeline.currentValue() == 0)
setup();
} else {
if (isUsingPresentWindows()) {
QList<WindowMotionManager>::iterator it;
for (auto it = m_managers.begin(); it != m_managers.end(); ++it) {
for (WindowMotionManager &manager : *it) {
for (EffectWindow* w : manager.managedWindows()) {
manager.moveWindow(w, w->frameGeometry());
}
}
}
}
QTimer::singleShot(zoomDuration + 1, this,
[this] {
if (activated)
return;
for (OffscreenQuickScene *view : qAsConst(m_desktopButtons)) {
view->hide();
}
}
);
setHighlightedDesktop(effects->currentDesktop()); // Ensure selected desktop is highlighted
}
effects->addRepaintFull();
}
void DesktopGridEffect::setup()
{
if (!isActive())
@ -1255,27 +1213,6 @@ void DesktopGridEffect::finish()
desktopNames.clear();
}
if (isUsingPresentWindows()) {
for (auto it = m_managers.begin(); it != m_managers.end(); ++it) {
for (WindowMotionManager &manager : *it) {
const auto windows = manager.managedWindows();
for (EffectWindow * w : windows) {
manager.moveWindow(w, w->frameGeometry());
}
}
}
}
QTimer::singleShot(zoomDuration + 1, this,
[this] {
if (activated)
return;
for (OffscreenQuickScene *view : qAsConst(m_desktopButtons)) {
view->hide();
}
}
);
setHighlightedDesktop(effects->currentDesktop()); // Ensure selected desktop is highlighted
windowMoveElevateTimer->stop();
if (keyboardGrab)

View file

@ -83,6 +83,7 @@ public:
return clickBehavior == SwitchDesktopAndActivateWindow;
}
private Q_SLOTS:
void toggle();
// slots for global shortcut changed
// needed to toggle the effect
void globalShortcutChanged(QAction *action, const QKeySequence& seq);
@ -105,9 +106,7 @@ private:
int desktopToLeft(int desktop, bool wrap = true) const;
int desktopUp(int desktop, bool wrap = true) const;
int desktopDown(int desktop, bool wrap = true) const;
void deactivate();
void activate();
void toggle();
void setActive(bool active);
void setup();
void setupGrid();
void finish();
@ -128,12 +127,7 @@ private:
int clickBehavior;
bool activated;
QTimeLine timeline;
// used to indicate whether or not the prepaint thingy should drive the
// animation.
bool timelineRunning = false;
int paintingDesktop;
int highlightedDesktop;
int sourceDesktop;
@ -170,8 +164,7 @@ private:
QVector<OffscreenQuickScene*> m_desktopButtons;
QAction *m_gestureAction;
QAction *m_shortcutAction;
QAction *m_activateAction;
};