📄 main.c
字号:
//-----------------------------------------------------------------------------//// Screen savers for KDE//// Copyright (c) Martin R. Jones 1996//#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <signal.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/wait.h>#include <kprocess.h>#include <qapp.h>#include <X11/Xlib.h>#include <X11/Xutil.h>#include <X11/keysym.h>#include <qkeycode.h>#include <qdialog.h>#include <qpushbt.h>#include <qbitmap.h>#include <qpainter.h>#include "xautolock.h"#include "saver.h"#include "main.h"#include "main.moc"#include <kmsgbox.h>KLocale *glocale;extern "C" { extern void startScreenSaver( Drawable d ); extern void stopScreenSaver(); extern int setupScreenSaver(); extern const char *getScreenSaverName(); extern void exposeScreenSaver( int x, int y, int width, int height );}extern void initPasswd();int mode = MODE_NONE, lock = FALSE, passOk = FALSE;bool canGetPasswd;static int lockOnce = FALSE;static int only1Time = 0;static int xs_timeout, xs_interval, xs_prefer_blanking, xs_allow_exposures;static QString pidFile;static KPasswordDlg *passDlg = NULL;static QWidget *saverWidget = NULL;static int desktopWidth = 0, desktopHeight = 0;extern char *ProgramName;extern Bool allowroot;bool grabInput( QWidget *w );void releaseInput();void destroySaverWindow( QWidget *w );static void lockNow( int );static void cleanup( int );void catchSignals();void usage( char *name );ssApp *globalKapp;//----------------------------------------------------------------------------ssApp::ssApp( int &argc, char **argv ) : KApplication( argc, argv ){ KConfig *kssConfig = new KConfig( kapp->kde_configdir() + "/kssrc", kapp->localconfigdir() + "/kssrc" ); kssConfig->setGroup( "kss" ); stars = kssConfig->readBoolEntry( "PasswordAsStars", true ); delete kssConfig;}bool ssApp::x11EventFilter( XEvent *event ){ if ( passDlg ) // pass key presses to password dialog { if ( event->type == KeyPress ) { XKeyEvent *xke = (XKeyEvent *) event; int key = 0; KeySym keysym = 0; XComposeStatus compose; char buffer[2] = ""; XLookupString( xke, buffer, 1, &keysym, &compose ); switch ( keysym ) { case XK_BackSpace: key = Key_Backspace; break; case XK_Return: key = Key_Return; break; case XK_Escape: key = Key_Escape; break; } if ( buffer[0] != '\0' || key != 0 ) { QKeyEvent qke( Event_KeyPress, key, buffer[0], 0 ); passDlg->keyPressed( &qke ); } return TRUE; } return FALSE; } if ( mode == MODE_INSTALL || mode == MODE_TEST ) { if ( (event->type == KeyPress || event->type == ButtonPress || event->type == MotionNotify ) && !passDlg ) { if ( !canGetPasswd || (!lock && !lockOnce) ) qApp->exit_loop(); else { passDlg = new KPasswordDlg( saverWidget, stars ); connect(passDlg, SIGNAL(passOk()), SLOT(slotPassOk())); connect(passDlg, SIGNAL(passCancel()), SLOT(slotPassCancel())); passDlg->move( (QApplication::desktop()->width() - passDlg->width())/2, (QApplication::desktop()->height() - passDlg->height())/2 ); passDlg->show(); } return TRUE; } else if ( event->type == VisibilityNotify ) { if ( event->xvisibility.state != VisibilityUnobscured) { if ( !passDlg ) { saverWidget->raise(); QApplication::flushX(); } } } else if ( event->type == ConfigureNotify ) { if ( !passDlg ) { saverWidget->raise(); QApplication::flushX(); } } else if ( event->type == Expose ) { if (!passDlg) { exposeScreenSaver( event->xexpose.x, event->xexpose.y, event->xexpose.width, event->xexpose.height ); } } } return FALSE;}void ssApp::slotPassOk(){ passOk = TRUE; passDlg->hide(); QApplication::flushX(); delete passDlg; passDlg = NULL; qApp->exit_loop(); QApplication::flushX();}void ssApp::slotPassCancel(){ passOk = FALSE; passDlg->hide(); QApplication::flushX(); delete passDlg; passDlg = NULL; grabInput( saverWidget ); QApplication::flushX();}//----------------------------------------------------------------------------bool grabInput( QWidget *w){ int rv = XGrabKeyboard( qt_xdisplay(), QApplication::desktop()->winId(), True, GrabModeAsync, GrabModeAsync, CurrentTime ); if (rv == AlreadyGrabbed) { return false; } rv = XGrabPointer( qt_xdisplay(), QApplication::desktop()->winId(), True, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask, GrabModeAsync, GrabModeAsync, None, w->cursor().handle(), CurrentTime ); if (rv == AlreadyGrabbed) { return false; } return true;}void releaseInput(){ XUngrabKeyboard( qt_xdisplay(), CurrentTime ); XUngrabPointer( qt_xdisplay(), CurrentTime );}QWidget *createSaverWindow(){ QWidget *w; // WStyle_Customize sets override_redirect w = new QWidget( NULL, "", WStyle_Customize | WStyle_NoBorder ); /* set NoBackground so that the saver can capture the current * screen state if neccessary */ w->setBackgroundMode( QWidget::NoBackground ); XSetWindowAttributes attr; attr.event_mask = KeyPressMask | ButtonPressMask | MotionNotify | VisibilityChangeMask | ExposureMask; // | StructureNotifyMask; XChangeWindowAttributes(qt_xdisplay(), w->winId(), CWEventMask, &attr); QBitmap bm( 1, 1, TRUE ); QCursor c( bm, bm ); w->setCursor( c ); if (grabInput( w ) == false) { // The grab failed - we can't save the window now. destroySaverWindow(w); w = 0; } return w;}void destroySaverWindow( QWidget *w ){ releaseInput(); delete w;}//----------------------------------------------------------------------------QString lockName(QString s){ // note that changes in the pidFile name have also to be done // in kdebase/kcontrol/display/scrnsave.cpp QString name = getenv( "HOME" ); name += "/.kss-" + s + ".pid."; char ksshostname[200]; gethostname(ksshostname, 200); name += ksshostname; return name;}int getLock(QString type){ QString lockFile = lockName(type); int pid = -1; FILE *fp; if ( (fp = fopen( lockFile, "r" ) ) != NULL ) { fscanf( fp, "%d", &pid ); fclose( fp ); } return pid;}void killProcess(int pid){ if ( pid != getpid() && pid > 1 ) { if( kill( pid, SIGTERM ) == 0 ) sleep(1); }}void setLock(QString type){ FILE *fp; pidFile = lockName(type); int pid = getLock( type ); killProcess( pid ); if ( (fp = fopen( pidFile, "w" ) ) != NULL ) { // on some systems, it's long one some in, so a cast may help fprintf( fp, "%ld\n", static_cast<long>(getpid()) ); fclose( fp ); }}/* Verify, if kcheckpass is able to verify passwords. * I cannot use KProcess here, as it needs ProcessEvents */bool canReadPasswdDatabase(){ KProcess chkpass; QString kcp_binName = ""; kcp_binName += KApplication::kde_bindir(); kcp_binName += "/kcheckpass"; chkpass.clearArguments(); chkpass << kcp_binName; bool ret = chkpass.start(KProcess::DontCare, KProcess::Stdin); if (ret == false) return false; chkpass.closeStdin(); int timeout = 1000; while ( timeout != 0 ) { if (! chkpass.isRunning() ) break; else { globalKapp->processEvents();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -