diff options
author | Sven Gothel <[email protected]> | 2023-01-31 22:57:23 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-01-31 22:57:23 +0100 |
commit | 7982cc52344c025c40da45fd4b946056a63bc855 (patch) | |
tree | 821c49296827111efc7b4b207ae4cc2726320559 /src/newt/classes/jogamp | |
parent | ad38d1559854985b1131e5b6c7274a392b5bc265 (diff) |
NEWT Soft-PixelScale (p7): get{Global->}PixelScaleEnv(..): Support per monitor values w/ QT_SCREEN_SCALE_FACTORS syntax, use for X11v2.4.0
Per-monitor values are parsed if value is not a float and stored
in a given Map<String,float[2]>, parallel to a detected global_pixel_scale_xy.
The per-monitor value syntax matches QT_SCREEN_SCALE_FACTORS,
i.e. the regular expression '(<string>=<float>;)+',
e.g. QT_SCREEN_SCALE_FACTORS='DP-1=1.25;DP-2=1.25;HDMI-1=1.25;'
The per-monitor value is preferred and on X11 stored within the MonitorDevice,
matching the MonitorDevice's name.
The following env-var names are searched on X11:
"QT_SCREEN_SCALE_FACTORS", "QT_SCALE_FACTOR", "GDK_SCALE", "SOFT_SCALE"
Diffstat (limited to 'src/newt/classes/jogamp')
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java | 30 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java | 5 |
2 files changed, 27 insertions, 8 deletions
diff --git a/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java index 1ffa26407..83929afe3 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/x11/ScreenDriver.java @@ -34,7 +34,9 @@ package jogamp.newt.driver.x11; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.jogamp.nativewindow.AbstractGraphicsDevice; import com.jogamp.nativewindow.ScalableSurface; @@ -60,24 +62,33 @@ import com.jogamp.newt.MonitorMode; public class ScreenDriver extends ScreenImpl { protected static final boolean DEBUG_TEST_RANDR13_DISABLED; protected static final float[] global_pixel_scale = new float[] { ScalableSurface.AUTOMAX_PIXELSCALE, ScalableSurface.AUTOMAX_PIXELSCALE }; + protected static final Map<String,float[/*2*/]> monitor_pixel_scale_map = new HashMap<String, float[]>(); protected static final boolean global_pixel_scale_set; + protected static final boolean monitor_pixel_scale_map_set; static { Debug.initSingleton(); DEBUG_TEST_RANDR13_DISABLED = PropertyAccess.isPropertyDefined("newt.test.Screen.disableRandR13", true); - final String[] env_var_names = new String[] { "GDK_SCALE", "QT_SCALE_FACTOR", "SOFT_SCALE" }; + final String[] env_var_names = new String[] { "QT_SCREEN_SCALE_FACTORS", "QT_SCALE_FACTOR", "GDK_SCALE", "SOFT_SCALE" }; int var_name_idx = -1; try { - var_name_idx = SurfaceScaleUtils.getGlobalPixelScaleEnv(env_var_names, global_pixel_scale); + var_name_idx = SurfaceScaleUtils.getPixelScaleEnv(env_var_names, global_pixel_scale, monitor_pixel_scale_map); } catch (final Throwable t) { t.printStackTrace(); } if( 0 <= var_name_idx && var_name_idx < env_var_names.length ) { - global_pixel_scale_set = true; + global_pixel_scale_set = global_pixel_scale[0] != ScalableSurface.AUTOMAX_PIXELSCALE && global_pixel_scale[1] != ScalableSurface.AUTOMAX_PIXELSCALE; + monitor_pixel_scale_map_set = !monitor_pixel_scale_map.isEmpty(); if( DEBUG ) { - System.err.println("X11Screen: Global PixelScale Set: "+env_var_names[var_name_idx]+": "+global_pixel_scale[0]+"/"+global_pixel_scale[1]); + System.err.println("X11Screen: Env PixelScale: Env-Variable "+env_var_names[var_name_idx]); + System.err.println("X11Screen: Env PixelScale: Global: Set "+global_pixel_scale_set+", "+global_pixel_scale[0]+"/"+global_pixel_scale[1]); + System.err.println("X11Screen: Env PixelScale: Map: Set "+monitor_pixel_scale_map_set+", "+SurfaceScaleUtils.toString(monitor_pixel_scale_map)); } } else { + if( DEBUG ) { + System.err.println("X11Screen: Env PixelScale: None"); + } global_pixel_scale_set = false; + monitor_pixel_scale_map_set = false; } DisplayDriver.initSingleton(); @@ -138,10 +149,6 @@ public class ScreenDriver extends ScreenImpl { try { if( rAndR.beginInitialQuery(device.getHandle(), this) ) { try { - final float pixel_scale[] = { ScalableSurface.IDENTITY_PIXELSCALE, ScalableSurface.IDENTITY_PIXELSCALE }; - if( global_pixel_scale_set ) { - System.arraycopy(global_pixel_scale, 0, pixel_scale, 0, 2); - } final int[] crt_ids = rAndR.getMonitorDeviceIds(device.getHandle(), this); final int crtCount = null != crt_ids ? crt_ids.length : 0; @@ -178,6 +185,13 @@ public class ScreenDriver extends ScreenImpl { if( null != monitorProps && MonitorModeProps.MIN_MONITOR_DEVICE_PROPERTIES <= monitorProps[0] && // Enabled ? I.e. contains active modes ? MonitorModeProps.MIN_MONITOR_DEVICE_PROPERTIES <= monitorProps.length ) { + float pixel_scale[] = null; + if( monitor_pixel_scale_map_set && null != monitorName && !monitorName.isEmpty() ) { + pixel_scale = monitor_pixel_scale_map.get(monitorName); + } + if( null == pixel_scale && global_pixel_scale_set ) { + pixel_scale = global_pixel_scale; + } MonitorModeProps.streamInMonitorDevice(cache, this, crt_id, monitorName, pixel_scale, true /* invscale_wuviewport */, monitorProps, 0, null); } diff --git a/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java index 28f881bab..5fb01c619 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/x11/WindowDriver.java @@ -108,6 +108,11 @@ public class WindowDriver extends WindowImpl { if( null != md ) { final float newPixelScale[] = { 0, 0 }; md.getPixelScale(newPixelScale); + if( DEBUG_IMPLEMENTATION ) { + System.err.println("Window.updatePixelScaleByMonitor: pixel "+getSurfaceBounds()+", window "+getBounds()); + System.err.println("Window.updatePixelScaleByMonitor: monitor "+md); + System.err.println("Window.updatePixelScaleByMonitor: has "+hasPixelScale[0]+", new "+newPixelScale[0]+" - "+getThreadName()); + } res = applySoftPixelScale(move_diff, sendEvent, defer, newPixelScale); } return res; |