Compare commits

..

No commits in common. "master" and "v1.1.1" have entirely different histories.

9 changed files with 54 additions and 95 deletions

View File

@ -33,7 +33,7 @@ clean:
install: lidm install: lidm
mkdir -p ${DESTDIR}${PREFIX}/bin ${DESTDIR}${PREFIX}/share/man/man{1,5} mkdir -p ${DESTDIR}${PREFIX}/bin ${DESTDIR}${PREFIX}/share/man/man{1,5}
install -Dm755 ./lidm ${DESTDIR}${PREFIX}/bin/ install -Dm755 ./lidm ${DESTDIR}${PREFIX}/bin/
[ -f ${DESTDIR}/etc/lidm.ini ] || install -Dm644 ./themes/default.ini ${DESTDIR}/etc/lidm.ini install -Dm644 ./themes/default.ini ${DESTDIR}/etc/lidm.ini
install -Dm644 ./assets/man/lidm.1 ${DESTDIR}${PREFIX}/share/man/man1/ install -Dm644 ./assets/man/lidm.1 ${DESTDIR}${PREFIX}/share/man/man1/
install -Dm644 ./assets/man/lidm-config.5 ${DESTDIR}${PREFIX}/share/man/man5/ install -Dm644 ./assets/man/lidm-config.5 ${DESTDIR}${PREFIX}/share/man/man5/

View File

@ -1,6 +1,6 @@
pkgbase = lidm-bin pkgbase = lidm-bin
pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary) pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary)
pkgver = 1.1.1 pkgver = 1.1.0
pkgrel = 1 pkgrel = 1
url = https://github.com/javalsai/lidm url = https://github.com/javalsai/lidm
arch = x86_64 arch = x86_64
@ -8,11 +8,11 @@ pkgbase = lidm-bin
depends = pam depends = pam
provides = lidm provides = lidm
conflicts = lidm conflicts = lidm
source = lidm::https://github.com/javalsai/lidm/releases/download/v1.1.1/lidm-amd64 source = lidm::https://github.com/javalsai/lidm/releases/download/v1.1.0/lidm-amd64
source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/themes/default.ini source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.1.0/themes/default.ini
source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/assets/man/lidm.1 source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.1.0/assets/man/lidm.1
source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.1.1/assets/man/lidm-config.5 source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.1.0/assets/man/lidm-config.5
sha256sums = c4e82ae2c08c223ef417edca50f86f516e3f9154339f67110c87d01855673fcf sha256sums = 7bc64f0f10994c062ea80ea2c6ee9d45828567b448e170fb3e7af4111ce1c2dc
sha256sums = a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542 sha256sums = a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542
sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8 sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8
sha256sums = 5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f sha256sums = 5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f

View File

@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-bin pkgname=lidm-bin
pkgver=1.1.1 pkgver=1.1.0
pkgrel=1 pkgrel=1
depends=('pam') depends=('pam')
pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)" pkgdesc="A fully colorful customizable TUI display manager made in C. (release binary)"
@ -16,7 +16,7 @@ source=(
"lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm.1" "lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm.1"
"lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5" "lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5"
) )
sha256sums=('c4e82ae2c08c223ef417edca50f86f516e3f9154339f67110c87d01855673fcf' sha256sums=('7bc64f0f10994c062ea80ea2c6ee9d45828567b448e170fb3e7af4111ce1c2dc'
'a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542' 'a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542'
'7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8' '7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8'
'5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f') '5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f')

View File

@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm-git pkgname=lidm-git
pkgver=1.1.1.r0.g3bfc2f5 pkgver=1.1.0.r0.g11e9257
pkgrel=1 pkgrel=1
depends=('pam') depends=('pam')
makedepends=('git' 'make' 'gcc') makedepends=('git' 'make' 'gcc')

View File

@ -1,6 +1,6 @@
pkgbase = lidm pkgbase = lidm
pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag) pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag)
pkgver = 1.1.1 pkgver = 1.1.0
pkgrel = 1 pkgrel = 1
url = https://github.com/javalsai/lidm url = https://github.com/javalsai/lidm
arch = any arch = any
@ -8,7 +8,7 @@ pkgbase = lidm
makedepends = git makedepends = git
makedepends = gcc makedepends = gcc
depends = pam depends = pam
source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.1.1.tar.gz source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.1.0.tar.gz
sha256sums = 915dc5acce413d5d32bb52c6f9980661a389a0939a49ac31bc250b2d162a5479 sha256sums = 4c39eb29f8a8b705b7a40f71df9b0ee2c8c140da039f933b2b895e649aaa8068
pkgname = lidm pkgname = lidm

