Changeset View
Changeset View
Standalone View
Standalone View
effects/desktopgrid/desktopgrid.cpp
Show All 36 Lines | |||||
37 | #include <QEvent> | 37 | #include <QEvent> | ||
38 | #include <QMouseEvent> | 38 | #include <QMouseEvent> | ||
39 | #include <QTimer> | 39 | #include <QTimer> | ||
40 | #include <QVector2D> | 40 | #include <QVector2D> | ||
41 | #include <QQmlContext> | 41 | #include <QQmlContext> | ||
42 | #include <QQmlEngine> | 42 | #include <QQmlEngine> | ||
43 | #include <QQuickItem> | 43 | #include <QQuickItem> | ||
44 | 44 | | |||
45 | #include <KWayland/Server/surface_interface.h> | ||||
46 | | ||||
45 | namespace KWin | 47 | namespace KWin | ||
46 | { | 48 | { | ||
47 | 49 | | |||
48 | // WARNING, TODO: This effect relies on the desktop layout being EWMH-compliant. | 50 | // WARNING, TODO: This effect relies on the desktop layout being EWMH-compliant. | ||
49 | 51 | | |||
50 | DesktopGridEffect::DesktopGridEffect() | 52 | DesktopGridEffect::DesktopGridEffect() | ||
51 | : activated(false) | 53 | : activated(false) | ||
52 | , timeline() | 54 | , timeline() | ||
53 | , keyboardGrab(false) | 55 | , keyboardGrab(false) | ||
54 | , wasWindowMove(false) | 56 | , wasWindowMove(false) | ||
57 | , wasWindowCopy(false) | ||||
55 | , wasDesktopMove(false) | 58 | , wasDesktopMove(false) | ||
56 | , isValidMove(false) | 59 | , isValidMove(false) | ||
57 | , windowMove(NULL) | 60 | , windowMove(NULL) | ||
58 | , windowMoveDiff() | 61 | , windowMoveDiff() | ||
59 | , gridSize() | 62 | , gridSize() | ||
60 | , orientation(Qt::Horizontal) | 63 | , orientation(Qt::Horizontal) | ||
61 | , activeCell(1, 1) | 64 | , activeCell(1, 1) | ||
62 | , scale() | 65 | , scale() | ||
▲ Show 20 Lines • Show All 229 Lines • ▼ Show 20 Line(s) | 294 | } else | |||
292 | w->disablePainting(EffectWindow::PAINT_DISABLED_BY_DESKTOP); | 295 | w->disablePainting(EffectWindow::PAINT_DISABLED_BY_DESKTOP); | ||
293 | } | 296 | } | ||
294 | effects->prePaintWindow(w, data, time); | 297 | effects->prePaintWindow(w, data, time); | ||
295 | } | 298 | } | ||
296 | 299 | | |||
297 | void DesktopGridEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) | 300 | void DesktopGridEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) | ||
298 | { | 301 | { | ||
299 | if (timeline.currentValue() != 0 || (isUsingPresentWindows() && isMotionManagerMovingWindows())) { | 302 | if (timeline.currentValue() != 0 || (isUsingPresentWindows() && isMotionManagerMovingWindows())) { | ||
300 | if (isUsingPresentWindows() && w == windowMove && wasWindowMove) { | 303 | if (isUsingPresentWindows() && w == windowMove && wasWindowMove && | ||
304 | ((!wasWindowCopy && sourceDesktop == paintingDesktop) || | ||||
305 | (sourceDesktop != highlightedDesktop && highlightedDesktop == paintingDesktop))) { | ||||
301 | return; // will be painted on top of all other windows | 306 | return; // will be painted on top of all other windows | ||
302 | } | 307 | } | ||
303 | foreach (DesktopButtonsView *view, m_desktopButtonsViews) { | 308 | foreach (DesktopButtonsView *view, m_desktopButtonsViews) { | ||
304 | if (view->effectWindow == w) { | 309 | if (view->effectWindow == w) { | ||
305 | if (!activated && timeline.currentValue() < 0.05) { | 310 | if (!activated && timeline.currentValue() < 0.05) { | ||
306 | view->hide(); | 311 | view->hide(); | ||
307 | } | 312 | } | ||
308 | return; // will be painted on top of all other windows | 313 | return; // will be painted on top of all other windows | ||
▲ Show 20 Lines • Show All 173 Lines • ▼ Show 20 Line(s) | 469 | { | |||
482 | if (e->type() == QEvent::MouseMove) { | 487 | if (e->type() == QEvent::MouseMove) { | ||
483 | int d = posToDesktop(me->pos()); | 488 | int d = posToDesktop(me->pos()); | ||
484 | if (windowMove != NULL && | 489 | if (windowMove != NULL && | ||
485 | (me->pos() - dragStartPos).manhattanLength() > QApplication::startDragDistance()) { | 490 | (me->pos() - dragStartPos).manhattanLength() > QApplication::startDragDistance()) { | ||
486 | // Handle window moving | 491 | // Handle window moving | ||
487 | if (!wasWindowMove) { // Activate on move | 492 | if (!wasWindowMove) { // Activate on move | ||
488 | if (isUsingPresentWindows()) { | 493 | if (isUsingPresentWindows()) { | ||
489 | foreach (const int i, desktopList(windowMove)) { | 494 | foreach (const int i, desktopList(windowMove)) { | ||
490 | const int sourceDesktop = windowMove->isOnAllDesktops() ? d : windowMove->desktop(); | | |||
491 | WindowMotionManager& manager = m_managers[(i)*(effects->numScreens()) + windowMove->screen()]; | 495 | WindowMotionManager& manager = m_managers[(i)*(effects->numScreens()) + windowMove->screen()]; | ||
492 | if ((i + 1) == sourceDesktop) { | 496 | if ((i + 1) == sourceDesktop) { | ||
493 | const QRectF transformedGeo = manager.transformedGeometry(windowMove); | 497 | const QRectF transformedGeo = manager.transformedGeometry(windowMove); | ||
494 | const QPointF pos = scalePos(transformedGeo.topLeft().toPoint(), sourceDesktop, windowMove->screen()); | 498 | const QPointF pos = scalePos(transformedGeo.topLeft().toPoint(), sourceDesktop, windowMove->screen()); | ||
495 | const QSize size(scale[windowMove->screen()] *(float)transformedGeo.width(), | 499 | const QSize size(scale[windowMove->screen()] *(float)transformedGeo.width(), | ||
496 | scale[windowMove->screen()] *(float)transformedGeo.height()); | 500 | scale[windowMove->screen()] *(float)transformedGeo.height()); | ||
497 | m_windowMoveGeometry = QRect(pos.toPoint(), size); | 501 | m_windowMoveGeometry = QRect(pos.toPoint(), size); | ||
498 | m_windowMoveStartPoint = me->pos(); | 502 | m_windowMoveStartPoint = me->pos(); | ||
Show All 9 Lines | |||||
508 | } | 512 | } | ||
509 | } | 513 | } | ||
510 | if (windowMove->isMovable() && !isUsingPresentWindows()) { | 514 | if (windowMove->isMovable() && !isUsingPresentWindows()) { | ||
511 | wasWindowMove = true; | 515 | wasWindowMove = true; | ||
512 | int screen = effects->screenNumber(me->pos()); | 516 | int screen = effects->screenNumber(me->pos()); | ||
513 | effects->moveWindow(windowMove, unscalePos(me->pos(), NULL) + windowMoveDiff, true, 1.0 / scale[screen]); | 517 | effects->moveWindow(windowMove, unscalePos(me->pos(), NULL) + windowMoveDiff, true, 1.0 / scale[screen]); | ||
514 | } | 518 | } | ||
515 | if (wasWindowMove) { | 519 | if (wasWindowMove) { | ||
520 | if (!effects->waylandDisplay() || (me->modifiers() & Qt::ControlModifier)) { | ||||
521 | wasWindowCopy = true; | ||||
522 | effects->defineCursor(Qt::DragCopyCursor); | ||||
523 | } else { | ||||
524 | wasWindowCopy = false; | ||||
516 | effects->defineCursor(Qt::ClosedHandCursor); | 525 | effects->defineCursor(Qt::ClosedHandCursor); | ||
526 | } | ||||
517 | if (d != highlightedDesktop) { | 527 | if (d != highlightedDesktop) { | ||
518 | effects->windowToDesktop(windowMove, d); // Not true all desktop move | 528 | effects->windowToDesktop(windowMove, d); // Not true all desktop move | ||
529 | if (highlightedDesktop != sourceDesktop || !wasWindowCopy) { | ||||
530 | effects->removeWindowFromDesktop(windowMove, highlightedDesktop); | ||||
531 | } | ||||
519 | const int screen = effects->screenNumber(me->pos()); | 532 | const int screen = effects->screenNumber(me->pos()); | ||
520 | if (screen != windowMove->screen()) | 533 | if (screen != windowMove->screen()) | ||
521 | effects->windowToScreen(windowMove, screen); | 534 | effects->windowToScreen(windowMove, screen); | ||
522 | } | 535 | } | ||
523 | effects->addRepaintFull(); | 536 | effects->addRepaintFull(); | ||
524 | } | 537 | } | ||
525 | } else if ((me->buttons() & Qt::LeftButton) && !wasDesktopMove && | 538 | } else if ((me->buttons() & Qt::LeftButton) && !wasDesktopMove && | ||
526 | (me->pos() - dragStartPos).manhattanLength() > QApplication::startDragDistance()) { | 539 | (me->pos() - dragStartPos).manhattanLength() > QApplication::startDragDistance()) { | ||
Show All 17 Lines | 556 | if (w->isOnDesktop(m_originalMovingDesktop)) | |||
544 | stack[2] << w; | 557 | stack[2] << w; | ||
545 | } | 558 | } | ||
546 | const int desks[4] = {highlightedDesktop, d, m_originalMovingDesktop, highlightedDesktop}; | 559 | const int desks[4] = {highlightedDesktop, d, m_originalMovingDesktop, highlightedDesktop}; | ||
547 | for (int i = 0; i < 3; ++i ) { | 560 | for (int i = 0; i < 3; ++i ) { | ||
548 | if (desks[i] == desks[i+1]) | 561 | if (desks[i] == desks[i+1]) | ||
549 | continue; | 562 | continue; | ||
550 | foreach (EffectWindow *w, stack[i]) { | 563 | foreach (EffectWindow *w, stack[i]) { | ||
551 | effects->windowToDesktop(w, desks[i+1]); | 564 | effects->windowToDesktop(w, desks[i+1]); | ||
565 | effects->removeWindowFromDesktop(w, desks[i]); | ||||
566 | | ||||
552 | if (isUsingPresentWindows()) { | 567 | if (isUsingPresentWindows()) { | ||
553 | m_managers[(desks[i]-1)*(effects->numScreens()) + w->screen()].unmanage(w); | 568 | m_managers[(desks[i]-1)*(effects->numScreens()) + w->screen()].unmanage(w); | ||
554 | m_managers[(desks[i+1]-1)*(effects->numScreens()) + w->screen()].manage(w); | 569 | m_managers[(desks[i+1]-1)*(effects->numScreens()) + w->screen()].manage(w); | ||
555 | } | 570 | } | ||
556 | } | 571 | } | ||
557 | } | 572 | } | ||
558 | if (isUsingPresentWindows()) { | 573 | if (isUsingPresentWindows()) { | ||
559 | for (int i = 0; i < effects->numScreens(); i++) { | 574 | for (int i = 0; i < effects->numScreens(); i++) { | ||
560 | for (int j = 0; j < 3; ++j) { | 575 | for (int j = 0; j < 3; ++j) { | ||
561 | WindowMotionManager& manager = m_managers[(desks[j]-1)*(effects->numScreens()) + i ]; | 576 | WindowMotionManager& manager = m_managers[(desks[j]-1)*(effects->numScreens()) + i ]; | ||
562 | m_proxy->calculateWindowTransformations(manager.managedWindows(), i, manager); | 577 | m_proxy->calculateWindowTransformations(manager.managedWindows(), i, manager); | ||
563 | } | 578 | } | ||
564 | } | 579 | } | ||
565 | effects->addRepaintFull(); | 580 | effects->addRepaintFull(); | ||
566 | } | 581 | } | ||
567 | } | 582 | } | ||
568 | setHighlightedDesktop(d); | 583 | setHighlightedDesktop(d); | ||
569 | } | 584 | } | ||
570 | } | 585 | } | ||
571 | if (e->type() == QEvent::MouseButtonPress) { | 586 | if (e->type() == QEvent::MouseButtonPress) { | ||
572 | if (me->buttons() == Qt::LeftButton) { | 587 | if (me->buttons() == Qt::LeftButton) { | ||
573 | isValidMove = true; | 588 | isValidMove = true; | ||
574 | dragStartPos = me->pos(); | 589 | dragStartPos = me->pos(); | ||
575 | bool isDesktop = (me->modifiers() & Qt::ControlModifier); | 590 | sourceDesktop = posToDesktop(me->pos()); | ||
591 | bool isDesktop = (me->modifiers() & Qt::ShiftModifier); | ||||
576 | EffectWindow* w = isDesktop ? NULL : windowAt(me->pos()); | 592 | EffectWindow* w = isDesktop ? NULL : windowAt(me->pos()); | ||
577 | if (w != NULL) | 593 | if (w != NULL) | ||
578 | isDesktop = w->isDesktop(); | 594 | isDesktop = w->isDesktop(); | ||
579 | if (isDesktop) | 595 | if (isDesktop) | ||
580 | m_originalMovingDesktop = posToDesktop(me->pos()); | 596 | m_originalMovingDesktop = posToDesktop(me->pos()); | ||
597 | else | ||||
598 | m_originalMovingDesktop = 0; | ||||
581 | if (w != NULL && !w->isDesktop() && (w->isMovable() || w->isMovableAcrossScreens() || isUsingPresentWindows())) { | 599 | if (w != NULL && !w->isDesktop() && (w->isMovable() || w->isMovableAcrossScreens() || isUsingPresentWindows())) { | ||
582 | // Prepare it for moving | 600 | // Prepare it for moving | ||
583 | windowMoveDiff = w->pos() - unscalePos(me->pos(), NULL); | 601 | windowMoveDiff = w->pos() - unscalePos(me->pos(), NULL); | ||
584 | windowMove = w; | 602 | windowMove = w; | ||
585 | effects->setElevatedWindow(windowMove, true); | 603 | effects->setElevatedWindow(windowMove, true); | ||
586 | } | 604 | } | ||
587 | } else if ((me->buttons() == Qt::MidButton || me->buttons() == Qt::RightButton) && windowMove == NULL) { | 605 | } else if ((me->buttons() == Qt::MidButton || me->buttons() == Qt::RightButton) && windowMove == NULL) { | ||
588 | EffectWindow* w = windowAt(me->pos()); | 606 | EffectWindow* w = windowAt(me->pos()); | ||
589 | if (w && w->isDesktop()) { | 607 | if (w && w->isDesktop()) { | ||
590 | w = nullptr; | 608 | w = nullptr; | ||
591 | } | 609 | } | ||
592 | if (w != NULL) { | 610 | if (w != NULL) { | ||
593 | int desktop = 0; | 611 | const int desktop = posToDesktop(me->pos()); | ||
594 | if (w->isOnAllDesktops()) { | 612 | if (w->isOnAllDesktops()) { | ||
595 | desktop = posToDesktop(me->pos()); | | |||
596 | effects->windowToDesktop(w, desktop); | 613 | effects->windowToDesktop(w, desktop); | ||
597 | } else { | 614 | } else { | ||
598 | desktop = w->desktop(); | | |||
599 | effects->windowToDesktop(w, NET::OnAllDesktops); | 615 | effects->windowToDesktop(w, NET::OnAllDesktops); | ||
600 | } | 616 | } | ||
601 | const bool isOnAllDesktops = w->isOnAllDesktops(); | 617 | const bool isOnAllDesktops = w->isOnAllDesktops(); | ||
602 | if (isUsingPresentWindows()) { | 618 | if (isUsingPresentWindows()) { | ||
603 | for (int i = 0; i < effects->numberOfDesktops(); i++) { | 619 | for (int i = 0; i < effects->numberOfDesktops(); i++) { | ||
604 | if (i != desktop - 1) { | 620 | if (i != desktop - 1) { | ||
605 | WindowMotionManager& manager = m_managers[ i*effects->numScreens() + w->screen()]; | 621 | WindowMotionManager& manager = m_managers[ i*effects->numScreens() + w->screen()]; | ||
606 | if (isOnAllDesktops) | 622 | if (isOnAllDesktops) | ||
Show All 18 Lines | 640 | } else { // click -> exit | |||
625 | const int desk = posToDesktop(me->pos()); | 641 | const int desk = posToDesktop(me->pos()); | ||
626 | if (desk > effects->numberOfDesktops()) | 642 | if (desk > effects->numberOfDesktops()) | ||
627 | return; // don't quit when missing desktop | 643 | return; // don't quit when missing desktop | ||
628 | setCurrentDesktop(desk); | 644 | setCurrentDesktop(desk); | ||
629 | setActive(false); | 645 | setActive(false); | ||
630 | } | 646 | } | ||
631 | if (windowMove) { | 647 | if (windowMove) { | ||
632 | if (wasWindowMove && isUsingPresentWindows()) { | 648 | if (wasWindowMove && isUsingPresentWindows()) { | ||
633 | const int targetDesktop = windowMove->isOnAllDesktops() ? posToDesktop(cursorPos()) : windowMove->desktop(); | 649 | const int targetDesktop = posToDesktop(cursorPos()); | ||
634 | foreach (const int i, desktopList(windowMove)) { | 650 | foreach (const int i, desktopList(windowMove)) { | ||
635 | WindowMotionManager& manager = m_managers[(i)*(effects->numScreens()) + windowMove->screen()]; | 651 | WindowMotionManager& manager = m_managers[(i)*(effects->numScreens()) + windowMove->screen()]; | ||
636 | manager.manage(windowMove); | 652 | manager.manage(windowMove); | ||
637 | if (EffectWindow* modal = windowMove->findModal()) | 653 | if (EffectWindow* modal = windowMove->findModal()) | ||
638 | manager.manage(modal); | 654 | manager.manage(modal); | ||
639 | if (i + 1 == targetDesktop) { | 655 | if (i + 1 == targetDesktop) { | ||
640 | // for the desktop the window is dropped on, we use the current geometry | 656 | // for the desktop the window is dropped on, we use the current geometry | ||
641 | manager.setTransformedGeometry(windowMove, moveGeometryToDesktop(targetDesktop)); | 657 | manager.setTransformedGeometry(windowMove, moveGeometryToDesktop(targetDesktop)); | ||
642 | } | 658 | } | ||
643 | m_proxy->calculateWindowTransformations(manager.managedWindows(), windowMove->screen(), manager); | 659 | m_proxy->calculateWindowTransformations(manager.managedWindows(), windowMove->screen(), manager); | ||
644 | } | 660 | } | ||
645 | effects->addRepaintFull(); | 661 | effects->addRepaintFull(); | ||
646 | } | 662 | } | ||
647 | effects->setElevatedWindow(windowMove, false); | 663 | effects->setElevatedWindow(windowMove, false); | ||
648 | windowMove = NULL; | 664 | windowMove = NULL; | ||
649 | } | 665 | } | ||
650 | wasWindowMove = false; | 666 | wasWindowMove = false; | ||
667 | wasWindowCopy = false; | ||||
651 | wasDesktopMove = false; | 668 | wasDesktopMove = false; | ||
652 | } | 669 | } | ||
653 | } | 670 | } | ||
654 | 671 | | |||
655 | void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e) | 672 | void DesktopGridEffect::grabbedKeyboardEvent(QKeyEvent* e) | ||
656 | { | 673 | { | ||
657 | if (timeline.currentValue() != 1) // Block user input during animations | 674 | if (timeline.currentValue() != 1) // Block user input during animations | ||
658 | return; | 675 | return; | ||
▲ Show 20 Lines • Show All 696 Lines • ▼ Show 20 Line(s) | 1361 | if (isUsingPresentWindows()) { | |||
1355 | } | 1372 | } | ||
1356 | } | 1373 | } | ||
1357 | 1374 | | |||
1358 | setupGrid(); | 1375 | setupGrid(); | ||
1359 | 1376 | | |||
1360 | // and repaint | 1377 | // and repaint | ||
1361 | effects->addRepaintFull(); | 1378 | effects->addRepaintFull(); | ||
1362 | } | 1379 | } | ||
1363 | 1380 | //TODO: kill this function? or at least keep a consistent numeration with desktops starting from 1 | |||
1364 | QVector<int> DesktopGridEffect::desktopList(const EffectWindow *w) const | 1381 | QVector<int> DesktopGridEffect::desktopList(const EffectWindow *w) const | ||
1365 | { | 1382 | { | ||
1366 | if (w->isOnAllDesktops()) { | 1383 | if (w->isOnAllDesktops()) { | ||
1367 | static QVector<int> allDesktops; | 1384 | static QVector<int> allDesktops; | ||
1368 | if (allDesktops.count() != effects->numberOfDesktops()) { | 1385 | if (allDesktops.count() != effects->numberOfDesktops()) { | ||
1369 | allDesktops.resize(effects->numberOfDesktops()); | 1386 | allDesktops.resize(effects->numberOfDesktops()); | ||
1370 | for (int i = 0; i < effects->numberOfDesktops(); ++i) | 1387 | for (int i = 0; i < effects->numberOfDesktops(); ++i) | ||
1371 | allDesktops[i] = i; | 1388 | allDesktops[i] = i; | ||
1372 | } | 1389 | } | ||
1373 | return allDesktops; | 1390 | return allDesktops; | ||
1374 | } | 1391 | } | ||
1375 | 1392 | | |||
1376 | if (w->desktop() > effects->numberOfDesktops() || w->desktop() < 1) { // sic! desktops are [1,n] | 1393 | QVector<int> desks; | ||
1377 | static QVector<int> emptyVector; | 1394 | desks.resize(w->desktops().count()); | ||
1378 | emptyVector.resize(0); | 1395 | int i = 0; | ||
1379 | return emptyVector; | 1396 | for (const int desk : w->desktops()) { | ||
1397 | desks[i++] = desk-1; | ||||
1380 | } | 1398 | } | ||
1381 | 1399 | return desks; | |||
davidedmundson: You don't want this as you're breaking xwayland windows.
We should be porting to just this… | |||||
will use the global operatingmode instead for this and all the places i'm doing a check whether we are running in wayland mart: will use the global operatingmode instead for this and all the places i'm doing a check whether… | |||||
1382 | static QVector<int> singleDesktop; | | |||
1383 | singleDesktop.resize(1); | | |||
1384 | singleDesktop[0] = w->desktop() - 1; | | |||
1385 | return singleDesktop; | | |||
1386 | } | 1400 | } | ||
1387 | 1401 | | |||
1388 | bool DesktopGridEffect::isActive() const | 1402 | bool DesktopGridEffect::isActive() const | ||
1389 | { | 1403 | { | ||
1390 | return (timeline.currentValue() != 0 || activated || (isUsingPresentWindows() && isMotionManagerMovingWindows())) && !effects->isScreenLocked(); | 1404 | return (timeline.currentValue() != 0 || activated || (isUsingPresentWindows() && isMotionManagerMovingWindows())) && !effects->isScreenLocked(); | ||
1391 | } | 1405 | } | ||
1392 | 1406 | | |||
1393 | bool DesktopGridEffect::isRelevantWithPresentWindows(EffectWindow *w) const | 1407 | bool DesktopGridEffect::isRelevantWithPresentWindows(EffectWindow *w) const | ||
▲ Show 20 Lines • Show All 101 Lines • Show Last 20 Lines |
You don't want this as you're breaking xwayland windows.
We should be porting to just this code you've added and doing any wayland/X abstraction in libkwineffects w->plasmasDesktops()