Vincent Povirk : wineboot: Query windows from all desktops when --end-session --kill is used.

Alexandre Julliard julliard at winehq.org
Tue Oct 5 14:41:45 CDT 2010


Module: wine
Branch: stable
Commit: 0028b4fd7f17f0e0c2b2390426d457530108f8de
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0028b4fd7f17f0e0c2b2390426d457530108f8de

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue May 18 13:36:36 2010 -0500

wineboot: Query windows from all desktops when --end-session --kill is used.
(cherry picked from commit 4f30ff875bfc556a2a69bf45218129cd196e5105)

---

 programs/wineboot/shutdown.c |   39 +++++++++++++++++++++++++++++++++++++++
 programs/wineboot/wineboot.c |    7 ++++++-
 2 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/programs/wineboot/shutdown.c b/programs/wineboot/shutdown.c
index ed80bf0..cebe16b 100644
--- a/programs/wineboot/shutdown.c
+++ b/programs/wineboot/shutdown.c
@@ -322,6 +322,45 @@ BOOL shutdown_close_windows( BOOL force )
     return (result != 0);
 }
 
+static BOOL CALLBACK shutdown_one_desktop( LPWSTR name, LPARAM force )
+{
+    HDESK hdesk;
+
+    WINE_TRACE("Shutting down desktop %s\n", wine_dbgstr_w(name));
+
+    hdesk = OpenDesktopW( name, 0, FALSE, GENERIC_ALL );
+    if (hdesk == NULL)
+    {
+        WINE_ERR("Cannot open desktop %s, err=%i\n", wine_dbgstr_w(name), GetLastError());
+        return 0;
+    }
+
+    if (!SetThreadDesktop( hdesk ))
+    {
+        CloseDesktop( hdesk );
+        WINE_ERR("Cannot set thread desktop %s, err=%i\n", wine_dbgstr_w(name), GetLastError());
+        return 0;
+    }
+
+    CloseDesktop( hdesk );
+
+    return shutdown_close_windows( force );
+}
+
+BOOL shutdown_all_desktops( BOOL force )
+{
+    BOOL ret;
+    HDESK prev_desktop;
+
+    prev_desktop = GetThreadDesktop(GetCurrentThreadId());
+
+    ret = EnumDesktopsW( NULL, shutdown_one_desktop, (LPARAM)force );
+
+    SetThreadDesktop(prev_desktop);
+
+    return ret;
+}
+
 /* forcibly kill all processes without any cleanup */
 void kill_processes( BOOL kill_desktop )
 {
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 32ac3ac..02d3746 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -88,6 +88,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
 #define MAX_LINE_LENGTH (2*MAX_PATH+2)
 
 extern BOOL shutdown_close_windows( BOOL force );
+extern BOOL shutdown_all_desktops( BOOL force );
 extern void kill_processes( BOOL kill_desktop );
 
 static WCHAR windowsdir[MAX_PATH];
@@ -1142,7 +1143,11 @@ int main( int argc, char *argv[] )
 
     if (end_session)
     {
-        if (!shutdown_close_windows( force )) return 1;
+        if (kill)
+        {
+            if (!shutdown_all_desktops( force )) return 1;
+        }
+        else if (!shutdown_close_windows( force )) return 1;
     }
 
     if (kill) kill_processes( shutdown );




More information about the wine-cvs mailing list