View File

@ -1,7 +1,7 @@
# shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164
# Maintainer: javalsai <javalsai@proton.me> # Maintainer: javalsai <javalsai@proton.me>
pkgname=lidm pkgname=lidm
pkgver=1.1.1 pkgver=1.1.0
pkgrel=1 pkgrel=1
depends=('pam') depends=('pam')
makedepends=('git' 'gcc') makedepends=('git' 'gcc')
@ -10,7 +10,7 @@ arch=('any')
url="https://github.com/javalsai/lidm" url="https://github.com/javalsai/lidm"
license=('GPL') license=('GPL')
source=("tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz") source=("tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('915dc5acce413d5d32bb52c6f9980661a389a0939a49ac31bc250b2d162a5479') sha256sums=('4c39eb29f8a8b705b7a40f71df9b0ee2c8c140da039f933b2b895e649aaa8068')
build() { build() {
tar -xzf "tarball.tar.gz" tar -xzf "tarball.tar.gz"

View File

@ -1,7 +1,6 @@
#ifndef UTILH_ #ifndef UTILH_
#define UTILH_ #define UTILH_
#include <bits/types/struct_timeval.h>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@ -13,8 +12,6 @@
int find_keyname(enum keys* at, const char* name); int find_keyname(enum keys* at, const char* name);
enum keys find_ansi(const char* seq); enum keys find_ansi(const char* seq);
void read_press(u_char* length, char* out); void read_press(u_char* length, char* out);
// non blocking, waits up to tv, returns true if actually read
bool read_press_nb(u_char* length, char* out, struct timeval* tv);
bool utf8_iscont(char byte); bool utf8_iscont(char byte);
size_t utf8len(const char* str); size_t utf8len(const char* str);

103
src/ui.c
View File

@ -46,7 +46,6 @@ static void print_session(struct uint_point origin, struct session session,
static void print_user(struct uint_point origin, struct user user, static void print_user(struct uint_point origin, struct user user,
bool multiple); bool multiple);
static void print_passwd(struct uint_point origin, uint length, bool err); static void print_passwd(struct uint_point origin, uint length, bool err);
static void scratch_print_ui();
// ansi resource: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 // ansi resource: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
static struct termios orig_term; static struct termios orig_term;
@ -55,15 +54,18 @@ static struct winsize window;
#define INNER_BOX_OUT_MARGIN 2 #define INNER_BOX_OUT_MARGIN 2
struct config* g_config = NULL; struct config* g_config = NULL;
static volatile sig_atomic_t need_resize = 0;
static void process_sigwinch(int signal) {
need_resize = 1;
}
void setup(struct config* config) { void setup(struct config* config) {
g_config = config; g_config = config;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &window);
// at least
// 2 padding top and bottom for footer and vertical compensation
// 2 padding left & right to not overflow footer width
if (window.ws_row < BOX_HEIGHT + INNER_BOX_OUT_MARGIN * 2 ||
window.ws_col < BOX_WIDTH + INNER_BOX_OUT_MARGIN * 2) {
(void)fprintf(stderr, "\x1b[1;31mScreen too small\x1b[0m\n");
exit(1);
}
tcgetattr(STDOUT_FILENO, &orig_term); tcgetattr(STDOUT_FILENO, &orig_term);
term = orig_term; // save term term = orig_term; // save term
@ -76,9 +78,9 @@ void setup(struct config* config) {
printf("\x1b[s\x1b[?47h\x1b[%s;%sm\x1b[2J", g_config->colors.bg, printf("\x1b[s\x1b[?47h\x1b[%s;%sm\x1b[2J", g_config->colors.bg,
g_config->colors.fg); g_config->colors.fg);
print_footer();
(void)atexit(restore_all); (void)atexit(restore_all);
(void)signal(SIGINT, signal_handler); (void)signal(SIGINT, signal_handler);
(void)signal(SIGWINCH, process_sigwinch);
} }
static struct uint_point box_start() { static struct uint_point box_start() {
@ -171,18 +173,11 @@ void ui_update_ofield(struct opts_field* NNULLABLE self) {
} }
static char* unknown_str = "unknown"; static char* unknown_str = "unknown";
void scratch_print_ui() { // NOLINTNEXTLINE(readability-function-cognitive-complexity)
ioctl(STDOUT_FILENO, TIOCGWINSZ, &window); int load(struct Vector* users, struct Vector* sessions) {
/// SETUP
if (window.ws_row < BOX_HEIGHT + INNER_BOX_OUT_MARGIN * 2 || gusers = users;
window.ws_col < BOX_WIDTH + INNER_BOX_OUT_MARGIN * 2) { gsessions = sessions;
printf("\033[2J\033[H"); // Clear screen
printf("\x1b[1;31mScreen too small\x1b[0m\n");
printf("\x1b[%s;%sm\x1b[2J", g_config->colors.bg, g_config->colors.fg);
return;
}
printf("\033[2J\033[H"); // Clear screen
// hostnames larger won't render properly // hostnames larger won't render properly
const u_char HOSTNAME_SIZE = VALUES_COL - VALUES_SEPR - BOX_HMARGIN; const u_char HOSTNAME_SIZE = VALUES_COL - VALUES_SEPR - BOX_HMARGIN;
@ -199,42 +194,6 @@ void scratch_print_ui() {
// 1]); // 1]);
// *hidx = '\0'; // *hidx = '\0';
} }
/// PRINTING
const struct uint_point BOXSTART = box_start();
// printf box
print_box();
// put hostname
printf("\x1b[%d;%dH\x1b[%sm%s\x1b[%sm", BOXSTART.y + HEAD_ROW,
BOXSTART.x + VALUES_COL - VALUES_SEPR - (uint)utf8len(hostname),
g_config->colors.e_hostname, hostname, g_config->colors.fg);
// put date
char* fmtd_time = fmt_time(g_config->behavior.timefmt);
printf("\x1b[%d;%dH\x1b[%sm%s\x1b[%sm", BOXSTART.y + HEAD_ROW,
BOXSTART.x + BOX_WIDTH - 1 - BOX_HMARGIN - (uint)utf8len(fmtd_time),
g_config->colors.e_date, fmtd_time, g_config->colors.fg);
free(fmtd_time);
print_footer();
ui_update_field(SESSION);
ui_update_field(USER);
ui_update_field(PASSWD);
ui_update_cursor_focus();
}
#define READ_NONBLOCK_DELAY 100000
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
int load(struct Vector* users, struct Vector* sessions) {
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = READ_NONBLOCK_DELAY; // timeout = 100ms
/// SETUP
gusers = users;
gsessions = sessions;
of_session = of_session =
ofield_new(sessions->length + g_config->behavior.include_defshell); ofield_new(sessions->length + g_config->behavior.include_defshell);
@ -269,19 +228,35 @@ int load(struct Vector* users, struct Vector* sessions) {
free(initial_state.session_opt); free(initial_state.session_opt);
} }
scratch_print_ui(); /// PRINTING
const struct uint_point BOXSTART = box_start();
// printf box
print_box();
// put hostname
printf("\x1b[%d;%dH\x1b[%sm%s\x1b[%sm", BOXSTART.y + HEAD_ROW,
BOXSTART.x + VALUES_COL - VALUES_SEPR - (uint)utf8len(hostname),
g_config->colors.e_hostname, hostname, g_config->colors.fg);
// put date
char* fmtd_time = fmt_time(g_config->behavior.timefmt);
printf("\x1b[%d;%dH\x1b[%sm%s\x1b[%sm", BOXSTART.y + HEAD_ROW,
BOXSTART.x + BOX_WIDTH - 1 - BOX_HMARGIN - (uint)utf8len(fmtd_time),
g_config->colors.e_date, fmtd_time, g_config->colors.fg);
free(fmtd_time);
ui_update_field(SESSION);
ui_update_field(USER);
ui_update_field(PASSWD);
ui_update_cursor_focus();
/// INTERACTIVE /// INTERACTIVE
u_char len; u_char len;
char seq[0xff]; char seq[0xff];
uint esc = 0; uint esc = 0;
while (true) { while (true) {
if (need_resize) { read_press(&len, seq);
need_resize = 0;
scratch_print_ui();
}
if (!read_press_nb(&len, seq, &tv)) continue;
if (*seq == '\x1b') { if (*seq == '\x1b') {
enum keys ansi_code = find_ansi(seq); enum keys ansi_code = find_ansi(seq);
if (ansi_code != -1) { if (ansi_code != -1) {

View File

@ -1,5 +1,3 @@
#include <asm-generic/errno-base.h>
#include <errno.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -55,17 +53,6 @@ void read_press(u_char* length, char* out) {
} }
} }
bool read_press_nb(u_char* length, char* out, struct timeval* tv) {
fd_set fds;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
int ret = select(STDIN_FILENO + 1, &fds, NULL, NULL, tv);
if ((ret < 0 && errno == EINTR) || ret == 0) return false;
read_press(length, out);
return true;
}
// https://stackoverflow.com/a/48040042 // https://stackoverflow.com/a/48040042
static int selret_magic() { static int selret_magic() {
fd_set set; fd_set set;