Commit ec759434 authored by Nate Graham's avatar Nate Graham
Browse files

Revert "revert desktopgrid realtime gestures port"

This reverts commit ca7fc448.

Reverting work with no explanation is unacceptable, especially when
you've already been asked to stop multiple times.

CWG has already been contacted regarding this conduct, which is
starting to seem like vandalism of KDE's codebase. I am CCing sysadmins
and officially recommending an emergency recovation of commit access
for uhhadd@gmail.com to prevent further abusive behavior.

CCMAIL: uhhadd@gmail.com
CCMAIL: sysadmin@kde.org
parent ca7fc448
Pipeline #151985 passed with stage
in 14 minutes and 10 seconds
......@@ -5,6 +5,7 @@
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
*/
......@@ -57,19 +58,72 @@ DesktopGridEffect::DesktopGridEffect()
, scaledSize()
, scaledOffset()
, m_proxy(nullptr)
, m_activateAction(new QAction(this))
, m_gestureAction(new QAction(this))
, m_shortcutAction(new QAction(this))
{
initConfig<DesktopGridConfig>();
// 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);
// 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);
connect(KGlobalAccel::self(), &KGlobalAccel::globalShortcutChanged, this, &DesktopGridEffect::globalShortcutChanged);
connect(effects, &EffectsHandler::windowAdded, this, &DesktopGridEffect::slotWindowAdded);
connect(effects, &EffectsHandler::windowClosed, this, &DesktopGridEffect::slotWindowClosed);
......@@ -80,7 +134,7 @@ DesktopGridEffect::DesktopGridEffect()
connect(effects, &EffectsHandler::screenRemoved, this, &DesktopGridEffect::setup);
connect(effects, &EffectsHandler::screenAboutToLock, this, [this]() {
setActive(false);
deactivate();
windowMoveElevateTimer->stop();
if (keyboardGrab) {
effects->ungrabKeyboard();
......@@ -131,14 +185,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_activateAction);
effects->unregisterTouchBorder(e, m_shortcutAction);
}
const auto touchBorders = DesktopGridConfig::touchBorderActivate();
for (int i : touchBorders) {
if (!relevantBorders.contains(ElectricBorder(i))) {
continue;
}
effects->registerTouchBorder(ElectricBorder(i), m_activateAction);
effects->registerTouchBorder(ElectricBorder(i), m_shortcutAction);
}
}
......@@ -155,18 +209,28 @@ 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 (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 (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 (isUsingPresentWindows()) {
for (auto i = m_managers.begin(); i != m_managers.end(); ++i) {
for (WindowMotionManager &manager : *i) {
......@@ -178,8 +242,6 @@ 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();
......@@ -254,7 +316,7 @@ void DesktopGridEffect::postPaintScreen()
{
bool resetLastPresentTime = true;
if (activated ? timeline.currentValue() != 1 : timeline.currentValue() != 0) {
if (timelineRunning || activated ? timeline.currentValue() != 1 : timeline.currentValue() != 0) {
effects->addRepaintFull(); // Repaint during zoom
resetLastPresentTime = false;
}
......@@ -629,7 +691,7 @@ void DesktopGridEffect::windowInputMouseEvent(QEvent* e)
if (desk > effects->numberOfDesktops())
return; // don't quit when missing desktop
setCurrentDesktop(desk);
setActive(false);
deactivate();
}
if (windowMove) {
if (wasWindowMove && isUsingPresentWindows()) {
......@@ -657,6 +719,30 @@ 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
......@@ -666,8 +752,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())) {
toggle();
if (shortcut.contains(e->key() | e->modifiers())) {
deactivate();
return;
}
......@@ -681,7 +767,7 @@ void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
if (desktop <= effects->numberOfDesktops()) {
setHighlightedDesktop(desktop);
setCurrentDesktop(desktop);
setActive(false);
deactivate();
}
return;
}
......@@ -700,13 +786,13 @@ void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e)
setHighlightedDesktop(desktopDown(highlightedDesktop, !e->isAutoRepeat()));
break;
case Qt::Key_Escape:
setActive(false);
deactivate();
return;
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Space:
setCurrentDesktop(highlightedDesktop);
setActive(false);
deactivate();
return;
case Qt::Key_Plus:
slotAddDesktop();
......@@ -1001,50 +1087,6 @@ 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())
......@@ -1213,6 +1255,27 @@ 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)
......
......@@ -83,7 +83,6 @@ 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);
......@@ -106,7 +105,9 @@ 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 setActive(bool active);
void deactivate();
void activate();
void toggle();
void setup();
void setupGrid();
void finish();
......@@ -127,7 +128,12 @@ 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;
......@@ -164,7 +170,8 @@ private:
QVector<OffscreenQuickScene*> m_desktopButtons;
QAction *m_activateAction;
QAction *m_gestureAction;
QAction *m_shortcutAction;
};
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment