add session save and session load functionality
New [key-bindings]:
- session-save: captures cwd and foreground process argv to ~/.local/share/foot/state/{name}.json
- session-save-secure: prompts for a password, encrypts the scrollback with argon2id + XChaCha20-Poly1305 (libsodium) and writes it to {name}.scrollback.enc(stores up to 1Mb scrollback buffer).
- session-load: a minimal fuzzy picker that displays saved sessions (both secure and vanilla), UI piggybacks on search bar subsurface. use arrows to navigate and delete to delete a previously saved session.
This commit is contained in:
parent
05ee680778
commit
cabddb26e6
16 changed files with 1947 additions and 49 deletions
63
search.c
63
search.c
|
|
@ -20,6 +20,7 @@
|
|||
#include "quirks.h"
|
||||
#include "render.h"
|
||||
#include "selection.h"
|
||||
#include "session.h"
|
||||
#include "shm.h"
|
||||
#include "unicode-mode.h"
|
||||
#include "util.h"
|
||||
|
|
@ -155,6 +156,9 @@ static void search_cancel_keep_selection(struct terminal *term) {
|
|||
term->search.wrapped = false;
|
||||
term->search.history_pos = NULL;
|
||||
term->is_searching = false;
|
||||
if (term->search.mode == SEARCH_MODE_SESSION_LOAD)
|
||||
session_picker_free(term);
|
||||
term->search.mode = SEARCH_MODE_NORMAL;
|
||||
term->render.search_glyph_offset = 0;
|
||||
|
||||
/* Reset IME state */
|
||||
|
|
@ -193,11 +197,20 @@ void search_begin(struct terminal *term) {
|
|||
term->search.sz = 64;
|
||||
term->search.buf = xmalloc(term->search.sz * sizeof(term->search.buf[0]));
|
||||
term->search.buf[0] = U'\0';
|
||||
term->search.mode = SEARCH_MODE_NORMAL;
|
||||
|
||||
term_xcursor_update(term);
|
||||
render_refresh_search(term);
|
||||
}
|
||||
|
||||
void search_begin_session(struct terminal *term, enum search_mode mode) {
|
||||
search_begin(term);
|
||||
term->search.mode = mode;
|
||||
if (mode == SEARCH_MODE_SESSION_LOAD)
|
||||
session_picker_init(term);
|
||||
render_refresh_search(term);
|
||||
}
|
||||
|
||||
void search_cancel(struct terminal *term) {
|
||||
if (!term->is_searching)
|
||||
return;
|
||||
|
|
@ -1539,6 +1552,10 @@ static bool execute_binding(struct seat *seat, struct terminal *term,
|
|||
return true;
|
||||
|
||||
case BIND_ACTION_SEARCH_COMMIT:
|
||||
if (term->search.mode != SEARCH_MODE_NORMAL) {
|
||||
session_prompt_commit(term);
|
||||
return true;
|
||||
}
|
||||
selection_finalize(seat, term, serial);
|
||||
search_cancel_keep_selection(term);
|
||||
return true;
|
||||
|
|
@ -1881,6 +1898,48 @@ void search_input(struct seat *seat, struct terminal *term,
|
|||
LOG_DBG("search: input: sym=%d/0x%x, mods=0x%08x, consumed=0x%08x", sym, sym,
|
||||
mods, consumed);
|
||||
|
||||
/* Overwrite-confirm: only y/Y proceeds; anything else cancels. */
|
||||
if (term->search.mode == SEARCH_MODE_SESSION_OVERWRITE_CONFIRM) {
|
||||
if (sym == XKB_KEY_y || sym == XKB_KEY_Y || sym == XKB_KEY_Return ||
|
||||
sym == XKB_KEY_KP_Enter) {
|
||||
session_prompt_confirm_overwrite(term);
|
||||
} else {
|
||||
session_prompt_cancel(term);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* In session-load mode, hijack a few keys for picker navigation. We do this
|
||||
* before binding dispatch so configured search-bindings (e.g. history-prev
|
||||
* on Up) don't fire. */
|
||||
if (term->search.mode == SEARCH_MODE_SESSION_LOAD) {
|
||||
bool handled = true;
|
||||
switch (sym) {
|
||||
case XKB_KEY_Up:
|
||||
session_picker_move(term, -1);
|
||||
break;
|
||||
case XKB_KEY_Down:
|
||||
session_picker_move(term, +1);
|
||||
break;
|
||||
case XKB_KEY_Page_Up:
|
||||
session_picker_move(term, -5);
|
||||
break;
|
||||
case XKB_KEY_Page_Down:
|
||||
session_picker_move(term, +5);
|
||||
break;
|
||||
case XKB_KEY_Delete:
|
||||
session_picker_delete_selected(term);
|
||||
break;
|
||||
default:
|
||||
handled = false;
|
||||
break;
|
||||
}
|
||||
if (handled) {
|
||||
render_refresh_search(term);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
enum xkb_compose_status compose_status =
|
||||
seat->kbd.xkb_compose_state != NULL
|
||||
? xkb_compose_state_get_status(seat->kbd.xkb_compose_state)
|
||||
|
|
@ -1969,8 +2028,10 @@ void search_input(struct seat *seat, struct terminal *term,
|
|||
|
||||
update_search:
|
||||
LOG_DBG("search: buffer: %ls", (const wchar_t *)term->search.buf);
|
||||
if (update_search_result)
|
||||
if (update_search_result && term->search.mode == SEARCH_MODE_NORMAL)
|
||||
search_find_next(term, search_direction);
|
||||
if (term->search.mode == SEARCH_MODE_SESSION_LOAD)
|
||||
session_picker_refilter(term);
|
||||
if (redraw)
|
||||
render_refresh_search(term);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue