diff --git a/CMakeLists.txt b/CMakeLists.txt index bf90ab0f1e..77f369489d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,7 @@ find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Declarative KCMUtils KIO + TextWidgets NewStuff Service XmlGui @@ -347,10 +348,10 @@ add_subdirectory(helpers) ########### next target ############### set(kwin_KDEINIT_SRCS - workspace.cpp + workspace.cpp dbusinterface.cpp abstract_client.cpp - client.cpp + client.cpp client_machine.cpp cursor.cpp debug_console.cpp @@ -363,25 +364,25 @@ set(kwin_KDEINIT_SRCS pointer_input.cpp touch_input.cpp netinfo.cpp - placement.cpp - atoms.cpp - utils.cpp - layers.cpp - main.cpp - options.cpp + placement.cpp + atoms.cpp + utils.cpp + layers.cpp + main.cpp + options.cpp outline.cpp - events.cpp - killwindow.cpp - geometrytip.cpp + events.cpp + killwindow.cpp + geometrytip.cpp screens.cpp shadow.cpp - sm.cpp - group.cpp - manage.cpp + sm.cpp + group.cpp + manage.cpp overlaywindow.cpp - activation.cpp - useractions.cpp - geometry.cpp + activation.cpp + useractions.cpp + geometry.cpp rules.cpp composite.cpp toplevel.cpp diff --git a/autotests/integration/move_resize_window_test.cpp b/autotests/integration/move_resize_window_test.cpp index 9d4d82070d..101bfad8bb 100644 --- a/autotests/integration/move_resize_window_test.cpp +++ b/autotests/integration/move_resize_window_test.cpp @@ -666,7 +666,6 @@ void MoveResizeWindowTest::testAdjustClientGeometryOfAutohidingX11Panel() QVERIFY(panelHiddenSpy.wait()); // now try to snap again - QEXPECT_FAIL("", "BUG 365892", Continue); QCOMPARE(Workspace::self()->adjustClientPosition(testWindow, targetPoint, false), targetPoint); // and destroy the panel again diff --git a/effects/mousemark/CMakeLists.txt b/effects/mousemark/CMakeLists.txt index 5d95a8acd6..9002f7c344 100644 --- a/effects/mousemark/CMakeLists.txt +++ b/effects/mousemark/CMakeLists.txt @@ -12,6 +12,7 @@ target_link_libraries(kwin_mousemark_config KF5::GlobalAccel KF5::I18n KF5::Service + KF5::TextWidgets KF5::XmlGui ) diff --git a/effects/mousemark/mousemark_config.cpp b/effects/mousemark/mousemark_config.cpp index 8f9f0d1927..68164a071b 100644 --- a/effects/mousemark/mousemark_config.cpp +++ b/effects/mousemark/mousemark_config.cpp @@ -52,7 +52,7 @@ MouseMarkEffectConfig::MouseMarkEffectConfig(QWidget* parent, const QVariantList { m_ui = new MouseMarkEffectConfigForm(this); - m_ui->kcfg_LineWidth->setSuffix(ki18np(" pixel", " pixels").toString()); + m_ui->kcfg_LineWidth->setSuffix(ki18np(" pixel", " pixels")); QVBoxLayout* layout = new QVBoxLayout(this); diff --git a/effects/mousemark/mousemark_config.ui b/effects/mousemark/mousemark_config.ui index b86db7e4cd..6bfbb3dfad 100644 --- a/effects/mousemark/mousemark_config.ui +++ b/effects/mousemark/mousemark_config.ui @@ -17,10 +17,10 @@ Appearance - + - &Width: + Wid&th: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -30,26 +30,7 @@ - - - - - 0 - 0 - - - - 1 - - - 10 - - - 3 - - - - + &Color: @@ -62,7 +43,7 @@ - + @@ -72,15 +53,24 @@ + + + + 1 + + + 10 + + + 3 + + + - - - KShortcutsEditor::GlobalAction - - + @@ -106,9 +96,14 @@ KShortcutsEditor QWidget -
KShortcutsEditor
+
kshortcutseditor.h
1
+ + KPluralHandlingSpinBox + QSpinBox +
kpluralhandlingspinbox.h
+
diff --git a/geometry.cpp b/geometry.cpp index 73507b296f..812db7c143 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -527,6 +527,8 @@ QPoint Workspace::adjustClientPosition(AbstractClient* c, QPoint pos, bool unres continue; if ((*l)->isMinimized()) continue; // is minimized + if (!(*l)->isShown(false)) + continue; if ((*l)->tabGroup() && (*l) != (*l)->tabGroup()->current()) continue; // is not active tab if (!((*l)->isOnDesktop(c->desktop()) || c->isOnDesktop((*l)->desktop()))) diff --git a/scripting/scriptedeffect.cpp b/scripting/scriptedeffect.cpp index 0aa9a8b968..193ed958dc 100644 --- a/scripting/scriptedeffect.cpp +++ b/scripting/scriptedeffect.cpp @@ -492,7 +492,7 @@ bool ScriptedEffect::init(const QString &effectName, const QString &pathToScript m_engine->globalObject().setProperty(QStringLiteral("effects"), effectsObject, QScriptValue::Undeletable); m_engine->globalObject().setProperty(QStringLiteral("Effect"), m_engine->newQMetaObject(&ScriptedEffect::staticMetaObject)); #ifndef KWIN_UNIT_TEST - m_engine->globalObject().setProperty(QStringLiteral("KWin"), m_engine->newQMetaObject(&WorkspaceWrapper::staticMetaObject)); + m_engine->globalObject().setProperty(QStringLiteral("KWin"), m_engine->newQMetaObject(&QtScriptWorkspaceWrapper::staticMetaObject)); #endif m_engine->globalObject().setProperty(QStringLiteral("QEasingCurve"), m_engine->newQMetaObject(&QEasingCurve::staticMetaObject)); m_engine->globalObject().setProperty(QStringLiteral("effect"), m_engine->newQObject(this, QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater), QScriptValue::Undeletable); diff --git a/scripting/scripting.cpp b/scripting/scripting.cpp index 0fbab7cb34..58ae79f199 100644 --- a/scripting/scripting.cpp +++ b/scripting/scripting.cpp @@ -46,6 +46,7 @@ along with this program. If not, see . #include #include #include +#include #include #include #include @@ -301,9 +302,9 @@ void KWin::Script::installScriptFunctions(QScriptEngine* engine) QScriptValue assertNotNullFunc = engine->newFunction(kwinAssertNotNull); engine->globalObject().setProperty(QStringLiteral("assertNotNull"), assertNotNullFunc); // global properties - engine->globalObject().setProperty(QStringLiteral("KWin"), engine->newQMetaObject(&WorkspaceWrapper::staticMetaObject)); + engine->globalObject().setProperty(QStringLiteral("KWin"), engine->newQMetaObject(&QtScriptWorkspaceWrapper::staticMetaObject)); QScriptValue workspace = engine->newQObject(Scripting::self()->workspaceWrapper(), QScriptEngine::QtOwnership, - QScriptEngine::ExcludeSuperClassContents | QScriptEngine::ExcludeDeleteLater); + QScriptEngine::ExcludeDeleteLater); engine->globalObject().setProperty(QStringLiteral("workspace"), workspace, QScriptValue::Undeletable); // install meta functions KWin::MetaScripting::registration(engine); @@ -535,7 +536,7 @@ void KWin::ScriptUnloaderAgent::scriptUnload(qint64 id) KWin::DeclarativeScript::DeclarativeScript(int id, QString scriptName, QString pluginName, QObject* parent) : AbstractScript(id, scriptName, pluginName, parent) - , m_context(new QQmlContext(Scripting::self()->qmlEngine(), this)) + , m_context(new QQmlContext(Scripting::self()->declarativeScriptSharedContext(), this)) , m_component(new QQmlComponent(Scripting::self()->qmlEngine(), this)) { m_context->setContextProperty(QStringLiteral("KWin"), new JSEngineGlobalMethodsWrapper(this)); @@ -630,7 +631,8 @@ KWin::Scripting::Scripting(QObject *parent) : QObject(parent) , m_scriptsLock(new QMutex(QMutex::Recursive)) , m_qmlEngine(new QQmlEngine(this)) - , m_workspaceWrapper(new WorkspaceWrapper(this)) + , m_declarativeScriptSharedContext(new QQmlContext(m_qmlEngine, this)) + , m_workspaceWrapper(new QtScriptWorkspaceWrapper(this)) { init(); QDBusConnection::sessionBus().registerObject(QStringLiteral("/Scripting"), this, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportScriptableInvokables); @@ -655,6 +657,11 @@ void KWin::Scripting::init() m_qmlEngine->rootContext()->setContextProperty(QStringLiteral("workspace"), m_workspaceWrapper); m_qmlEngine->rootContext()->setContextProperty(QStringLiteral("options"), options); + + m_declarativeScriptSharedContext->setContextProperty(QStringLiteral("workspace"), new DeclarativeScriptWorkspaceWrapper(this)); + // QQmlListProperty interfaces only work via properties, rebind them as functions here + QQmlExpression expr(m_declarativeScriptSharedContext, nullptr, "workspace.clientList = function() { return workspace.clients }"); + expr.evaluate(); } void KWin::Scripting::start() diff --git a/scripting/scripting.h b/scripting/scripting.h index d2682e22e0..02627e90ad 100644 --- a/scripting/scripting.h +++ b/scripting/scripting.h @@ -51,7 +51,7 @@ namespace KWin class AbstractClient; class Client; class ScriptUnloaderAgent; -class WorkspaceWrapper; +class QtScriptWorkspaceWrapper; class KWIN_EXPORT AbstractScript : public QObject { @@ -362,7 +362,9 @@ public: QQmlEngine *qmlEngine() const; QQmlEngine *qmlEngine(); - WorkspaceWrapper *workspaceWrapper() const; + QQmlContext *declarativeScriptSharedContext() const; + QQmlContext *declarativeScriptSharedContext(); + QtScriptWorkspaceWrapper *workspaceWrapper() const; AbstractScript *findScript(const QString &pluginName) const; @@ -381,7 +383,8 @@ private: LoadScriptList queryScriptsToLoad(); static Scripting *s_self; QQmlEngine *m_qmlEngine; - WorkspaceWrapper *m_workspaceWrapper; + QQmlContext *m_declarativeScriptSharedContext; + QtScriptWorkspaceWrapper *m_workspaceWrapper; }; inline @@ -397,7 +400,19 @@ QQmlEngine *Scripting::qmlEngine() } inline -WorkspaceWrapper *Scripting::workspaceWrapper() const +QQmlContext *Scripting::declarativeScriptSharedContext() const +{ + return m_declarativeScriptSharedContext; +} + +inline +QQmlContext *Scripting::declarativeScriptSharedContext() +{ + return m_declarativeScriptSharedContext; +} + +inline +QtScriptWorkspaceWrapper *Scripting::workspaceWrapper() const { return m_workspaceWrapper; } diff --git a/scripting/workspace_wrapper.cpp b/scripting/workspace_wrapper.cpp index 05aecb6eb6..461e0546c4 100644 --- a/scripting/workspace_wrapper.cpp +++ b/scripting/workspace_wrapper.cpp @@ -90,12 +90,12 @@ void WorkspaceWrapper::setNumberOfDesktops(int count) VirtualDesktopManager::self()->setCount(count); } -#define GETTER( rettype, getterName ) \ -rettype WorkspaceWrapper::getterName( ) const { \ +#define GETTER( klass, rettype, getterName ) \ +rettype klass::getterName( ) const { \ return Workspace::self()->getterName(); \ } -GETTER(KWin::AbstractClient*, activeClient) -GETTER(QList< KWin::Client* >, clientList) +GETTER(WorkspaceWrapper, KWin::AbstractClient*, activeClient) +GETTER(QtScriptWorkspaceWrapper, QList< KWin::Client* >, clientList) #undef GETTER @@ -324,4 +324,28 @@ QSize WorkspaceWrapper::virtualScreenSize() const return screens()->size(); } +QtScriptWorkspaceWrapper::QtScriptWorkspaceWrapper(QObject* parent) + : WorkspaceWrapper(parent) {} + + +QQmlListProperty DeclarativeScriptWorkspaceWrapper::clients() +{ + return QQmlListProperty(this, 0, &DeclarativeScriptWorkspaceWrapper::countClientList, &DeclarativeScriptWorkspaceWrapper::atClientList); +} + +int DeclarativeScriptWorkspaceWrapper::countClientList(QQmlListProperty *clients) +{ + Q_UNUSED(clients) + return Workspace::self()->clientList().size(); +} + +KWin::Client *DeclarativeScriptWorkspaceWrapper::atClientList(QQmlListProperty *clients, int index) +{ + Q_UNUSED(clients) + return Workspace::self()->clientList().at(index); +} + +DeclarativeScriptWorkspaceWrapper::DeclarativeScriptWorkspaceWrapper(QObject* parent) + : WorkspaceWrapper(parent) {} + } // KWin diff --git a/scripting/workspace_wrapper.h b/scripting/workspace_wrapper.h index 5a6c2cbf71..d21989a788 100644 --- a/scripting/workspace_wrapper.h +++ b/scripting/workspace_wrapper.h @@ -26,6 +26,7 @@ along with this program. If not, see . #include #include #include +#include #include namespace KWin @@ -198,7 +199,10 @@ public: ElectricNone }; +protected: explicit WorkspaceWrapper(QObject* parent = nullptr); + +public: #define GETTERSETTERDEF( rettype, getter, setter ) \ rettype getter() const; \ void setter( rettype val ); @@ -222,10 +226,6 @@ void setter( rettype val ); QSize virtualScreenSize() const; QRect virtualScreenGeometry() const; - /** - * List of Clients currently managed by KWin. - **/ - Q_INVOKABLE QList< KWin::Client* > clientList() const; /** * Returns the geometry a Client can use with the specified option. * This method should be preferred over other methods providing screen sizes as the @@ -349,6 +349,31 @@ private Q_SLOTS: void setupClientConnections(KWin::Client* client); }; +class QtScriptWorkspaceWrapper : public WorkspaceWrapper +{ + Q_OBJECT +public: + /** + * List of Clients currently managed by KWin. + **/ + Q_INVOKABLE QList< KWin::Client* > clientList() const; + + explicit QtScriptWorkspaceWrapper(QObject* parent = nullptr); +}; + +class DeclarativeScriptWorkspaceWrapper : public WorkspaceWrapper +{ + Q_OBJECT + + Q_PROPERTY(QQmlListProperty clients READ clients) +public: + QQmlListProperty clients(); + static int countClientList(QQmlListProperty *clients); + static KWin::Client *atClientList(QQmlListProperty *clients, int index); + + explicit DeclarativeScriptWorkspaceWrapper(QObject* parent = nullptr); +}; + } #endif