ivmx/cefpython

Text size (DPI) issues on Windows

GoogleCodeExporter opened this issue · 9 comments

When the text size (DPI) on Windows is set to Medium (125%) or Larger (150%), 
it will also enlarge the text size in the following examples:

example.py (pywin32)
wxpython.py
pygtk_.py

Though, the text looks fuzzy.

Is there a way to disable the automatic enlarging of texts in CEF browser 
windows? It would definitely give better results if the DPI setting was 
detected manually, and then Browser.`SetZoomLevel()` was called to enlarge 
text. The text fonts wouldn't look fuzzy then.

In the following examples, the text size is not enlarged automatically, thus on 
high resolutions everything is so small:

pyqt.py
pyside.py

Investigate the Qt API whether there is some function to use the system DPI 
setting for the embedded window.

Original issue reported on code.google.com by czarek.t...@gmail.com on 18 Jan 2014 at 12:12

The Browser.`SetZoomLevel()` method should probably be called in 
LifespanHandler.`OnAfterCreated()` (callback not yet ported to cefpython) or in 
LoadHandler.`OnLoadStart()`.

Original comment by czarek.t...@gmail.com on 18 Jan 2014 at 12:14

On Windows application can embed a DPI aware manifest in the executable, to let 
know OS that it will handle DPI resizing itself. The manifest looks like this:

  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <asmv3:application>
      <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>true</dpiAware>
      </asmv3:windowsSettings>
    </asmv3:application>
  </assembly>

Is there a way to programmatically tell the OS that app will handle the DPI 
sizing itself? So that SetZoomLevel can be used which gives better non-fuzzy 
fonts?

Regarding where should SetZoomLevel() be called. The zoom level needs to be 
checked constantly, as it is required to set it again when the url changes to a 
different domain. And when url changes a new renderer process is handling the 
new site. Calling SetZoomLevel() in `OnLoadStart` or `OnAfterCreated` does not 
work. It needs to be called during loading of a page or after it is loaded. 
Calling it after all content was loaded does not give good UI experience, as 
the whole page kind of "jumps" when resizing the content. An interval timer 
should be used. This can be accomplished by using the CefPostDelayedTask() 
function. For an example see the SetBrowserDpiSettings() function in the PHP 
Desktop project:

https://code.google.com/p/phpdesktop/source/browse/phpdesktop-chrome/dpi_aware.c
pp?r=a09cf1528699

Original comment by czarek.t...@gmail.com on 27 Jan 2014 at 3:52

In branch 1650 and earlier there is the --high-dpi-support switch available. 
Does it affect zooming, or is this dpi support for the controls outside the 
browser view? And does it work with CEF? 

That switch was removed in branch 1750 or later, see:
https://groups.google.com/a/chromium.org/d/topic/chromium-dev/U_K1NHuMLic/discus
sion

Original comment by czarek.t...@gmail.com on 14 Jun 2014 at 9:41

Branch 1750 is supposed to support high DPI natively without the need for 
zooming. Including the dpiAware manifest or calling SetProcessDPIAware (Vista 
or later) should be enough. See:
http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=11948

Original comment by czarek.t...@gmail.com on 15 Jul 2014 at 5:53

Original comment by czarek.t...@gmail.com on 29 Jul 2014 at 3:32

  • Now blocked on: #128
If patch from the issue below gets accepted then it might be easier to 
implement zooming by using the zoom handler:
https://code.google.com/p/chromiumembedded/issues/detail?id=1314

Original comment by czarek.t...@gmail.com on 14 Jun 2014 at 5:58

Fixed in revision a07c898cb1df.

See the ApplicationSettings.`auto_zooming` option and the DpiAware wiki page. 
Example usage is in the wxpython.py example.

Original comment by czarek.t...@gmail.com on 9 Aug 2014 at 4:22

  • Changed state: Fixed
The --high-dpi-support flag started working only after applying a patch to CEF 
sources. See the BuildOnWindows wiki page.

That flag was removed in Chromium revision r256811 (probably branch 1750). So 
when we upgrade to a newer CEF we will need to work on a new patch (and 
probably use the old functions from dpi.cc).

See dpi.cc in branch 1650. EnableHighDPISupport calls win32 function 
SetProcessDPIAware.
http://src.chromium.org/viewvc/chrome/trunk/src/ui/gfx/win/dpi.cc?revision=24164
1

In later revisions the DPI awareness is set through Windows Registry, see:
http://src.chromium.org/viewvc/chrome/trunk/src/ui/gfx/win/dpi.cc?revision=25681
1&pathrev=256811

On how to enable High DPI support see the CommandLineSwitches wiki page.

Original comment by czarek.t...@gmail.com on 8 Aug 2014 at 4:22

There were some problems with Chrome UI on Win 8.1 when calling 
SetProcessDPIAware. On MSDN [1] you can find that out that this function is not 
reliable, thus it's better to set dpi awareness by embedding a manifest in 
executable, or by using Windows registry.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633543(v=vs.85).aspx

Original comment by czarek.t...@gmail.com on 8 Aug 2014 at 4:29