//===========================================================================
//
// This file is part of the TDE project
//
// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
// Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org>
// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net>
//

#ifndef __LOCKENG_H__
#define __LOCKENG_H__

#include <kgreeterplugin.h>
#include <kprocess.h>
#include <kpixmap.h>
#include <krootpixmap.h>

#include <tqwidget.h>
#include <tqtimer.h>
#include <tqvaluestack.h>
#include <tqmessagebox.h>
#include <tqpixmap.h>
#include <tqdatetime.h>
#include <tqthread.h>

#include <X11/Xlib.h>

class KLibrary;
class KWinModule;
class KSMModalDialog;
class LockProcess;
#ifdef WITH_TDEHWLIB
class TDECryptographicCardDevice;
#else
#define TDECryptographicCardDevice void
#endif

struct GreeterPluginHandle {
	KLibrary *library;
	kgreeterplugin_info *info;
};

#define FIFO_DIR "/tmp/tdesocket-global"
#define FIFO_FILE "/tmp/tdesocket-global/kdesktoplockcontrol-%d"
#define FIFO_FILE_OUT "/tmp/tdesocket-global/kdesktoplockcontrol_out-%d"

typedef TQValueList<Window> TQXLibWindowList;

//===========================================================================
//
// Control pipe handler
//
class ControlPipeHandlerObject : public TQObject
{
	Q_OBJECT

	public:
		ControlPipeHandlerObject();
		~ControlPipeHandlerObject();

	public slots:
		void run();
		void terminateThread();

	signals:
		void processCommand(TQString);

	public:
		LockProcess* mParent;

	private:
		bool mRunning;
		bool mTerminate;
		pthread_t mThreadID;
};

//===========================================================================
//
// Screen saver handling process.  Handles screensaver window,
// starting screensaver hacks, and password entry.
//
class LockProcess : public TQWidget
{
	Q_OBJECT

	public:
		LockProcess();
		~LockProcess();

		void init(bool child_saver = false, bool useBlankOnly = false);

		bool lock();

		bool defaultSave();

		bool dontLock();

		bool runSecureDialog();
		bool inSecureDialog();

		void setChildren(TQValueList<int> children) { child_sockets = children; }
		void setParent(int fd) { mParent = fd; }

		void msgBox( TQMessageBox::Icon type, const TQString &txt );
		int execDialog( TQDialog* dlg );

		TDECryptographicCardDevice* cryptographicCardDevice();

	signals:
		void terminateHelperThread();

	public slots:
		void quitSaver();
		void preparePopup();
		void cleanupPopup();
		void desktopResized();
		void doDesktopResizeFinish();
		void doFunctionKeyBroadcast();
		void slotPaintBackground(const TQPixmap &pm);
		void slotForcePaintBackground();

	protected:
		virtual bool x11Event(XEvent *);
		virtual void timerEvent(TQTimerEvent *);
		virtual void resizeEvent(TQResizeEvent *);

	private slots:
		void hackExited(TDEProcess *);
		void signalPipeSignal();
		bool startLock();
		void suspend();
		void checkDPMSActive();
		void slotDeadTimePassed();
		void windowAdded( WId );
		void resumeUnforced();
		void displayLockDialogIfNeeded();
		void closeDialogAndStartHack();
		bool closeCurrentWindow();
		void repaintRootWindowIfNeeded();
		void startSecureDialog();
		void slotMouseActivity(XEvent *event);
		void processInputPipeCommand(TQString command);
		void cryptographicCardInserted(TDECryptographicCardDevice*);
		void cryptographicCardRemoved(TDECryptographicCardDevice*);
		void cryptographicCardPinRequested(TQString prompt, TDECryptographicCardDevice* cdevice);
		void signalPassDlgToAttemptCardLogin();
		void signalPassDlgToAttemptCardAbort();

