mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-21 06:46:34 -04:00
url-mode: multiple URL (parts) with the same ID is assigned a single key sequence
In case an URL is split up into multiple parts, those parts are now treated as a single URL when it comes to key assignment. Only the *first* URL part is actually assigned a key combo. The other parts are ignored. We still highlight them, but for all other purposes they are ignored.
This commit is contained in:
parent
ffbee5ff37
commit
fb9e9513a5
3 changed files with 37 additions and 3 deletions
6
render.c
6
render.c
|
|
@ -2531,6 +2531,12 @@ render_urls(struct terminal *term)
|
||||||
const wchar_t *key = url->key;
|
const wchar_t *key = url->key;
|
||||||
const size_t entered_key_len = wcslen(term->url_keys);
|
const size_t entered_key_len = wcslen(term->url_keys);
|
||||||
|
|
||||||
|
if (key == NULL) {
|
||||||
|
/* TODO: if we decide to use the .text field, we cannot
|
||||||
|
* just skip the entire jump label like this */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
struct wl_surface *surf = it->item.surf.surf;
|
struct wl_surface *surf = it->item.surf.surf;
|
||||||
struct wl_subsurface *sub_surf = it->item.surf.sub;
|
struct wl_subsurface *sub_surf = it->item.surf.sub;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,7 @@ typedef tll(struct ptmx_buffer) ptmx_buffer_list_t;
|
||||||
|
|
||||||
enum url_action { URL_ACTION_COPY, URL_ACTION_LAUNCH };
|
enum url_action { URL_ACTION_COPY, URL_ACTION_LAUNCH };
|
||||||
struct url {
|
struct url {
|
||||||
|
uint64_t id;
|
||||||
char *url;
|
char *url;
|
||||||
wchar_t *text;
|
wchar_t *text;
|
||||||
wchar_t *key;
|
wchar_t *key;
|
||||||
|
|
|
||||||
33
url-mode.c
33
url-mode.c
|
|
@ -1,5 +1,6 @@
|
||||||
#include "url-mode.h"
|
#include "url-mode.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
|
||||||
|
|
@ -135,6 +136,9 @@ urls_input(struct seat *seat, struct terminal *term, uint32_t key,
|
||||||
const struct url *match = NULL;
|
const struct url *match = NULL;
|
||||||
|
|
||||||
tll_foreach(term->urls, it) {
|
tll_foreach(term->urls, it) {
|
||||||
|
if (it->item.key == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
const struct url *url = &it->item;
|
const struct url *url = &it->item;
|
||||||
const size_t key_len = wcslen(it->item.key);
|
const size_t key_len = wcslen(it->item.key);
|
||||||
|
|
||||||
|
|
@ -165,7 +169,8 @@ urls_input(struct seat *seat, struct terminal *term, uint32_t key,
|
||||||
IGNORE_WARNING("-Wpedantic")
|
IGNORE_WARNING("-Wpedantic")
|
||||||
|
|
||||||
static void
|
static void
|
||||||
auto_detected(const struct terminal *term, enum url_action action, url_list_t *urls)
|
auto_detected(const struct terminal *term, enum url_action action,
|
||||||
|
url_list_t *urls)
|
||||||
{
|
{
|
||||||
static const wchar_t *const prots[] = {
|
static const wchar_t *const prots[] = {
|
||||||
L"http://",
|
L"http://",
|
||||||
|
|
@ -335,6 +340,7 @@ auto_detected(const struct terminal *term, enum url_action action, url_list_t *u
|
||||||
tll_push_back(
|
tll_push_back(
|
||||||
*urls,
|
*urls,
|
||||||
((struct url){
|
((struct url){
|
||||||
|
.id = (uint64_t)rand() << 32 | rand(),
|
||||||
.url = url_utf8,
|
.url = url_utf8,
|
||||||
.text = xwcsdup(L""),
|
.text = xwcsdup(L""),
|
||||||
.start = start,
|
.start = start,
|
||||||
|
|
@ -376,6 +382,7 @@ osc8_uris(const struct terminal *term, enum url_action action, url_list_t *urls)
|
||||||
tll_push_back(
|
tll_push_back(
|
||||||
*urls,
|
*urls,
|
||||||
((struct url){
|
((struct url){
|
||||||
|
.id = it->item.id,
|
||||||
.url = xstrdup(it->item.uri),
|
.url = xstrdup(it->item.uri),
|
||||||
.text = xwcsdup(L""),
|
.text = xwcsdup(L""),
|
||||||
.start = start,
|
.start = start,
|
||||||
|
|
@ -467,18 +474,38 @@ urls_assign_key_combos(const struct config *conf, url_list_t *urls)
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
uint64_t seen_ids[count];
|
||||||
wchar_t *combos[count];
|
wchar_t *combos[count];
|
||||||
generate_key_combos(conf, count, combos);
|
generate_key_combos(conf, count, combos);
|
||||||
|
|
||||||
size_t idx = 0;
|
size_t idx = 0;
|
||||||
tll_foreach(*urls, it)
|
tll_foreach(*urls, it) {
|
||||||
|
bool id_already_seen = false;
|
||||||
|
for (size_t i = 0; i < idx; i++) {
|
||||||
|
if (it->item.id == seen_ids[i]) {
|
||||||
|
id_already_seen = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id_already_seen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
seen_ids[idx] = it->item.id;
|
||||||
it->item.key = combos[idx++];
|
it->item.key = combos[idx++];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free combos we didn’t use up */
|
||||||
|
for (size_t i = idx; i < count; i++)
|
||||||
|
free(combos[i]);
|
||||||
|
|
||||||
#if defined(_DEBUG) && LOG_ENABLE_DBG
|
#if defined(_DEBUG) && LOG_ENABLE_DBG
|
||||||
tll_foreach(*urls, it) {
|
tll_foreach(*urls, it) {
|
||||||
|
if (it->item.key == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
char key[32];
|
char key[32];
|
||||||
wcstombs(key, it->item.key, sizeof(key) - 1);
|
wcstombs(key, it->item.key, sizeof(key) - 1);
|
||||||
|
|
||||||
LOG_DBG("URL: %s (%s)", it->item.url, key);
|
LOG_DBG("URL: %s (%s)", it->item.url, key);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue