From 16159f2b1cfb2ac790dd8293ce74afd48b80bbb8 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 25 Sep 2012 05:03:14 -0400 Subject: [PATCH] give url_data ownership over the url pointer --- termite.cc | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/termite.cc b/termite.cc index 36dc98e..d9aea5a 100644 --- a/termite.cc +++ b/termite.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,9 @@ using namespace std::placeholders; +template +using g_unique_ptr = std::unique_ptr; + enum class overlay_mode { hidden, search, @@ -40,7 +44,8 @@ struct select_info { }; struct url_data { - char *url; + url_data(char *u, long c, long r) : url(u, g_free), col(c), row(r) {} + g_unique_ptr url; long col, row; }; @@ -112,9 +117,9 @@ static void find_urls(VteTerminal *vte, search_panel_info *panel_info) { const long first_row = g_array_index(attributes, vte_char_attributes, 0).row; const auto attr = g_array_index(attributes, vte_char_attributes, token + pos - content); - panel_info->url_list.push_back(url_data{g_match_info_fetch(info, 0), - attr.column, - attr.row - first_row}); + panel_info->url_list.emplace_back(g_match_info_fetch(info, 0), + attr.column, + attr.row - first_row); g_match_info_next(info, &error); } @@ -136,7 +141,7 @@ static void launch_url(const char *text, search_panel_info *info) { unsigned long id = strtoul(text, &end, 10); if (!errno && end != text && *end == '\0' && id && id <= info->url_list.size()) { - launch_browser(info->url_list[id - 1].url); + launch_browser(info->url_list[id - 1].url.get()); } else { g_printerr("url hint invalid\n"); } @@ -177,7 +182,7 @@ static gboolean draw_cb(const search_panel_info *info, cairo_t *cr) { cairo_stroke(cr); for (unsigned i = 0; i < info->url_list.size(); i++) { - url_data data = info->url_list[i]; + const url_data &data = info->url_list[i]; const long x = data.col * cw; const long y = data.row * ch; draw_marker(cr, font, x, y, 3, i + 1); @@ -602,7 +607,6 @@ gboolean entry_key_press_cb(GtkEntry *entry, GdkEventKey *event, search_panel_in if (ret) { if (info->mode == overlay_mode::urlselect) { gtk_widget_hide(info->da); - for (url_data d : info->url_list) g_free(d.url); info->url_list.clear(); } info->mode = overlay_mode::hidden;