You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
5.1 KiB
C++
230 lines
5.1 KiB
C++
//
|
|
// This file is part of the TDE project
|
|
//
|
|
// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
|
|
//
|
|
|
|
#ifndef __LOCKENG_H__
|
|
#define __LOCKENG_H__
|
|
|
|
#include <tqthread.h>
|
|
#include <tdeprocess.h>
|
|
#include <tqvaluevector.h>
|
|
#include "KScreensaverIface.h"
|
|
#include "xautolock.h"
|
|
#include "xautolock_c.h"
|
|
|
|
#include <tqdbusconnection.h>
|
|
|
|
#ifdef WITH_TDEHWLIB
|
|
class TDECryptographicCardDevice;
|
|
#else
|
|
#define TDECryptographicCardDevice void
|
|
#endif
|
|
|
|
/**
|
|
* Screen saver engine. Handles communication with the lock process.
|
|
* The engine is split into two parts, the 'SaverEngine' running in the GUI thread and
|
|
* the 'SaverEngineEventHandler' running in a separate thread and eventloop.
|
|
* The 'SaverEngine' handles communication with X11, DCOP and DBUS while the
|
|
* 'SaverEngineEventHandler' handles communication with the actual lock process.
|
|
* Several actions require cooperation of the two parts, so in various methods
|
|
* there will be inter-thread calls (using timers or by emitting signals) to
|
|
* trigger the other side remaining logic.
|
|
* This complex design is necessary to avoid blocking the main GUI application event loop,
|
|
* which has several tasks to manage and therefore can't affort to wait in a suspended state.
|
|
* This was previously leading to deadlock when DCOP calls where executed on the secondary
|
|
* thread/eventloop, for example when changing desktop while the lock process was restarting.
|
|
*/
|
|
|
|
class DCOPClientTransaction;
|
|
class TQT_DBusMessage;
|
|
class TQT_DBusProxy;
|
|
class SaverEngineEventHandler;
|
|
|
|
// Type of lock screen
|
|
enum LockType : int
|
|
{
|
|
DontLock = 0,
|
|
DefaultLock,
|
|
ForceLock,
|
|
SecureDialog
|
|
};
|
|
|
|
enum SaverState
|
|
{
|
|
Waiting,
|
|
Preparing,
|
|
Engaging,
|
|
Saving
|
|
};
|
|
|
|
class SaverEngine : public TQObject, public KScreensaverIface
|
|
{
|
|
friend class SaverEngineEventHandler;
|
|
|
|
TQ_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();
|
|
|
|
void lockScreen(bool DCOP = false);
|
|
|
|
void lockScreenAndDoNewSession();
|
|
void lockScreenAndSwitchSession(int vt);
|
|
|
|
void enableExports(); // Enable wallpaper exports
|
|
|
|
signals:
|
|
void activateSaverOrLockSignal(LockType lock_type);
|
|
void lockScreenSignal(bool);
|
|
void terminateEventHandlerThread();
|
|
|
|
public slots:
|
|
void handleDBusSignal(const TQT_DBusMessage&);
|
|
void terminateTDESession();
|
|
|
|
protected slots:
|
|
void idleTimeout();
|
|
|
|
private slots:
|
|
void cryptographicCardInserted(TDECryptographicCardDevice*);
|
|
void cryptographicCardRemoved(TDECryptographicCardDevice*);
|
|
void cardStartupTimeout();
|
|
bool dBusReconnect();
|
|
|
|
// The following slots are invoked by corresponding methods named without the 'GUI' suffix
|
|
// in 'SaverEngineEventHandler' to complete the remaining X11 part of the actions
|
|
void activateSaverOrLockGUI();
|
|
void lockProcessFullyActivatedGUI();
|
|
void lockScreenGUI();
|
|
void stopLockProcessGUI();
|
|
|
|
private:
|
|
void dBusClose();
|
|
bool dBusConnect();
|
|
void onDBusServiceRegistered(const TQString&);
|
|
void onDBusServiceUnregistered(const TQString&);
|
|
|
|
protected:
|
|
void processLockTransactions();
|
|
xautolock_corner_t applyManualSettings(int);
|
|
|
|
protected:
|
|
bool mEnabled;
|
|
|
|
XAutoLock *mXAutoLock;
|
|
int mTimeout;
|
|
|
|
// the original X screensaver parameters
|
|
int mXTimeout;
|
|
int mXInterval;
|
|
int mXBlanking;
|
|
int mXExposures;
|
|
|
|
TQValueVector< DCOPClientTransaction* > mLockTransactions;
|
|
|
|
public:
|
|
bool mBlankOnly; // only use the blanker, not the defined saver // protected
|
|
SaverEngineEventHandler *m_saverEngineEventHandler;
|
|
|
|
private:
|
|
TQEventLoopThread* m_eventHandlerThread;
|
|
bool mNewVTAfterLockEngage;
|
|
bool mValidCryptoCardInserted;
|
|
int mSwitchVTAfterLockEngage;
|
|
struct sigaction mSignalAction;
|
|
TQT_DBusConnection dBusConn;
|
|
TQT_DBusProxy *dBusLocal;
|
|
TQT_DBusProxy *dBusWatch;
|
|
TQT_DBusProxy *systemdSession;
|
|
};
|
|
|
|
class SaverEngineEventHandler : public TQObject
|
|
{
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
SaverEngineEventHandler(SaverEngine *engine);
|
|
|
|
SaverState getState() const { return m_state; }
|
|
|
|
void lockCompleted();
|
|
void lockFullyActivated();
|
|
void lockReady();
|
|
void terminateLockProcess();
|
|
|
|
public slots:
|
|
bool activateSaverOrLock(LockType lock_type);
|
|
void lockScreen(bool DCOP = false);
|
|
bool restartLockProcess();
|
|
void saveScreen();
|
|
void stopLockProcess();
|
|
void terminateThread();
|
|
|
|
protected slots:
|
|
void slotLockProcessExited();
|
|
void slotSAKProcessExited();
|
|
|
|
protected:
|
|
void startSAKProcess();
|
|
|
|
bool m_saverProcessReady;
|
|
bool m_lockProcessRestarting;
|
|
bool m_terminationRequest;
|
|
SaverState m_state;
|
|
SaverEngine *m_saverEngine;
|
|
TDEProcess *m_SAKProcess;
|
|
TDEProcess m_lockProcess;
|
|
};
|
|
|
|
#endif
|
|
|