File indexing completed on 2024-05-05 09:51:32
0001 /* 0002 KSysGuard, the KDE System Guard 0003 0004 SPDX-FileCopyrightText: 2009 John Tapsell <john.tapsell@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 0008 */ 0009 0010 #ifndef KSYSGUARDSCRIPTING_H 0011 #define KSYSGUARDSCRIPTING_H 0012 0013 #include "../config-ksysguard.h" 0014 #include "ProcessModel.h" 0015 #include <QList> 0016 #include <QString> 0017 #include <QWidget> 0018 #include <processcore/processes.h> 0019 0020 class QAction; 0021 class ScriptingHtmlDialog; // Defined in scripting.cpp file 0022 class KSysGuardProcessList; 0023 class ProcessObject; 0024 class QWebChannel; 0025 0026 class Scripting : public QWidget 0027 { 0028 Q_OBJECT 0029 public: 0030 /** Create a scripting object */ 0031 Scripting(KSysGuardProcessList *parent); 0032 /** Run the script in the given path */ 0033 void runScript(const QString &path, const QString &name); 0034 /** Read all the script .desktop files and create an action for each one */ 0035 void loadContextMenu(); 0036 /** List of context menu actions that are created by loadContextMenu() */ 0037 QList<QAction *> actions() 0038 { 0039 return mActions; 0040 } 0041 0042 public Q_SLOTS: 0043 /** Stop all scripts and delete the script engine */ 0044 void stopAllScripts(); 0045 private Q_SLOTS: 0046 /** Run the script associated with the QAction that called this slot */ 0047 void runScriptSlot(); 0048 #if WEBENGINE_SCRIPTING_ENABLED 0049 void setupJavascriptObjects(); 0050 void refreshScript(); 0051 void zoomIn(); 0052 void zoomOut(); 0053 #endif 0054 private: 0055 /** This is created on the fly as needed, and deleted when no longer used */ 0056 ScriptingHtmlDialog *mScriptingHtmlDialog; 0057 /** Used to expose mProcessObject to the WebEnginePage */ 0058 QWebChannel *mWebChannel; 0059 /** The parent process list to script for */ 0060 KSysGuardProcessList *const mProcessList; 0061 /** List of context menu actions that are created by loadContextMenu() */ 0062 QList<QAction *> mActions; 0063 QString mScriptPath; 0064 QString mScriptName; 0065 ProcessObject *mProcessObject; 0066 0067 qlonglong mPid; 0068 }; 0069 0070 // QWebChannel only reloads properties on demand, so we need a signal. 0071 #define P_PROPERTY(x) Q_PROPERTY(x NOTIFY anythingChanged) 0072 #define PROPERTY(Type, Name) \ 0073 Type Name() const \ 0074 { \ 0075 KSysGuard::Process *process = mModel->getProcess(mPid); \ 0076 if (process) \ 0077 return process->Name(); \ 0078 else \ 0079 return Type(); \ 0080 } 0081 0082 class ProcessObject : public QObject 0083 { 0084 Q_OBJECT 0085 public: 0086 // clang-format off 0087 P_PROPERTY(qlonglong pid READ pid WRITE setPid) /* Add functionality to 'set' the pid to change which process to read from */ 0088 P_PROPERTY(qlonglong ppid READ parentPid) /* Map 'ppid' to 'parentPid' to give it a nicer scripting name */ 0089 P_PROPERTY(QString name READ name) /* Defined below to return the first word of the name */ 0090 P_PROPERTY(QString fullname READ fullname) /* Defined below to return 'name' */ 0091 P_PROPERTY(qlonglong rss READ vmRSS) /* Map 'rss' to 'vmRSS' just to give it a nicer scripting name */ 0092 P_PROPERTY(qlonglong urss READ vmURSS) /* Map 'urss' to 'vmURSS' just to give it a nicer scripting name */ 0093 P_PROPERTY(int numThreads READ numThreads) PROPERTY(int, numThreads) 0094 P_PROPERTY(qlonglong fsgid READ fsgid) PROPERTY(qlonglong, fsgid) 0095 P_PROPERTY(qlonglong parentPid READ parentPid) PROPERTY(qlonglong, parentPid) 0096 P_PROPERTY(QString login READ login) PROPERTY(QString, login) 0097 P_PROPERTY(qlonglong uid READ uid) PROPERTY(qlonglong, uid) 0098 P_PROPERTY(qlonglong euid READ euid) PROPERTY(qlonglong, euid) 0099 P_PROPERTY(qlonglong suid READ suid) PROPERTY(qlonglong, suid) 0100 P_PROPERTY(qlonglong fsuid READ fsuid) PROPERTY(qlonglong, fsuid) 0101 P_PROPERTY(qlonglong gid READ gid) PROPERTY(qlonglong, gid) 0102 P_PROPERTY(qlonglong egid READ egid) PROPERTY(qlonglong, egid) 0103 P_PROPERTY(qlonglong sgid READ sgid) PROPERTY(qlonglong, sgid) 0104 P_PROPERTY(qlonglong tracerpid READ tracerpid) PROPERTY(qlonglong, tracerpid) 0105 P_PROPERTY(QByteArray tty READ tty) PROPERTY(QByteArray, tty) 0106 P_PROPERTY(qlonglong userTime READ userTime) PROPERTY(qlonglong, userTime) 0107 P_PROPERTY(qlonglong sysTime READ sysTime) PROPERTY(qlonglong, sysTime) 0108 P_PROPERTY(int userUsage READ userUsage) PROPERTY(int, userUsage) 0109 P_PROPERTY(int sysUsage READ sysUsage) PROPERTY(int, sysUsage) 0110 P_PROPERTY(int totalUserUsage READ totalUserUsage) PROPERTY(int, totalUserUsage) 0111 P_PROPERTY(int totalSysUsage READ totalSysUsage) PROPERTY(int, totalSysUsage) 0112 P_PROPERTY(int numChildren READ numChildren) PROPERTY(int, numChildren) 0113 P_PROPERTY(int niceLevel READ niceLevel) PROPERTY(int, niceLevel) 0114 P_PROPERTY(int scheduler READ scheduler) PROPERTY(int, scheduler) 0115 P_PROPERTY(int ioPriorityClass READ ioPriorityClass) PROPERTY(int, ioPriorityClass) 0116 P_PROPERTY(int ioniceLevel READ ioniceLevel) PROPERTY(int, ioniceLevel) 0117 P_PROPERTY(qlonglong vmSize READ vmSize) PROPERTY(qlonglong, vmSize) 0118 P_PROPERTY(qlonglong vmRSS READ vmRSS) PROPERTY(qlonglong, vmRSS) 0119 P_PROPERTY(qlonglong vmURSS READ vmURSS) PROPERTY(qlonglong, vmURSS) 0120 P_PROPERTY(qlonglong pixmapBytes READ pixmapBytes) PROPERTY(qlonglong, pixmapBytes) 0121 P_PROPERTY(bool hasManagedGuiWindow READ hasManagedGuiWindow) PROPERTY(bool, hasManagedGuiWindow) 0122 P_PROPERTY(QString command READ command) PROPERTY(QString, command) 0123 P_PROPERTY(qlonglong status READ status) PROPERTY(qlonglong, status) 0124 P_PROPERTY(qlonglong ioCharactersRead READ ioCharactersRead) PROPERTY(qlonglong, ioCharactersRead) 0125 P_PROPERTY(qlonglong ioCharactersWritten READ ioCharactersWritten) PROPERTY(qlonglong, ioCharactersWritten) 0126 P_PROPERTY(qlonglong ioReadSyscalls READ ioReadSyscalls) PROPERTY(qlonglong, ioReadSyscalls) 0127 P_PROPERTY(qlonglong ioWriteSyscalls READ ioWriteSyscalls) PROPERTY(qlonglong, ioWriteSyscalls) 0128 P_PROPERTY(qlonglong ioCharactersActuallyRead READ ioCharactersActuallyRead) PROPERTY(qlonglong, ioCharactersActuallyRead) 0129 P_PROPERTY(qlonglong ioCharactersActuallyWritten READ ioCharactersActuallyWritten) PROPERTY(qlonglong, ioCharactersActuallyWritten) 0130 P_PROPERTY(qlonglong ioCharactersReadRate READ ioCharactersReadRate) PROPERTY(qlonglong, ioCharactersReadRate) 0131 P_PROPERTY(qlonglong ioCharactersWrittenRate READ ioCharactersWrittenRate) PROPERTY(qlonglong, ioCharactersWrittenRate) 0132 P_PROPERTY(qlonglong ioReadSyscallsRate READ ioReadSyscallsRate) PROPERTY(qlonglong, ioReadSyscallsRate) 0133 P_PROPERTY(qlonglong ioWriteSyscallsRate READ ioWriteSyscallsRate) PROPERTY(qlonglong, ioWriteSyscallsRate) 0134 P_PROPERTY(qlonglong ioCharactersActuallyReadRate READ ioCharactersActuallyReadRate) PROPERTY(qlonglong, ioCharactersActuallyReadRate) 0135 P_PROPERTY(qlonglong ioCharactersActuallyWrittenRate READ ioCharactersActuallyWrittenRate) PROPERTY(qlonglong, ioCharactersActuallyWrittenRate) 0136 // clang-format off 0137 0138 ProcessObject(ProcessModel * processModel, int pid); 0139 void update(KSysGuard::Process *process); 0140 0141 int pid() const { return mPid; } 0142 void setPid(int pid) { mPid = pid; } 0143 QString name() const { KSysGuard::Process *process = mModel->getProcess(mPid); if(process) return process->name().section(QLatin1Char(' '), 0,0); else return QString(); } 0144 QString fullname() const { KSysGuard::Process *process = mModel->getProcess(mPid); if(process) return process->name(); else return QString(); } 0145 0146 public Q_SLOTS: 0147 bool fileExists(const QString &filename); 0148 QString readFile(const QString &filename); 0149 0150 Q_SIGNALS: 0151 void anythingChanged(); 0152 0153 private: 0154 int mPid; 0155 ProcessModel *mModel; 0156 }; 0157 0158 #endif