summaryrefslogtreecommitdiffstats
path: root/kdesktop/lockeng.h
blob: 9827090b483be32e135fc08c402369436be6cd48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
//===========================================================================
//
// This file is part of the KDE project
//
// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
//

#ifndef __LOCKENG_H__
#define __LOCKENG_H__

#include <tqwidget.h>
#include <tqthread.h>
#include <kprocess.h>
#include <tqvaluevector.h>
#include "KScreensaverIface.h"
#include "xautolock.h"
#include "xautolock_c.h"

#include <tqdbusconnection.h>

class DCOPClientTransaction;
class TQT_DBusMessage;
class TQT_DBusProxy;

class SaverEngineThreadHelperObject : public TQObject
{
	Q_OBJECT
	
public slots:
	void terminateThread();
	void slotLockProcessWaiting();
	void slotLockProcessFullyActivated();

signals:
	void lockProcessWaiting();
	void lockProcessFullyActivated();
};

//===========================================================================
/**
 * Screen saver engine.  Handles screensaver window, starting screensaver
 * hacks, and password entry.
 */
class SaverEngine : public TQWidget, public KScreensaverIface
{
	Q_OBJECT
public:
	SaverEngine();
	~SaverEngine();

	/**
	 * Lock the screen
	 */
	virtual void lock();

	/**
	 * Save the screen
	 */
	virtual void save();

	/**
	 * Quit the screensaver if running
	 */
	virtual void quit();

	/**
	 * return true if the screensaver is enabled
	 */
	virtual bool isEnabled();

	/**
	 * enable/disable the screensaver
	 */
	virtual bool enable( bool e );

	/**
	 * return true if the screen is currently blanked
	 */
	virtual bool isBlanked();

	/**
	 * Read and apply configuration.
	 */
	virtual void configure();

	/**
	 * Enable or disable "blank only" mode.  This is useful for
	 * laptops where one might not want a cpu thirsty screensaver
	 * draining the battery.
	 */
	virtual void setBlankOnly( bool blankOnly );

	/**
	 * Called by kdesktop_lock when locking is in effect.
	 */
	virtual void saverLockReady();

	/**
	 * @internal
	 */
	void lockScreen(bool DCOP = false);

	/**
	 * Called by KDesktop to wait for saver engage
	 * @internal
	 */
	bool waitForLockEngage();

signals:
	void terminateHelperThread();
	void asyncLock();

public slots:
	void slotLockProcessReady();
	void lockProcessWaiting();
	void lockProcessFullyActivated();
	void handleDBusSignal(const TQT_DBusMessage&);

protected slots:
	void idleTimeout();
	void lockProcessExited();

private slots:
	void handleSecureDialog();
	void slotSAKProcessExited();

	/**
	 * Enable wallpaper exports
	 */
	void enableExports();
	void recoverFromHackingAttempt();

	bool dBusReconnect();

private:
	bool restartDesktopLockProcess();
	void dBusClose();
	bool dBusConnect();
	void onDBusServiceRegistered(const TQString&);
	void onDBusServiceUnregistered(const TQString&);

protected:
	enum SaverState { Waiting, Preparing, Engaging, Saving };
	enum LockType { DontLock, DefaultLock, ForceLock, SecureDialog };
	bool startLockProcess( LockType lock_type );
	bool waitForLockProcessStart();
	void stopLockProcess();
	bool handleKeyPress(XKeyEvent *xke);
	void processLockTransactions();
	xautolock_corner_t applyManualSettings(int);

protected:
	bool mEnabled;

	SaverState mState;
	XAutoLock *mXAutoLock;
	TDEProcess mLockProcess;
	int mTimeout;

	// the original X screensaver parameters
	int mXTimeout;
	int mXInterval;
	int mXBlanking;
	int mXExposures;

	bool mBlankOnly;  // only use the blanker, not the defined saver
	TQValueVector< DCOPClientTransaction* > mLockTransactions;

public:
	SaverEngineThreadHelperObject* m_threadHelperObject;

private:
	TQEventLoopThread* m_helperThread;
	sigset_t mThreadBlockSet;
	TDEProcess* mSAKProcess;
	bool mTerminationRequested;
	bool mSaverProcessReady;
	struct sigaction mSignalAction;
	TQT_DBusConnection dBusConn;
	TQT_DBusProxy* dBusLocal;
	TQT_DBusProxy* dBusWatch;
	TQT_DBusProxy* systemdSession;
};

#endif