/* This file is part of the KDE project
Copyright ( C ) 1999 David Faure
Copyright ( c ) 2003 Oswald Buddenhagen < ossi @ 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 .
*/
# include "lockprocess.h"
# include "main.h"
# include "kdesktopsettings.h"
# include <kcmdlineargs.h>
# include <klocale.h>
# include <kglobal.h>
# include <kdebug.h>
# include <kglobalsettings.h>
# include <dcopref.h>
# include <kdmtsak.h>
# include <stdlib.h>
# include <X11/Xlib.h>
# include <fixx11h.h>
// [FIXME] Add GUI configuration checkboxes for these three settings (see kdesktoprc [ScreenSaver] UseUnmanagedLockWindows, DelaySaverStart, and UseTDESAK)
bool trinity_desktop_lock_use_system_modal_dialogs = FALSE ;
bool trinity_desktop_lock_delay_screensaver_start = FALSE ;
bool trinity_desktop_lock_use_sak = FALSE ;
bool trinity_desktop_lock_forced = FALSE ;
bool MyApp : : x11EventFilter ( XEvent * ev )
{
if ( ev - > type = = XKeyPress | | ev - > type = = ButtonPress )
emit activity ( ) ;
else if ( ev - > type = = MotionNotify ) {
time_t tick = time ( 0 ) ;
if ( tick ! = lastTick ) {
lastTick = tick ;
emit activity ( ) ;
}
}
return KApplication : : x11EventFilter ( ev ) ;
}
static KCmdLineOptions options [ ] =
{
{ " forcelock " , I18N_NOOP ( " Force session locking " ) , 0 } ,
{ " dontlock " , I18N_NOOP ( " Only start screensaver " ) , 0 } ,
{ " securedialog " , I18N_NOOP ( " Launch the secure dialog " ) , 0 } ,
{ " blank " , I18N_NOOP ( " Only use the blank screensaver " ) , 0 } ,
KCmdLineLastOption
} ;
// -----------------------------------------------------------------------------
int main ( int argc , char * * argv )
{
KLocale : : setMainCatalogue ( " kdesktop " ) ;
KCmdLineArgs : : init ( argc , argv , " kdesktop_lock " , I18N_NOOP ( " KDesktop Locker " ) , I18N_NOOP ( " Session Locker for KDesktop " ) , " 2.0 " ) ;
KCmdLineArgs : : addCmdLineOptions ( options ) ;
KCmdLineArgs * args = KCmdLineArgs : : parsedArgs ( ) ;
if ( args - > isSet ( " forcelock " ) )
trinity_desktop_lock_forced = TRUE ;
putenv ( strdup ( " SESSION_MANAGER= " ) ) ;
KApplication : : disableAutoDcopRegistration ( ) ; // not needed
int kdesktop_screen_number = 0 ;
int starting_screen = 0 ;
bool child = false ;
int parent_connection = 0 ; // socket to the parent saver
TQValueList < int > child_sockets ;
if ( KGlobalSettings : : isMultiHead ( ) )
{
Display * dpy = XOpenDisplay ( NULL ) ;
if ( ! dpy ) {
fprintf ( stderr ,
" %s: FATAL ERROR: couldn't open display '%s' \n " ,
argv [ 0 ] , XDisplayName ( NULL ) ) ;
exit ( 1 ) ;
}
int number_of_screens = ScreenCount ( dpy ) ;
starting_screen = kdesktop_screen_number = DefaultScreen ( dpy ) ;
int pos ;
TQCString display_name = XDisplayString ( dpy ) ;
XCloseDisplay ( dpy ) ;
kdDebug ( ) < < " screen " < < number_of_screens < < " " < < kdesktop_screen_number < < " " < < display_name < < " " < < starting_screen < < endl ;
dpy = 0 ;
if ( ( pos = display_name . findRev ( ' . ' ) ) ! = - 1 )
display_name . remove ( pos , 10 ) ;
TQCString env ;
if ( number_of_screens ! = 1 ) {
for ( int i = 0 ; i < number_of_screens ; i + + ) {
if ( i ! = starting_screen ) {
int fd [ 2 ] ;
if ( pipe ( fd ) ) {
perror ( " pipe " ) ;
break ;
}
if ( fork ( ) = = 0 ) {
child = true ;
kdesktop_screen_number = i ;
parent_connection = fd [ 0 ] ;
// break here because we are the child process, we don't
// want to fork() anymore
break ;
} else {
child_sockets . append ( fd [ 1 ] ) ;
}
}
}
env . sprintf ( " DISPLAY=%s.%d " , display_name . data ( ) ,
kdesktop_screen_number ) ;
kdDebug ( ) < < " env " < < env < < endl ;
if ( putenv ( strdup ( env . data ( ) ) ) ) {
fprintf ( stderr ,
" %s: WARNING: unable to set DISPLAY environment variable \n " ,
argv [ 0 ] ) ;
perror ( " putenv() " ) ;
}
}
}
MyApp app ;
kdDebug ( ) < < " app " < < kdesktop_screen_number < < " " < < starting_screen < < " " < < child < < " " < < child_sockets . count ( ) < < " " < < parent_connection < < endl ;
app . disableSessionManagement ( ) ;
KGlobal : : locale ( ) - > insertCatalogue ( " libdmctl " ) ;
// we need to read from the right rc file - possibly taking screen number in account
KDesktopSettings : : instance ( " kdesktoprc " ) ;
trinity_desktop_lock_use_system_modal_dialogs = ! KDesktopSettings : : useUnmanagedLockWindows ( ) ;
trinity_desktop_lock_delay_screensaver_start = KDesktopSettings : : delaySaverStart ( ) ;
trinity_desktop_lock_use_sak = KDesktopSettings : : useTDESAK ( ) ;
LockProcess process ( child , args - > isSet ( " blank " ) ) ;
if ( ! child )
process . setChildren ( child_sockets ) ;
else
process . setParent ( parent_connection ) ;
bool rt ;
bool sig = false ;
if ( ! child & & args - > isSet ( " forcelock " ) )
{
rt = process . lock ( ) ;
sig = true ;
}
else if ( child | | args - > isSet ( " dontlock " ) ) {
rt = process . dontLock ( ) ;
}
else if ( child | | args - > isSet ( " securedialog " ) ) {
int retcode = tde_sak_verify_calling_process ( ) ;
if ( retcode = = 0 ) {
rt = process . runSecureDialog ( ) ;
}
else {
return 1 ;
}
}
else {
rt = process . defaultSave ( ) ;
}
if ( ! rt ) {
return 1 ;
}
if ( sig )
{
DCOPRef ref ( " kdesktop " , " KScreensaverIface " ) ;
ref . send ( " saverLockReady " ) ;
}
return app . exec ( ) ;
}
# include "main.moc"