Improve and add colour to possible hint matches
Changed URL hinting to be a lot smarter and to colour hints when possible matches are found. - Add active_foreground and active_background config options - Add a new char* to hold entry text for checking against when redrawing Signed-off-by: numeral <numerical@gmail.com> Signed-off-by: Simon Gomizelj <simongmzlj@gmail.com>
This commit is contained in:
parent
224c76ea37
commit
63f52cea8b
56
termite.cc
56
termite.cc
|
@ -76,11 +76,12 @@ struct search_panel_info {
|
|||
GtkWidget *da;
|
||||
overlay_mode mode;
|
||||
std::vector<url_data> 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<unsigned>::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<double>(x), static_cast<double>(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<double>(x) + hints->padding,
|
||||
static_cast<double>(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<unsigned>::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<size_t>(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<size_t>(
|
||||
log10(static_cast<double>(info->panel.url_list.size())) + 1);
|
||||
size_t text_dig = static_cast<size_t>(
|
||||
log10(static_cast<double>(textd)) + 1);
|
||||
|
||||
if(url_dig == text_dig ||
|
||||
textd > static_cast<size_t>(static_cast<double>(urld)/10)) {
|
||||
|
||||
launch_url(info->config.browser, fulltext, &info->panel);
|
||||
if (url_dig == text_dig ||
|
||||
textd > static_cast<size_t>(static_cast<double>(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<url_data>()},
|
||||
std::vector<url_data>(),
|
||||
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}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue