⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 linux下的flash播放器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------------------------//// 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 + -