	private:
		void configure();
		void readSaver();
		void createSaverWindow();
		void hideSaverWindow();
		void saveVRoot();
		void setVRoot(Window win, Window rw);
		void removeVRoot(Window win);
		void setTransparentBackgroundARGB();
		bool grabKeyboard();
		bool grabMouse();
		bool grabInput();
		void ungrabInput();
		void cantLock(const TQString &reason);
		bool startSaver(bool notify_ready = false);
		void stopSaver();
		bool startHack();
		void stopHack();
		void setupSignals();
		bool checkPass();
		void stayOnTop();
		void lockXF86();
		void unlockXF86();
		void showVkbd();
		void hideVkbd();
		void saverReady();
		void saverReadyIfNeeded();
		bool forwardVkbdEvent( XEvent* event );
		void sendVkbdFocusInOut( WId window, Time t );
		void windowAdded( WId window, bool managed );
		void resume( bool force );
		static TQVariant getConf(void *ctx, const char *key, const TQVariant &dflt);
		void generateBackingImages();
		void fullyOnline();

		bool        mLocked;
		int         mLockGrace;
		int         mPriority;
		bool        mBusy;
		TDEProcess    mHackProc;
		int         mRootWidth;
		int         mRootHeight;
		TQString     mSaverExec;
		TQString     mSaver;
		bool        mOpenGLVisual;
		bool        child_saver;
		TQValueList<int> child_sockets;
		int         mParent;
		bool        mUseBlankOnly;
		bool        mShowLockDateTime;
		bool        mSuspended;
		TQTimer      mSuspendTimer;
		bool        mVisibility;
		TQTimer      mCheckDPMS;
		TQValueStack< TQWidget* > mDialogs;
		bool        mRestoreXF86Lock;
		bool        mForbidden;
		TQStringList mPlugins, mPluginOptions;
		TQString     mMethod;
		GreeterPluginHandle greetPlugin;
		TQPixmap     mSavedScreen;
		int         mAutoLogoutTimerId;
		int         mAutoLogoutTimeout;
		bool        mAutoLogout;

		TQTimer      *resizeTimer;
		unsigned int  mkeyCode;

		TQTimer      *hackResumeTimer;

		TDEProcess*   mVkbdProcess;
		KWinModule* mKWinModule;
		struct VkbdWindow {
			WId id;
			TQRect rect;
		};
		TQValueList< VkbdWindow > mVkbdWindows;
		WId         mVkbdLastEventWindow;

		bool        mPipeOpen;
		int         mPipe_fd;
		bool        mPipeOpen_out;
		int         mPipe_fd_out;

		bool        mInfoMessageDisplayed;
		bool        mDialogControlLock;
		bool        mForceReject;
		TQDialog    *currentDialog;

		TQTimer*    mEnsureScreenHiddenTimer;
		TQTimer*    mForceContinualLockDisplayTimer;
		TQTimer*    mEnsureVRootWindowSecurityTimer;
		TQTimer*    mHackDelayStartupTimer;

		int         mHackDelayStartupTimeout;
		bool        mHackStartupEnabled;
		bool        mOverrideHackStartupEnabled;
		bool        mResizingDesktopLock;
		bool        mFullyOnlineSent;

		bool        mClosingWindows;
		bool        mInSecureDialog;
		bool        mHackActive;

		TQPixmap    backingPixmap;
		KRootPixmap *m_rootPixmap;
		int         mBackingStartupDelayTimer;
		TQPixmap    mArgbTransparentBackgroundPixmap;

		KSMModalDialog* m_startupStatusDialog;

		TQDateTime mlockDateTime;

		bool m_mouseDown;
		int m_mousePrevX;
		int m_mousePrevY;
		int m_dialogPrevX;
		int m_dialogPrevY;

		bool m_notifyReadyRequested;
		TDECryptographicCardDevice* m_loginCardDevice;

		TQWidget* m_maskWidget;
		Window m_saverRootWindow;

		ControlPipeHandlerObject* mControlPipeHandler;
		TQEventLoopThread*        mControlPipeHandlerThread;

	friend class ControlPipeHandlerObject;
};

#endif

