Changeset 224776 in webkit


Ignore:
Timestamp:
Nov 13, 2017 1:42:54 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

[GTK] Automatically adjust font size when gtk-xft-dpi changes
https://bugs.webkit.org/show_bug.cgi?id=142673

Patch by Gabriel Ivascu <givascu@igalia.com> on 2017-11-13
Reviewed by Michael Catanzaro.

Source/WebCore:

  • platform/PlatformScreen.h:
  • platform/gtk/PlatformScreenGtk.cpp:

(WebCore::gtkXftDPIChangedCallback):
(WebCore::setScreenDPIObserverHandler):

  • platform/wpe/PlatformScreenWPE.cpp:

(WebCore::setScreenDPIObserverHandler):

Source/WebKit:

  • UIProcess/API/glib/WebKitSettings.cpp:

(webKitSettingsDispose):
(webKitSettingsConstructed):
(webkit_settings_class_init):

Tools:

  • TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp:

(testWebKitSettings):

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r224775 r224776  
     12017-11-13  Gabriel Ivascu  <givascu@igalia.com>
     2
     3        [GTK] Automatically adjust font size when gtk-xft-dpi changes
     4        https://bugs.webkit.org/show_bug.cgi?id=142673
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * platform/PlatformScreen.h:
     9        * platform/gtk/PlatformScreenGtk.cpp:
     10        (WebCore::gtkXftDPIChangedCallback):
     11        (WebCore::setScreenDPIObserverHandler):
     12        * platform/wpe/PlatformScreenWPE.cpp:
     13        (WebCore::setScreenDPIObserverHandler):
     14
    1152017-11-13  Commit Queue  <commit-queue@webkit.org>
    216
  • trunk/Source/WebCore/platform/PlatformScreen.h

    r224737 r224776  
    2525
    2626#pragma once
     27
     28#if USE(GLIB)
     29#include <wtf/Function.h>
     30#endif
    2731
    2832#if PLATFORM(MAC)
     
    6165#if USE(GLIB)
    6266double screenDPI();
     67void setScreenDPIObserverHandler(Function<void()>&&);
    6368#endif
    6469
  • trunk/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp

    r224737 r224776  
    4141#include <cmath>
    4242#include <gtk/gtk.h>
     43#include <wtf/Optional.h>
    4344
    4445namespace WebCore {
     
    113114}
    114115
     116static std::optional<Function<void()>> screenDPIObserverHandler;
     117
     118static void gtkXftDPIChangedCallback()
     119{
     120    if (screenDPIObserverHandler)
     121        (*screenDPIObserverHandler)();
     122}
     123
     124void setScreenDPIObserverHandler(Function<void()>&& handler)
     125{
     126    static GtkSettings* gtkSettings = gtk_settings_get_default();
     127    static unsigned long gtkXftDpiChangedHandlerID = 0;
     128
     129    if (!handler) {
     130        if (gtkSettings && gtkXftDpiChangedHandlerID) {
     131            g_signal_handler_disconnect(gtkSettings, gtkXftDpiChangedHandlerID);
     132            gtkXftDpiChangedHandlerID = 0;
     133        }
     134        return;
     135    }
     136
     137    screenDPIObserverHandler = WTFMove(handler);
     138    if (gtkSettings && !gtkXftDpiChangedHandlerID)
     139        gtkXftDpiChangedHandlerID = g_signal_connect(gtkSettings, "notify::gtk-xft-dpi", G_CALLBACK(gtkXftDPIChangedCallback), nullptr);
     140}
     141
    115142static GdkScreen* getScreen(GtkWidget* widget)
    116143{
  • trunk/Source/WebCore/platform/wpe/PlatformScreenWPE.cpp

    r224737 r224776  
    6161}
    6262
     63void setScreenDPIObserverHandler(Function<void()>&&)
     64{
     65    notImplemented();
     66}
     67
    6368FloatRect screenRect(Widget*)
    6469{
  • trunk/Source/WebKit/ChangeLog

    r224772 r224776  
     12017-11-13  Gabriel Ivascu  <givascu@igalia.com>
     2
     3        [GTK] Automatically adjust font size when gtk-xft-dpi changes
     4        https://bugs.webkit.org/show_bug.cgi?id=142673
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * UIProcess/API/glib/WebKitSettings.cpp:
     9        (webKitSettingsDispose):
     10        (webKitSettingsConstructed):
     11        (webkit_settings_class_init):
     12
    1132017-11-13  Chris Dumez  <cdumez@apple.com>
    214
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitSettings.cpp

    r224737 r224776  
    8080    bool allowModalDialogs { false };
    8181    bool zoomTextOnly { false };
     82    double screenDpi { 96 };
    8283};
    8384
     
    159160};
    160161
     162static void webKitSettingsDispose(GObject* object)
     163{
     164    WebCore::setScreenDPIObserverHandler(nullptr);
     165    G_OBJECT_CLASS(webkit_settings_parent_class)->dispose(object);
     166}
     167
    161168static void webKitSettingsConstructed(GObject* object)
    162169{
    163170    G_OBJECT_CLASS(webkit_settings_parent_class)->constructed(object);
    164171
    165     WebPreferences* prefs = WEBKIT_SETTINGS(object)->priv->preferences.get();
     172    WebKitSettings* settings = WEBKIT_SETTINGS(object);
     173    WebPreferences* prefs = settings->priv->preferences.get();
    166174    prefs->setShouldRespectImageOrientation(true);
     175
     176    settings->priv->screenDpi = WebCore::screenDPI();
     177    WebCore::setScreenDPIObserverHandler([settings]() {
     178        auto newScreenDpi = WebCore::screenDPI();
     179        if (newScreenDpi == settings->priv->screenDpi)
     180            return;
     181
     182        auto scalingFactor = newScreenDpi / settings->priv->screenDpi;
     183        auto prevFontSize = settings->priv->preferences->defaultFontSize();
     184        auto prevMonospaceFontSize = settings->priv->preferences->defaultFixedFontSize();
     185
     186        settings->priv->preferences->setDefaultFontSize(std::round(prevFontSize * scalingFactor));
     187        g_object_notify(G_OBJECT(settings), "default-font-size");
     188
     189        settings->priv->preferences->setDefaultFixedFontSize(std::round(prevMonospaceFontSize * scalingFactor));
     190        g_object_notify(G_OBJECT(settings), "default-monospace-font-size");
     191
     192        settings->priv->screenDpi = newScreenDpi;
     193    });
    167194}
    168195
     
    513540    GObjectClass* gObjectClass = G_OBJECT_CLASS(klass);
    514541    gObjectClass->constructed = webKitSettingsConstructed;
     542    gObjectClass->dispose = webKitSettingsDispose;
    515543    gObjectClass->set_property = webKitSettingsSetProperty;
    516544    gObjectClass->get_property = webKitSettingsGetProperty;
  • trunk/Tools/ChangeLog

    r224765 r224776  
     12017-11-13  Gabriel Ivascu  <givascu@igalia.com>
     2
     3        [GTK] Automatically adjust font size when gtk-xft-dpi changes
     4        https://bugs.webkit.org/show_bug.cgi?id=142673
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        * TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp:
     9        (testWebKitSettings):
     10
    1112017-11-13  Jonathan Bedard  <jbedard@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitSettings.cpp

    r224737 r224776  
    169169    g_assert_cmpuint(webkit_settings_font_size_to_points(8), ==, 6);
    170170    g_assert_cmpuint(webkit_settings_font_size_to_points(24), ==, 18);
     171
     172    // Test font size on DPI change. The font size value in pixels should scale
     173    // accordingly, while the font size value in points should remain the same.
     174    if (gtkSettings) {
     175        // At 96 DPI, 20 pixels is 15 points.
     176        webkit_settings_set_default_font_size(settings, 20);
     177        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_font_size(settings)), ==, 15);
     178        // At 96 DPI, 16 pixels is 12 points.
     179        webkit_settings_set_default_monospace_font_size(settings, 16);
     180        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_monospace_font_size(settings)), ==, 12);
     181
     182        // Set DPI to 120. The scaling factor is 120 / 96 == 1.25.
     183        g_object_set(gtkSettings, "gtk-xft-dpi", 120 * 1024, nullptr);
     184        g_assert_cmpuint(webkit_settings_get_default_font_size(settings), ==, 25);
     185        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_font_size(settings)), ==, 15);
     186        g_assert_cmpuint(webkit_settings_get_default_monospace_font_size(settings), ==, 20);
     187        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_monospace_font_size(settings)), ==, 12);
     188
     189        // Set DPI back to 96. The scaling factor is 96 / 120 == 0.8.
     190        g_object_set(gtkSettings, "gtk-xft-dpi", 96 * 1024, nullptr);
     191        g_assert_cmpuint(webkit_settings_get_default_font_size(settings), ==, 20);
     192        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_font_size(settings)), ==, 15);
     193        g_assert_cmpuint(webkit_settings_get_default_monospace_font_size(settings), ==, 16);
     194        g_assert_cmpuint(webkit_settings_font_size_to_points(webkit_settings_get_default_monospace_font_size(settings)), ==, 12);
     195    }
    171196#endif
    172197
Note: See TracChangeset for help on using the changeset viewer.