Dmitry Timoshkov : winex11.drv: Use display device guid managed by explorer .

Alexandre Julliard julliard at winehq.org
Mon Nov 19 08:19:53 CST 2007


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Fri Nov 16 19:39:08 2007 +0800

winex11.drv: Use display device guid managed by explorer.

---

 dlls/winex11.drv/settings.c   |   39 ++++++++++++++++++++++++++++++++++-----
 programs/explorer/Makefile.in |    2 +-
 programs/explorer/desktop.c   |   20 ++++++++++++++++++++
 3 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c
index 2de20ca..a3fd3d5 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -21,6 +21,7 @@
 #include "config.h"
 #include <string.h>
 #include <stdio.h>
+#include <assert.h>
 
 #define NONAMELESSUNION
 #define NONAMELESSSTRUCT
@@ -166,17 +167,40 @@ void X11DRV_Settings_Init(void)
     X11DRV_Settings_AddOneMode(screen_width, screen_height, 0, 60);
 }
 
-/* Our fake driver GUID path */
-static const char wine_X11_reg_key[] =
-    "System\\CurrentControlSet\\Control\\Video\\{64498428-1122-3344-5566-778899aabbcc}\\0000";
+static BOOL get_display_device_reg_key(char *key, unsigned len)
+{
+    static const char display_device_guid_prop[] = "__wine_display_device_guid";
+    static const char video_path[] = "System\\CurrentControlSet\\Control\\Video\\{";
+    static const char display0[] = "}\\0000";
+    ATOM guid_atom;
+
+    assert(len >= sizeof(video_path) + sizeof(display0) + 40);
+
+    guid_atom = HandleToULong(GetPropA(GetDesktopWindow(), display_device_guid_prop));
+    if (!guid_atom) return FALSE;
+
+    memcpy(key, video_path, sizeof(video_path));
+
+    if (!GlobalGetAtomNameA(guid_atom, key + strlen(key), 40))
+        return FALSE;
+
+    strcat(key, display0);
+
+    TRACE("display device key %s\n", wine_dbgstr_a(key));
+    return TRUE;
+}
 
 static BOOL read_registry_settings(DEVMODEW *dm)
 {
+    char wine_x11_reg_key[128];
     HKEY hkey;
     DWORD type, size;
     BOOL ret = TRUE;
 
-    if (RegOpenKeyA(HKEY_CURRENT_CONFIG, wine_X11_reg_key, &hkey))
+    if (!get_display_device_reg_key(wine_x11_reg_key, sizeof(wine_x11_reg_key)))
+        return FALSE;
+
+    if (RegOpenKeyExA(HKEY_CURRENT_CONFIG, wine_x11_reg_key, 0, KEY_READ, &hkey))
         return FALSE;
 
 #define query_value(name, data) \
@@ -203,10 +227,15 @@ static BOOL read_registry_settings(DEVMODEW *dm)
 
 static BOOL write_registry_settings(const DEVMODEW *dm)
 {
+    char wine_x11_reg_key[128];
     HKEY hkey;
     BOOL ret = TRUE;
 
-    if (RegCreateKeyA(HKEY_CURRENT_CONFIG, wine_X11_reg_key, &hkey))
+    if (!get_display_device_reg_key(wine_x11_reg_key, sizeof(wine_x11_reg_key)))
+        return FALSE;
+
+    if (RegCreateKeyExA(HKEY_CURRENT_CONFIG, wine_x11_reg_key, 0, NULL,
+                        REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hkey, NULL))
         return FALSE;
 
 #define set_value(name, data) \
diff --git a/programs/explorer/Makefile.in b/programs/explorer/Makefile.in
index 3ee51f8..9498a0f 100644
--- a/programs/explorer/Makefile.in
+++ b/programs/explorer/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = explorer.exe
 APPMODE   = -mwindows
-IMPORTS   = user32 gdi32 advapi32 kernel32 ntdll 
+IMPORTS   = rpcrt4 user32 gdi32 advapi32 kernel32 ntdll
 DELAYIMPORTS = comctl32
 EXTRADEFS = @HALINCL@
 EXTRALIBS = @DISKARBITRATIONLIB@
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index 7f2e23f..4b1d041 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -115,6 +115,25 @@ static BOOL get_default_desktop_size( unsigned int *width, unsigned int *height
     return ret;
 }
 
+static void initialize_display_settings( HWND desktop )
+{
+    static const WCHAR display_device_guid_propW[] = {
+        '_','_','w','i','n','e','_','d','i','s','p','l','a','y','_',
+        'd','e','v','i','c','e','_','g','u','i','d',0 };
+    GUID guid;
+    LPWSTR guid_str;
+    ATOM guid_atom;
+
+    UuidCreate( &guid );
+    UuidToStringW( &guid, &guid_str );
+    WINE_TRACE( "display guid %s\n", wine_dbgstr_w(guid_str) );
+
+    guid_atom = GlobalAddAtomW( guid_str );
+    SetPropW( desktop, display_device_guid_propW, ULongToHandle(guid_atom) );
+
+    RpcStringFreeW( &guid_str );
+}
+
 /* main desktop management function */
 void manage_desktop( char *arg )
 {
@@ -171,6 +190,7 @@ void manage_desktop( char *arg )
         SetWindowTextW( hwnd, desktop_nameW );
         SystemParametersInfoA( SPI_SETDESKPATTERN, -1, NULL, FALSE );
         SetDeskWallPaper( (LPSTR)-1 );
+        initialize_display_settings( hwnd );
         initialize_diskarbitration();
         initialize_hal();
         initialize_systray();




More information about the wine-cvs mailing list