diff --git a/juci/source.cc b/juci/source.cc index 2d2af80..1c1215f 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -367,7 +367,7 @@ void Source::ClangView::update_diagnostics() { tooltip_widget->set_editable(false); tooltip_widget->get_buffer()->insert_with_tag(tooltip_widget->get_buffer()->get_insert()->get_iter(), diagnostic.severity_spelling, diagnostic_tag_name); tooltip_widget->get_buffer()->insert_at_cursor(": \n"+diagnostic.spelling); - //TODO: Insert newlines in tooltip_widget->get_buffer() (use 80 chars, then newline?) + //TODO: Insert newlines to diagnostic.spelling (use 80 chars, then newline?) diagnostic_tooltips.emplace_back(tooltip_widget, *this, get_source_buffer()->create_mark(start), get_source_buffer()->create_mark(end)); auto tag=buffer->create_tag(); diff --git a/juci/tooltips.cc b/juci/tooltips.cc index 8938830..5e77726 100644 --- a/juci/tooltips.cc +++ b/juci/tooltips.cc @@ -3,18 +3,19 @@ Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle(); -Tooltip::Tooltip(std::shared_ptr widget, Gtk::TextView& text_view, +Tooltip::Tooltip(std::shared_ptr tooltip_widget, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark): -widget(widget), text_view(text_view), Gtk::Window(Gtk::WindowType::WINDOW_POPUP), +tooltip_widget(tooltip_widget), text_view(text_view), Gtk::Window(Gtk::WindowType::WINDOW_POPUP), start_mark(start_mark), end_mark(end_mark) { - add(*widget); + add(*tooltip_widget); property_decorated()=false; set_accept_focus(false); set_skip_taskbar_hint(true); set_default_size(0, 0); - signal_realize().connect([this](){ - adjust(); //Fix for older GTK+ versions? - }); + + auto layout=Pango::Layout::create(tooltip_widget->get_pango_context()); + layout->set_text(tooltip_widget->get_buffer()->get_text()); + layout->get_pixel_size(tooltip_width, tooltip_height); } void Tooltip::update() { @@ -34,14 +35,9 @@ void Tooltip::update() { text_view.buffer_to_window_coords(Gtk::TextWindowType::TEXT_WINDOW_TEXT, activation_rectangle.get_x(), activation_rectangle.get_y(), location_window_x, location_window_y); activation_rectangle.set_x(location_window_x); activation_rectangle.set_y(location_window_y); - adjusted=false; } void Tooltip::adjust() { - if(adjusted) - return; - int tooltip_width, tooltip_height; - get_size(tooltip_width, tooltip_height); int root_x, root_y; text_view.get_window(Gtk::TextWindowType::TEXT_WINDOW_TEXT)->get_root_coords(activation_rectangle.get_x(), activation_rectangle.get_y(), root_x, root_y); Gdk::Rectangle rectangle; @@ -59,16 +55,14 @@ void Tooltip::adjust() { Tooltips::drawn_tooltips_rectangle=rectangle; move(rectangle.get_x(), rectangle.get_y()); - adjusted=true; } void Tooltips::show(const Gdk::Rectangle& rectangle) { for(auto& tooltip: *this) { tooltip.update(); if(rectangle.intersects(tooltip.activation_rectangle)) { + tooltip.adjust(); tooltip.show_all(); - if(tooltip.get_realized()) - tooltip.adjust(); } else tooltip.hide(); @@ -78,9 +72,8 @@ void Tooltips::show(const Gdk::Rectangle& rectangle) { void Tooltips::show() { for(auto& tooltip: *this) { tooltip.update(); + tooltip.adjust(); tooltip.show_all(); - if(tooltip.get_realized()) - tooltip.adjust(); } } diff --git a/juci/tooltips.h b/juci/tooltips.h index 5f13b14..94b2c69 100644 --- a/juci/tooltips.h +++ b/juci/tooltips.h @@ -6,18 +6,18 @@ class Tooltip : public Gtk::Window { public: - Tooltip(std::shared_ptr widget, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark); + Tooltip(std::shared_ptr tooltip_widget, Gtk::TextView& text_view, Glib::RefPtr start_mark, Glib::RefPtr end_mark); void update(); void adjust(); Gdk::Rectangle activation_rectangle; - bool adjusted=false; private: - std::shared_ptr widget; + std::shared_ptr tooltip_widget; Glib::RefPtr start_mark; Glib::RefPtr end_mark; Gtk::TextView& text_view; + int tooltip_width, tooltip_height; }; class Tooltips : public std::list {