diff --git a/termite.cc b/termite.cc index f6a73e3..5f1e9d1 100644 --- a/termite.cc +++ b/termite.cc @@ -76,11 +76,12 @@ struct search_panel_info { GtkWidget *da; overlay_mode mode; std::vector url_list; + char *fulltext; }; struct hint_info { PangoFontDescription *font; - cairo_pattern_t *fg, *bg, *border; + cairo_pattern_t *fg, *bg, *af, *ab, *border; double padding, border_width, roundness; }; @@ -203,17 +204,15 @@ static void draw_rectangle(cairo_t *cr, double x, double y, double height, } static void draw_marker(cairo_t *cr, const PangoFontDescription *desc, - const hint_info *hints, long x, long y, unsigned id) { - char buffer[std::numeric_limits::digits10 + 1]; + const hint_info *hints, long x, long y, const char *msg, + bool active) { cairo_text_extents_t ext; int width, height; - snprintf(buffer, sizeof(buffer), "%u", id); - - cairo_text_extents(cr, buffer, &ext); + cairo_text_extents(cr, msg, &ext); PangoLayout *layout = pango_cairo_create_layout(cr); pango_layout_set_font_description(layout, desc); - pango_layout_set_text(layout, buffer, -1); + pango_layout_set_text(layout, msg, -1); pango_layout_get_size(layout, &width, &height); draw_rectangle(cr, static_cast(x), static_cast(y), @@ -223,14 +222,14 @@ static void draw_marker(cairo_t *cr, const PangoFontDescription *desc, cairo_set_source(cr, hints->border); cairo_set_line_width(cr, hints->border_width); cairo_stroke_preserve(cr); - cairo_set_source(cr, hints->bg); + cairo_set_source(cr, active ? hints->ab : hints->bg); cairo_fill(cr); cairo_new_path(cr); cairo_move_to(cr, static_cast(x) + hints->padding, static_cast(y) + hints->padding); - cairo_set_source(cr, hints->fg); + cairo_set_source(cr, active ? hints->af : hints->fg); pango_cairo_update_layout(cr, layout); pango_cairo_layout_path(cr, layout); cairo_fill(cr); @@ -240,10 +239,14 @@ static void draw_marker(cairo_t *cr, const PangoFontDescription *desc, static gboolean draw_cb(const draw_cb_info *info, cairo_t *cr) { if (!info->panel->url_list.empty()) { + char buffer[std::numeric_limits::digits10 + 1]; + const long cw = vte_terminal_get_char_width(info->panel->vte); const long ch = vte_terminal_get_char_height(info->panel->vte); const PangoFontDescription *desc = info->hints->font ? info->hints->font : vte_terminal_get_font(info->panel->vte); + size_t len = info->panel->fulltext == NULL ? + 0 : strlen(info->panel->fulltext); cairo_set_line_width(cr, 1); cairo_set_source_rgb(cr, 0, 0, 0); @@ -253,7 +256,13 @@ static gboolean draw_cb(const draw_cb_info *info, cairo_t *cr) { const url_data &data = info->panel->url_list[i]; const long x = data.col * cw; const long y = data.row * ch; - draw_marker(cr, desc, info->hints, x, y, i + 1); + bool active = false; + + snprintf(buffer, sizeof(buffer), "%u", i + 1); + if(len) + active = strncmp(buffer, info->panel->fulltext, len) == 0; + + draw_marker(cr, desc, info->hints, x, y, buffer, active); } } @@ -756,6 +765,7 @@ gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, keybind_info *i gboolean ret = FALSE; switch (event->keyval) { + case GDK_KEY_BackSpace: case GDK_KEY_0: case GDK_KEY_1: case GDK_KEY_2: @@ -768,23 +778,22 @@ gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, keybind_info *i case GDK_KEY_9: if (info->panel.mode == overlay_mode::urlselect) { const char *const text = gtk_entry_get_text(entry); - char *fulltext = g_strndup(text, strlen(text) + 1); - fulltext[strlen(text)] = (char)event->keyval; + info->panel.fulltext = g_strndup(text, strlen(text) + 1); + info->panel.fulltext[strlen(text)] = (char)event->keyval; size_t urld = static_cast(info->panel.url_list.size()); - size_t textd = strtoul(fulltext, NULL, 10); + size_t textd = strtoul(info->panel.fulltext, NULL, 10); size_t url_dig = static_cast( log10(static_cast(info->panel.url_list.size())) + 1); size_t text_dig = static_cast( log10(static_cast(textd)) + 1); - if(url_dig == text_dig || - textd > static_cast(static_cast(urld)/10)) { - - launch_url(info->config.browser, fulltext, &info->panel); + if (url_dig == text_dig || + textd > static_cast(static_cast(urld)/10)) { + launch_url(info->config.browser, info->panel.fulltext, &info->panel); ret = TRUE; + } else { + gtk_widget_queue_draw(info->panel.da); } - - free(fulltext); } break; case GDK_KEY_Tab: @@ -827,6 +836,8 @@ gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, keybind_info *i if (info->panel.mode == overlay_mode::urlselect) { gtk_widget_hide(info->panel.da); info->panel.url_list.clear(); + free(info->panel.fulltext); + info->panel.fulltext = nullptr; } info->panel.mode = overlay_mode::hidden; gtk_widget_hide(info->panel.panel); @@ -1068,6 +1079,8 @@ static void load_theme(VteTerminal *vte, GKeyFile *config, hint_info &hints) { hints.fg = get_config_cairo_color(config, "hints", "foreground").get_value_or(cairo_pattern_create_rgb(1, 1, 1)); hints.bg = get_config_cairo_color(config, "hints", "background").get_value_or(cairo_pattern_create_rgb(0, 0, 0)); + hints.af = get_config_cairo_color(config, "hints", "active_foreground").get_value_or(cairo_pattern_create_rgb(0.9, 0.5, 0.5)); + hints.ab = get_config_cairo_color(config, "hints", "active_background").get_value_or(cairo_pattern_create_rgb(0, 0, 0)); hints.border = get_config_cairo_color(config, "hints", "border").get_value_or(hints.fg); hints.padding = get_config_double(config, "hints", "padding", 5).get_value_or(2.0); hints.border_width = get_config_double(config, "hints", "border_width").get_value_or(1.0); @@ -1306,9 +1319,10 @@ int main(int argc, char **argv) { gtk_alignment_new(0, 0, 1, 1), gtk_drawing_area_new(), overlay_mode::hidden, - std::vector()}, + std::vector(), + nullptr}, {vi_mode::insert, 0, 0, 0, 0}, - {{nullptr, nullptr, nullptr, nullptr, 0, 0, 0}, + {{nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 0, 0, 0}, nullptr, FALSE, FALSE, FALSE, -1, config_file} };