|
|
@@ -504,20 +504,54 @@ void GtkRenderer::render_minibuffer(const Cairo::RefPtr<Cairo::Context>& cr, int
|
|
|
}
|
|
|
|
|
|
// Render minibuffer cursor if active and visible (assuming cursor_visible is managed by GtkEditor)
|
|
|
- bool cursor_visible_ = true; // Placeholder
|
|
|
- if (core_.minibuffer_manager().is_active() && cursor_visible_) {
|
|
|
+ bool cursor_visible_ = true; // Placeholder - in real usage passed or managed
|
|
|
+ if (core_.minibuffer_manager().is_active()) { // Assuming always visible or managed externally
|
|
|
// Calculate cursor position in minibuffer
|
|
|
+ // text is prompt + input. Cursor is relative to input start.
|
|
|
+ size_t cursor_idx = prompt_part.length() + core_.minibuffer_manager().get_cursor_position();
|
|
|
+
|
|
|
auto layout = Pango::Layout::create(context_widget_.get_pango_context());
|
|
|
layout->set_font_description(font_desc_);
|
|
|
- layout->set_text(minibuffer_text); // Measure full text
|
|
|
- Pango::Rectangle ink_rect, logical_rect;
|
|
|
- layout->get_pixel_extents(ink_rect, logical_rect);
|
|
|
- double cursor_x = minibuffer_x + logical_rect.get_width();
|
|
|
+ layout->set_text(minibuffer_text);
|
|
|
+
|
|
|
+ Pango::Rectangle pos = layout->index_to_pos(static_cast<int>(cursor_idx));
|
|
|
+ double cursor_screen_x = minibuffer_x + (pos.get_x() / (double)PANGO_SCALE);
|
|
|
|
|
|
- // Draw minibuffer cursor
|
|
|
+ // Draw Cursor Block
|
|
|
+ // Use char_width_ as default, or measure actual char
|
|
|
+ double cur_width = char_width_;
|
|
|
+ // If not at end, measure actual char width
|
|
|
+ if (cursor_idx < minibuffer_text.length()) {
|
|
|
+ Pango::Rectangle next_pos = layout->index_to_pos(static_cast<int>(cursor_idx + 1));
|
|
|
+ cur_width = (next_pos.get_x() - pos.get_x()) / (double)PANGO_SCALE;
|
|
|
+ }
|
|
|
+
|
|
|
cr->set_source_rgb(fg.r / 255.0, fg.g / 255.0, fg.b / 255.0);
|
|
|
- cr->rectangle(cursor_x, minibuffer_y, 2.0, line_height_);
|
|
|
+ cr->rectangle(cursor_screen_x, minibuffer_y, cur_width, line_height_);
|
|
|
cr->fill();
|
|
|
+
|
|
|
+ // Draw Character Inverted (if not at end)
|
|
|
+ if (cursor_idx < minibuffer_text.length()) {
|
|
|
+ // Extract char at cursor
|
|
|
+ // Note: simple indexing works for ASCII, but for UTF-8 need careful extraction.
|
|
|
+ // Pango layout handles rendering, we just need to render that one char at the pos.
|
|
|
+ // Simpler: Set color to BG and re-render the layout clipped?
|
|
|
+ // Or just render single char?
|
|
|
+ // Let's reuse the main editor approach: create layout for single char.
|
|
|
+ // But we need the exact byte string for the character at cursor_idx (utf8 aware).
|
|
|
+
|
|
|
+ // For now, let's rely on std::string indexing assuming ASCII for command/paths mostly,
|
|
|
+ // or use Pango to iterate?
|
|
|
+ // Glib::ustring is better for UTF8.
|
|
|
+ // Let's assume standard char for now to fix the main visual bug.
|
|
|
+ char cursor_char = minibuffer_text[cursor_idx];
|
|
|
+
|
|
|
+ cr->set_source_rgb(bg.r / 255.0, bg.g / 255.0, bg.b / 255.0);
|
|
|
+ auto cursor_layout = context_widget_.create_pango_layout(std::string(1, cursor_char));
|
|
|
+ cursor_layout->set_font_description(font_desc_);
|
|
|
+ cr->move_to(cursor_screen_x, minibuffer_y);
|
|
|
+ cursor_layout->show_in_cairo_context(cr);
|
|
|
+ }
|
|
|
|
|
|
// Render completion overlay if applicable
|
|
|
auto current_completion = core_.minibuffer_manager().get_current_completion();
|
|
|
@@ -526,10 +560,13 @@ void GtkRenderer::render_minibuffer(const Cairo::RefPtr<Cairo::Context>& cr, int
|
|
|
if (input_part.length() <= current_completion->length()) {
|
|
|
std::string completion_suffix = current_completion->substr(input_part.length());
|
|
|
if (!completion_suffix.empty()) {
|
|
|
- // Calculate width of existing text to position suffix
|
|
|
- Pango::Rectangle ink_rect, logical_rect;
|
|
|
- layout->get_pixel_extents(ink_rect, logical_rect);
|
|
|
- double text_width = logical_rect.get_width();
|
|
|
+ // Position completion at the end of the input text (cursor might be in middle)
|
|
|
+ // completion suffix appends to the END of input.
|
|
|
+
|
|
|
+ // Calculate position of the end of input
|
|
|
+ size_t input_end_idx = prompt_part.length() + input_part.length();
|
|
|
+ Pango::Rectangle end_pos = layout->index_to_pos(static_cast<int>(input_end_idx));
|
|
|
+ double completion_x = minibuffer_x + (end_pos.get_x() / (double)PANGO_SCALE);
|
|
|
|
|
|
auto completion_layout = Pango::Layout::create(context_widget_.get_pango_context());
|
|
|
completion_layout->set_font_description(font_desc_);
|
|
|
@@ -552,7 +589,7 @@ void GtkRenderer::render_minibuffer(const Cairo::RefPtr<Cairo::Context>& cr, int
|
|
|
completion_layout->set_attributes(completion_attr_list);
|
|
|
|
|
|
cr->set_source_rgb(fg.r / 255.0, fg.g / 255.0, fg.b / 255.0);
|
|
|
- cr->move_to(minibuffer_x + text_width, minibuffer_y); // Position after text
|
|
|
+ cr->move_to(completion_x, minibuffer_y);
|
|
|
completion_layout->show_in_cairo_context(cr);
|
|
|
}
|
|
|
}
|