From a5904bc661a809caf4f85bae64fe8f08669c54ae Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 31 May 2017 11:15:17 +0200 Subject: [PATCH] wineandroid: Initialize screen dimensions. Signed-off-by: Alexandre Julliard --- dlls/wineandroid.drv/Makefile.in | 1 + dlls/wineandroid.drv/android.h | 50 ++++++++++ dlls/wineandroid.drv/init.c | 156 +++++++++++++++++++++++++++++- dlls/wineandroid.drv/wineandroid.drv.spec | 5 + 4 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 dlls/wineandroid.drv/android.h diff --git a/dlls/wineandroid.drv/Makefile.in b/dlls/wineandroid.drv/Makefile.in index 13ec433eb77..dd3ad1939e9 100644 --- a/dlls/wineandroid.drv/Makefile.in +++ b/dlls/wineandroid.drv/Makefile.in @@ -1,4 +1,5 @@ MODULE = wineandroid.drv +IMPORTS = user32 gdi32 C_SRCS = \ init.c diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h new file mode 100644 index 00000000000..7c708f36999 --- /dev/null +++ b/dlls/wineandroid.drv/android.h @@ -0,0 +1,50 @@ +/* + * Android driver definitions + * + * Copyright 2013 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_ANDROID_H +#define __WINE_ANDROID_H + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/gdi_driver.h" + + +/************************************************************************** + * USER driver + */ + +extern unsigned int screen_width DECLSPEC_HIDDEN; +extern unsigned int screen_height DECLSPEC_HIDDEN; +extern RECT virtual_screen_rect DECLSPEC_HIDDEN; +extern MONITORINFOEXW default_monitor DECLSPEC_HIDDEN; + +extern void init_monitors( int width, int height ) DECLSPEC_HIDDEN; + +extern JavaVM *wine_get_java_vm(void); +extern jobject wine_get_java_object(void); + +#endif /* __WINE_ANDROID_H */ diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index da2a168e015..3a3ce80b5b2 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -28,13 +28,30 @@ #include "windef.h" #include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "wine/gdi_driver.h" +#include "android.h" +#include "wine/server.h" +#include "wine/library.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(android); +unsigned int screen_width = 0; +unsigned int screen_height = 0; +RECT virtual_screen_rect = { 0, 0, 0, 0 }; + +MONITORINFOEXW default_monitor = +{ + sizeof(default_monitor), /* cbSize */ + { 0, 0, 0, 0 }, /* rcMonitor */ + { 0, 0, 0, 0 }, /* rcWork */ + MONITORINFOF_PRIMARY, /* dwFlags */ + { '\\','\\','.','\\','D','I','S','P','L','A','Y','1',0 } /* szDevice */ +}; + +static const unsigned int screen_bpp = 32; /* we don't support other modes */ + +static int device_init_done; + typedef struct { struct gdi_physdev dev; @@ -42,6 +59,65 @@ typedef struct static const struct gdi_dc_funcs android_drv_funcs; + +/****************************************************************************** + * init_monitors + */ +void init_monitors( int width, int height ) +{ + static const WCHAR trayW[] = {'S','h','e','l','l','_','T','r','a','y','W','n','d',0}; + RECT rect; + HWND hwnd = FindWindowW( trayW, NULL ); + + virtual_screen_rect.right = width; + virtual_screen_rect.bottom = height; + default_monitor.rcMonitor = default_monitor.rcWork = virtual_screen_rect; + + if (!hwnd || !IsWindowVisible( hwnd )) return; + if (!GetWindowRect( hwnd, &rect )) return; + if (rect.top) default_monitor.rcWork.bottom = rect.top; + else default_monitor.rcWork.top = rect.bottom; + TRACE( "found tray %p %s work area %s\n", hwnd, + wine_dbgstr_rect( &rect ), wine_dbgstr_rect( &default_monitor.rcWork )); +} + + +/********************************************************************** + * fetch_display_metrics + */ +static void fetch_display_metrics(void) +{ + if (wine_get_java_vm()) return; /* for Java threads it will be set when the top view is created */ + + SERVER_START_REQ( get_window_rectangles ) + { + req->handle = wine_server_user_handle( GetDesktopWindow() ); + req->relative = COORDS_CLIENT; + if (!wine_server_call( req )) + { + screen_width = reply->window.right; + screen_height = reply->window.bottom; + } + } + SERVER_END_REQ; + + init_monitors( screen_width, screen_height ); + TRACE( "screen %ux%u\n", screen_width, screen_height ); +} + + +/********************************************************************** + * device_init + * + * Perform initializations needed upon creation of the first device. + */ +static void device_init(void) +{ + device_init_done = TRUE; + fetch_display_metrics(); +} + + /****************************************************************************** * create_android_physdev */ @@ -49,6 +125,8 @@ static ANDROID_PDEVICE *create_android_physdev(void) { ANDROID_PDEVICE *physdev; + if (!device_init_done) device_init(); + if (!(physdev = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*physdev) ))) return NULL; return physdev; } @@ -92,6 +170,76 @@ static BOOL ANDROID_DeleteDC( PHYSDEV dev ) } +/*********************************************************************** + * ANDROID_GetDeviceCaps + */ +static INT ANDROID_GetDeviceCaps( PHYSDEV dev, INT cap ) +{ + switch(cap) + { + case HORZRES: return screen_width; + case VERTRES: return screen_height; + case DESKTOPHORZRES: return virtual_screen_rect.right - virtual_screen_rect.left; + case DESKTOPVERTRES: return virtual_screen_rect.bottom - virtual_screen_rect.top; + case BITSPIXEL: return screen_bpp; + default: + dev = GET_NEXT_PHYSDEV( dev, pGetDeviceCaps ); + return dev->funcs->pGetDeviceCaps( dev, cap ); + } +} + + +/*********************************************************************** + * ANDROID_GetMonitorInfo + */ +BOOL CDECL ANDROID_GetMonitorInfo( HMONITOR handle, LPMONITORINFO info ) +{ + if (handle != (HMONITOR)1) + { + SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; + } + info->rcMonitor = default_monitor.rcMonitor; + info->rcWork = default_monitor.rcWork; + info->dwFlags = default_monitor.dwFlags; + if (info->cbSize >= sizeof(MONITORINFOEXW)) + lstrcpyW( ((MONITORINFOEXW *)info)->szDevice, default_monitor.szDevice ); + return TRUE; +} + + +/*********************************************************************** + * ANDROID_EnumDisplayMonitors + */ +BOOL CDECL ANDROID_EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPARAM lp ) +{ + if (hdc) + { + POINT origin; + RECT limit, monrect; + + if (!GetDCOrgEx( hdc, &origin )) return FALSE; + if (GetClipBox( hdc, &limit ) == ERROR) return FALSE; + + if (rect && !IntersectRect( &limit, &limit, rect )) return TRUE; + + monrect = default_monitor.rcMonitor; + OffsetRect( &monrect, -origin.x, -origin.y ); + if (IntersectRect( &monrect, &monrect, &limit )) + if (!proc( (HMONITOR)1, hdc, &monrect, lp )) + return FALSE; + } + else + { + RECT unused; + if (!rect || IntersectRect( &unused, &default_monitor.rcMonitor, rect )) + if (!proc( (HMONITOR)1, 0, &default_monitor.rcMonitor, lp )) + return FALSE; + } + return TRUE; +} + + static const struct gdi_dc_funcs android_drv_funcs = { NULL, /* pAbortDoc */ @@ -131,7 +279,7 @@ static const struct gdi_dc_funcs android_drv_funcs = NULL, /* pGetCharABCWidths */ NULL, /* pGetCharABCWidthsI */ NULL, /* pGetCharWidth */ - NULL, /* pGetDeviceCaps */ + ANDROID_GetDeviceCaps, /* pGetDeviceCaps */ NULL, /* pGetDeviceGammaRamp */ NULL, /* pGetFontData */ NULL, /* pGetFontRealizationInfo */ diff --git a/dlls/wineandroid.drv/wineandroid.drv.spec b/dlls/wineandroid.drv/wineandroid.drv.spec index 9e943202cef..1723bd45bdd 100644 --- a/dlls/wineandroid.drv/wineandroid.drv.spec +++ b/dlls/wineandroid.drv/wineandroid.drv.spec @@ -1,3 +1,8 @@ # GDI driver @ cdecl wine_get_gdi_driver(long) ANDROID_get_gdi_driver + +# USER driver + +@ cdecl EnumDisplayMonitors(long ptr ptr long) ANDROID_EnumDisplayMonitors +@ cdecl GetMonitorInfo(long ptr) ANDROID_GetMonitorInfo -- 2.11.4.GIT