128
127
return c == m_client.data();
131
void UserActionsMenu::show(const QRect &pos, const QWeakPointer<Client> &cl)
130
void UserActionsMenu::show(const QRect &pos, const QWeakPointer<AbstractClient> &cl)
133
132
if (!KAuthorized::authorizeKAction(QStringLiteral("kwin_rmb")))
289
288
advancedMenu->addSeparator();
291
QAction *action = advancedMenu->addAction(i18n("Window &Shortcut..."));
292
action->setIcon(QIcon::fromTheme(QStringLiteral("configure-shortcuts")));
293
setShortcut(action, QStringLiteral("Setup Window Shortcut"));
294
action->setData(Options::SetupWindowShortcutOp);
290
m_shortcutOperation = advancedMenu->addAction(i18n("Window &Shortcut..."));
291
m_shortcutOperation->setIcon(QIcon::fromTheme(QStringLiteral("configure-shortcuts")));
292
setShortcut(m_shortcutOperation, QStringLiteral("Setup Window Shortcut"));
293
m_shortcutOperation->setData(Options::SetupWindowShortcutOp);
296
action = advancedMenu->addAction(i18n("&Special Window Settings..."));
295
QAction *action = advancedMenu->addAction(i18n("&Special Window Settings..."));
297
296
action->setIcon(QIcon::fromTheme(QStringLiteral("preferences-system-windows-actions")));
298
297
action->setData(Options::WindowRulesOp);
307
306
"Window &Manager Settings..."));
308
307
action->setIcon(QIcon::fromTheme(QStringLiteral("configure")));
309
308
connect(action, &QAction::triggered, this,
311
310
// opens the KWin configuration
312
311
QStringList args;
313
312
args << QStringLiteral("--icon") << QStringLiteral("preferences-system-windows") << configModules(false);
315
if (KToolInvocation::kdeinitExec(QStringLiteral("kcmshell5"), args, &error) != 0) {
316
qCDebug(KWIN_CORE) << "Failed to start kcmshell5: " << error;
313
QProcess *p = new QProcess(this);
314
p->setArguments(args);
315
p->setProcessEnvironment(kwinApp()->processStartupEnvironment());
316
p->setProgram(QStringLiteral("kcmshell5"));
317
connect(p, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &QProcess::deleteLater);
318
connect(p, static_cast<void (QProcess::*)(QProcess::ProcessError)>(&QProcess::error), this,
319
[p] (QProcess::ProcessError e) {
320
if (e == QProcess::FailedToStart) {
321
qCDebug(KWIN_CORE) << "Failed to start kcmshell5";
436
445
void UserActionsMenu::showHideActivityMenu()
438
447
#ifdef KWIN_BUILD_ACTIVITIES
448
if (!Activities::self()) {
439
451
const QStringList &openActivities_ = Activities::self()->running();
440
452
qCDebug(KWIN_CORE) << "activities:" << openActivities_.size();
441
453
if (openActivities_.size() < 2) {
498
510
if (m_client.isNull() || !action->data().isValid())
500
Client *other = action->data().value<Client*>();
512
Client *other = dynamic_cast<Client*>(action->data().value<AbstractClient*>());
501
513
if (!Workspace::self()->clientList().contains(other)) // might have been lost betwenn pop-up and selection
503
m_client.data()->tabBehind(other, true);
515
Client *c = dynamic_cast<Client*>(m_client.data());
519
c->tabBehind(other, true);
504
520
if (options->focusPolicyIsReasonable())
505
Workspace::self()->requestFocus(m_client.data());
521
Workspace::self()->requestFocus(c);
508
524
void UserActionsMenu::rebuildTabGroupPopup()
648
664
QActionGroup *group = new QActionGroup(m_screenMenu);
650
666
for (int i = 0; i<screens()->count(); ++i) {
651
// TODO: retrieve the screen name?
652
667
// assumption: there are not more than 9 screens attached.
653
QAction *action = m_screenMenu->addAction(i18nc("@item:inmenu List of all Screens to send a window to",
654
"Screen &%1", (i+1)));
668
QAction *action = m_screenMenu->addAction(i18nc("@item:inmenu List of all Screens to send a window to. First argument is a number, second the output identifier. E.g. Screen 1 (HDMI1)",
669
"Screen &%1 (%2)", (i+1), screens()->name(i)));
655
670
action->setData(i);
656
671
action->setCheckable(true);
657
672
if (!m_client.isNull() && i == m_client.data()->screen()) {
735
753
qRegisterMetaType<Options::WindowOperation>();
736
754
QMetaObject::invokeMethod(workspace(), "performWindowOperation",
737
755
Qt::QueuedConnection,
738
Q_ARG(KWin::Client*, c.data()),
756
Q_ARG(KWin::AbstractClient*, c.data()),
739
757
Q_ARG(Options::WindowOperation, op));
789
Activities::self()->toggleClientOnActivity(m_client.data(), activity, false);
810
Client *c = dynamic_cast<Client*>(m_client.data());
815
Activities::self()->toggleClientOnActivity(c, activity, false);
790
816
if (m_activityMenu && m_activityMenu->isVisible() && m_activityMenu->actions().count()) {
791
817
const bool isOnAll = m_client.data()->isOnAllActivities();
792
818
m_activityMenu->actions().at(0)->setChecked(isOnAll);
954
980
m_userActionsMenu->discard(); // so that it's recreated next time
957
void Workspace::setupWindowShortcut(Client* c)
983
void Workspace::setupWindowShortcut(AbstractClient* c)
959
985
assert(client_keys_dialog == NULL);
960
986
// TODO: PORT ME (KGlobalAccel related)
1157
1183
bool replay = false;
1158
1184
switch(command) {
1159
case Options::MouseRaise:
1160
workspace()->raiseClient(this);
1162
1185
case Options::MouseLower: {
1163
1186
workspace()->lowerClient(this);
1164
1187
// used to be activateNextClient(this), then topClientOnDesktop
1182
1205
setShade(ShadeNone);
1183
1206
cancelShadeHoverTimer();
1185
case Options::MouseOperationsMenu:
1186
if (isActive() && options->isClickRaise())
1188
workspace()->showWindowMenu(QRect(globalPos, globalPos), this);
1190
case Options::MouseToggleRaiseAndLower:
1191
workspace()->raiseOrLowerClient(this);
1193
case Options::MouseActivateAndRaise: {
1194
replay = isActive(); // for clickraise mode
1195
bool mustReplay = !rules()->checkAcceptFocus(info->input());
1197
ToplevelList::const_iterator it = workspace()->stackingOrder().constEnd(),
1198
begin = workspace()->stackingOrder().constBegin();
1199
while (mustReplay && --it != begin && *it != this) {
1200
Client *c = qobject_cast<Client*>(*it);
1201
if (!c || (c->keepAbove() && !keepAbove()) || (keepBelow() && !c->keepBelow()))
1202
continue; // can never raise above "it"
1203
mustReplay = !(c->isOnCurrentDesktop() && c->isOnCurrentActivity() && c->geometry().intersects(geometry()));
1206
workspace()->takeActivity(this, Workspace::ActivityFocus | Workspace::ActivityRaise);
1207
screens()->setCurrent(globalPos);
1208
replay = replay || mustReplay;
1211
case Options::MouseActivateAndLower:
1212
workspace()->requestFocus(this);
1213
workspace()->lowerClient(this);
1214
screens()->setCurrent(globalPos);
1215
replay = replay || !rules()->checkAcceptFocus(info->input());
1217
case Options::MouseActivate:
1218
replay = isActive(); // for clickraise mode
1219
workspace()->takeActivity(this, Workspace::ActivityFocus);
1220
screens()->setCurrent(globalPos);
1221
replay = replay || !rules()->checkAcceptFocus(info->input());
1223
case Options::MouseActivateRaiseAndPassClick:
1224
workspace()->takeActivity(this, Workspace::ActivityFocus | Workspace::ActivityRaise);
1225
screens()->setCurrent(globalPos);
1228
case Options::MouseActivateAndPassClick:
1229
workspace()->takeActivity(this, Workspace::ActivityFocus);
1230
screens()->setCurrent(globalPos);
1233
1208
case Options::MouseActivateRaiseAndMove:
1234
1209
case Options::MouseActivateRaiseAndUnrestrictedMove:
1235
1210
workspace()->raiseClient(this);
1279
1254
updateCursor();
1282
case Options::MouseMaximize:
1283
maximize(MaximizeFull);
1285
case Options::MouseRestore:
1286
maximize(MaximizeRestore);
1288
case Options::MouseMinimize:
1291
case Options::MouseAbove: {
1292
StackingUpdatesBlocker blocker(workspace());
1294
setKeepBelow(false);
1299
case Options::MouseBelow: {
1300
StackingUpdatesBlocker blocker(workspace());
1302
setKeepAbove(false);
1307
case Options::MousePreviousDesktop:
1308
workspace()->windowToPreviousDesktop(this);
1310
case Options::MouseNextDesktop:
1311
workspace()->windowToNextDesktop(this);
1313
case Options::MouseOpacityMore:
1314
if (!isDesktop()) // No point in changing the opacity of the desktop
1315
setOpacity(qMin(opacity() + 0.1, 1.0));
1317
case Options::MouseOpacityLess:
1318
if (!isDesktop()) // No point in changing the opacity of the desktop
1319
setOpacity(qMax(opacity() - 0.1, 0.1));
1321
case Options::MousePreviousTab:
1323
tabGroup()->activatePrev();
1325
case Options::MouseNextTab:
1327
tabGroup()->activateNext();
1329
case Options::MouseClose:
1332
case Options::MouseDragTab:
1333
case Options::MouseNothing:
1258
return AbstractClient::performMouseCommand(command, globalPos);
1558
1481
template <typename Direction>
1559
void windowToDesktop(Client *c)
1482
void windowToDesktop(AbstractClient *c)
1561
1484
VirtualDesktopManager *vds = VirtualDesktopManager::self();
1562
1485
Workspace *ws = Workspace::self();
1783
1706
showWindowMenu(QRect(pos, pos), active_client);
1786
void Workspace::showWindowMenu(const QRect &pos, Client* cl)
1709
void Workspace::showWindowMenu(const QRect &pos, AbstractClient* cl)
1788
1711
m_userActionsMenu->show(pos, cl);