diff --git a/CHANGELOG.md b/CHANGELOG.md index 27cc543b..709ee757 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,11 @@ selection mode to 'character-wise' when extending a selection. * `DECSET` `47`, `1047` and `1048`. * FreeBSD support (https://codeberg.org/dnkl/foot/issues/238). +* `selection-target=none|primary|clipboard|both` to `foot.ini`. It can + be used to configure which clipboard(s) selected text should be + copied to. The default is `primary`, which corresponds to the + behavior in older foot releases + (https://codeberg.org/dnkl/foot/issues/288). ### Changed diff --git a/config.c b/config.c index da55f8f8..81b329cf 100644 --- a/config.c +++ b/config.c @@ -673,6 +673,28 @@ parse_section_main(const char *key, const char *value, struct config *conf, conf->notify.argv = argv; } + else if (strcmp(key, "selection-target") == 0) { + static const char values[][12] = { + [SELECTION_TARGET_NONE] = "none", + [SELECTION_TARGET_PRIMARY] = "primary", + [SELECTION_TARGET_CLIPBOARD] = "clipboard", + [SELECTION_TARGET_BOTH] = "both", + }; + + for (size_t i = 0; i < ALEN(values); i++) { + if (strcasecmp(value, values[i]) == 0) { + conf->selection_target = i; + return true; + } + } + + LOG_AND_NOTIFY_ERR( + "%s:%d: [default]: %s: invalid 'selection-target'; " + "must be one of 'none', 'primary', 'clipboard' or 'both", + path, lineno, value); + return false; + } + else { LOG_AND_NOTIFY_ERR("%s:%u: [default]: %s: invalid key", path, lineno, key); return false; @@ -2127,6 +2149,7 @@ config_load(struct config *conf, const char *conf_path, .render_worker_count = sysconf(_SC_NPROCESSORS_ONLN), .server_socket_path = get_server_socket_path(), .presentation_timings = false, + .selection_target = SELECTION_TARGET_PRIMARY, .hold_at_exit = false, .notify = { .raw_cmd = NULL, diff --git a/config.h b/config.h index 2bae8d31..1c349f2a 100644 --- a/config.h +++ b/config.h @@ -181,6 +181,12 @@ struct config { char *server_socket_path; bool presentation_timings; bool hold_at_exit; + enum { + SELECTION_TARGET_NONE, + SELECTION_TARGET_PRIMARY, + SELECTION_TARGET_CLIPBOARD, + SELECTION_TARGET_BOTH + } selection_target; struct { char *raw_cmd; diff --git a/doc/foot.ini.5.scd b/doc/foot.ini.5.scd index c78ad7bc..180ac7c2 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -161,12 +161,6 @@ in this order: compositor can use this value to e.g. group multiple windows, or apply window management rules. Default: _foot_. -*workers* - Number of threads to use for rendering. Set to 0 to disable - multithreading. Default: the number of available logical CPUs - (including SMT). Note that this is not always the best value. In - some cases, the number of physical _cores_ is better. - *bold-text-in-bright* Boolean. When enabled, bold text is rendered in a brighter color (in addition to using a bold font). Default: _no_. @@ -212,6 +206,17 @@ in this order: Default: _notify-send -a foot -i foot ${title} ${body}_. +*selection-target* + Clipboard target to automatically copy selected text to. One of + *none*, *primary*, *clipboard* or *both*. Default: _primary_. + + +*workers* + Number of threads to use for rendering. Set to 0 to disable + multithreading. Default: the number of available logical CPUs + (including SMT). Note that this is not always the best value. In + some cases, the number of physical _cores_ is better. + # SECTION: scrollback diff --git a/foot.ini b/foot.ini index 330b4b7f..19a82061 100644 --- a/foot.ini +++ b/foot.ini @@ -23,6 +23,7 @@ # bell=none # word-delimiters=,│`|:"'()[]{}<> # notify=notify-send -a foot -i foot ${title} ${body} +# selection-target=primary # workers= [scrollback] diff --git a/selection.c b/selection.c index 966b6b2a..00292541 100644 --- a/selection.c +++ b/selection.c @@ -1017,7 +1017,23 @@ selection_finalize(struct seat *seat, struct terminal *term, uint32_t serial) } xassert(term->selection.start.row <= term->selection.end.row); - selection_to_primary(seat, term, serial); + + switch (term->conf->selection_target) { + case SELECTION_TARGET_NONE: + break; + + case SELECTION_TARGET_PRIMARY: + selection_to_primary(seat, term, serial); + break; + case SELECTION_TARGET_CLIPBOARD: + selection_to_clipboard(seat, term, serial); + break; + + case SELECTION_TARGET_BOTH: + selection_to_primary(seat, term, serial); + selection_to_clipboard(seat, term, serial); + break; + } } void