Changeset View
Changeset View
Standalone View
Standalone View
useractions.cpp
Show First 20 Lines • Show All 396 Lines • ▼ Show 20 Line(s) | 255 | { | |||
---|---|---|---|---|---|
397 | m_closeOperation->setData(Options::CloseOp); | 397 | m_closeOperation->setData(Options::CloseOp); | ||
398 | } | 398 | } | ||
399 | 399 | | |||
400 | void UserActionsMenu::discard() | 400 | void UserActionsMenu::discard() | ||
401 | { | 401 | { | ||
402 | delete m_menu; | 402 | delete m_menu; | ||
403 | m_menu = NULL; | 403 | m_menu = NULL; | ||
404 | m_desktopMenu = NULL; | 404 | m_desktopMenu = NULL; | ||
405 | m_multipleDesktopsMenu = nullptr; | ||||
405 | m_screenMenu = NULL; | 406 | m_screenMenu = NULL; | ||
406 | m_activityMenu = NULL; | 407 | m_activityMenu = NULL; | ||
407 | m_switchToTabMenu = NULL; | 408 | m_switchToTabMenu = NULL; | ||
408 | m_addTabsMenu = NULL; | 409 | m_addTabsMenu = NULL; | ||
409 | m_scriptsMenu = NULL; | 410 | m_scriptsMenu = NULL; | ||
410 | } | 411 | } | ||
411 | 412 | | |||
412 | void UserActionsMenu::menuAboutToShow() | 413 | void UserActionsMenu::menuAboutToShow() | ||
413 | { | 414 | { | ||
414 | if (m_client.isNull() || !m_menu) | 415 | if (m_client.isNull() || !m_menu) | ||
415 | return; | 416 | return; | ||
416 | 417 | | |||
417 | if (VirtualDesktopManager::self()->count() == 1) { | 418 | if (VirtualDesktopManager::self()->count() == 1) { | ||
418 | delete m_desktopMenu; | 419 | delete m_desktopMenu; | ||
419 | m_desktopMenu = 0; | 420 | m_desktopMenu = 0; | ||
421 | delete m_multipleDesktopsMenu; | ||||
422 | m_multipleDesktopsMenu = nullptr; | ||||
420 | } else { | 423 | } else { | ||
421 | initDesktopPopup(); | 424 | initDesktopPopup(); | ||
422 | } | 425 | } | ||
423 | if (screens()->count() == 1 || (!m_client.data()->isMovable() && !m_client.data()->isMovableAcrossScreens())) { | 426 | if (screens()->count() == 1 || (!m_client.data()->isMovable() && !m_client.data()->isMovableAcrossScreens())) { | ||
424 | delete m_screenMenu; | 427 | delete m_screenMenu; | ||
425 | m_screenMenu = NULL; | 428 | m_screenMenu = NULL; | ||
426 | } else { | 429 | } else { | ||
427 | initScreenPopup(); | 430 | initScreenPopup(); | ||
▲ Show 20 Lines • Show All 171 Lines • ▼ Show 20 Line(s) | 581 | { | |||
599 | 602 | | |||
600 | m_addTabsMenu->menuAction()->setEnabled(!m_client.data()->isFullScreen()); | 603 | m_addTabsMenu->menuAction()->setEnabled(!m_client.data()->isFullScreen()); | ||
601 | m_removeFromTabGroup->setVisible(needTabManagers); | 604 | m_removeFromTabGroup->setVisible(needTabManagers); | ||
602 | m_closeTabGroup->setVisible(needTabManagers); | 605 | m_closeTabGroup->setVisible(needTabManagers); | ||
603 | } | 606 | } | ||
604 | 607 | | |||
605 | void UserActionsMenu::initDesktopPopup() | 608 | void UserActionsMenu::initDesktopPopup() | ||
606 | { | 609 | { | ||
610 | if (kwinApp()->operationMode() == Application::OperationModeWaylandOnly || | ||||
611 | kwinApp()->operationMode() == Application::OperationModeXwayland) { | ||||
612 | if (m_multipleDesktopsMenu) { | ||||
613 | return; | ||||
614 | } | ||||
615 | | ||||
616 | m_multipleDesktopsMenu = new QMenu(m_menu); | ||||
617 | connect(m_multipleDesktopsMenu, &QMenu::triggered, this, &UserActionsMenu::slotToggleOnVirtualDesktop); | ||||
618 | connect(m_multipleDesktopsMenu, &QMenu::aboutToShow, this, &UserActionsMenu::multipleDesktopsPopupAboutToShow); | ||||
619 | | ||||
620 | QAction *action = m_multipleDesktopsMenu->menuAction(); | ||||
621 | // set it as the first item | ||||
622 | m_menu->insertAction(m_minimizeOperation, action); | ||||
623 | action->setText(i18n("&Desktops")); | ||||
624 | | ||||
625 | } else { | ||||
607 | if (m_desktopMenu) | 626 | if (m_desktopMenu) | ||
608 | return; | 627 | return; | ||
609 | 628 | | |||
610 | m_desktopMenu = new QMenu(m_menu); | 629 | m_desktopMenu = new QMenu(m_menu); | ||
611 | connect(m_desktopMenu, &QMenu::triggered, this, &UserActionsMenu::slotSendToDesktop); | 630 | connect(m_desktopMenu, &QMenu::triggered, this, &UserActionsMenu::slotSendToDesktop); | ||
612 | connect(m_desktopMenu, &QMenu::aboutToShow, this, &UserActionsMenu::desktopPopupAboutToShow); | 631 | connect(m_desktopMenu, &QMenu::aboutToShow, this, &UserActionsMenu::desktopPopupAboutToShow); | ||
613 | 632 | | |||
614 | QAction *action = m_desktopMenu->menuAction(); | 633 | QAction *action = m_desktopMenu->menuAction(); | ||
615 | // set it as the first item | 634 | // set it as the first item | ||
616 | m_menu->insertAction(m_minimizeOperation, action); | 635 | m_menu->insertAction(m_minimizeOperation, action); | ||
617 | action->setText(i18n("Move To &Desktop")); | 636 | action->setText(i18n("Move To &Desktop")); | ||
618 | } | 637 | } | ||
638 | } | ||||
619 | 639 | | |||
620 | void UserActionsMenu::initScreenPopup() | 640 | void UserActionsMenu::initScreenPopup() | ||
621 | { | 641 | { | ||
622 | if (m_screenMenu) { | 642 | if (m_screenMenu) { | ||
623 | return; | 643 | return; | ||
624 | } | 644 | } | ||
625 | 645 | | |||
626 | m_screenMenu = new QMenu(m_menu); | 646 | m_screenMenu = new QMenu(m_menu); | ||
Show All 35 Lines | 672 | { | |||
662 | action->setCheckable(true); | 682 | action->setCheckable(true); | ||
663 | group->addAction(action); | 683 | group->addAction(action); | ||
664 | 684 | | |||
665 | if (!m_client.isNull() && m_client.data()->isOnAllDesktops()) | 685 | if (!m_client.isNull() && m_client.data()->isOnAllDesktops()) | ||
666 | action->setChecked(true); | 686 | action->setChecked(true); | ||
667 | m_desktopMenu->addSeparator(); | 687 | m_desktopMenu->addSeparator(); | ||
668 | 688 | | |||
669 | const uint BASE = 10; | 689 | const uint BASE = 10; | ||
690 | | ||||
670 | for (uint i = 1; i <= vds->count(); ++i) { | 691 | for (uint i = 1; i <= vds->count(); ++i) { | ||
671 | QString basic_name(QStringLiteral("%1 %2")); | 692 | QString basic_name(QStringLiteral("%1 %2")); | ||
672 | if (i < BASE) { | 693 | if (i < BASE) { | ||
673 | basic_name.prepend(QLatin1Char('&')); | 694 | basic_name.prepend(QLatin1Char('&')); | ||
674 | } | 695 | } | ||
675 | action = m_desktopMenu->addAction(basic_name.arg(i).arg(vds->name(i).replace(QLatin1Char('&'), QStringLiteral("&&")))); | 696 | action = m_desktopMenu->addAction(basic_name.arg(i).arg(vds->name(i).replace(QLatin1Char('&'), QStringLiteral("&&")))); | ||
676 | action->setData(i); | 697 | action->setData(i); | ||
677 | action->setCheckable(true); | 698 | action->setCheckable(true); | ||
678 | group->addAction(action); | 699 | group->addAction(action); | ||
679 | 700 | | |||
680 | if (!m_client.isNull() && | 701 | if (!m_client.isNull() && | ||
681 | !m_client.data()->isOnAllDesktops() && m_client.data()->isOnDesktop(i)) | 702 | !m_client.data()->isOnAllDesktops() && m_client.data()->isOnDesktop(i)) | ||
682 | action->setChecked(true); | 703 | action->setChecked(true); | ||
683 | } | 704 | } | ||
684 | 705 | | |||
685 | m_desktopMenu->addSeparator(); | 706 | m_desktopMenu->addSeparator(); | ||
686 | action = m_desktopMenu->addAction(i18nc("Create a new desktop and move there the window", "&New Desktop")); | 707 | action = m_desktopMenu->addAction(i18nc("Create a new desktop and move there the window", "&New Desktop")); | ||
687 | action->setData(vds->count() + 1); | 708 | action->setData(vds->count() + 1); | ||
688 | 709 | | |||
689 | if (vds->count() >= vds->maximum()) | 710 | if (vds->count() >= vds->maximum()) | ||
690 | action->setEnabled(false); | 711 | action->setEnabled(false); | ||
691 | } | 712 | } | ||
692 | 713 | | |||
714 | void UserActionsMenu::multipleDesktopsPopupAboutToShow() | ||||
715 | { | ||||
716 | if (!m_multipleDesktopsMenu) | ||||
717 | return; | ||||
718 | const VirtualDesktopManager *vds = VirtualDesktopManager::self(); | ||||
719 | | ||||
720 | m_multipleDesktopsMenu->clear(); | ||||
721 | m_multipleDesktopsMenu->setPalette(m_client.data()->palette()); | ||||
722 | QAction *action = m_multipleDesktopsMenu->addAction(i18n("&All Desktops")); | ||||
723 | action->setData(0); | ||||
724 | action->setCheckable(true); | ||||
725 | QActionGroup *allDesktopsGroup = new QActionGroup(m_multipleDesktopsMenu); | ||||
726 | allDesktopsGroup->addAction(action); | ||||
727 | | ||||
728 | if (!m_client.isNull() && m_client.data()->isOnAllDesktops()) { | ||||
729 | action->setChecked(true); | ||||
730 | } | ||||
731 | m_multipleDesktopsMenu->addSeparator(); | ||||
732 | | ||||
733 | | ||||
734 | const uint BASE = 10; | ||||
735 | | ||||
736 | for (uint i = 1; i <= vds->count(); ++i) { | ||||
737 | QString basic_name(QStringLiteral("%1 %2")); | ||||
738 | if (i < BASE) { | ||||
739 | basic_name.prepend(QLatin1Char('&')); | ||||
740 | } | ||||
741 | QWidgetAction *action = new QWidgetAction(m_multipleDesktopsMenu); | ||||
742 | QCheckBox *box = new QCheckBox(basic_name.arg(i).arg(vds->name(i).replace(QLatin1Char('&'), QStringLiteral("&&"))), m_multipleDesktopsMenu); | ||||
743 | action->setDefaultWidget(box); | ||||
744 | | ||||
745 | box->setBackgroundRole(m_multipleDesktopsMenu->backgroundRole()); | ||||
746 | box->setForegroundRole(m_multipleDesktopsMenu->foregroundRole()); | ||||
747 | box->setPalette(m_multipleDesktopsMenu->palette()); | ||||
748 | connect(box, &QCheckBox::clicked, action, &QAction::triggered); | ||||
749 | m_multipleDesktopsMenu->addAction(action); | ||||
750 | action->setData(i); | ||||
751 | | ||||
752 | if (!m_client.isNull() && | ||||
753 | !m_client.data()->isOnAllDesktops() && m_client.data()->isOnDesktop(i)) { | ||||
754 | box->setChecked(true); | ||||
755 | } | ||||
756 | } | ||||
757 | | ||||
758 | m_multipleDesktopsMenu->addSeparator(); | ||||
759 | action = m_multipleDesktopsMenu->addAction(i18nc("Create a new desktop and move there the window", "&New Desktop")); | ||||
760 | action->setData(vds->count() + 1); | ||||
761 | | ||||
762 | if (vds->count() >= vds->maximum()) | ||||
763 | action->setEnabled(false); | ||||
764 | } | ||||
765 | | ||||
693 | void UserActionsMenu::screenPopupAboutToShow() | 766 | void UserActionsMenu::screenPopupAboutToShow() | ||
694 | { | 767 | { | ||
695 | if (!m_screenMenu) { | 768 | if (!m_screenMenu) { | ||
696 | return; | 769 | return; | ||
697 | } | 770 | } | ||
698 | 771 | | |||
699 | m_screenMenu->clear(); | 772 | m_screenMenu->clear(); | ||
700 | m_screenMenu->setPalette(m_client.data()->palette()); | 773 | m_screenMenu->setPalette(m_client.data()->palette()); | ||
▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Line(s) | 881 | if (desk == 0) { | |||
811 | return; | 884 | return; | ||
812 | } else if (desk > vds->count()) { | 885 | } else if (desk > vds->count()) { | ||
813 | vds->setCount(desk); | 886 | vds->setCount(desk); | ||
814 | } | 887 | } | ||
815 | 888 | | |||
816 | ws->sendClientToDesktop(m_client.data(), desk, false); | 889 | ws->sendClientToDesktop(m_client.data(), desk, false); | ||
817 | } | 890 | } | ||
818 | 891 | | |||
892 | void UserActionsMenu::slotToggleOnVirtualDesktop(QAction *action) | ||||
893 | { | ||||
894 | bool ok = false; | ||||
895 | uint desk = action->data().toUInt(&ok); | ||||
896 | if (!ok) { | ||||
897 | return; | ||||
898 | } | ||||
899 | if (m_client.isNull()) { | ||||
900 | return; | ||||
901 | } | ||||
902 | | ||||
903 | Workspace *ws = Workspace::self(); | ||||
904 | VirtualDesktopManager *vds = VirtualDesktopManager::self(); | ||||
905 | if (desk == 0) { | ||||
906 | // the 'on_all_desktops' menu entry | ||||
907 | m_client.data()->setOnAllDesktops(!m_client.data()->isOnAllDesktops()); | ||||
908 | return; | ||||
909 | } else if (desk > vds->count()) { | ||||
910 | vds->setCount(desk); | ||||
911 | } | ||||
912 | | ||||
913 | VirtualDesktop *virtualDesktop = VirtualDesktopManager::self()->desktopForX11Id(desk); | ||||
914 | if (m_client.data()->desktops().contains(virtualDesktop)) { | ||||
915 | m_client.data()->unSetDesktop(desk); | ||||
916 | } else { | ||||
917 | ws->sendClientToDesktop(m_client.data(), desk, false); | ||||
918 | } | ||||
919 | } | ||||
920 | | ||||
819 | void UserActionsMenu::slotSendToScreen(QAction *action) | 921 | void UserActionsMenu::slotSendToScreen(QAction *action) | ||
820 | { | 922 | { | ||
821 | const int screen = action->data().toInt(); | 923 | const int screen = action->data().toInt(); | ||
822 | if (m_client.isNull()) { | 924 | if (m_client.isNull()) { | ||
823 | return; | 925 | return; | ||
824 | } | 926 | } | ||
825 | if (screen >= screens()->count()) { | 927 | if (screen >= screens()->count()) { | ||
826 | return; | 928 | return; | ||
▲ Show 20 Lines • Show All 1003 Lines • Show Last 20 Lines |