Alexandre Julliard : wineandroid: Store the actual screen DPI on startup.

Alexandre Julliard julliard at winehq.org
Mon Jun 12 16:10:39 CDT 2017


Module: wine
Branch: master
Commit: f254aec4498e9926200ea9fd9cd2acf914747d91
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f254aec4498e9926200ea9fd9cd2acf914747d91

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 12 19:12:30 2017 +0200

wineandroid: Store the actual screen DPI on startup.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineandroid.drv/Makefile.in       |  2 +-
 dlls/wineandroid.drv/WineActivity.java |  2 ++
 dlls/wineandroid.drv/android.h         |  8 ++++++++
 dlls/wineandroid.drv/init.c            | 18 ++++++++++++++++++
 dlls/wineandroid.drv/window.c          | 22 ++++++++++++++++++++++
 5 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/dlls/wineandroid.drv/Makefile.in b/dlls/wineandroid.drv/Makefile.in
index 55eba97..07082dc 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 1b99b18..ea1ab85 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 class WineActivity extends Activity
         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 0c3f35f..5ef7668 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,
@@ -111,6 +114,11 @@ union event_data
     struct
     {
         enum event_type type;
+        unsigned int    dpi;
+    } cfg;
+    struct
+    {
+        enum event_type type;
         HWND            hwnd;
         ANativeWindow  *window;
         unsigned int    width;
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index 14aa239..871e41d 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 33f2240..3bde739 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -224,6 +224,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
  *
  * JNI callback, runs in the context of the Java thread.
@@ -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 );




More information about the wine-cvs mailing list