diff --git a/CHANGELOG.md b/CHANGELOG.md index 25ce6e8..aacac9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Switched to gtk4 to get rid of texture noise. Chunks of texts are rendered as gtk labels. - Capture and display service output like --help or --version in the GUI window - TCP session that can be engaged by recompiling currently +- Font zoom using keyboard shortcuts `^+`, `^-`, `^0` ### Fixed diff --git a/src/GGrid.cpp b/src/GGrid.cpp index 79eee39..d5bff0e 100644 --- a/src/GGrid.cpp +++ b/src/GGrid.cpp @@ -1,13 +1,13 @@ #include "GGrid.hpp" #include "Logger.hpp" #include "Renderer.hpp" -#include "IMenuBarToggler.hpp" +#include "IWindowHandler.hpp" #include -GGrid::GGrid(GtkWidget *grid, Session::PtrT &session, IMenuBarToggler *menu_bar_toggler) +GGrid::GGrid(GtkWidget *grid, Session::PtrT &session, IWindowHandler *window_handler) : _grid{grid} , _session{session} - , _menu_bar_toggler{menu_bar_toggler} + , _window_handler{window_handler} { gtk_widget_set_focusable(_grid, true); @@ -86,7 +86,7 @@ void GGrid::UpdateStyle() oss << "* {\n"; oss << "font-family: Fira Code;\n"; - oss << "font-size: 14pt;\n"; + oss << "font-size: " << _font_size_pt << "pt;\n"; mapAttr(renderer->GetDefAttr(), renderer->GetDefAttr()); oss << "}\n"; @@ -110,6 +110,7 @@ void GGrid::UpdateStyle() gtk_css_provider_load_from_data(_css_provider.get(), style.data(), -1); MeasureCell(); + _window_handler->CheckSizeAsync(); } void GGrid::Present(int width, int height) @@ -201,11 +202,29 @@ gboolean GGrid::_OnKeyPressed(guint keyval, guint /*keycode*/, GdkModifierType s return true; } _alt_pending = false; - _menu_bar_toggler->MenuBarHide(); + _window_handler->MenuBarHide(); if (!_session) return true; + if (0 != (GDK_CONTROL_MASK & state)) + { + double font_size_pt = _font_size_pt; + if (keyval == GDK_KEY_equal) + font_size_pt *= 1.1; + else if (keyval == GDK_KEY_minus) + font_size_pt /= 1.1; + else if (keyval == GDK_KEY_0) + font_size_pt = 14; + if (font_size_pt != _font_size_pt) + { + auto guard = _session->GetRenderer()->Lock(); + _font_size_pt = font_size_pt; + UpdateStyle(); + return true; + } + } + gunichar uc = gdk_keyval_to_unicode(keyval); auto input = MkPtr(g_string_append_unichar(g_string_new(nullptr), uc), [](GString *s) { g_string_free(s, true); }); @@ -262,7 +281,7 @@ gboolean GGrid::_OnKeyReleased(guint keyval, guint /*keycode*/, GdkModifierType { if (_alt_pending && keyval == GDK_KEY_Alt_L) { - _menu_bar_toggler->MenuBarToggle(); + _window_handler->MenuBarToggle(); } return true; } diff --git a/src/GGrid.hpp b/src/GGrid.hpp index 889003e..d16cc7a 100644 --- a/src/GGrid.hpp +++ b/src/GGrid.hpp @@ -9,12 +9,12 @@ #include #include -struct IMenuBarToggler; +struct IWindowHandler; class GGrid { public: - GGrid(GtkWidget *grid, Session::PtrT &session, IMenuBarToggler *); + GGrid(GtkWidget *grid, Session::PtrT &session, IWindowHandler *); GtkStyleProvider* GetStyle() const { @@ -48,7 +48,7 @@ class GGrid private: GtkWidget *_grid; Session::PtrT &_session; - IMenuBarToggler *_menu_bar_toggler; + IWindowHandler *_window_handler; PtrT _css_provider = NullPtr([](auto *p) { g_object_unref(p); }); int _cell_width = 0; @@ -65,4 +65,6 @@ class GGrid int _last_rows = 0, _last_cols = 0; void _CheckSize(int width, int height); + + double _font_size_pt = 14; }; diff --git a/src/GWindow.cpp b/src/GWindow.cpp index cbff298..be615a7 100644 --- a/src/GWindow.cpp +++ b/src/GWindow.cpp @@ -39,7 +39,7 @@ GWindow::GWindow(GtkApplication *app, Session::PtrT &session) } // Adjust the grid size to the actual window size - _CheckSizeAsync(); + CheckSizeAsync(); } GWindow::~GWindow() @@ -83,7 +83,7 @@ void GWindow::_SetupWindowSignals() { using SizeChangedT = gboolean (*)(GObject *, GParamSpec *, gpointer data); SizeChangedT sizeChanged = [](auto *, auto *, gpointer data) { - reinterpret_cast(data)->_CheckSizeAsync(); + reinterpret_cast(data)->CheckSizeAsync(); return FALSE; }; @@ -92,7 +92,7 @@ void GWindow::_SetupWindowSignals() using OnShowT = void (*)(GtkWidget *, gpointer); OnShowT onShow = [](auto *, gpointer data) { - reinterpret_cast(data)->_CheckSizeAsync(); + reinterpret_cast(data)->CheckSizeAsync(); }; g_signal_connect(_window, "show", G_CALLBACK(onShow), this); @@ -125,7 +125,7 @@ void GWindow::_SetupStatusLabel() gtk_widget_set_visible(status_label, false); } -void GWindow::_CheckSizeAsync() +void GWindow::CheckSizeAsync() { g_timeout_add(0, [](gpointer data) { reinterpret_cast(data)->_CheckSize(); diff --git a/src/GWindow.hpp b/src/GWindow.hpp index d80cfe2..84c77f0 100644 --- a/src/GWindow.hpp +++ b/src/GWindow.hpp @@ -4,7 +4,7 @@ #include "Utils.hpp" #include "Session.hpp" #include "GGrid.hpp" -#include "IMenuBarToggler.hpp" +#include "IWindowHandler.hpp" #include #include #include @@ -12,7 +12,7 @@ class GWindow : public IWindow - , public IMenuBarToggler + , public IWindowHandler { public: GWindow(GtkApplication *, Session::PtrT &session); @@ -38,7 +38,7 @@ class GWindow void _SetupWindowSignals(); void _SetupStatusLabel(); - void _CheckSizeAsync(); + void CheckSizeAsync() override; void _CheckSize(); void _Present(); diff --git a/src/IMenuBarToggler.hpp b/src/IMenuBarToggler.hpp deleted file mode 100644 index ccdea7e..0000000 --- a/src/IMenuBarToggler.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -struct IMenuBarToggler -{ - virtual ~IMenuBarToggler() { } - virtual void MenuBarToggle() = 0; - virtual void MenuBarHide() = 0; -}; diff --git a/src/IWindowHandler.hpp b/src/IWindowHandler.hpp new file mode 100644 index 0000000..a2c5a6e --- /dev/null +++ b/src/IWindowHandler.hpp @@ -0,0 +1,9 @@ +#pragma once + +struct IWindowHandler +{ + virtual ~IWindowHandler() { } + virtual void MenuBarToggle() = 0; + virtual void MenuBarHide() = 0; + virtual void CheckSizeAsync() = 0; +}; diff --git a/src/meson.build b/src/meson.build index 6afa776..1a0cd5c 100644 --- a/src/meson.build +++ b/src/meson.build @@ -44,6 +44,7 @@ nvim_ui_sources = [ 'GPointer.hpp', 'GWindow.cpp', 'GWindow.hpp', + 'IWindowHandler.hpp', gtk_res, win_res, ]