mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-18 22:05:25 -05:00
config: add new mouse binding ‘launch-url’, bind to alt+BTN_LEFT
This adds a new mouse binding, launch-url (bound to Alt+BTN_LEFT by default). When executed, the URL under the mouse pointer is launched (with url.launcher, as usual). This is done by calling urls_collect(), to get all currently visible URLs (both auto-detected and OSC-8 ones), and then iterating them all until we find one that spans the cell the mouse pointer is on.
This commit is contained in:
parent
8b882b3a13
commit
16d220d3f9
3 changed files with 39 additions and 1 deletions
2
config.c
2
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);
|
||||
|
|
|
|||
35
input.c
35
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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue