mirror of
https://github.com/javalsai/lidm.git
synced 2026-02-27 03:50:44 +01:00
* chore(organization): allow nested header and c files * feat: add shell login "middleware" & etc: * lidm now calls `bash` (or other shells, depends on PACKAGE cfg) in login mode as a session wrapper to source most env (can be disabled) * this fixes a lot of env problems with all `/etc/profile` and more Extra: * implemented a musl compatible version of `execvpe` and now lidm should search for PATH everywhere it needs to * `search_path` now also checks if the found binary is properly executable * lidm now uses `confstr` for a decent PATH default if none is found * logs are unbuffered for cases where debug logs appear empty (exit without handlers moment) * chore: one-time evaluate certain makefile vars --------- Co-authored-by: grialion <48643945+grialion@users.noreply.github.com>
77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
#include <stddef.h>
|
|
|
|
#include "efield.h"
|
|
#include "ofield.h"
|
|
#include "ui.h"
|
|
#include "util/utf8.h"
|
|
|
|
struct opts_field ofield_new(size_t opts) {
|
|
if (opts == 0) {
|
|
return (struct opts_field){
|
|
.opts = 0,
|
|
.current_opt = 0,
|
|
.efield = efield_new(""),
|
|
};
|
|
}
|
|
|
|
return (struct opts_field){
|
|
.opts = opts,
|
|
.current_opt = 1,
|
|
};
|
|
}
|
|
|
|
void ofield_toedit(struct opts_field* self, char* init) {
|
|
self->current_opt = 0;
|
|
self->efield = efield_new(init);
|
|
}
|
|
|
|
void ofield_kbd_type(struct opts_field* self, char* typed,
|
|
char* empty_default) {
|
|
if (self->current_opt != 0) ofield_toedit(self, empty_default);
|
|
efield_update(&self->efield, typed);
|
|
}
|
|
|
|
bool ofield_opts_seek(struct opts_field* self, char seek) {
|
|
// no options or (a single option but its selected instead of on edit)
|
|
if (self->opts == 0 || (self->opts == 1 && self->current_opt != 0))
|
|
return false;
|
|
|
|
self->current_opt =
|
|
1 + ((self->current_opt - 1 + seek + self->opts) % self->opts);
|
|
ui_update_ofield(self);
|
|
return true;
|
|
}
|
|
|
|
bool ofield_seek(struct opts_field* self, char seek) {
|
|
if (self->current_opt == 0) {
|
|
if (efield_seek(&self->efield, seek)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (self->opts == 0) return false;
|
|
ofield_opts_seek(self, seek);
|
|
return true;
|
|
}
|
|
|
|
uint8_t ofield_display_cursor_col(struct opts_field* self, uint8_t maxlen) {
|
|
if (self->current_opt == 0) {
|
|
uint8_t display_len = utf8len(self->efield.content);
|
|
uint8_t pos = utf8len_until(self->efield.content,
|
|
&self->efield.content[self->efield.pos]);
|
|
|
|
if (display_len > maxlen) {
|
|
if (pos < maxlen / 2) {
|
|
return pos;
|
|
}
|
|
if (display_len - pos < maxlen / 2) {
|
|
return maxlen - (display_len - pos);
|
|
}
|
|
return maxlen / 2;
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
return 0;
|
|
}
|