diff options
Diffstat (limited to 'ksmserver/server.h')
-rw-r--r-- | ksmserver/server.h | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/ksmserver/server.h b/ksmserver/server.h new file mode 100644 index 000000000..bc677752c --- /dev/null +++ b/ksmserver/server.h @@ -0,0 +1,264 @@ +/***************************************************************** +ksmserver - the KDE session management server + +Copyright (C) 2000 Matthias Ettrich <[email protected]> +******************************************************************/ + +#ifndef SERVER_H +#define SERVER_H + +// needed to avoid clash with INT8 defined in X11/Xmd.h on solaris +#define QT_CLEAN_NAMESPACE 1 +#include <tqobject.h> +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqsocketnotifier.h> +#include <tqptrlist.h> +#include <tqvaluelist.h> +#include <tqcstring.h> +#include <tqdict.h> +#include <tqptrqueue.h> +#include <tqptrdict.h> +#include <tdeapplication.h> +#include <tqtimer.h> +#include <dcopobject.h> + +#ifdef __TDE_HAVE_TDEHWLIB +#include <tdehardwaredevices.h> +#endif + +#include "server2.h" + +#include "KSMServerInterface.h" + +#define SESSION_PREVIOUS_LOGOUT "saved at previous logout" +#define SESSION_BY_USER "saved by user" + +typedef TQValueList<TQCString> QCStringList; +class KSMListener; +class KSMConnection; +class KSMClient; + +enum SMType { SM_ERROR, SM_WMCOMMAND, SM_WMSAVEYOURSELF }; +struct SMData + { + SMType type; + TQStringList wmCommand; + TQString wmClientMachine; + TQString wmclass1, wmclass2; + }; +typedef TQMap<WId,SMData> WindowMap; + +class KSMServer : public TQObject, public KSMServerInterface +{ +Q_OBJECT +K_DCOP +k_dcop: + void notifySlot(TQString,TQString,TQString,TQString,TQString,int,int,int,int); + void logoutSoundFinished(int,int); + void autoStart0Done(); + void autoStart1Done(); + void autoStart2Done(); + void kcmPhase1Done(); + void kcmPhase2Done(); +public: + KSMServer( const TQString& windowManager, const TQString& windowManagerAddArgs, bool only_local ); + ~KSMServer(); + + static KSMServer* self(); + + void* watchConnection( IceConn iceConn ); + void removeConnection( KSMConnection* conn ); + + KSMClient* newClient( SmsConn ); + void deleteClient( KSMClient* client ); + + // callbacks + void saveYourselfDone( KSMClient* client, bool success ); + void interactRequest( KSMClient* client, int dialogType ); + void interactDone( KSMClient* client, bool cancelShutdown ); + void phase2Request( KSMClient* client ); + + // error handling + void ioError( IceConn iceConn ); + + // notification + void clientSetProgram( KSMClient* client ); + void clientRegistered( const char* previousId ); + + // public API + void restoreSession( TQString sessionName ); + void startDefaultSession(); + + void shutdown( TDEApplication::ShutdownConfirm confirm, + TDEApplication::ShutdownType sdtype, + TDEApplication::ShutdownMode sdmode ); + + virtual void suspendStartup( TQCString app ); + virtual void resumeStartup( TQCString app ); + + bool checkStatus( bool &logoutConfirmed, bool &maysd, bool &mayrb, + TDEApplication::ShutdownConfirm confirm, + TDEApplication::ShutdownType sdtype, + TDEApplication::ShutdownMode sdmode ); + +public slots: + void cleanUp(); + +private slots: + void newConnection( int socket ); + void processData( int socket ); + void restoreSessionInternal(); + void restoreSessionDoneInternal(); + + void notificationTimeout(); + void protectionTimerTick(); + void protectionTimeout(); + void timeoutQuit(); + void timeoutWMQuit(); + void knotifyTimeout(); + void kcmPhase1Timeout(); + void kcmPhase2Timeout(); + void pendingShutdownTimeout(); + + void autoStart0(); + void autoStart1(); + void autoStart2(); + void tryRestoreNext(); + void startupSuspendTimeout(); + + void cancelShutdown(); + void forceSkipSaveYourself(); + +private: + void handlePendingInteractions(); + void completeShutdownOrCheckpoint(); + void startKilling(); + void performStandardKilling(); + void completeKilling(); + void killWM(); + void completeKillingWM(); + void cancelShutdown( TQString cancellationText ); + void cancelShutdown( KSMClient* c ); + void killingCompleted(); + + void discardSession(); + void storeSession(); + + void startProtection(); + void endProtection(); + void handleProtectionTimeout(); + void updateLogoutStatusDialog(); + + void startApplication( TQStringList command, + const TQString& clientMachine = TQString::null, + const TQString& userId = TQString::null ); + void executeCommand( const TQStringList& command ); + + bool isWM( const KSMClient* client ) const; + bool isWM( const TQString& program ) const; + bool isCM( const KSMClient* client ) const; + bool isCM( const TQString& program ) const; + bool isDesktop( const KSMClient* client ) const; + bool isDesktop( const TQString& program ) const; + bool isNotifier( const KSMClient* client ) const; + bool isNotifier( const TQString& program ) const; + bool isCrashHandler( const KSMClient* client ) const; + bool isCrashHandler( const TQString& program ) const; + bool defaultSession() const; // empty session + void setupXIOErrorHandler(); + + void shutdownInternal( TDEApplication::ShutdownConfirm confirm, + TDEApplication::ShutdownType sdtype, + TDEApplication::ShutdownMode sdmode, + TQString bootOption = TQString::null ); + + void performLegacySessionSave(); + void storeLegacySession( TDEConfig* config ); + void restoreLegacySession( TDEConfig* config ); + void restoreLegacySessionInternal( TDEConfig* config, char sep = ',' ); + TQStringList windowWmCommand(WId w); + TQString windowWmClientMachine(WId w); + WId windowWmClientLeader(WId w); + TQCString windowSessionId(WId w, WId leader); + + bool checkStartupSuspend(); + void finishStartup(); + void resumeStartupInternal(); + + // public dcop interface + void logout( int, int, int ); + virtual void logoutTimed( int, int, TQString ); + TQStringList sessionList(); + TQString currentSession(); + void saveCurrentSession(); + void saveCurrentSessionAs( TQString ); + + TQWidget* startupNotifierIPDlg; + TQWidget* shutdownNotifierIPDlg; + + private: + TQPtrList<KSMListener> listener; + TQPtrList<KSMClient> clients; + + enum State + { + Idle, + LaunchingWM, AutoStart0, KcmInitPhase1, AutoStart1, Restoring, FinishingStartup, // startup + Shutdown, Checkpoint, Killing, KillingWM, WaitingForKNotify // shutdown + }; + State state; + bool dialogActive; + bool saveSession; + int wmPhase1WaitingCount; + int saveType; + TQMap< TQCString, int > startupSuspendCount; + + TDEApplication::ShutdownType shutdownType; + TDEApplication::ShutdownMode shutdownMode; + TQString bootOption; + + bool clean; + KSMClient* clientInteracting; + TQString wm; + TQString wmAddArgs; + TQString sessionGroup; + TQString sessionName; + TQCString launcher; + TQTimer protectionTimer; + TQTimer notificationTimer; + TQTimer restoreTimer; + TQTimer shutdownTimer; + TQString xonCommand; + int logoutSoundEvent; + TQTimer knotifyTimeoutTimer; + TQTimer startupSuspendTimeoutTimer; + bool waitAutoStart2; + bool waitKcmInit2; + TQTimer pendingShutdown; + TDEApplication::ShutdownConfirm pendingShutdown_confirm; + TDEApplication::ShutdownType pendingShutdown_sdtype; + TDEApplication::ShutdownMode pendingShutdown_sdmode; + + // ksplash interface + void upAndRunning( const TQString& msg ); + void publishProgress( int progress, bool max = false ); + + // sequential startup + int appsToStart; + int lastAppStarted; + TQString lastIdStarted; + + TQStringList excludeApps; + + WindowMap legacyWindows; + +#ifdef __TDE_HAVE_TDEHWLIB + TDEHardwareDevices* hwDevices; +#endif + int initialClientCount; + int phase2ClientCount; + int protectionTimerCounter; +}; + +#endif |