diff --git a/config.c b/config.c index ce0e27b8..ba2fc347 100644 --- a/config.c +++ b/config.c @@ -126,6 +126,7 @@ static const char *const binding_action_map[] = { [BIND_ACTION_SELECT_WORD] = "select-word", [BIND_ACTION_SELECT_WORD_WS] = "select-word-whitespace", [BIND_ACTION_SELECT_ROW] = "select-row", + [BIND_ACTION_LAUNCH_URL] = "launch-url", }; static const char *const search_binding_action_map[] = { @@ -2745,6 +2746,7 @@ add_default_mouse_bindings(struct config *conf) {BIND_ACTION_SELECT_WORD, m_none, {.m = {BTN_LEFT, 2}}}, {BIND_ACTION_SELECT_WORD_WS, m_ctrl, {.m = {BTN_LEFT, 2}}}, {BIND_ACTION_SELECT_ROW, m_none, {.m = {BTN_LEFT, 3}}}, + {BIND_ACTION_LAUNCH_URL, m_alt, {.m = {BTN_LEFT, 1}}}, }; conf->bindings.mouse.count = ALEN(bindings); diff --git a/input.c b/input.c index fca46050..8d652e7f 100644 --- a/input.c +++ b/input.c @@ -454,6 +454,41 @@ execute_binding(struct seat *seat, struct terminal *term, term, seat->mouse.col, seat->mouse.row, SELECTION_LINE_WISE, false); return true; + case BIND_ACTION_LAUNCH_URL: { + const int m_row = seat->mouse.row; + const int m_col = seat->mouse.col; + + if (m_col >= 0 && m_row >= 0) { + url_list_t urls = tll_init(); + urls_collect(term, URL_ACTION_LAUNCH, &urls); + + tll_foreach(urls, it) { + const struct url *url = &it->item; + const int start_row = url->range.start.row; + const int start_col = url->range.start.col; + const int end_row = url->range.end.row; + const int end_col = url->range.end.col; + + bool start_is_before_point = + start_row < m_row || + (start_row == m_row && start_col <= m_col); + + bool end_is_after_point = + end_row > m_row || + (end_row == m_row && end_col >= m_col); + + if (start_is_before_point && end_is_after_point) { + url_activate(seat, term, url, serial); + break; + } + } + + url_list_destroy(&urls); + } + + return true; + } + case BIND_ACTION_COUNT: BUG("Invalid action type"); return false; diff --git a/key-binding.h b/key-binding.h index 1c0e2a99..c853b2a1 100644 --- a/key-binding.h +++ b/key-binding.h @@ -47,9 +47,10 @@ enum bind_action_normal { BIND_ACTION_SELECT_WORD, BIND_ACTION_SELECT_WORD_WS, BIND_ACTION_SELECT_ROW, + BIND_ACTION_LAUNCH_URL, BIND_ACTION_KEY_COUNT = BIND_ACTION_PROMPT_NEXT + 1, - BIND_ACTION_COUNT = BIND_ACTION_SELECT_ROW + 1, + BIND_ACTION_COUNT = BIND_ACTION_LAUNCH_URL + 1, }; enum bind_action_search {