commit 057932620ba8355a6506b9d437518e253ba14ed9 Author: Timothy Pearson Date: 1327619240 -0600 Clean up lock screen internals This cleanup is part of an effort to resolve Bug 810, but a new Qt3 version is required to fully resolve it diff --git a/kdesktop/lock/autologout.cc b/kdesktop/lock/autologout.cc index 22b449c..bef39dd 100644 --- a/kdesktop/lock/autologout.cc +++ b/kdesktop/lock/autologout.cc @@ -82,6 +82,8 @@ AutoLogout::AutoLogout(LockProcess *parent) : TQDialog(parent, "password dialog" mCountdownTimerId = startTimer(1000/25); connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity())); + + setFixedSize( sizeHint() ); } AutoLogout::~AutoLogout() diff --git a/kdesktop/lock/infodlg.cc b/kdesktop/lock/infodlg.cc index f5f35b9..3fbc276 100644 --- a/kdesktop/lock/infodlg.cc +++ b/kdesktop/lock/infodlg.cc @@ -99,6 +99,7 @@ InfoDlg::InfoDlg(LockProcess *parent) frameLayout->addLayout( layStatus, 1, 1 ); installEventFilter(this); + setFixedSize( sizeHint() ); } InfoDlg::~InfoDlg() diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc index 0863a22..f3eeee0 100644 --- a/kdesktop/lock/lockdlg.cc +++ b/kdesktop/lock/lockdlg.cc @@ -215,6 +215,7 @@ void PasswordDlg::init(GreeterPluginHandle *plugin) mNewSessButton->hide(); installEventFilter(this); + setFixedSize( sizeHint() ); mFailedTimerId = 0; mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); @@ -598,6 +599,7 @@ void PasswordDlg::show() { TQDialog::show(); TQApplication::flushX(); + setFixedSize( sizeHint() ); } void PasswordDlg::slotStartNewSession() @@ -818,6 +820,8 @@ void PasswordDlg::slotSwitchUser() connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(reject()) ); vbox2->addWidget( btn ); + dialog.setFixedSize( dialog.sizeHint() ); + int ret = static_cast< LockProcess* >(parent())->execDialog( &dialog ); if (ret != TQDialog::Rejected) { TQDialog::reject(); diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 5acc96e..9648bbc 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -4,7 +4,7 @@ // // Copyright (c) 1999 Martin R. Jones // Copyright (c) 2003 Oswald Buddenhagen -// Copyright (c) 2010-2011 Timothy Pearson +// Copyright (c) 2010-2012 Timothy Pearson // //kdesktop keeps running and checks user inactivity @@ -111,6 +111,10 @@ Status DPMSInfo ( Display *, CARD16 *, BOOL * ); #define LOCK_GRACE_DEFAULT 5000 #define AUTOLOGOUT_DEFAULT 600 +// FIXME +// This should be defined if Qt 3.4.0 or higher is in use +// #define KEEP_MOUSE_UNGRABBED 1 + // These lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special multimedia keys #define XF86XK_AudioMute 0x1008FF12 #define XF86XK_AudioRaiseVolume 0x1008FF13 @@ -183,6 +187,10 @@ LockProcess::LockProcess(bool child, bool useBlankOnly) mBackingStartupDelayTimer(0), m_startupStatusDialog(NULL) { +#ifdef KEEP_MOUSE_UNGRABBED + setNFlags(WX11DisableMove|WX11DisableClose|WX11DisableShade|WX11DisableMinimize|WX11DisableMaximize); +#endif + setupSignals(); setupPipe(); @@ -267,7 +275,11 @@ LockProcess::LockProcess(bool child, bool useBlankOnly) #endif #if (QT_VERSION-0 >= 0x030200) // XRANDR support - connect( kapp->desktop(), TQT_SIGNAL( resized( int )), TQT_SLOT( desktopResized())); + connect( kapp->desktop(), TQT_SIGNAL( resized( int )), TQT_SLOT( desktopResized())); +#endif + +#ifdef KEEP_MOUSE_UNGRABBED + setEnabled(false); #endif greetPlugin.library = 0; @@ -874,7 +886,6 @@ void LockProcess::createSaverWindow() // this is a security risk and has been deactivated--welcome to the 21st century folks! // setBackgroundMode(TQWidget::NoBackground); - setCursor( tqblankCursor ); setGeometry(0, 0, mRootWidth, mRootHeight); kdDebug(1204) << "Saver window Id: " << winId() << endl; @@ -884,7 +895,6 @@ void LockProcess::desktopResized() { mBusy = true; suspend(); - setCursor( tqblankCursor ); // Get root window size XWindowAttributes rootAttr; @@ -1087,6 +1097,7 @@ bool LockProcess::grabInput() } } +#ifndef KEEP_MOUSE_UNGRABBED if (!grabMouse()) { usleep(100000); @@ -1096,6 +1107,7 @@ bool LockProcess::grabInput() return false; } } +#endif lockXF86(); @@ -1150,7 +1162,6 @@ bool LockProcess::startSaver() createSaverWindow(); move(0, 0); show(); - setCursor( tqblankCursor ); raise(); XSync(qt_xdisplay(), False); @@ -1313,6 +1324,8 @@ void LockProcess::repaintRootWindowIfNeeded() bool LockProcess::startHack() { + setCursor( tqblankCursor ); + if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE); if (currentDialog || (!mDialogs.isEmpty())) @@ -1429,6 +1442,7 @@ void LockProcess::stopHack() mHackProc.kill(SIGKILL); } } + setCursor( tqarrowCursor ); } //--------------------------------------------------------------------------- @@ -1730,7 +1744,6 @@ void LockProcess::doFunctionKeyBroadcast() { mDialogControlLock = false; } } - setCursor( tqblankCursor ); DCOPRef ref( "*", "MainApplication-Interface"); ref.send("sendFakeKey", DCOPArg(mkeyCode , "unsigned int")); diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index c0b8e24..0cbef60 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -45,8 +45,9 @@ bool trinity_desktop_lock_forced = FALSE; bool MyApp::x11EventFilter( XEvent *ev ) { - if (ev->type == XKeyPress || ev->type == ButtonPress) + if (ev->type == XKeyPress || ev->type == ButtonPress) { emit activity(); + } else if (ev->type == MotionNotify) { time_t tick = time( 0 ); if (tick != lastTick) { diff --git a/kdesktop/lock/querydlg.cc b/kdesktop/lock/querydlg.cc index e672d54..5f50cbe 100644 --- a/kdesktop/lock/querydlg.cc +++ b/kdesktop/lock/querydlg.cc @@ -118,6 +118,7 @@ QueryDlg::QueryDlg(LockProcess *parent) connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); installEventFilter(this); + setFixedSize( sizeHint() ); } QueryDlg::~QueryDlg() diff --git a/kdesktop/lock/sakdlg.cc b/kdesktop/lock/sakdlg.cc index 17f54a1..d96e0af 100644 --- a/kdesktop/lock/sakdlg.cc +++ b/kdesktop/lock/sakdlg.cc @@ -102,6 +102,7 @@ SAKDlg::SAKDlg(LockProcess *parent) mStatusLabel->setText("" + i18n("Press Ctrl+Alt+Del to begin.") + "

" + i18n("This process helps keep your password secure.") + "
" + i18n("It prevents unauthorized users from emulating the login screen.")); installEventFilter(this); + setFixedSize( sizeHint() ); mSAKProcess = new KProcess; *mSAKProcess << "kdmtsak"; diff --git a/kdesktop/lock/securedlg.cc b/kdesktop/lock/securedlg.cc index 532b904..37524f7 100644 --- a/kdesktop/lock/securedlg.cc +++ b/kdesktop/lock/securedlg.cc @@ -144,6 +144,7 @@ SecureDlg::SecureDlg(LockProcess *parent) mSwitchButton->setFixedWidth(btnSize); installEventFilter(this); + setFixedSize( sizeHint() ); } SecureDlg::~SecureDlg() commit 678bea5ba74b3b39981e482e188c61fdd37786f0 Author: Timothy Pearson Date: 1328606373 -0600 Allow minimal managed window interaction inside the lock process This closes Bug 810 diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 9648bbc..2e9c9d3 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -111,8 +111,8 @@ Status DPMSInfo ( Display *, CARD16 *, BOOL * ); #define LOCK_GRACE_DEFAULT 5000 #define AUTOLOGOUT_DEFAULT 600 -// FIXME -// This should be defined if Qt 3.4.0 or higher is in use +// Setting this define is INSECURE +// Use it for debugging purposes ONLY // #define KEEP_MOUSE_UNGRABBED 1 // These lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special multimedia keys @@ -185,7 +185,12 @@ LockProcess::LockProcess(bool child, bool useBlankOnly) mHackStartupEnabled(true), m_rootPixmap(NULL), mBackingStartupDelayTimer(0), - m_startupStatusDialog(NULL) + m_startupStatusDialog(NULL), + m_mouseDown(0), + m_mousePrevX(0), + m_mousePrevY(0), + m_dialogPrevX(0), + m_dialogPrevY(0) { #ifdef KEEP_MOUSE_UNGRABBED setNFlags(WX11DisableMove|WX11DisableClose|WX11DisableShade|WX11DisableMinimize|WX11DisableMaximize); @@ -208,6 +213,8 @@ LockProcess::LockProcess(bool child, bool useBlankOnly) mEnsureVRootWindowSecurityTimer = new TQTimer( this ); connect( mEnsureVRootWindowSecurityTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(repaintRootWindowIfNeeded()) ); + connect(tqApp, TQT_SIGNAL(mouseInteraction(XEvent *)), TQT_SLOT(slotMouseActivity(XEvent *))); + mHackDelayStartupTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000; mHackStartupEnabled = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::screenSaverEnabled():true; @@ -2200,4 +2207,64 @@ void LockProcess::sendVkbdFocusInOut( WId window, Time t ) } } +void LockProcess::slotMouseActivity(XEvent *event) +{ + bool inFrame = 0; + bool inDialog = 0; + XButtonEvent *be = (XButtonEvent *) event; + XMotionEvent *me = (XMotionEvent *) event; + if (event->type == ButtonPress) { + // Get geometry including window frame/titlebar + TQRect fgeom = mDialogs.first()->frameGeometry(); + TQRect wgeom = mDialogs.first()->geometry(); + + if (((be->x_root > fgeom.x()) && (be->y_root > fgeom.y())) && ((be->x_root < (fgeom.x()+fgeom.width())) && (be->y_root < (fgeom.y()+fgeom.height())))) { + inFrame = 1; + } + if (((be->x_root > wgeom.x()) && (be->y_root > wgeom.y())) && ((be->x_root < (wgeom.x()+wgeom.width())) && (be->y_root < (wgeom.y()+wgeom.height())))) { + inDialog = 1; + } + + // Clicked inside dialog; set focus + if (inFrame == TRUE) { + WId window = mDialogs.first()->winId(); + XSetInputFocus(qt_xdisplay(), window, RevertToParent, CurrentTime); + fakeFocusIn(window); + // Why this needs to be repeated I have no idea... + XSetInputFocus(qt_xdisplay(), window, RevertToParent, CurrentTime); + fakeFocusIn(window); + } + + // Clicked inside window handle (or border); drag window + if ((inFrame == TRUE) && (inDialog == FALSE)) { + TQPoint oldPoint = mDialogs.first()->pos(); + m_mouseDown = 1; + m_dialogPrevX = oldPoint.x(); + m_dialogPrevY = oldPoint.y(); + m_mousePrevX = be->x_root; + m_mousePrevY = be->y_root; + XChangeActivePointerGrab( qt_xdisplay(), GRABEVENTS, TQCursor(tqsizeAllCursor).handle(), CurrentTime); + } + } + + // Drag the window... + if (event->type == MotionNotify) { + if (m_mouseDown == TRUE) { + int deltaX = me->x_root - m_mousePrevX; + int deltaY = me->y_root - m_mousePrevY; + m_dialogPrevX = m_dialogPrevX + deltaX; + m_dialogPrevY = m_dialogPrevY + deltaY; + mDialogs.first()->move(m_dialogPrevX, m_dialogPrevY); + + m_mousePrevX = me->x_root; + m_mousePrevY = me->y_root; + } + } + + if (event->type == ButtonRelease) { + m_mouseDown = 0; + XChangeActivePointerGrab( qt_xdisplay(), GRABEVENTS, TQCursor(tqarrowCursor).handle(), CurrentTime); + } +} + #include "lockprocess.moc" diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h index 3a7e3db..18320a8 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -94,6 +94,7 @@ private slots: bool closeCurrentWindow(); void repaintRootWindowIfNeeded(); void startSecureDialog(); + void slotMouseActivity(XEvent *event); private: void configure(); @@ -197,6 +198,12 @@ private: KSMModalDialog* m_startupStatusDialog; TQDateTime mlockDateTime; + + bool m_mouseDown; + int m_mousePrevX; + int m_mousePrevY; + int m_dialogPrevX; + int m_dialogPrevY; }; #endif diff --git a/kdesktop/lock/main.h b/kdesktop/lock/main.h index c8e0e05..23797e4 100644 --- a/kdesktop/lock/main.h +++ b/kdesktop/lock/main.h @@ -32,6 +32,7 @@ protected: bool x11EventFilter( XEvent * ); signals: void activity(); + void mouseInteraction(XEvent *event); private: time_t lastTick; };