KWin
Loading...
Searching...
No Matches
scripting.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2010 Rohan Prabhu <rohan@rohanprabhu.com>
6 SPDX-FileCopyrightText: 2011 Martin Gräßlin <mgraesslin@kde.org>
7 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
8
9 SPDX-License-Identifier: GPL-2.0-or-later
10*/
11
12#pragma once
13
14#include "effect/globals.h"
15
16#include <QHash>
17#include <QJSEngine>
18#include <QJSValue>
19#include <QStringList>
20#include <QTimer>
21
22#include <QDBusContext>
23#include <QDBusMessage>
24
25class QQmlComponent;
26class QQmlContext;
27class QQmlEngine;
28class QAction;
29class QMenu;
30class QRecursiveMutex;
31class QQuickWindow;
32class KConfigGroup;
33
35typedef QList<QPair<bool, QPair<QString, QString>>> LoadScriptList;
36
37namespace KWin
38{
39class Window;
40class QtScriptWorkspaceWrapper;
41
42class KWIN_EXPORT AbstractScript : public QObject
43{
44 Q_OBJECT
45public:
46 AbstractScript(int id, QString scriptName, QString pluginName, QObject *parent = nullptr);
47 ~AbstractScript() override;
48 int scriptId() const
49 {
50 return m_scriptId;
51 }
52 QString fileName() const
53 {
54 return m_fileName;
55 }
56 const QString &pluginName()
57 {
58 return m_pluginName;
59 }
60 bool running() const
61 {
62 return m_running;
63 }
64
65 KConfigGroup config() const;
66
67public Q_SLOTS:
68 void stop();
69 virtual void run() = 0;
70
71Q_SIGNALS:
72 void runningChanged(bool);
73
74protected:
75 void setRunning(bool running)
76 {
77 if (m_running == running) {
78 return;
79 }
80 m_running = running;
81 Q_EMIT runningChanged(m_running);
82 }
83
84private:
85 int m_scriptId;
86 QString m_fileName;
87 QString m_pluginName;
88 bool m_running;
89};
90
95class ScriptTimer : public QTimer
96{
97 Q_OBJECT
98
99public:
100 Q_INVOKABLE ScriptTimer(QObject *parent = nullptr);
101};
102
103class Script : public AbstractScript, QDBusContext
104{
105 Q_OBJECT
106public:
107 Script(int id, QString scriptName, QString pluginName, QObject *parent = nullptr);
108 virtual ~Script();
109
110 Q_INVOKABLE QVariant readConfig(const QString &key, const QVariant &defaultValue = QVariant());
111
112 Q_INVOKABLE void callDBus(const QString &service, const QString &path,
113 const QString &interface, const QString &method,
114 const QJSValue &arg1 = QJSValue(),
115 const QJSValue &arg2 = QJSValue(),
116 const QJSValue &arg3 = QJSValue(),
117 const QJSValue &arg4 = QJSValue(),
118 const QJSValue &arg5 = QJSValue(),
119 const QJSValue &arg6 = QJSValue(),
120 const QJSValue &arg7 = QJSValue(),
121 const QJSValue &arg8 = QJSValue(),
122 const QJSValue &arg9 = QJSValue());
123
124 Q_INVOKABLE bool registerShortcut(const QString &objectName, const QString &text,
125 const QString &keySequence, const QJSValue &callback);
126
127 Q_INVOKABLE bool registerScreenEdge(int edge, const QJSValue &callback);
128 Q_INVOKABLE bool unregisterScreenEdge(int edge);
129
130 Q_INVOKABLE bool registerTouchScreenEdge(int edge, const QJSValue &callback);
131 Q_INVOKABLE bool unregisterTouchScreenEdge(int edge);
132
142 Q_INVOKABLE void registerUserActionsMenu(const QJSValue &callback);
143
186 QList<QAction *> actionsForUserActionMenu(Window *client, QMenu *parent);
187
188public Q_SLOTS:
189 void run() override;
190
191private Q_SLOTS:
195 void slotScriptLoadedFromFile();
196
200 bool slotBorderActivated(ElectricBorder border);
201
202private:
207 QByteArray loadScriptFromFile(const QString &fileName);
208
216 QAction *scriptValueToAction(const QJSValue &value, QMenu *parent);
217
232 QAction *createAction(const QString &title, const QJSValue &item, QMenu *parent);
233
242 QAction *createMenu(const QString &title, const QJSValue &items, QMenu *parent);
243
244 QJSEngine *m_engine;
245 QDBusMessage m_invocationContext;
246 bool m_starting;
247 QHash<int, QJSValueList> m_screenEdgeCallbacks;
248 QHash<int, QAction *> m_touchScreenEdgeCallbacks;
249 QJSValueList m_userActionsMenuCallbacks;
250};
251
253{
254 Q_OBJECT
255public:
256 explicit DeclarativeScript(int id, QString scriptName, QString pluginName, QObject *parent = nullptr);
257 ~DeclarativeScript() override;
258
259public Q_SLOTS:
260 Q_SCRIPTABLE void run() override;
261
262private Q_SLOTS:
263 void createComponent();
264
265private:
266 QQmlContext *m_context;
267 QQmlComponent *m_component;
268};
269
270class JSEngineGlobalMethodsWrapper : public QObject
271{
272 Q_OBJECT
273public:
274 //------------------------------------------------------------------
275 // enums copy&pasted from kwinglobals.h for exporting
276
295 Q_ENUM(ClientAreaOption)
298
299public Q_SLOTS:
300 QVariant readConfig(const QString &key, QVariant defaultValue = QVariant());
301
302private:
303 DeclarativeScript *m_script;
304};
305
309class KWIN_EXPORT Scripting : public QObject
310{
311 Q_OBJECT
312 Q_CLASSINFO("D-Bus Interface", "org.kde.kwin.Scripting")
313private:
314 explicit Scripting(QObject *parent);
315 QStringList scriptList;
316 QList<KWin::AbstractScript *> scripts;
320 std::unique_ptr<QRecursiveMutex> m_scriptsLock;
321
322 // Preferably call ONLY at load time
323 void runScripts();
324
325public:
326 ~Scripting() override;
327 Q_SCRIPTABLE Q_INVOKABLE int loadScript(const QString &filePath, const QString &pluginName = QString());
328 Q_SCRIPTABLE Q_INVOKABLE int loadDeclarativeScript(const QString &filePath, const QString &pluginName = QString());
329 Q_SCRIPTABLE Q_INVOKABLE bool isScriptLoaded(const QString &pluginName) const;
330 Q_SCRIPTABLE Q_INVOKABLE bool unloadScript(const QString &pluginName);
331
339 QList<QAction *> actionsForUserActionMenu(Window *c, QMenu *parent);
340
341 QQmlEngine *qmlEngine() const;
342 QQmlEngine *qmlEngine();
343 QQmlContext *declarativeScriptSharedContext() const;
344 QQmlContext *declarativeScriptSharedContext();
345 QtScriptWorkspaceWrapper *workspaceWrapper() const;
346
347 AbstractScript *findScript(const QString &pluginName) const;
348
349 static Scripting *self();
350 static Scripting *create(QObject *parent);
351
352public Q_SLOTS:
353 void scriptDestroyed(QObject *object);
354 Q_SCRIPTABLE void start();
355
356private Q_SLOTS:
357 void slotScriptsQueried();
358
359private:
360 void init();
361 LoadScriptList queryScriptsToLoad();
362 static Scripting *s_self;
363 QQmlEngine *m_qmlEngine;
364 QQmlContext *m_declarativeScriptSharedContext;
365 QtScriptWorkspaceWrapper *m_workspaceWrapper;
366};
367
368inline QQmlEngine *Scripting::qmlEngine() const
369{
370 return m_qmlEngine;
371}
372
373inline QQmlEngine *Scripting::qmlEngine()
374{
375 return m_qmlEngine;
376}
377
379{
380 return m_declarativeScriptSharedContext;
381}
382
384{
385 return m_declarativeScriptSharedContext;
386}
387
389{
390 return m_workspaceWrapper;
391}
392
394{
395 return s_self;
396}
397
398}
void setRunning(bool running)
Definition scripting.h:75
QString fileName() const
Definition scripting.h:52
virtual void run()=0
void runningChanged(bool)
const QString & pluginName()
Definition scripting.h:56
bool running() const
Definition scripting.h:60
int scriptId() const
Definition scripting.h:48
Q_SCRIPTABLE void run() override
~DeclarativeScript() override
DeclarativeScript(int id, QString scriptName, QString pluginName, QObject *parent=nullptr)
JSEngineGlobalMethodsWrapper(DeclarativeScript *parent)
@ PlacementArea
geometry where a window will be initially placed after being mapped
Definition scripting.h:279
@ FullArea
one whole screen, ignore struts
Definition scripting.h:291
@ MaximizeArea
like MaximizeArea, but ignore struts - used e.g. for topmenu
Definition scripting.h:283
@ MaximizeFullArea
area for fullscreen windows
Definition scripting.h:285
@ WorkArea
whole area (all screens together), ignore struts
Definition scripting.h:289
@ MovementArea
geometry to which a window will be maximized
Definition scripting.h:281
@ FullScreenArea
whole workarea (all screens together)
Definition scripting.h:287
QVariant readConfig(const QString &key, QVariant defaultValue=QVariant())
Q_INVOKABLE QVariant readConfig(const QString &key, const QVariant &defaultValue=QVariant())
Q_INVOKABLE bool unregisterTouchScreenEdge(int edge)
Script(int id, QString scriptName, QString pluginName, QObject *parent=nullptr)
Q_INVOKABLE void callDBus(const QString &service, const QString &path, const QString &interface, const QString &method, const QJSValue &arg1=QJSValue(), const QJSValue &arg2=QJSValue(), const QJSValue &arg3=QJSValue(), const QJSValue &arg4=QJSValue(), const QJSValue &arg5=QJSValue(), const QJSValue &arg6=QJSValue(), const QJSValue &arg7=QJSValue(), const QJSValue &arg8=QJSValue(), const QJSValue &arg9=QJSValue())
Q_INVOKABLE bool registerTouchScreenEdge(int edge, const QJSValue &callback)
void run() override
Q_INVOKABLE bool registerShortcut(const QString &objectName, const QString &text, const QString &keySequence, const QJSValue &callback)
QList< QAction * > actionsForUserActionMenu(Window *client, QMenu *parent)
Creates actions for the UserActionsMenu by invoking the registered callbacks.
virtual ~Script()
Q_INVOKABLE void registerUserActionsMenu(const QJSValue &callback)
Registers the given callback to be invoked whenever the UserActionsMenu is about to be showed....
Q_INVOKABLE bool unregisterScreenEdge(int edge)
Q_INVOKABLE bool registerScreenEdge(int edge, const QJSValue &callback)
Q_INVOKABLE ScriptTimer(QObject *parent=nullptr)
QQmlContext * declarativeScriptSharedContext() const
Definition scripting.h:378
QtScriptWorkspaceWrapper * workspaceWrapper() const
Definition scripting.h:388
static Scripting * self()
Definition scripting.h:393
QQmlEngine * qmlEngine() const
Definition scripting.h:368
ElectricBorder
Definition globals.h:60
QList< QPair< bool, QPair< QString, QString > > > LoadScriptList
true == javascript, false == qml
Definition scripting.h:35