kde-workspace/libs/ksysguard/processui/ProcessModel_p.h

219 lines
8.4 KiB
C
Raw Normal View History

2014-11-13 19:30:51 +02:00
/*
KSysGuard, the KDE System Guard
Copyright (c) 2006-2007 John Tapsell <john.tapsell@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef PROCESSMODEL_P_H_
#define PROCESSMODEL_P_H_
#include "processcore/process.h"
#include "ProcessModel.h"
#include <kapplication.h>
#include <kuser.h>
#include <QPixmap>
#include <QObject>
#include <QList>
#include <QVariant>
#include <QHash>
#include <QSet>
#include <QDateTime>
2014-11-13 19:30:51 +02:00
#include <QDebug>
#ifdef Q_WS_X11
#include <kwindowsystem.h>
#include <netwm.h>
#include <QtGui/qx11info_x11.h>
2014-11-13 19:30:51 +02:00
#include <X11/Xatom.h>
#include <kxerrorhandler.h>
struct WindowInfo {
WindowInfo(WId _wid, qlonglong _pid) {
wid = _wid;
pid = 0;
pid = _pid;
}
qlonglong pid;
QPixmap icon;
WId wid;
QString name;
};
#include "config-X11.h"
2014-11-13 19:30:51 +02:00
#endif
namespace KSysGuard { class Processes; }
class ProcessModelPrivate : public QObject
{
Q_OBJECT
public:
ProcessModelPrivate();
~ProcessModelPrivate();
public Q_SLOTS:
#ifdef Q_WS_X11
/** When an X window is changed, this is called */
void windowChanged(WId wid, unsigned int properties);
/** When an X window is created, this is called
*/
void windowAdded(WId wid);
/** When an X window is closed, this is called
*/
void windowRemoved(WId wid);
#endif
/** Change the data for a process. This is called from KSysGuard::Processes
* if @p onlyCpuOrMem is set, only the total cpu usuage is updated.
* process->changes contains a bitfield of what has been changed
*/
void processChanged(KSysGuard::Process *process, bool onlyCpuOrMem);
/** Called from KSysGuard::Processes
* This indicates we are about to insert a process in the model. Emit the appropriate signals
*/
void beginInsertRow( KSysGuard::Process *parent);
/** Called from KSysGuard::Processes
* We have finished inserting a process
*/
void endInsertRow();
/** Called from KSysGuard::Processes
* This indicates we are about to remove a process in the model. Emit the appropriate signals
*/
void beginRemoveRow( KSysGuard::Process *process);
/** Called from KSysGuard::Processes
* We have finished removing a process
*/
void endRemoveRow();
/** Called from KSysGuard::Processes
* This indicates we are about to move a process in the model from one parent process to another. Emit the appropriate signals
*/
void beginMoveProcess(KSysGuard::Process *process, KSysGuard::Process *new_parent);
/** Called from KSysGuard::Processes
* We have finished moving a process
*/
void endMoveRow();
public:
/** Connects to the host */
void setupProcesses();
/** A mapping of running,stopped,etc to a friendly description like 'Stopped, either by a job control signal or because it is being traced.'*/
QString getStatusDescription(KSysGuard::Process::ProcessStatus status) const;
/** Return a qt markup tooltip string for a local user. It will have their full name etc.
* This will be slow the first time, as it practically indirectly reads the whole of /etc/passwd
* But the second time will be as fast as hash lookup as we cache the result
*/
inline QString getTooltipForUser(const KSysGuard::Process *process) const;
/** Return a username for a local user if it can, otherwise just their uid.
* This may have been given from the result of "ps" (but not necessarily).
* If it's not found, then it needs to find out the username from the uid.
* This will be slow the first time, as it practically indirectly reads the whole of /etc/passwd
* But the second time will be as fast as hash lookup as we cache the result
*
* If withuid is set, and the username is found, return: "username (Uid: uid)"
*/
inline QString getUsernameForUser(long uid, bool withuid) const;
/** Return the groupname for a given gid. This is in the form of "gid" if not known, or
* "groupname (Uid: gid)" if known.
*/
inline QString getGroupnameForGroup(long gid) const;
#ifdef Q_WS_X11
/** On X11 system, connects to the signals emitted when windows are created/destroyed */
void setupWindows();
void updateWindowInfo(WId wid, unsigned int properties, bool newWindow);
QMultiHash< long long, WindowInfo *> mPidToWindowInfo; ///< Map a process pid to X window info if available
QHash< WId, WindowInfo *> mWIdToWindowInfo; ///< Map an X window id to window info
#ifdef HAVE_XRES
bool updateXResClientData();
void queryForAndUpdateAllXWindows();
#endif
#endif
virtual void timerEvent ( QTimerEvent * event ); ///< Call dataChanged() for all the processes in mPidsToUpdate
/** @see setIsLocalhost */
bool mIsLocalhost;
/** A caching hash for tooltips for a user.
* @see getTooltipForUser */
mutable QHash<long long,QString> mUserTooltips;
/** A caching hash for username for a user uid, or just their uid if it can't be found (as a long long)
* @see getUsernameForUser */
mutable QHash<long long, QString> mUserUsername;
/** A mapping of a user id to whether this user can log in. We have to guess based on the shell.
* All are set to true to non localhost.
* It is set to:
* 0 if the user cannot login
* 1 is the user can login
* The reason for using an int and not a bool is so that we can do
* \code mUidCanLogin.value(uid,-1) \endcode and thus we get a tristate for whether
* they are logged in, not logged in, or not known yet.
* */
mutable QHash<long long, int> mUidCanLogin;
/** A translated list of headings (column titles) in the order we want to display them. Used in headerData() */
QStringList mHeadings;
bool mShowChildTotals; ///< If set to true, a parent will return the CPU usage of all its children recursively
bool mSimple; //< In simple mode, the model returns everything as flat, with no icons, etc. This is set by changing cmbFilter
QTime mLastUpdated; ///< Time that we last updated the processes.
long long mMemTotal; ///< the total amount of physical memory in kb in the machine. We can used this to determine the percentage of memory an app is using
int mNumProcessorCores; ///< The number of (enabled) processor cores in the this machine
KSysGuard::Processes *mProcesses; ///< The processes instance
QPixmap mBlankPixmap; ///< Used to pad out process names which don't have an icon
/** Show the process command line options in the process name column */
bool mShowCommandLineOptions;
bool mShowingTooltips;
bool mNormalizeCPUUsage;
/** When displaying memory sizes, this is the units it should be displayed in */
ProcessModel::Units mUnits;
ProcessModel::Units mIoUnits;
ProcessModel::IoInformation mIoInformation;
/** The hostname */
QString mHostName;
bool mHaveTimer;
int mTimerId;
QList<long> mPidsToUpdate; ///< A list of pids that we need to emit dataChanged() for regularly
#ifdef HAVE_XRES
bool mHaveXRes; ///< True if the XRes extension is available at run time
QMap<qlonglong, XID> mXResClientResources;
#endif
bool mMovingRow;
bool mRemovingRow;
bool mInsertingRow;
ProcessModel* q;
};
#endif