user32: Notify the user driver about window extended style changes too.

This commit is contained in:
Alexandre Julliard 2008-09-12 14:55:07 +02:00
parent 54d920ae91
commit 2f11213168
5 changed files with 26 additions and 25 deletions

View File

@ -388,7 +388,7 @@ static void nulldrv_SetWindowIcon( HWND hwnd, UINT type, HICON icon )
{
}
static void nulldrv_SetWindowStyle( HWND hwnd, DWORD old_style )
static void nulldrv_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style )
{
}
@ -723,9 +723,9 @@ static void loaderdrv_SetWindowIcon( HWND hwnd, UINT type, HICON icon )
load_driver()->pSetWindowIcon( hwnd, type, icon );
}
static void loaderdrv_SetWindowStyle( HWND hwnd, DWORD old_style )
static void loaderdrv_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style )
{
load_driver()->pSetWindowStyle( hwnd, old_style );
load_driver()->pSetWindowStyle( hwnd, offset, style );
}
static void loaderdrv_SetWindowText( HWND hwnd, LPCWSTR text )

View File

@ -153,7 +153,7 @@ typedef struct tagUSER_DRIVER {
void (*pSetParent)(HWND,HWND,HWND);
int (*pSetWindowRgn)(HWND,HRGN,BOOL);
void (*pSetWindowIcon)(HWND,UINT,HICON);
void (*pSetWindowStyle)(HWND,DWORD);
void (*pSetWindowStyle)(HWND,INT,STYLESTRUCT*);
void (*pSetWindowText)(HWND,LPCWSTR);
UINT (*pShowWindow)(HWND,INT,RECT*,UINT);
LRESULT (*pSysCommand)(HWND,WPARAM,LPARAM);

View File

@ -536,7 +536,7 @@ HWND WIN_SetOwner( HWND hwnd, HWND owner )
ULONG WIN_SetStyle( HWND hwnd, ULONG set_bits, ULONG clear_bits )
{
BOOL ok;
ULONG new_style, old_style = 0;
STYLESTRUCT style;
WND *win = WIN_GetPtr( hwnd );
if (!win || win == WND_DESKTOP) return 0;
@ -547,32 +547,33 @@ ULONG WIN_SetStyle( HWND hwnd, ULONG set_bits, ULONG clear_bits )
set_bits, clear_bits, hwnd );
return 0;
}
new_style = (win->dwStyle | set_bits) & ~clear_bits;
if (new_style == win->dwStyle)
style.styleOld = win->dwStyle;
style.styleNew = (win->dwStyle | set_bits) & ~clear_bits;
if (style.styleNew == style.styleOld)
{
WIN_ReleasePtr( win );
return new_style;
return style.styleNew;
}
SERVER_START_REQ( set_window_info )
{
req->handle = hwnd;
req->flags = SET_WIN_STYLE;
req->style = new_style;
req->style = style.styleNew;
req->extra_offset = -1;
if ((ok = !wine_server_call( req )))
{
old_style = reply->old_style;
win->dwStyle = new_style;
style.styleOld = reply->old_style;
win->dwStyle = style.styleNew;
}
}
SERVER_END_REQ;
WIN_ReleasePtr( win );
if (ok)
{
USER_Driver->pSetWindowStyle( hwnd, old_style );
if ((old_style ^ new_style) & WS_VISIBLE) invalidate_dce( hwnd, NULL );
USER_Driver->pSetWindowStyle( hwnd, GWL_STYLE, &style );
if ((style.styleOld ^ style.styleNew) & WS_VISIBLE) invalidate_dce( hwnd, NULL );
}
return old_style;
return style.styleOld;
}
@ -2131,10 +2132,11 @@ LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, UINT size, LONG_PTR newval, B
if (!ok) return 0;
if (offset == GWL_STYLE) USER_Driver->pSetWindowStyle( hwnd, retval );
if (offset == GWL_STYLE || offset == GWL_EXSTYLE)
{
USER_Driver->pSetWindowStyle( hwnd, offset, &style );
SendMessageW( hwnd, WM_STYLECHANGED, offset, (LPARAM)&style );
}
return retval;
}

View File

@ -1455,16 +1455,15 @@ void X11DRV_SetWindowText( HWND hwnd, LPCWSTR text )
*
* Update the X state of a window to reflect a style change
*/
void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style )
void X11DRV_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style )
{
struct x11drv_win_data *data;
DWORD new_style, changed;
DWORD changed;
if (hwnd == GetDesktopWindow()) return;
new_style = GetWindowLongW( hwnd, GWL_STYLE );
changed = new_style ^ old_style;
changed = style->styleNew ^ style->styleOld;
if ((changed & WS_VISIBLE) && (new_style & WS_VISIBLE))
if (offset == GWL_STYLE && (changed & WS_VISIBLE) && (style->styleNew & WS_VISIBLE))
{
/* we don't unmap windows, that causes trouble with the window manager */
if (!(data = X11DRV_get_win_data( hwnd )) &&
@ -1474,17 +1473,17 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style )
{
Display *display = thread_display();
set_wm_hints( display, data );
if (!data->mapped) map_window( display, data, new_style );
if (!data->mapped) map_window( display, data, style->styleNew );
}
}
if (changed & WS_DISABLED)
if (offset == GWL_STYLE && (changed & WS_DISABLED))
{
data = X11DRV_get_win_data( hwnd );
if (data && data->wm_hints)
{
wine_tsx11_lock();
data->wm_hints->input = !(new_style & WS_DISABLED);
data->wm_hints->input = !(style->styleNew & WS_DISABLED);
XSetWMHints( thread_display(), data->whole_window, data->wm_hints );
wine_tsx11_unlock();
}

View File

@ -109,7 +109,7 @@
@ cdecl SetParent(long long long) X11DRV_SetParent
@ cdecl SetWindowIcon(long long long) X11DRV_SetWindowIcon
@ cdecl SetWindowRgn(long long long) X11DRV_SetWindowRgn
@ cdecl SetWindowStyle(ptr long) X11DRV_SetWindowStyle
@ cdecl SetWindowStyle(ptr long ptr) X11DRV_SetWindowStyle
@ cdecl SetWindowText(long wstr) X11DRV_SetWindowText
@ cdecl ShowWindow(long long ptr long) X11DRV_ShowWindow
@ cdecl SysCommand(long long long) X11DRV_SysCommand