Vincent Povirk : explorer: Add a registry setting to always show the systray.

Alexandre Julliard julliard at winehq.org
Wed Jan 8 13:41:33 CST 2014


Module: wine
Branch: master
Commit: 913cb83622a1077731ed3505af9b36bb45571beb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=913cb83622a1077731ed3505af9b36bb45571beb

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Mon Dec 16 16:17:21 2013 -0600

explorer: Add a registry setting to always show the systray.

---

 programs/explorer/desktop.c          |   28 +++++++++++++++++++++++++++-
 programs/explorer/explorer_private.h |    2 +-
 programs/explorer/systray.c          |    9 ++++++---
 3 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index 1a8db99..51791c7 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -638,6 +638,26 @@ static BOOL get_default_desktop_size( const WCHAR *name, unsigned int *width, un
     return found;
 }
 
+static BOOL get_default_enable_shell( const WCHAR *name )
+{
+    static const WCHAR desktop_keyW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
+                                         'E','x','p','l','o','r','e','r','\\',
+                                         'D','e','s','k','t','o','p','s',0};
+    static const WCHAR enable_shellW[] = {'E','n','a','b','l','e','S','h','e','l','l',0};
+    HKEY hkey;
+    BOOL result = FALSE;
+    DWORD size = sizeof(result);
+
+    /* @@ Wine registry key: HKCU\Software\Wine\Explorer\Desktops */
+    if (!RegOpenKeyW( HKEY_CURRENT_USER, desktop_keyW, &hkey ))
+    {
+        if (RegGetValueW( hkey, name, enable_shellW, RRF_RT_REG_DWORD, NULL, &result, &size ))
+            result = FALSE;
+        RegCloseKey( hkey );
+    }
+    return result;
+}
+
 static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
 {
     static const WCHAR device_keyW[] = {
@@ -780,6 +800,7 @@ void manage_desktop( WCHAR *arg )
     WCHAR *cmdline = NULL, *driver = NULL;
     WCHAR *p = arg;
     const WCHAR *name = NULL;
+    BOOL enable_shell = FALSE;
 
     /* get the rest of the command line (if any) */
     while (*p && !isspace(*p)) p++;
@@ -809,6 +830,9 @@ void manage_desktop( WCHAR *arg )
         if (!get_default_desktop_size( name, &width, &height )) width = height = 0;
     }
 
+    if (name)
+        enable_shell = get_default_enable_shell( name );
+
     if (name && width && height)
     {
         if (!(desktop = CreateDesktopW( name, NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL )))
@@ -850,7 +874,9 @@ void manage_desktop( WCHAR *arg )
             HMODULE shell32;
             void (WINAPI *pShellDDEInit)( BOOL );
 
-            initialize_systray( graphics_driver, using_root );
+            if (using_root) enable_shell = FALSE;
+
+            initialize_systray( graphics_driver, using_root, enable_shell );
             if (!using_root) initialize_launchers( hwnd );
 
             if ((shell32 = LoadLibraryA( "shell32.dll" )) &&
diff --git a/programs/explorer/explorer_private.h b/programs/explorer/explorer_private.h
index 80bc7d0..49400cd 100644
--- a/programs/explorer/explorer_private.h
+++ b/programs/explorer/explorer_private.h
@@ -22,7 +22,7 @@
 #define __WINE_EXPLORER_PRIVATE_H
 
 extern void manage_desktop( WCHAR *arg );
-extern void initialize_systray( HMODULE graphics_driver, BOOL using_root );
+extern void initialize_systray( HMODULE graphics_driver, BOOL using_root, BOOL enable_shell );
 extern void initialize_appbar(void);
 extern void do_startmenu( HWND owner );
 extern LRESULT menu_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c
index 75b9532..2a6ff14 100644
--- a/programs/explorer/systray.c
+++ b/programs/explorer/systray.c
@@ -86,7 +86,7 @@ static unsigned int alloc_displayed;
 static unsigned int nb_displayed;
 static struct icon **displayed;  /* array of currently displayed icons */
 
-static BOOL hide_systray;
+static BOOL hide_systray, enable_shell;
 static int icon_cx, icon_cy, tray_width;
 
 static struct icon *balloon_icon;
@@ -352,7 +352,7 @@ static BOOL hide_icon(struct icon *icon)
     invalidate_icons( icon->display, nb_displayed );
     icon->display = -1;
 
-    if (!nb_displayed) ShowWindow( tray_window, SW_HIDE );
+    if (!nb_displayed && !enable_shell) ShowWindow( tray_window, SW_HIDE );
 
     update_balloon( icon );
     update_tooltip_position( icon );
@@ -651,7 +651,7 @@ static void get_system_text_size( const WCHAR *text, SIZE *size )
 }
 
 /* this function creates the listener window */
-void initialize_systray( HMODULE graphics_driver, BOOL using_root )
+void initialize_systray( HMODULE graphics_driver, BOOL using_root, BOOL arg_enable_shell )
 {
     WNDCLASSEXW class;
     static const WCHAR classname[] = {'S','h','e','l','l','_','T','r','a','y','W','n','d',0};
@@ -664,6 +664,7 @@ void initialize_systray( HMODULE graphics_driver, BOOL using_root )
     icon_cx = GetSystemMetrics( SM_CXSMICON ) + 2*ICON_BORDER;
     icon_cy = GetSystemMetrics( SM_CYSMICON ) + 2*ICON_BORDER;
     hide_systray = using_root;
+    enable_shell = arg_enable_shell;
 
     /* register the systray listener window class */
     ZeroMemory(&class, sizeof(class));
@@ -699,5 +700,7 @@ void initialize_systray( HMODULE graphics_driver, BOOL using_root )
     start_button = CreateWindowW( button_class, start_label, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
         0, 0, start_text_size.cx + 8, icon_cy, tray_window, 0, 0, 0 );
 
+    if (enable_shell && !hide_systray) ShowWindow( tray_window, SW_SHOWNA );
+
     if (hide_systray) do_hide_systray();
 }




More information about the wine-cvs mailing list