kcm/kwinrules: Detect and suggest activities from a window

Add the activities info to the list of properties provided by
the `queryWindowInfo()` dBus method, and suggest them to the
user when inspecting a given window.

An empty activity list means "All Activities" (null UUID)
Also get the null UUID value instead of having it hardcoded.
remotes/origin/work/custom-virtual-keyboard
Ismael Asensio 5 years ago
parent 8a79f38de8
commit 6eda92a0fd
  1. 5
      dbusinterface.cpp
  2. 2
      kcmkwin/kwinrules/package/contents/ui/RulesEditor.qml
  3. 29
      kcmkwin/kwinrules/package/contents/ui/ValueEditor.qml
  4. 13
      kcmkwin/kwinrules/rulesmodel.cpp

@ -208,7 +208,10 @@ QVariantMap clientToVariantMap(const AbstractClient *c)
{QStringLiteral("skipPager"), c->skipPager()}, {QStringLiteral("skipPager"), c->skipPager()},
{QStringLiteral("skipSwitcher"), c->skipSwitcher()}, {QStringLiteral("skipSwitcher"), c->skipSwitcher()},
{QStringLiteral("maximizeHorizontal"), c->maximizeMode() & MaximizeHorizontal}, {QStringLiteral("maximizeHorizontal"), c->maximizeMode() & MaximizeHorizontal},
{QStringLiteral("maximizeVertical"), c->maximizeMode() & MaximizeVertical} {QStringLiteral("maximizeVertical"), c->maximizeMode() & MaximizeVertical},
#ifdef KWIN_BUILD_ACTIVITIES
{QStringLiteral("activities"), c->activities()},
#endif
}; };
} }
} }

@ -253,6 +253,8 @@ ScrollViewKCM {
case RuleItem.NetTypes: case RuleItem.NetTypes:
var selectedValue = value.toString(2).length - 1; var selectedValue = value.toString(2).length - 1;
return options.textOfValue(selectedValue); return options.textOfValue(selectedValue);
case RuleItem.OptionList:
return Array.from(value, item => options.textOfValue(item) ).join(", ");
} }
return value; return value;
} }

@ -117,18 +117,11 @@ Loader {
Component { Component {
id: optionListEditor id: optionListEditor
OptionsComboBox { OptionsComboBox {
id: optionListCombo
flat: true flat: true
model: ruleOptions model: ruleOptions
multipleChoice: true multipleChoice: true
selectionMask: {
let mask = 0
for (let i = 0; i < count; i++) {
if (ruleValue.includes(model.data(model.index(i,0), Qt.UserRole))) {
mask += 1 << i
}
}
return mask
}
onActivated: { onActivated: {
let selectionList = [] let selectionList = []
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
@ -138,6 +131,24 @@ Loader {
} }
valueEditor.valueEdited(selectionList); valueEditor.valueEdited(selectionList);
} }
function updateSelectionMask() {
selectionMask = 0
for (let i = 0; i < count; i++) {
if (ruleValue.includes(model.data(model.index(i,0), Qt.UserRole))) {
selectionMask += 1 << i
}
}
}
onModelChanged: updateSelectionMask()
Component.onCompleted: updateSelectionMask()
Connections {
target: valueEditor
function onRuleValueChanged() {
optionListCombo.updateSelectionMask()
}
}
} }
} }

@ -7,6 +7,10 @@
#include "rulesmodel.h" #include "rulesmodel.h"
#ifdef KWIN_BUILD_ACTIVITIES
#include "activities.h"
#endif
#include <QFileInfo> #include <QFileInfo>
#include <QIcon> #include <QIcon>
#include <QQmlEngine> #include <QQmlEngine>
@ -686,6 +690,12 @@ void RulesModel::setSuggestedProperties(const QVariantMap &info)
m_rules["wmclass"]->setSuggestedValue(wmsimpleclass); m_rules["wmclass"]->setSuggestedValue(wmsimpleclass);
m_rules["wmclasshelper"]->setSuggestedValue(wmcompleteclass); m_rules["wmclasshelper"]->setSuggestedValue(wmcompleteclass);
#ifdef KWIN_BUILD_ACTIVITIES
const QStringList activities = info.value("activities").toStringList();
m_rules["activity"]->setSuggestedValue(activities.isEmpty() ? QStringList{ Activities::nullUuid() }
: activities);
#endif
const auto ruleForProperty = x11PropertyHash(); const auto ruleForProperty = x11PropertyHash();
for (QString &property : info.keys()) { for (QString &property : info.keys()) {
if (!ruleForProperty.contains(property)) { if (!ruleForProperty.contains(property)) {
@ -739,9 +749,8 @@ QList<OptionsModel::Data> RulesModel::activitiesModelData() const
#ifdef KWIN_BUILD_ACTIVITIES #ifdef KWIN_BUILD_ACTIVITIES
QList<OptionsModel::Data> modelData; QList<OptionsModel::Data> modelData;
// NULL_ID from kactivities/src/lib/core/consumer.cpp
modelData << OptionsModel::Data{ modelData << OptionsModel::Data{
QString::fromLatin1("00000000-0000-0000-0000-000000000000"), Activities::nullUuid(),
i18n("All Activities"), i18n("All Activities"),
QIcon::fromTheme("activities") QIcon::fromTheme("activities")
}; };

Loading…
Cancel
Save