Changeset View
Changeset View
Standalone View
Standalone View
useractions.cpp
Show First 20 Lines • Show All 77 Lines • ▼ Show 20 Line(s) | |||||
78 | { | 78 | { | ||
79 | 79 | | |||
80 | UserActionsMenu::UserActionsMenu(QObject *parent) | 80 | UserActionsMenu::UserActionsMenu(QObject *parent) | ||
81 | : QObject(parent) | 81 | : QObject(parent) | ||
82 | , m_menu(NULL) | 82 | , m_menu(NULL) | ||
83 | , m_desktopMenu(NULL) | 83 | , m_desktopMenu(NULL) | ||
84 | , m_screenMenu(NULL) | 84 | , m_screenMenu(NULL) | ||
85 | , m_activityMenu(NULL) | 85 | , m_activityMenu(NULL) | ||
86 | , m_addTabsMenu(NULL) | | |||
87 | , m_switchToTabMenu(NULL) | | |||
88 | , m_scriptsMenu(NULL) | 86 | , m_scriptsMenu(NULL) | ||
89 | , m_resizeOperation(NULL) | 87 | , m_resizeOperation(NULL) | ||
90 | , m_moveOperation(NULL) | 88 | , m_moveOperation(NULL) | ||
91 | , m_maximizeOperation(NULL) | 89 | , m_maximizeOperation(NULL) | ||
92 | , m_shadeOperation(NULL) | 90 | , m_shadeOperation(NULL) | ||
93 | , m_keepAboveOperation(NULL) | 91 | , m_keepAboveOperation(NULL) | ||
94 | , m_keepBelowOperation(NULL) | 92 | , m_keepBelowOperation(NULL) | ||
95 | , m_fullScreenOperation(NULL) | 93 | , m_fullScreenOperation(NULL) | ||
96 | , m_noBorderOperation(NULL) | 94 | , m_noBorderOperation(NULL) | ||
97 | , m_minimizeOperation(NULL) | 95 | , m_minimizeOperation(NULL) | ||
98 | , m_closeOperation(NULL) | 96 | , m_closeOperation(NULL) | ||
99 | , m_removeFromTabGroup(NULL) | | |||
100 | , m_closeTabGroup(NULL) | | |||
101 | { | 97 | { | ||
102 | } | 98 | } | ||
103 | 99 | | |||
104 | UserActionsMenu::~UserActionsMenu() | 100 | UserActionsMenu::~UserActionsMenu() | ||
105 | { | 101 | { | ||
106 | discard(); | 102 | discard(); | ||
107 | } | 103 | } | ||
108 | 104 | | |||
▲ Show 20 Lines • Show All 240 Lines • ▼ Show 20 Line(s) | 230 | { | |||
349 | m_maximizeOperation->setCheckable(true); | 345 | m_maximizeOperation->setCheckable(true); | ||
350 | m_maximizeOperation->setData(Options::MaximizeOp); | 346 | m_maximizeOperation->setData(Options::MaximizeOp); | ||
351 | 347 | | |||
352 | m_minimizeOperation = m_menu->addAction(i18n("Mi&nimize")); | 348 | m_minimizeOperation = m_menu->addAction(i18n("Mi&nimize")); | ||
353 | m_minimizeOperation->setIcon(QIcon::fromTheme(QStringLiteral("window-minimize"))); | 349 | m_minimizeOperation->setIcon(QIcon::fromTheme(QStringLiteral("window-minimize"))); | ||
354 | setShortcut(m_minimizeOperation, QStringLiteral("Window Minimize")); | 350 | setShortcut(m_minimizeOperation, QStringLiteral("Window Minimize")); | ||
355 | m_minimizeOperation->setData(Options::MinimizeOp); | 351 | m_minimizeOperation->setData(Options::MinimizeOp); | ||
356 | 352 | | |||
357 | // Actions for window tabbing | | |||
358 | if (false) { | | |||
359 | m_removeFromTabGroup = m_menu->addAction(i18n("&Untab")); | | |||
360 | setShortcut(m_removeFromTabGroup, QStringLiteral("Untab")); | | |||
361 | m_removeFromTabGroup->setData(Options::RemoveTabFromGroupOp); | | |||
362 | | ||||
363 | m_closeTabGroup = m_menu->addAction(i18n("Close Entire &Group")); | | |||
364 | m_closeTabGroup->setIcon(QIcon::fromTheme(QStringLiteral("window-close"))); | | |||
365 | setShortcut(m_closeTabGroup, QStringLiteral("Close TabGroup")); | | |||
366 | m_closeTabGroup->setData(Options::CloseTabGroupOp); | | |||
367 | | ||||
368 | m_menu->addSeparator(); | | |||
369 | } | | |||
370 | | ||||
371 | action = m_menu->addMenu(advancedMenu); | 353 | action = m_menu->addMenu(advancedMenu); | ||
372 | action->setText(i18n("&More Actions")); | 354 | action->setText(i18n("&More Actions")); | ||
373 | action->setIcon(QIcon::fromTheme(QStringLiteral("view-more-symbolic"))); | 355 | action->setIcon(QIcon::fromTheme(QStringLiteral("view-more-symbolic"))); | ||
374 | 356 | | |||
375 | m_closeOperation = m_menu->addAction(i18n("&Close")); | 357 | m_closeOperation = m_menu->addAction(i18n("&Close")); | ||
376 | m_closeOperation->setIcon(QIcon::fromTheme(QStringLiteral("window-close"))); | 358 | m_closeOperation->setIcon(QIcon::fromTheme(QStringLiteral("window-close"))); | ||
377 | setShortcut(m_closeOperation, QStringLiteral("Window Close")); | 359 | setShortcut(m_closeOperation, QStringLiteral("Window Close")); | ||
378 | m_closeOperation->setData(Options::CloseOp); | 360 | m_closeOperation->setData(Options::CloseOp); | ||
379 | } | 361 | } | ||
380 | 362 | | |||
381 | void UserActionsMenu::discard() | 363 | void UserActionsMenu::discard() | ||
382 | { | 364 | { | ||
383 | delete m_menu; | 365 | delete m_menu; | ||
384 | m_menu = NULL; | 366 | m_menu = NULL; | ||
385 | m_desktopMenu = NULL; | 367 | m_desktopMenu = NULL; | ||
386 | m_multipleDesktopsMenu = nullptr; | 368 | m_multipleDesktopsMenu = nullptr; | ||
387 | m_screenMenu = NULL; | 369 | m_screenMenu = NULL; | ||
388 | m_activityMenu = NULL; | 370 | m_activityMenu = NULL; | ||
389 | m_switchToTabMenu = NULL; | | |||
390 | m_addTabsMenu = NULL; | | |||
391 | m_scriptsMenu = NULL; | 371 | m_scriptsMenu = NULL; | ||
392 | } | 372 | } | ||
393 | 373 | | |||
394 | void UserActionsMenu::menuAboutToShow() | 374 | void UserActionsMenu::menuAboutToShow() | ||
395 | { | 375 | { | ||
396 | if (m_client.isNull() || !m_menu) | 376 | if (m_client.isNull() || !m_menu) | ||
397 | return; | 377 | return; | ||
398 | 378 | | |||
Show All 24 Lines | |||||
423 | m_fullScreenOperation->setEnabled(m_client->userCanSetFullScreen()); | 403 | m_fullScreenOperation->setEnabled(m_client->userCanSetFullScreen()); | ||
424 | m_fullScreenOperation->setChecked(m_client->isFullScreen()); | 404 | m_fullScreenOperation->setChecked(m_client->isFullScreen()); | ||
425 | m_noBorderOperation->setEnabled(m_client->userCanSetNoBorder()); | 405 | m_noBorderOperation->setEnabled(m_client->userCanSetNoBorder()); | ||
426 | m_noBorderOperation->setChecked(m_client->noBorder()); | 406 | m_noBorderOperation->setChecked(m_client->noBorder()); | ||
427 | m_minimizeOperation->setEnabled(m_client->isMinimizable()); | 407 | m_minimizeOperation->setEnabled(m_client->isMinimizable()); | ||
428 | m_closeOperation->setEnabled(m_client->isCloseable()); | 408 | m_closeOperation->setEnabled(m_client->isCloseable()); | ||
429 | m_shortcutOperation->setEnabled(m_client->rules()->checkShortcut(QString()).isNull()); | 409 | m_shortcutOperation->setEnabled(m_client->rules()->checkShortcut(QString()).isNull()); | ||
430 | 410 | | |||
431 | if (false) { | | |||
432 | initTabbingPopups(); | | |||
433 | m_addTabsMenu->setPalette(m_client->palette()); | | |||
434 | } else { | | |||
435 | delete m_addTabsMenu; | | |||
436 | m_addTabsMenu = 0; | | |||
437 | } | | |||
438 | | ||||
439 | // drop the existing scripts menu | 411 | // drop the existing scripts menu | ||
440 | delete m_scriptsMenu; | 412 | delete m_scriptsMenu; | ||
441 | m_scriptsMenu = NULL; | 413 | m_scriptsMenu = nullptr; | ||
zzag: We'll switch to nullptr in one go. See D23618. Revert this unrelated change. | |||||
442 | // ask scripts whether they want to add entries for the given Client | 414 | // ask scripts whether they want to add entries for the given Client | ||
443 | QList<QAction*> scriptActions = Scripting::self()->actionsForUserActionMenu(m_client.data(), m_scriptsMenu); | 415 | QList<QAction*> scriptActions = Scripting::self()->actionsForUserActionMenu(m_client.data(), m_scriptsMenu); | ||
444 | if (!scriptActions.isEmpty()) { | 416 | if (!scriptActions.isEmpty()) { | ||
445 | m_scriptsMenu = new QMenu(m_menu); | 417 | m_scriptsMenu = new QMenu(m_menu); | ||
446 | m_scriptsMenu->setPalette(m_client->palette()); | 418 | m_scriptsMenu->setPalette(m_client->palette()); | ||
447 | m_scriptsMenu->addActions(scriptActions); | 419 | m_scriptsMenu->addActions(scriptActions); | ||
448 | 420 | | |||
449 | QAction *action = m_scriptsMenu->menuAction(); | 421 | QAction *action = m_scriptsMenu->menuAction(); | ||
Show All 20 Lines | 441 | if (openActivities_.size() < 2) { | |||
470 | delete m_activityMenu; | 442 | delete m_activityMenu; | ||
471 | m_activityMenu = 0; | 443 | m_activityMenu = 0; | ||
472 | } else { | 444 | } else { | ||
473 | initActivityPopup(); | 445 | initActivityPopup(); | ||
474 | } | 446 | } | ||
475 | #endif | 447 | #endif | ||
476 | } | 448 | } | ||
477 | 449 | | |||
478 | void UserActionsMenu::selectPopupClientTab(QAction* action) | | |||
479 | { | | |||
480 | if (!m_client || !m_client->tabGroup() || !action->data().isValid()) { | | |||
481 | return; | | |||
482 | } | | |||
483 | | ||||
484 | if (AbstractClient *other = action->data().value<AbstractClient*>()) { | | |||
485 | m_client->tabGroup()->setCurrent(other); | | |||
486 | return; | | |||
487 | } | | |||
488 | | ||||
489 | // failed conversion, try "1" & "2", being prev and next | | |||
490 | int direction = action->data().toInt(); | | |||
491 | if (direction == 1) { | | |||
492 | m_client->tabGroup()->activatePrev(); | | |||
493 | } else if (direction == 2) { | | |||
494 | m_client->tabGroup()->activateNext(); | | |||
495 | } | | |||
496 | } | | |||
497 | | ||||
498 | static QString shortCaption(const QString &s) | | |||
499 | { | | |||
500 | if (s.length() < 64) | | |||
501 | return s; | | |||
502 | QString ss = s; | | |||
503 | return ss.replace(32,s.length()-64, QStringLiteral("...")); | | |||
504 | } | | |||
505 | | ||||
506 | void UserActionsMenu::rebuildTabListPopup() | | |||
507 | { | | |||
508 | Q_ASSERT(m_switchToTabMenu); | | |||
509 | | ||||
510 | m_switchToTabMenu->clear(); | | |||
511 | // whatever happens "0x1" and "0x2" are no heap positions ;-) | | |||
512 | m_switchToTabMenu->addAction(i18nc("Switch to tab -> Previous", "Previous"))->setData(1); | | |||
513 | m_switchToTabMenu->addAction(i18nc("Switch to tab -> Next", "Next"))->setData(2); | | |||
514 | | ||||
515 | m_switchToTabMenu->addSeparator(); | | |||
516 | | ||||
517 | if (!m_client) { | | |||
518 | return; | | |||
519 | } | | |||
520 | for (auto i = m_client->tabGroup()->clients().constBegin(), | | |||
521 | end = m_client->tabGroup()->clients().constEnd(); i != end; ++i) { | | |||
522 | if ((*i)->noBorder() || *i == m_client->tabGroup()->current()) | | |||
523 | continue; // cannot tab there anyway | | |||
524 | m_switchToTabMenu->addAction(shortCaption((*i)->caption()))->setData(QVariant::fromValue(*i)); | | |||
525 | } | | |||
526 | } | | |||
527 | | ||||
528 | void UserActionsMenu::entabPopupClient(QAction* action) | | |||
529 | { | | |||
530 | if (m_client.isNull() || !action->data().isValid()) { | | |||
531 | return; | | |||
532 | } | | |||
533 | AbstractClient *other = action->data().value<AbstractClient*>(); | | |||
534 | if (!Workspace::self()->allClientList().contains(other)) { // might have been lost betwenn pop-up and selection | | |||
535 | return; | | |||
536 | } | | |||
537 | | ||||
538 | m_client->tabBehind(other, true); | | |||
539 | if (options->focusPolicyIsReasonable()) { | | |||
540 | Workspace::self()->requestFocus(m_client); | | |||
541 | } | | |||
542 | } | | |||
543 | | ||||
544 | void UserActionsMenu::rebuildTabGroupPopup() | | |||
545 | { | | |||
546 | Q_ASSERT(m_addTabsMenu); | | |||
547 | | ||||
548 | m_addTabsMenu->clear(); | | |||
549 | const auto &clientList = Workspace::self()->allClientList(); | | |||
550 | for (auto i = clientList.constBegin(), end = clientList.constEnd(); i != end; ++i) { | | |||
551 | if (*i == m_client.data() || (*i)->noBorder()) | | |||
552 | continue; | | |||
553 | m_addTabsMenu->addAction(shortCaption((*i)->caption()))->setData(QVariant::fromValue(*i)); | | |||
554 | } | | |||
555 | if (m_addTabsMenu->actions().isEmpty()) | | |||
556 | m_addTabsMenu->addAction(i18nc("There's no window available to be attached as tab to this one", "None available"))->setEnabled(false); | | |||
557 | } | | |||
558 | | ||||
559 | void UserActionsMenu::initTabbingPopups() | | |||
560 | { | | |||
561 | bool needTabManagers = false; | | |||
562 | Q_ASSERT(m_client); | | |||
563 | if (!m_client) | | |||
564 | return; | | |||
565 | if (m_client->tabGroup() && m_client->tabGroup()->count() > 1) { | | |||
566 | needTabManagers = true; | | |||
567 | if (!m_switchToTabMenu) { | | |||
568 | m_switchToTabMenu = new QMenu(i18n("Switch to Tab"), m_menu); | | |||
569 | connect(m_switchToTabMenu, &QMenu::triggered, this, &UserActionsMenu::selectPopupClientTab); | | |||
570 | connect(m_switchToTabMenu, &QMenu::aboutToShow, this, &UserActionsMenu::rebuildTabListPopup); | | |||
571 | m_menu->insertMenu(m_removeFromTabGroup, m_switchToTabMenu); | | |||
572 | } | | |||
573 | } else { | | |||
574 | delete m_switchToTabMenu; | | |||
575 | m_switchToTabMenu = 0; | | |||
576 | } | | |||
577 | | ||||
578 | if (!m_addTabsMenu) { | | |||
579 | m_addTabsMenu = new QMenu(i18n("&Attach as tab to"), m_menu); | | |||
580 | connect(m_addTabsMenu, &QMenu::triggered, this, &UserActionsMenu::entabPopupClient); | | |||
581 | connect(m_addTabsMenu, &QMenu::aboutToShow, this, &UserActionsMenu::rebuildTabGroupPopup); | | |||
582 | m_menu->insertMenu(m_removeFromTabGroup, m_addTabsMenu); | | |||
583 | } | | |||
584 | | ||||
585 | m_addTabsMenu->menuAction()->setEnabled(!m_client->isFullScreen()); | | |||
586 | m_removeFromTabGroup->setVisible(needTabManagers); | | |||
587 | m_closeTabGroup->setVisible(needTabManagers); | | |||
588 | } | | |||
589 | | ||||
590 | void UserActionsMenu::initDesktopPopup() | 450 | void UserActionsMenu::initDesktopPopup() | ||
591 | { | 451 | { | ||
592 | if (kwinApp()->operationMode() == Application::OperationModeWaylandOnly || | 452 | if (kwinApp()->operationMode() == Application::OperationModeWaylandOnly || | ||
593 | kwinApp()->operationMode() == Application::OperationModeXwayland) { | 453 | kwinApp()->operationMode() == Application::OperationModeXwayland) { | ||
594 | if (m_multipleDesktopsMenu) { | 454 | if (m_multipleDesktopsMenu) { | ||
595 | return; | 455 | return; | ||
596 | } | 456 | } | ||
597 | 457 | | |||
▲ Show 20 Lines • Show All 667 Lines • ▼ Show 20 Line(s) | 1124 | case Options::ApplicationRulesOp: | |||
1265 | RuleBook::self()->edit(c, true); | 1125 | RuleBook::self()->edit(c, true); | ||
1266 | break; | 1126 | break; | ||
1267 | case Options::SetupWindowShortcutOp: | 1127 | case Options::SetupWindowShortcutOp: | ||
1268 | setupWindowShortcut(c); | 1128 | setupWindowShortcut(c); | ||
1269 | break; | 1129 | break; | ||
1270 | case Options::LowerOp: | 1130 | case Options::LowerOp: | ||
1271 | lowerClient(c); | 1131 | lowerClient(c); | ||
1272 | break; | 1132 | break; | ||
1273 | case Options::TabDragOp: // Handled by decoration itself | | |||
1274 | case Options::NoOp: | 1133 | case Options::NoOp: | ||
1275 | break; | 1134 | break; | ||
1276 | case Options::RemoveTabFromGroupOp: | | |||
1277 | if (c->untab(c->geometry().translated(cascadeOffset(c))) && options->focusPolicyIsReasonable()) | | |||
1278 | takeActivity(c, ActivityFocus | ActivityRaise); | | |||
1279 | break; | | |||
1280 | case Options::ActivateNextTabOp: | | |||
1281 | if (c->tabGroup()) | | |||
1282 | c->tabGroup()->activateNext(); | | |||
1283 | break; | | |||
1284 | case Options::ActivatePreviousTabOp: | | |||
1285 | if (c->tabGroup()) | | |||
1286 | c->tabGroup()->activatePrev(); | | |||
1287 | break; | | |||
1288 | case Options::CloseTabGroupOp: | | |||
1289 | c->tabGroup()->closeAll(); | | |||
1290 | break; | | |||
1291 | } | 1135 | } | ||
1292 | } | 1136 | } | ||
1293 | 1137 | | |||
1294 | /** | 1138 | /** | ||
1295 | * Called by the decoration in the new API to determine what buttons the user has configured for | 1139 | * Called by the decoration in the new API to determine what buttons the user has configured for | ||
1296 | * window tab dragging and the operations menu. | 1140 | * window tab dragging and the operations menu. | ||
1297 | */ | 1141 | */ | ||
1298 | Options::WindowOperation Client::mouseButtonToWindowOperation(Qt::MouseButtons button) | 1142 | Options::WindowOperation Client::mouseButtonToWindowOperation(Qt::MouseButtons button) | ||
1299 | { | 1143 | { | ||
1300 | Options::MouseCommand com = Options::MouseNothing; | 1144 | Options::MouseCommand com = Options::MouseNothing; | ||
1301 | bool active = isActive(); | 1145 | bool active = isActive(); | ||
1302 | if (!wantsInput()) // we cannot be active, use it anyway | 1146 | if (!wantsInput()) // we cannot be active, use it anyway | ||
1303 | active = true; | 1147 | active = true; | ||
1304 | 1148 | | |||
1305 | if (button == Qt::LeftButton) | 1149 | if (button == Qt::LeftButton) | ||
1306 | com = active ? options->commandActiveTitlebar1() : options->commandInactiveTitlebar1(); | 1150 | com = active ? options->commandActiveTitlebar1() : options->commandInactiveTitlebar1(); | ||
1307 | else if (button == Qt::MidButton) | 1151 | else if (button == Qt::MidButton) | ||
1308 | com = active ? options->commandActiveTitlebar2() : options->commandInactiveTitlebar2(); | 1152 | com = active ? options->commandActiveTitlebar2() : options->commandInactiveTitlebar2(); | ||
1309 | else if (button == Qt::RightButton) | 1153 | else if (button == Qt::RightButton) | ||
1310 | com = active ? options->commandActiveTitlebar3() : options->commandInactiveTitlebar3(); | 1154 | com = active ? options->commandActiveTitlebar3() : options->commandInactiveTitlebar3(); | ||
1311 | 1155 | | |||
1312 | // TODO: Complete the list | | |||
1313 | if (com == Options::MouseDragTab) | | |||
1314 | return Options::TabDragOp; | | |||
1315 | if (com == Options::MouseOperationsMenu) | 1156 | if (com == Options::MouseOperationsMenu) | ||
1316 | return Options::OperationsOp; | 1157 | return Options::OperationsOp; | ||
1317 | return Options::NoOp; | 1158 | return Options::NoOp; | ||
1318 | } | 1159 | } | ||
1319 | 1160 | | |||
1320 | /** | 1161 | /** | ||
1321 | * Performs a mouse command on this client (see options.h) | 1162 | * Performs a mouse command on this client (see options.h) | ||
1322 | */ | 1163 | */ | ||
▲ Show 20 Lines • Show All 319 Lines • ▼ Show 20 Line(s) | |||||
1642 | 1483 | | |||
1643 | void Workspace::slotWindowToDesktopDown() | 1484 | void Workspace::slotWindowToDesktopDown() | ||
1644 | { | 1485 | { | ||
1645 | if (USABLE_ACTIVE_CLIENT) { | 1486 | if (USABLE_ACTIVE_CLIENT) { | ||
1646 | activeClientToDesktop<DesktopBelow>(); | 1487 | activeClientToDesktop<DesktopBelow>(); | ||
1647 | } | 1488 | } | ||
1648 | } | 1489 | } | ||
1649 | 1490 | | |||
1650 | void Workspace::slotActivateNextTab() | | |||
1651 | { | | |||
1652 | if (active_client && active_client->tabGroup()) | | |||
1653 | active_client->tabGroup()->activateNext(); | | |||
1654 | } | | |||
1655 | | ||||
1656 | void Workspace::slotActivatePrevTab() | | |||
1657 | { | | |||
1658 | if (active_client && active_client->tabGroup()) | | |||
1659 | active_client->tabGroup()->activatePrev(); | | |||
1660 | } | | |||
1661 | | ||||
1662 | void Workspace::slotUntab() | | |||
1663 | { | | |||
1664 | if (active_client) | | |||
1665 | active_client->untab(active_client->geometry().translated(cascadeOffset(active_client))); | | |||
1666 | } | | |||
1667 | | ||||
1668 | /** | 1491 | /** | ||
1669 | * Kill Window feature, similar to xkill. | 1492 | * Kill Window feature, similar to xkill. | ||
1670 | */ | 1493 | */ | ||
1671 | void Workspace::slotKillWindow() | 1494 | void Workspace::slotKillWindow() | ||
1672 | { | 1495 | { | ||
1673 | if (m_windowKiller.isNull()) { | 1496 | if (m_windowKiller.isNull()) { | ||
1674 | m_windowKiller.reset(new KillWindow()); | 1497 | m_windowKiller.reset(new KillWindow()); | ||
1675 | } | 1498 | } | ||
▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Line(s) | 1577 | if (distance > 0) { | |||
1757 | if (score < bestScore || !switchTo) { | 1580 | if (score < bestScore || !switchTo) { | ||
1758 | switchTo = client; | 1581 | switchTo = client; | ||
1759 | bestScore = score; | 1582 | bestScore = score; | ||
1760 | } | 1583 | } | ||
1761 | } | 1584 | } | ||
1762 | } | 1585 | } | ||
1763 | } | 1586 | } | ||
1764 | if (switchTo) { | 1587 | if (switchTo) { | ||
1765 | if (switchTo->tabGroup()) | | |||
1766 | switchTo = switchTo->tabGroup()->current(); | | |||
1767 | activateClient(switchTo); | 1588 | activateClient(switchTo); | ||
1768 | } | 1589 | } | ||
1769 | 1590 | | |||
1770 | return switchTo; | 1591 | return switchTo; | ||
1771 | } | 1592 | } | ||
1772 | 1593 | | |||
1773 | /** | 1594 | /** | ||
1774 | * Shows the window operations popup menu for the active client. | 1595 | * Shows the window operations popup menu for the active client. | ||
▲ Show 20 Lines • Show All 155 Lines • Show Last 20 Lines |
We'll switch to nullptr in one go. See D23618. Revert this unrelated change.