mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 14:27:35 +00:00
LibGfx+WindowServer: Have WindowServer broadcast system font settings
Instead of everybody getting their system fonts from Gfx::FontDatabase (where it's all hardcoded), they now get it from WindowServer. These are then plumbed into the usual Gfx::FontDatabase places so that the old default_font() and default_fixed_width_font() APIs keep working.
This commit is contained in:
parent
66ad739934
commit
bb23e61fbf
11 changed files with 76 additions and 15 deletions
|
@ -21,6 +21,7 @@
|
||||||
#include <LibGUI/Window.h>
|
#include <LibGUI/Window.h>
|
||||||
#include <LibGUI/WindowServerConnection.h>
|
#include <LibGUI/WindowServerConnection.h>
|
||||||
#include <LibGfx/Bitmap.h>
|
#include <LibGfx/Bitmap.h>
|
||||||
|
#include <LibGfx/FontDatabase.h>
|
||||||
#include <LibGfx/Palette.h>
|
#include <LibGfx/Palette.h>
|
||||||
#include <LibGfx/SystemTheme.h>
|
#include <LibGfx/SystemTheme.h>
|
||||||
|
|
||||||
|
@ -47,9 +48,11 @@ void WindowServerConnection::handshake()
|
||||||
auto message = wait_for_specific_message<Messages::WindowClient::FastGreet>();
|
auto message = wait_for_specific_message<Messages::WindowClient::FastGreet>();
|
||||||
set_system_theme_from_anonymous_buffer(message->theme_buffer());
|
set_system_theme_from_anonymous_buffer(message->theme_buffer());
|
||||||
Desktop::the().did_receive_screen_rect({}, message->screen_rect());
|
Desktop::the().did_receive_screen_rect({}, message->screen_rect());
|
||||||
|
Gfx::FontDatabase::set_default_font_query(message->default_font_query());
|
||||||
|
Gfx::FontDatabase::set_fixed_width_font_query(message->fixed_width_font_query());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowServerConnection::fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&)
|
void WindowServerConnection::fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&, String const&, String const&)
|
||||||
{
|
{
|
||||||
// NOTE: This message is handled in handshake().
|
// NOTE: This message is handled in handshake().
|
||||||
}
|
}
|
||||||
|
@ -63,6 +66,12 @@ void WindowServerConnection::update_system_theme(Core::AnonymousBuffer const& th
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowServerConnection::update_system_fonts(const String& default_font_query, const String& fixed_width_font_query)
|
||||||
|
{
|
||||||
|
Gfx::FontDatabase::set_default_font_query(default_font_query);
|
||||||
|
Gfx::FontDatabase::set_fixed_width_font_query(fixed_width_font_query);
|
||||||
|
}
|
||||||
|
|
||||||
void WindowServerConnection::paint(i32 window_id, Gfx::IntSize const& window_size, Vector<Gfx::IntRect> const& rects)
|
void WindowServerConnection::paint(i32 window_id, Gfx::IntSize const& window_size, Vector<Gfx::IntRect> const& rects)
|
||||||
{
|
{
|
||||||
if (auto* window = Window::from_window_id(window_id))
|
if (auto* window = Window::from_window_id(window_id))
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
static WindowServerConnection& the();
|
static WindowServerConnection& the();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&) override;
|
virtual void fast_greet(Gfx::IntRect const&, Core::AnonymousBuffer const&, String const&, String const&) override;
|
||||||
virtual void paint(i32, Gfx::IntSize const&, Vector<Gfx::IntRect> const&) override;
|
virtual void paint(i32, Gfx::IntSize const&, Vector<Gfx::IntRect> const&) override;
|
||||||
virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, bool, Vector<String> const&) override;
|
virtual void mouse_move(i32, Gfx::IntPoint const&, u32, u32, u32, i32, bool, Vector<String> const&) override;
|
||||||
virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;
|
virtual void mouse_down(i32, Gfx::IntPoint const&, u32, u32, u32, i32) override;
|
||||||
|
@ -54,6 +54,7 @@ private:
|
||||||
virtual void drag_accepted() override;
|
virtual void drag_accepted() override;
|
||||||
virtual void drag_cancelled() override;
|
virtual void drag_cancelled() override;
|
||||||
virtual void update_system_theme(Core::AnonymousBuffer const&) override;
|
virtual void update_system_theme(Core::AnonymousBuffer const&) override;
|
||||||
|
virtual void update_system_fonts(String const&, String const&) override;
|
||||||
virtual void window_state_changed(i32, bool, bool) override;
|
virtual void window_state_changed(i32, bool, bool) override;
|
||||||
virtual void display_link_notification() override;
|
virtual void display_link_notification() override;
|
||||||
virtual void ping() override;
|
virtual void ping() override;
|
||||||
|
|
|
@ -24,24 +24,55 @@ FontDatabase& FontDatabase::the()
|
||||||
return *s_the;
|
return *s_the;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RefPtr<Font> s_default_font;
|
||||||
|
static String s_default_font_query;
|
||||||
|
static RefPtr<Font> s_fixed_width_font;
|
||||||
|
static String s_fixed_width_font_query;
|
||||||
|
|
||||||
|
void FontDatabase::set_default_font_query(String query)
|
||||||
|
{
|
||||||
|
if (s_default_font_query == query)
|
||||||
|
return;
|
||||||
|
s_default_font_query = move(query);
|
||||||
|
s_default_font = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
String FontDatabase::default_font_query()
|
||||||
|
{
|
||||||
|
return s_default_font_query;
|
||||||
|
}
|
||||||
|
|
||||||
Font& FontDatabase::default_font()
|
Font& FontDatabase::default_font()
|
||||||
{
|
{
|
||||||
static Font* font;
|
if (!s_default_font) {
|
||||||
if (!font) {
|
VERIFY(!s_default_font_query.is_empty());
|
||||||
font = FontDatabase::the().get_by_name("Katica 10 400");
|
s_default_font = FontDatabase::the().get_by_name(s_default_font_query);
|
||||||
VERIFY(font);
|
VERIFY(s_default_font);
|
||||||
}
|
}
|
||||||
return *font;
|
return *s_default_font;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontDatabase::set_fixed_width_font_query(String query)
|
||||||
|
{
|
||||||
|
if (s_fixed_width_font_query == query)
|
||||||
|
return;
|
||||||
|
s_fixed_width_font_query = move(query);
|
||||||
|
s_fixed_width_font = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
String FontDatabase::fixed_width_font_query()
|
||||||
|
{
|
||||||
|
return s_fixed_width_font_query;
|
||||||
}
|
}
|
||||||
|
|
||||||
Font& FontDatabase::default_fixed_width_font()
|
Font& FontDatabase::default_fixed_width_font()
|
||||||
{
|
{
|
||||||
static Font* font;
|
if (!s_fixed_width_font) {
|
||||||
if (!font) {
|
VERIFY(!s_fixed_width_font_query.is_empty());
|
||||||
font = FontDatabase::the().get_by_name("Csilla 10 400");
|
s_fixed_width_font = FontDatabase::the().get_by_name(s_fixed_width_font_query);
|
||||||
VERIFY(font);
|
VERIFY(s_fixed_width_font);
|
||||||
}
|
}
|
||||||
return *font;
|
return *s_fixed_width_font;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FontDatabase::Private {
|
struct FontDatabase::Private {
|
||||||
|
|
|
@ -37,6 +37,11 @@ public:
|
||||||
static Font& default_font();
|
static Font& default_font();
|
||||||
static Font& default_fixed_width_font();
|
static Font& default_fixed_width_font();
|
||||||
|
|
||||||
|
static String default_font_query();
|
||||||
|
static String fixed_width_font_query();
|
||||||
|
static void set_default_font_query(String);
|
||||||
|
static void set_fixed_width_font_query(String);
|
||||||
|
|
||||||
RefPtr<Gfx::Font> get(const String& family, unsigned size, unsigned weight);
|
RefPtr<Gfx::Font> get(const String& family, unsigned size, unsigned weight);
|
||||||
RefPtr<Gfx::Font> get(const String& family, const String& variant, unsigned size);
|
RefPtr<Gfx::Font> get(const String& family, const String& variant, unsigned size);
|
||||||
RefPtr<Gfx::Font> get_by_name(const StringView&);
|
RefPtr<Gfx::Font> get_by_name(const StringView&);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
* Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
#include <LibGUI/Painter.h>
|
#include <LibGUI/Painter.h>
|
||||||
#include <LibGUI/Scrollbar.h>
|
#include <LibGUI/Scrollbar.h>
|
||||||
#include <LibGUI/Window.h>
|
#include <LibGUI/Window.h>
|
||||||
|
#include <LibGfx/FontDatabase.h>
|
||||||
#include <LibGfx/Palette.h>
|
#include <LibGfx/Palette.h>
|
||||||
#include <LibGfx/SystemTheme.h>
|
#include <LibGfx/SystemTheme.h>
|
||||||
|
|
||||||
|
@ -69,6 +70,7 @@ void OutOfProcessWebView::create_client()
|
||||||
};
|
};
|
||||||
|
|
||||||
client().async_update_system_theme(Gfx::current_system_theme_buffer());
|
client().async_update_system_theme(Gfx::current_system_theme_buffer());
|
||||||
|
client().async_update_system_fonts(Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query());
|
||||||
client().async_update_screen_rect(GUI::Desktop::the().rect());
|
client().async_update_screen_rect(GUI::Desktop::the().rect());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <AK/Badge.h>
|
#include <AK/Badge.h>
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <LibGfx/Bitmap.h>
|
#include <LibGfx/Bitmap.h>
|
||||||
|
#include <LibGfx/FontDatabase.h>
|
||||||
#include <LibGfx/SystemTheme.h>
|
#include <LibGfx/SystemTheme.h>
|
||||||
#include <LibJS/Console.h>
|
#include <LibJS/Console.h>
|
||||||
#include <LibJS/Heap/Heap.h>
|
#include <LibJS/Heap/Heap.h>
|
||||||
|
@ -69,6 +70,12 @@ void ClientConnection::update_system_theme(const Core::AnonymousBuffer& theme_bu
|
||||||
m_page_host->set_palette_impl(*impl);
|
m_page_host->set_palette_impl(*impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientConnection::update_system_fonts(String const& default_font_query, String const& fixed_width_font_query)
|
||||||
|
{
|
||||||
|
Gfx::FontDatabase::set_default_font_query(default_font_query);
|
||||||
|
Gfx::FontDatabase::set_fixed_width_font_query(fixed_width_font_query);
|
||||||
|
}
|
||||||
|
|
||||||
void ClientConnection::update_screen_rect(const Gfx::IntRect& rect)
|
void ClientConnection::update_screen_rect(const Gfx::IntRect& rect)
|
||||||
{
|
{
|
||||||
m_page_host->set_screen_rect(rect);
|
m_page_host->set_screen_rect(rect);
|
||||||
|
|
|
@ -34,6 +34,7 @@ private:
|
||||||
|
|
||||||
virtual void greet() override;
|
virtual void greet() override;
|
||||||
virtual void update_system_theme(Core::AnonymousBuffer const&) override;
|
virtual void update_system_theme(Core::AnonymousBuffer const&) override;
|
||||||
|
virtual void update_system_fonts(String const&, String const&) override;
|
||||||
virtual void update_screen_rect(Gfx::IntRect const&) override;
|
virtual void update_screen_rect(Gfx::IntRect const&) override;
|
||||||
virtual void load_url(URL const&) override;
|
virtual void load_url(URL const&) override;
|
||||||
virtual void load_html(String const&, URL const&) override;
|
virtual void load_html(String const&, URL const&) override;
|
||||||
|
|
|
@ -3,6 +3,7 @@ endpoint WebContentServer
|
||||||
greet() => ()
|
greet() => ()
|
||||||
|
|
||||||
update_system_theme(Core::AnonymousBuffer theme_buffer) =|
|
update_system_theme(Core::AnonymousBuffer theme_buffer) =|
|
||||||
|
update_system_fonts(String default_font_query, String fixed_width_font_query) =|
|
||||||
update_screen_rect(Gfx::IntRect rect) =|
|
update_screen_rect(Gfx::IntRect rect) =|
|
||||||
|
|
||||||
load_url(URL url) =|
|
load_url(URL url) =|
|
||||||
|
|
|
@ -54,7 +54,7 @@ ClientConnection::ClientConnection(NonnullRefPtr<Core::LocalSocket> client_socke
|
||||||
s_connections = new HashMap<int, NonnullRefPtr<ClientConnection>>;
|
s_connections = new HashMap<int, NonnullRefPtr<ClientConnection>>;
|
||||||
s_connections->set(client_id, *this);
|
s_connections->set(client_id, *this);
|
||||||
|
|
||||||
async_fast_greet(Screen::the().rect(), Gfx::current_system_theme_buffer());
|
async_fast_greet(Screen::the().rect(), Gfx::current_system_theme_buffer(), Gfx::FontDatabase::default_font_query(), Gfx::FontDatabase::fixed_width_font_query());
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientConnection::~ClientConnection()
|
ClientConnection::~ClientConnection()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
endpoint WindowClient
|
endpoint WindowClient
|
||||||
{
|
{
|
||||||
fast_greet(Gfx::IntRect screen_rect, Core::AnonymousBuffer theme_buffer) =|
|
fast_greet(Gfx::IntRect screen_rect, Core::AnonymousBuffer theme_buffer, String default_font_query, String fixed_width_font_query) =|
|
||||||
|
|
||||||
paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =|
|
paint(i32 window_id, Gfx::IntSize window_size, Vector<Gfx::IntRect> rects) =|
|
||||||
mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> mime_types) =|
|
mouse_move(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta, bool is_drag, Vector<String> mime_types) =|
|
||||||
|
@ -35,6 +35,7 @@ endpoint WindowClient
|
||||||
drag_dropped(i32 window_id, Gfx::IntPoint mouse_position, [UTF8] String text, HashMap<String,ByteBuffer> mime_data) =|
|
drag_dropped(i32 window_id, Gfx::IntPoint mouse_position, [UTF8] String text, HashMap<String,ByteBuffer> mime_data) =|
|
||||||
|
|
||||||
update_system_theme(Core::AnonymousBuffer theme_buffer) =|
|
update_system_theme(Core::AnonymousBuffer theme_buffer) =|
|
||||||
|
update_system_fonts(String default_font_query, String fixed_width_font_query) =|
|
||||||
|
|
||||||
display_link_notification() =|
|
display_link_notification() =|
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,9 @@ int main(int, char**)
|
||||||
Gfx::set_system_theme(theme);
|
Gfx::set_system_theme(theme);
|
||||||
auto palette = Gfx::PaletteImpl::create_with_anonymous_buffer(theme);
|
auto palette = Gfx::PaletteImpl::create_with_anonymous_buffer(theme);
|
||||||
|
|
||||||
|
Gfx::FontDatabase::set_default_font_query("Katica 10 400");
|
||||||
|
Gfx::FontDatabase::set_fixed_width_font_query("Csilla 10 400");
|
||||||
|
|
||||||
WindowServer::EventLoop loop;
|
WindowServer::EventLoop loop;
|
||||||
|
|
||||||
if (pledge("stdio video thread sendfd recvfd accept rpath wpath cpath proc", nullptr) < 0) {
|
if (pledge("stdio video thread sendfd recvfd accept rpath wpath cpath proc", nullptr) < 0) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue