This patch set should prevent for following bug tracked on: https://bugs.kde.org/show_bug.cgi?id=282639 From 509d2f1ece2fdee371032e155769f744dc18d525 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Fri, 30 Sep 2011 14:31:55 +0200 Subject: [PATCH 1/3] attempt to make requestShutdown more friendly: non-blocking, not require a sync of the xserver --- libs/kworkspace/kworkspace.cpp | 14 +++++--------- libs/kworkspace/kworkspace.h | 4 +--- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/libs/kworkspace/kworkspace.cpp b/libs/kworkspace/kworkspace.cpp index 0b4146e..96a435b 100644 --- a/libs/kworkspace/kworkspace.cpp +++ b/libs/kworkspace/kworkspace.cpp @@ -174,29 +174,25 @@ static void cleanup_sm() } #endif -bool requestShutDown( - ShutdownConfirm confirm, ShutdownType sdtype, ShutdownMode sdmode ) +void requestShutDown(ShutdownConfirm confirm, ShutdownType sdtype, ShutdownMode sdmode) { #ifdef Q_WS_X11 - QApplication::syncX(); - kapp->updateRemoteUserTimestamp( "org.kde.ksmserver" ); /* use ksmserver's dcop interface if necessary */ if ( confirm == ShutdownConfirmYes || sdtype != ShutdownTypeDefault || sdmode != ShutdownModeDefault ) { org::kde::KSMServerInterface ksmserver("org.kde.ksmserver", "/KSMServer", QDBusConnection::sessionBus()); - QDBusReply reply = ksmserver.logout((int)confirm, (int)sdtype, (int)sdmode); - return (reply.isValid()); + ksmserver.logout((int)confirm, (int)sdtype, (int)sdmode); + return; } + if( helper == NULL ) { helper = new KRequestShutdownHelper(); qAddPostRoutine(cleanup_sm); } - return helper->requestShutdown( confirm ); -#else - return false; + helper->requestShutdown( confirm ); #endif } diff --git a/libs/kworkspace/kworkspace.h b/libs/kworkspace/kworkspace.h index 2516c3a..8868bf6 100644 --- a/libs/kworkspace/kworkspace.h +++ b/libs/kworkspace/kworkspace.h @@ -110,10 +110,8 @@ namespace KWorkSpace * ShutdownConfirm * @param sdtype The action to take after logging out. ShutdownType * @param sdmode If/When the action should be taken. ShutdownMode - * @return true on success, false if the session manager could not be - * contacted. */ - KDE_EXPORT bool requestShutDown( ShutdownConfirm confirm = ShutdownConfirmDefault, + KDE_EXPORT void requestShutDown( ShutdownConfirm confirm = ShutdownConfirmDefault, ShutdownType sdtype = ShutdownTypeDefault, ShutdownMode sdmode = ShutdownModeDefault ); -- 1.7.4.1 From a40c435195b07268a409ae83e9fbc1086be7c253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maurice=20de=20la=20Fert=C3=A9?= Date: Mon, 3 Oct 2011 23:02:36 +0200 Subject: [PATCH 2/3] update the user timestamp before showing the dialog should prevent focus stealing preventing related issues where the dialog goes behind other windows; this functionality was moved from libkworkspace Conflicts: ksmserver/shutdown.cpp --- ksmserver/shutdown.cpp | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ksmserver/shutdown.cpp b/ksmserver/shutdown.cpp index a083545..d86ccaa 100644 --- a/ksmserver/shutdown.cpp +++ b/ksmserver/shutdown.cpp @@ -58,15 +58,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "server.h" #include "global.h" #include "client.h" @@ -152,9 +152,9 @@ void KSMServer::shutdown( KWorkSpace::ShutdownConfirm confirm, dialogActive = true; QString bopt; if ( !logoutConfirmed ) { + KApplication::kApplication()->updateUserTimestamp(); KSMShutdownFeedback::start(); // make the screen gray - logoutConfirmed = - KSMShutdownDlg::confirmShutdown( maysd, choose, sdtype, bopt ); + logoutConfirmed = KSMShutdownDlg::confirmShutdown( maysd, choose, sdtype, bopt ); // ###### We can't make the screen remain gray while talking to the apps, // because this prevents interaction ("do you want to save", etc.) // TODO: turn the feedback widget into a list of apps to be closed, -- 1.7.4.1 From 61534bb9236c78632637f35429f0d66128089119 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Mon, 26 Sep 2011 14:57:53 +0200 Subject: [PATCH 3/3] simplify usage of requestShutDown --- .../desktop/applets/kickoff/core/itemhandlers.cpp | 3 --- plasma/generic/applets/lock_logout/lockout.cpp | 6 +----- .../containmentactions/contextmenu/menu.cpp | 7 ++----- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/plasma/desktop/applets/kickoff/core/itemhandlers.cpp b/plasma/desktop/applets/kickoff/core/itemhandlers.cpp index 7364fc8..4e83c37 100644 --- a/plasma/desktop/applets/kickoff/core/itemhandlers.cpp +++ b/plasma/desktop/applets/kickoff/core/itemhandlers.cpp @@ -160,10 +160,7 @@ void LeaveItemHandler::logout() type = KWorkSpace::ShutdownTypeHalt; } -//FIXME: the proper fix is to implement the KWorkSpace methods for Windows -#ifndef Q_WS_WIN KWorkSpace::requestShutDown(confirm, type); -#endif } void LeaveItemHandler::lock() diff --git a/plasma/generic/applets/lock_logout/lockout.cpp b/plasma/generic/applets/lock_logout/lockout.cpp index ecd8736..9a1a3bb 100644 --- a/plasma/generic/applets/lock_logout/lockout.cpp +++ b/plasma/generic/applets/lock_logout/lockout.cpp @@ -274,11 +274,7 @@ void LockOut::clickLogout() } kDebug()<<"LockOut:: logout clicked "; -#ifndef Q_OS_WIN - KWorkSpace::requestShutDown( KWorkSpace::ShutdownConfirmDefault, - KWorkSpace::ShutdownTypeDefault, - KWorkSpace::ShutdownModeDefault); -#endif + KWorkSpace::requestShutDown(); } void LockOut::clickSwitchUser() diff --git a/plasma/generic/containmentactions/contextmenu/menu.cpp b/plasma/generic/containmentactions/contextmenu/menu.cpp index a328c8d..33f07e7 100644 --- a/plasma/generic/containmentactions/contextmenu/menu.cpp +++ b/plasma/generic/containmentactions/contextmenu/menu.cpp @@ -242,11 +242,8 @@ void ContextMenu::logout() if (!KAuthorized::authorizeKAction("logout")) { return; } -#ifndef Q_WS_WIN - KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmDefault, - KWorkSpace::ShutdownTypeDefault, - KWorkSpace::ShutdownModeDefault); -#endif + + KWorkSpace::requestShutDown(); } QWidget* ContextMenu::createConfigurationInterface(QWidget* parent) -- 1.7.4.1