server: Inherit internal desktop flags when creating desktops.
Based on Rémi's idea. CEF applications create their own desktops and so is_virtual_desktop() could incorrectly report that virtual desktop is off if DF_WINE_VIRTUAL_DESKTOP is not inherited. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55810
This commit is contained in:
parent
2990a4f8c3
commit
ca97cb8700
4 changed files with 16 additions and 4 deletions
|
@ -256,7 +256,8 @@ HDESK WINAPI CreateDesktopW( LPCWSTR name, LPCWSTR device, LPDEVMODEW devmode,
|
||||||
OBJECT_ATTRIBUTES attr;
|
OBJECT_ATTRIBUTES attr;
|
||||||
UNICODE_STRING str;
|
UNICODE_STRING str;
|
||||||
|
|
||||||
if (device || (devmode && !(flags & DF_WINE_VIRTUAL_DESKTOP)))
|
if (device || (devmode && !(flags & DF_WINE_VIRTUAL_DESKTOP))
|
||||||
|
|| (flags & DF_WINE_ROOT_DESKTOP && flags & DF_WINE_VIRTUAL_DESKTOP))
|
||||||
{
|
{
|
||||||
SetLastError( ERROR_INVALID_PARAMETER );
|
SetLastError( ERROR_INVALID_PARAMETER );
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -297,6 +297,7 @@ struct unpack_dde_message_result
|
||||||
#define SPY_RESULT_DEFWND 0x0002
|
#define SPY_RESULT_DEFWND 0x0002
|
||||||
|
|
||||||
/* CreateDesktop wine specific flag */
|
/* CreateDesktop wine specific flag */
|
||||||
|
#define DF_WINE_ROOT_DESKTOP 0x40000000
|
||||||
#define DF_WINE_VIRTUAL_DESKTOP 0x80000000
|
#define DF_WINE_VIRTUAL_DESKTOP 0x80000000
|
||||||
|
|
||||||
/* NtUserMessageCall codes */
|
/* NtUserMessageCall codes */
|
||||||
|
|
|
@ -1094,7 +1094,7 @@ void manage_desktop( WCHAR *arg )
|
||||||
{
|
{
|
||||||
DEVMODEW devmode = {.dmPelsWidth = width, .dmPelsHeight = height};
|
DEVMODEW devmode = {.dmPelsWidth = width, .dmPelsHeight = height};
|
||||||
/* magic: desktop "root" means use the root window */
|
/* magic: desktop "root" means use the root window */
|
||||||
if ((using_root = !wcsicmp( name, L"root" ))) desktop = CreateDesktopW( name, NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL );
|
if ((using_root = !wcsicmp( name, L"root" ))) desktop = CreateDesktopW( name, NULL, NULL, DF_WINE_ROOT_DESKTOP, DESKTOP_ALL_ACCESS, NULL );
|
||||||
else desktop = CreateDesktopW( name, NULL, &devmode, DF_WINE_VIRTUAL_DESKTOP, DESKTOP_ALL_ACCESS, NULL );
|
else desktop = CreateDesktopW( name, NULL, &devmode, DF_WINE_VIRTUAL_DESKTOP, DESKTOP_ALL_ACCESS, NULL );
|
||||||
if (!desktop)
|
if (!desktop)
|
||||||
{
|
{
|
||||||
|
|
|
@ -221,14 +221,24 @@ struct desktop *get_desktop_obj( struct process *process, obj_handle_t handle, u
|
||||||
static struct desktop *create_desktop( const struct unicode_str *name, unsigned int attr,
|
static struct desktop *create_desktop( const struct unicode_str *name, unsigned int attr,
|
||||||
unsigned int flags, struct winstation *winstation )
|
unsigned int flags, struct winstation *winstation )
|
||||||
{
|
{
|
||||||
struct desktop *desktop;
|
struct desktop *desktop, *current_desktop;
|
||||||
|
|
||||||
if ((desktop = create_named_object( &winstation->obj, &desktop_ops, name, attr, NULL )))
|
if ((desktop = create_named_object( &winstation->obj, &desktop_ops, name, attr, NULL )))
|
||||||
{
|
{
|
||||||
if (get_error() != STATUS_OBJECT_NAME_EXISTS)
|
if (get_error() != STATUS_OBJECT_NAME_EXISTS)
|
||||||
{
|
{
|
||||||
/* initialize it if it didn't already exist */
|
/* initialize it if it didn't already exist */
|
||||||
|
|
||||||
desktop->flags = flags;
|
desktop->flags = flags;
|
||||||
|
|
||||||
|
/* inherit DF_WINE_*_DESKTOP flags if none of them are specified */
|
||||||
|
if (!(flags & (DF_WINE_ROOT_DESKTOP | DF_WINE_VIRTUAL_DESKTOP))
|
||||||
|
&& (current_desktop = get_thread_desktop( current, 0 )))
|
||||||
|
{
|
||||||
|
desktop->flags |= current_desktop->flags & (DF_WINE_VIRTUAL_DESKTOP | DF_WINE_ROOT_DESKTOP);
|
||||||
|
release_object( current_desktop );
|
||||||
|
}
|
||||||
|
|
||||||
desktop->winstation = (struct winstation *)grab_object( winstation );
|
desktop->winstation = (struct winstation *)grab_object( winstation );
|
||||||
desktop->top_window = NULL;
|
desktop->top_window = NULL;
|
||||||
desktop->msg_window = NULL;
|
desktop->msg_window = NULL;
|
||||||
|
@ -243,7 +253,7 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
desktop->flags |= (flags & DF_WINE_VIRTUAL_DESKTOP);
|
desktop->flags |= flags & (DF_WINE_VIRTUAL_DESKTOP | DF_WINE_ROOT_DESKTOP);
|
||||||
clear_error();
|
clear_error();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue