From 6a19542715e4cc5a5483807b049bb109714888b3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 9 Jan 2021 13:46:22 +0100 Subject: [PATCH] LibVT+Terminal: Resize terminal when font changes When the font is changed in the Terminal application, we now resize the terminal window to accomodate the new font. --- Applications/Terminal/main.cpp | 3 ++- Libraries/LibVT/TerminalWidget.cpp | 19 +++++++++++++++++-- Libraries/LibVT/TerminalWidget.h | 4 ++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Applications/Terminal/main.cpp b/Applications/Terminal/main.cpp index 68518e6079..9267b9465f 100644 --- a/Applications/Terminal/main.cpp +++ b/Applications/Terminal/main.cpp @@ -417,7 +417,8 @@ int main(int argc, char** argv) [&](auto&) { auto picker = GUI::FontPicker::construct(window, &terminal.font(), true); if (picker->exec() == GUI::Dialog::ExecOK) { - terminal.set_font(picker->font()); + terminal.set_font_and_resize_to_fit(*picker->font()); + window->resize(terminal.size()); config->write_entry("Text", "Font", picker->font()->qualified_name()); config->sync(); } diff --git a/Libraries/LibVT/TerminalWidget.cpp b/Libraries/LibVT/TerminalWidget.cpp index c1509cea36..c8bf33f5c5 100644 --- a/Libraries/LibVT/TerminalWidget.cpp +++ b/Libraries/LibVT/TerminalWidget.cpp @@ -960,8 +960,9 @@ void TerminalWidget::terminal_history_changed() void TerminalWidget::terminal_did_resize(u16 columns, u16 rows) { - m_pixel_width = (frame_thickness() * 2) + (m_inset * 2) + (columns * font().glyph_width('x')) + m_scrollbar->width(); - m_pixel_height = (frame_thickness() * 2) + (m_inset * 2) + (rows * (font().glyph_height() + m_line_spacing)); + auto pixel_size = widget_size_for_font(font()); + m_pixel_width = pixel_size.width(); + m_pixel_height = pixel_size.height(); if (m_automatic_size_policy) { set_fixed_size(m_pixel_width, m_pixel_height); @@ -1119,3 +1120,17 @@ void TerminalWidget::update_paste_action() { m_paste_action->set_enabled(GUI::Clipboard::the().mime_type().starts_with("text/") && !GUI::Clipboard::the().data().is_empty()); } + +Gfx::IntSize TerminalWidget::widget_size_for_font(const Gfx::Font& font) const +{ + return { + (frame_thickness() * 2) + (m_inset * 2) + (m_terminal.columns() * font.glyph_width('x')) + m_scrollbar->width(), + (frame_thickness() * 2) + (m_inset * 2) + (m_terminal.rows() * (font.glyph_height() + m_line_spacing)) + }; +} + +void TerminalWidget::set_font_and_resize_to_fit(const Gfx::Font& font) +{ + set_font(font); + resize(widget_size_for_font(font)); +} diff --git a/Libraries/LibVT/TerminalWidget.h b/Libraries/LibVT/TerminalWidget.h index cb5c2274c0..a9a8370ecc 100644 --- a/Libraries/LibVT/TerminalWidget.h +++ b/Libraries/LibVT/TerminalWidget.h @@ -106,6 +106,8 @@ public: GUI::Menu& context_menu() { return *m_context_menu; } + void set_font_and_resize_to_fit(const Gfx::Font&); + private: // ^GUI::Widget virtual void event(Core::Event&) override; @@ -138,6 +140,8 @@ private: Gfx::IntRect glyph_rect(u16 row, u16 column); Gfx::IntRect row_rect(u16 row); + Gfx::IntSize widget_size_for_font(const Gfx::Font&) const; + void update_cursor(); void invalidate_cursor();