diff --git a/dlls/wineandroid.drv/Makefile.in b/dlls/wineandroid.drv/Makefile.in index 55eba97b097..07082dcb22c 100644 --- a/dlls/wineandroid.drv/Makefile.in +++ b/dlls/wineandroid.drv/Makefile.in @@ -1,5 +1,5 @@ MODULE = wineandroid.drv -IMPORTS = user32 gdi32 ntoskrnl +IMPORTS = user32 gdi32 advapi32 ntoskrnl C_SRCS = \ device.c \ diff --git a/dlls/wineandroid.drv/WineActivity.java b/dlls/wineandroid.drv/WineActivity.java index 1b99b186393..ea1ab8536eb 100644 --- a/dlls/wineandroid.drv/WineActivity.java +++ b/dlls/wineandroid.drv/WineActivity.java @@ -53,6 +53,7 @@ public class WineActivity extends Activity { private native String wine_init( String[] cmdline, String[] env ); public native void wine_desktop_changed( int width, int height ); + public native void wine_config_changed( int dpi ); public native void wine_surface_changed( int hwnd, Surface surface ); public native boolean wine_motion_event( int hwnd, int action, int x, int y, int state, int vscroll ); public native boolean wine_keyboard_event( int hwnd, int action, int keycode, int state ); @@ -508,6 +509,7 @@ public void create_desktop_window( int hwnd ) top_view = new TopView( this, hwnd ); setContentView( top_view ); progress_dialog.dismiss(); + wine_config_changed( getResources().getConfiguration().densityDpi ); } public void create_window( int hwnd, int parent, int pid ) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 0c3f35f207f..5ef7668d33d 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -81,10 +81,12 @@ enum android_window_messages extern HWND get_capture_window(void) DECLSPEC_HIDDEN; extern void init_monitors( int width, int height ) DECLSPEC_HIDDEN; +extern void set_screen_dpi( DWORD dpi ) DECLSPEC_HIDDEN; extern void update_keyboard_lock_state( WORD vkey, UINT state ) DECLSPEC_HIDDEN; /* JNI entry points */ extern void desktop_changed( JNIEnv *env, jobject obj, jint width, jint height ) DECLSPEC_HIDDEN; +extern void config_changed( JNIEnv *env, jobject obj, jint dpi ) DECLSPEC_HIDDEN; extern void surface_changed( JNIEnv *env, jobject obj, jint win, jobject surface ) DECLSPEC_HIDDEN; extern jboolean motion_event( JNIEnv *env, jobject obj, jint win, jint action, jint x, jint y, jint state, jint vscroll ) DECLSPEC_HIDDEN; @@ -94,6 +96,7 @@ extern jboolean keyboard_event( JNIEnv *env, jobject obj, jint win, jint action, enum event_type { DESKTOP_CHANGED, + CONFIG_CHANGED, SURFACE_CHANGED, MOTION_EVENT, KEYBOARD_EVENT, @@ -109,6 +112,11 @@ union event_data unsigned int height; } desktop; struct + { + enum event_type type; + unsigned int dpi; + } cfg; + struct { enum event_type type; HWND hwnd; diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 14aa2392e87..871e41d800c 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -28,6 +28,7 @@ #include "windef.h" #include "winbase.h" +#include "winreg.h" #include "android.h" #include "wine/server.h" #include "wine/library.h" @@ -82,6 +83,22 @@ void init_monitors( int width, int height ) } +/****************************************************************************** + * set_screen_dpi + */ +void set_screen_dpi( DWORD dpi ) +{ + static const WCHAR dpi_key_name[] = {'S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0}; + static const WCHAR dpi_value_name[] = {'L','o','g','P','i','x','e','l','s',0}; + HKEY hkey; + + if (!RegCreateKeyW( HKEY_CURRENT_CONFIG, dpi_key_name, &hkey )) + { + RegSetValueExW( hkey, dpi_value_name, 0, REG_DWORD, (void *)&dpi, sizeof(DWORD) ); + RegCloseKey( hkey ); + } +} + /********************************************************************** * fetch_display_metrics */ @@ -390,6 +407,7 @@ const struct gdi_dc_funcs * CDECL ANDROID_get_gdi_driver( unsigned int version ) static const JNINativeMethod methods[] = { { "wine_desktop_changed", "(II)V", desktop_changed }, + { "wine_config_changed", "(I)V", config_changed }, { "wine_surface_changed", "(ILandroid/view/Surface;)V", surface_changed }, { "wine_motion_event", "(IIIIII)Z", motion_event }, { "wine_keyboard_event", "(IIII)Z", keyboard_event }, diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index 33f22403e59..3bde739adbd 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -223,6 +223,23 @@ void desktop_changed( JNIEnv *env, jobject obj, jint width, jint height ) } +/*********************************************************************** + * config_changed + * + * JNI callback, runs in the context of the Java thread. + */ +void config_changed( JNIEnv *env, jobject obj, jint dpi ) +{ + union event_data data; + + memset( &data, 0, sizeof(data) ); + data.type = CONFIG_CHANGED; + data.cfg.dpi = dpi; + p__android_log_print( ANDROID_LOG_INFO, "wine", "config_changed: %u dpi", dpi ); + send_event( &data ); +} + + /*********************************************************************** * surface_changed * @@ -428,6 +445,11 @@ static int process_events( DWORD mask ) SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW ); break; + case CONFIG_CHANGED: + TRACE( "CONFIG_CHANGED dpi %u\n", event->data.cfg.dpi ); + set_screen_dpi( event->data.cfg.dpi ); + break; + case SURFACE_CHANGED: TRACE("SURFACE_CHANGED %p %p size %ux%u\n", event->data.surface.hwnd, event->data.surface.window, event->data.surface.width, event->data.surface.height );