📄 main.c
字号:
timeout--; usleep(10000); } } int canRead = ( chkpass.normalExit() && (chkpass.exitStatus() != 2) ); return canRead;}//----------------------------------------------------------------------------int main( int argc, char *argv[] ){ // drop root privileges temporarily#ifdef HAVE_SETEUID seteuid(getuid());#else setreuid(-1, getuid());#endif // HAVE_SETEUID Window saveWin = 0; int timeout = 600; ProgramName = argv[0]; ssApp a( argc, argv ); globalKapp = &a; glocale = new KLocale("klock"); if ( argc == 1 ) usage( argv[0] ); enum parameter_code { install, setup, preview, inroot, test, delay, arg_lock, corners, descr, arg_nice, help, allow_root, unknown } parameter; char *strings[] = { "-install", "-setup", "-preview", "-inroot", "-test", "-delay", "-lock", "-corners", "-desc", "-nice", "--help", "-allow-root", 0 }; int i = 1; while ( i < argc) { parameter = unknown; for ( int p = 0 ; strings[p]; p++) if ( !strcmp( argv[i], strings[p]) ) { parameter = static_cast<parameter_code>(p); break; } switch (parameter) { case install: mode = MODE_INSTALL; break; case setup: mode = MODE_SETUP; break; case preview: mode = MODE_PREVIEW; saveWin = atol( argv[++i] ); break; case inroot: mode = MODE_PREVIEW; saveWin = kapp->desktop()->winId(); break; case test: mode = MODE_TEST; break; case delay: timeout = atoi( argv[++i] ) * 60; if( timeout == 0 ) only1Time = 1; else if( timeout < 60 ) timeout = 60; break; case arg_lock: lock = TRUE; break; case corners: setCorners( argv[++i] ); break; case descr: printf( "%s\n", getScreenSaverName() ); exit( 0 ); case arg_nice:#ifdef HAVE_NICE nice( atoi( argv[++i] ) );#else warning(glocale->translate( "Option %s is not support on " "this plattform!"), strings[arg_nice]);#endif break; case allow_root: allowroot = 1; break; case help: usage( argv[0] ); break; default: // unknown debug("unknown parameter"); break; } i++; } // regain root privileges#ifdef HAVE_SETEUID seteuid(0);#else setreuid(-1, 0);#endif // HAVE_SETEUID initPasswd(); // ... and drop them again before doing anything important setuid(getuid()); // now check, if I can verify passwords (might be a problem // only with shadow passwords, due to missing SUID on // kcheckpass program.#ifdef HAVE_SHADOW canGetPasswd = canReadPasswdDatabase();#else canGetPasswd = true;#endif // Get the size of the desktop XWindowAttributes attr; if (XGetWindowAttributes(qt_xdisplay(), RootWindow(qt_xdisplay(), qt_xscreen()), &attr) == 0) { debug("Failed getting Root window size"); } else { desktopWidth = attr.width; desktopHeight = attr.height; } catchSignals(); if ( mode == MODE_INSTALL ) { if (!canGetPasswd && lock) { QString tmp = glocale->translate( "Warning: You won't be able to lock the screen!\n\n" "Your system uses shadow passwords.\n" "Please contact your system administrator.\n" "Tell him that you need suid for the kcheckpass program!"); KMsgBox::message(NULL, glocale->translate("Shadow Passwords"), tmp, KMsgBox::EXCLAMATION); } setLock("install"); XGetScreenSaver( qt_xdisplay(), &xs_timeout, &xs_interval, &xs_prefer_blanking, &xs_allow_exposures ); XSetScreenSaver( qt_xdisplay(), 0, xs_interval, xs_prefer_blanking, xs_allow_exposures ); initAutoLock(); while ( 1 ) { if ( waitTimeout( timeout ) == FORCE_LOCK ) lockOnce = TRUE; // if another saver is in test-mode, kill it killProcess(getLock("test")); saverWidget = createSaverWindow(); if (saverWidget) { saverWidget->setFixedSize(desktopWidth, desktopHeight); saverWidget->move( 0, 0 ); saverWidget->show(); saverWidget->raise(); QApplication::flushX(); saveWin = saverWidget->winId(); startScreenSaver( saveWin ); a.enter_loop(); stopScreenSaver(); destroySaverWindow( saverWidget ); lockOnce = FALSE; if( only1Time ) break; } } cleanupAutoLock(); } else if ( mode == MODE_TEST ) { if( lock ) { fprintf(stderr, glocale->translate( "\nplease don't use -test together with -lock.\n" "use klock instead.\n\n") ); exit(1); } setLock("test"); saverWidget = createSaverWindow(); if (saverWidget) { saverWidget->setFixedSize(desktopWidth, desktopHeight); saverWidget->move( 0, 0 ); saverWidget->show(); saverWidget->raise(); QApplication::flushX(); saveWin = saverWidget->winId(); startScreenSaver( saveWin ); a.enter_loop(); stopScreenSaver(); destroySaverWindow( saverWidget ); } } else if ( mode == MODE_PREVIEW ) { char mode[32]; sprintf(mode, "preview%ld", (unsigned long) saveWin); setLock(mode); startScreenSaver( saveWin ); a.exec(); } else if ( mode == MODE_SETUP ) { setupScreenSaver(); } else usage( argv[0] ); if ( !pidFile.isEmpty() ) { remove( pidFile ); } return 0;}//----------------------------------------------------------------------------void catchSignals(){ // SIGUSR1 forces a lock signal(SIGUSR1, lockNow); // These signals are captured to clean-up before exiting signal(SIGINT, cleanup); /* Interrupt */ signal(SIGTERM, cleanup); /* Terminate */ signal(SIGABRT, cleanup); signal(SIGALRM, cleanup); signal(SIGFPE, cleanup); signal(SIGILL, cleanup); signal(SIGPIPE, cleanup); signal(SIGQUIT, cleanup); signal(SIGSEGV, cleanup);#ifdef SIGBUS signal(SIGBUS, cleanup);#endif#ifdef SIGEMT signal(SIGEMT, cleanup);#endif#ifdef SIGPOLL signal(SIGPOLL, cleanup);#endif#ifdef SIGSYS signal(SIGSYS, cleanup);#endif#ifdef SIGTRAP signal(SIGTRAP, cleanup);#endif#ifdef SIGVTALRM signal(SIGVTALRM, cleanup);#endif#ifdef SIGXCPU signal(SIGXCPU, cleanup);#endif#ifdef SIGXFSZ signal(SIGXFSZ, cleanup);#endif}static void lockNow( int ){ forceTimeout(); // SIGUSR1 forces a lock signal(SIGUSR1, lockNow);}static void cleanup( int id ){ if ( !pidFile.isEmpty() ) { remove( pidFile ); } if ( mode == MODE_INSTALL ) { if (id != SIGPIPE) { XSetScreenSaver( qt_xdisplay(), xs_timeout, xs_interval, xs_prefer_blanking, xs_allow_exposures ); cleanupAutoLock(); } } exit(1);}void usage( char *name ){ printf( glocale->translate( "Usage: %s -install|-setup|-test|-desc|-preview wid|-inroot\n"\ " [-corners xxxx] [-delay num] [-lock] [-allow-root] [-nice num]\n"), name ); printf( glocale->translate( " -corners xxxx Placing cursor in corner performs action:\n"\ " x = i no action (ignore)\n"\ " x = s save screen\n"\ " x = l lock screen\n"\ " order: top-left, top-right, bottom-left, bottom-right\n"\ " -delay num Amount of idle time before screen saver\n"\ " starts (default 10min)\n"\ " -desc Print the screen saver's description to stdout\n"\ " -install Install screen saver\n"\ " -lock Require password to stop screen saver\n"\ " -allow-root Accept root password to unlock\n"\ " -nice num Run with specified nice value\n\n"\ " -preview wid Run in the specified XWindow\n"\ " -inroot Run in the root window\n"\ " -setup Setup screen saver\n"\ " -test Invoke the screen saver immediately\n")); exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -