Alexandre Julliard : user32: Refresh the desktop when the wallpaper is changed.
Alexandre Julliard
julliard at winehq.org
Mon Dec 3 13:33:56 CST 2012
Module: wine
Branch: master
Commit: 124722584107ba99ac9f6f8882fa56e80eff69ba
URL: http://source.winehq.org/git/wine.git/?a=commit;h=124722584107ba99ac9f6f8882fa56e80eff69ba
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Dec 3 13:28:08 2012 +0100
user32: Refresh the desktop when the wallpaper is changed.
---
dlls/user32/controls.h | 2 +-
dlls/user32/desktop.c | 17 +++++++----------
dlls/user32/sysparams.c | 26 +++++++++++++++++++++-----
programs/explorer/desktop.c | 7 ++++++-
4 files changed, 35 insertions(+), 17 deletions(-)
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 6bd946b..e168f16 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -148,7 +148,7 @@ extern struct dce *set_class_dce( struct tagCLASS *class, struct dce *dce ) DECL
extern HBRUSH DEFWND_ControlColor( HDC hDC, UINT ctlType ) DECLSPEC_HIDDEN;
/* desktop */
-extern BOOL DESKTOP_SetPattern( LPCWSTR pattern ) DECLSPEC_HIDDEN;
+extern BOOL update_wallpaper( const WCHAR *wallpaper, const WCHAR *pattern ) DECLSPEC_HIDDEN;
/* icon title */
extern HWND ICONTITLE_Create( HWND hwnd ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/desktop.c b/dlls/user32/desktop.c
index ddf812a..2204b77 100644
--- a/dlls/user32/desktop.c
+++ b/dlls/user32/desktop.c
@@ -56,12 +56,10 @@ const struct builtin_class_descr DESKTOP_builtin_class =
/***********************************************************************
* DESKTOP_LoadBitmap
*/
-static HBITMAP DESKTOP_LoadBitmap(void)
+static HBITMAP DESKTOP_LoadBitmap( const WCHAR *filename )
{
HBITMAP hbitmap;
- WCHAR filename[MAX_PATH];
- if (!SystemParametersInfoW( SPI_GETDESKWALLPAPER, MAX_PATH, filename, 0 )) return 0;
if (!filename[0]) return 0;
hbitmap = LoadImageW( 0, filename, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if (!hbitmap)
@@ -78,9 +76,9 @@ static HBITMAP DESKTOP_LoadBitmap(void)
/***********************************************************************
* init_wallpaper
*/
-static void init_wallpaper(void)
+static void init_wallpaper( const WCHAR *wallpaper )
{
- HBITMAP hbitmap = DESKTOP_LoadBitmap();
+ HBITMAP hbitmap = DESKTOP_LoadBitmap( wallpaper );
if (hbitmapWallPaper) DeleteObject( hbitmapWallPaper );
hbitmapWallPaper = hbitmap;
@@ -172,11 +170,9 @@ BOOL WINAPI SetDeskWallPaper( LPCSTR filename )
/***********************************************************************
- * DESKTOP_SetPattern
- *
- * Set the desktop pattern.
+ * update_wallpaper
*/
-BOOL DESKTOP_SetPattern( LPCWSTR pattern )
+BOOL update_wallpaper( const WCHAR *wallpaper, const WCHAR *pattern )
{
int pat[8];
@@ -201,6 +197,7 @@ BOOL DESKTOP_SetPattern( LPCWSTR pattern )
DeleteObject( hbitmap );
}
}
- init_wallpaper();
+ init_wallpaper( wallpaper );
+ RedrawWindow( GetDesktopWindow(), 0, 0, RDW_INVALIDATE | RDW_ERASE | RDW_NOCHILDREN );
return TRUE;
}
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 895b4eb..3e9a639 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -1293,6 +1293,7 @@ static union sysparam_all_entry * const default_entries[] =
(union sysparam_all_entry *)&entry_CAPTIONHEIGHT,
(union sysparam_all_entry *)&entry_CAPTIONWIDTH,
(union sysparam_all_entry *)&entry_CARETWIDTH,
+ (union sysparam_all_entry *)&entry_DESKWALLPAPER,
(union sysparam_all_entry *)&entry_DOUBLECLICKTIME,
(union sysparam_all_entry *)&entry_DOUBLECLKHEIGHT,
(union sysparam_all_entry *)&entry_DOUBLECLKWIDTH,
@@ -1374,6 +1375,23 @@ void SYSPARAMS_Init(void)
}
}
+static BOOL update_desktop_wallpaper(void)
+{
+ DWORD pid;
+
+ if (GetWindowThreadProcessId( GetDesktopWindow(), &pid ) && pid == GetCurrentProcessId())
+ {
+ WCHAR wallpaper[MAX_PATH], pattern[256];
+
+ entry_DESKWALLPAPER.hdr.loaded = entry_DESKPATTERN.hdr.loaded = FALSE;
+ if (get_entry( &entry_DESKWALLPAPER, MAX_PATH, wallpaper ) &&
+ get_entry( &entry_DESKPATTERN, 256, pattern ))
+ update_wallpaper( wallpaper, pattern );
+ }
+ else SendMessageW( GetDesktopWindow(), WM_SETTINGCHANGE, SPI_SETDESKWALLPAPER, 0 );
+ return TRUE;
+}
+
/***********************************************************************
* SystemParametersInfoW (USER32.@)
*
@@ -1484,14 +1502,12 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
ret = set_entry( &entry_GRIDGRANULARITY, uiParam, pvParam, fWinIni );
break;
case SPI_SETDESKWALLPAPER:
- ret = set_entry( &entry_DESKWALLPAPER, uiParam, pvParam, fWinIni );
+ if (!pvParam || set_entry( &entry_DESKWALLPAPER, uiParam, pvParam, fWinIni ))
+ ret = update_desktop_wallpaper();
break;
case SPI_SETDESKPATTERN:
if (!pvParam || set_entry( &entry_DESKPATTERN, uiParam, pvParam, fWinIni ))
- {
- WCHAR buf[256];
- ret = get_entry( &entry_DESKPATTERN, 256, buf ) && DESKTOP_SetPattern( buf );
- }
+ ret = update_desktop_wallpaper();
break;
case SPI_GETKEYBOARDDELAY:
ret = get_entry( &entry_KEYBOARDDELAY, uiParam, pvParam );
diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
index fdb966f..12888d8 100644
--- a/programs/explorer/desktop.c
+++ b/programs/explorer/desktop.c
@@ -85,6 +85,11 @@ static LRESULT WINAPI desktop_wnd_proc( HWND hwnd, UINT message, WPARAM wp, LPAR
if (!using_root) PaintDesktop( (HDC)wp );
return TRUE;
+ case WM_SETTINGCHANGE:
+ if (wp == SPI_SETDESKWALLPAPER)
+ SystemParametersInfoW( SPI_SETDESKWALLPAPER, 0, NULL, FALSE );
+ return 0;
+
case WM_PAINT:
{
PAINTSTRUCT ps;
@@ -311,7 +316,7 @@ void manage_desktop( WCHAR *arg )
SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_wnd_proc );
SendMessageW( hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIconW( 0, MAKEINTRESOURCEW(OIC_WINLOGO)));
if (name) set_desktop_window_title( hwnd, name );
- SystemParametersInfoA( SPI_SETDESKPATTERN, -1, NULL, FALSE );
+ SystemParametersInfoW( SPI_SETDESKWALLPAPER, 0, NULL, FALSE );
ClipCursor( NULL );
initialize_display_settings( hwnd );
initialize_appbar();
More information about the wine-cvs
mailing list