From ba995b168ae15efe6a2c5118ceff5e1b0b5e2fff Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 19 Aug 2021 12:18:47 +0200 Subject: [PATCH] Tooltips: now adds scrolling to all tooltip windows that are placed partially outside of screen --- src/tooltips.cpp | 37 +++++++++++++++++++++++-------------- src/tooltips.hpp | 2 ++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/tooltips.cpp b/src/tooltips.cpp index 8091239..be06732 100644 --- a/src/tooltips.cpp +++ b/src/tooltips.cpp @@ -213,24 +213,16 @@ void Tooltip::show(bool disregard_drawn, const std::function &on_motion) size.first += 6; // 2xpadding size.second += 8; // 2xpadding + 2 - // Add ScrolledWindow if needed - Gtk::Widget *widget = tooltip_text_view; - auto screen_width = Gdk::Screen::get_default()->get_width(); - auto screen_height = Gdk::Screen::get_default()->get_height(); - if(size.first > screen_width - 6 /* 2xpadding */ || size.second > screen_height - 6 /* 2xpadding */) { - auto scrolled_window = Gtk::manage(new Gtk::ScrolledWindow()); - scrolled_window->property_hscrollbar_policy() = size.first > screen_width - 6 ? Gtk::PolicyType::POLICY_AUTOMATIC : Gtk::PolicyType::POLICY_NEVER; - scrolled_window->property_vscrollbar_policy() = size.second > screen_height - 6 ? Gtk::PolicyType::POLICY_AUTOMATIC : Gtk::PolicyType::POLICY_NEVER; - scrolled_window->add(*tooltip_text_view); - scrolled_window->set_size_request(size.first > screen_width - 6 ? screen_width - 6 : -1, size.second > screen_height - 6 ? screen_height - 6 : -1); - widget = scrolled_window; - } + scrolled_window = Gtk::manage(new Gtk::ScrolledWindow()); + scrolled_window->property_hscrollbar_policy() = Gtk::PolicyType::POLICY_NEVER; + scrolled_window->property_vscrollbar_policy() = Gtk::PolicyType::POLICY_NEVER; + scrolled_window->add(*tooltip_text_view); #if GTK_VERSION_GE(3, 20) - box->add(*widget); + box->add(*scrolled_window); #else auto box2 = Gtk::manage(new Gtk::Box()); - box2->pack_start(*widget, true, true, 3); + box2->pack_start(*scrolled_window, true, true, 3); box->pack_start(*box2, true, true, 3); #endif @@ -306,6 +298,23 @@ void Tooltip::show(bool disregard_drawn, const std::function &on_motion) Tooltips::drawn_tooltips_rectangle = rectangle; } + auto screen_width = Gdk::Screen::get_default()->get_width(); + auto screen_height = Gdk::Screen::get_default()->get_height(); + auto width = rectangle.get_width(); + if(rectangle.get_x() + width > screen_width) { + width -= rectangle.get_x() + width - screen_width; + scrolled_window->property_hscrollbar_policy() = Gtk::PolicyType::POLICY_AUTOMATIC; + } + auto height = rectangle.get_height(); + if(rectangle.get_y() + height > screen_height) { + height -= rectangle.get_y() + height - screen_height; + scrolled_window->property_vscrollbar_policy() = Gtk::PolicyType::POLICY_AUTOMATIC; + } + width -= 6; + height -= 8; + if(width > 0 && height > 0) + scrolled_window->set_size_request(width, height); + if(window->get_realized()) window->move(rectangle.get_x(), rectangle.get_y()); window->show_all(); diff --git a/src/tooltips.hpp b/src/tooltips.hpp index d748c3b..c7124be 100644 --- a/src/tooltips.hpp +++ b/src/tooltips.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,7 @@ public: private: std::unique_ptr window; + Gtk::ScrolledWindow *scrolled_window = nullptr; Gsv::View *view; std::function set_buffer;