diff --git a/assets/pkg/aur/lidm-bin/.SRCINFO b/assets/pkg/aur/lidm-bin/.SRCINFO index 2606b70..b83bd86 100644 --- a/assets/pkg/aur/lidm-bin/.SRCINFO +++ b/assets/pkg/aur/lidm-bin/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = lidm-bin pkgdesc = A fully colorful customizable TUI display manager made in C. (release binary) - pkgver = 1.0.0 + pkgver = 1.1.0 pkgrel = 1 url = https://github.com/javalsai/lidm arch = x86_64 @@ -8,11 +8,11 @@ pkgbase = lidm-bin depends = pam provides = lidm conflicts = lidm - source = lidm::https://github.com/javalsai/lidm/releases/download/v1.0.0/lidm-amd64 - source = default-theme.ini::https://raw.githubusercontent.com/javalsai/lidm/v1.0.0/themes/default.ini - source = lidm.1::https://raw.githubusercontent.com/javalsai/lidm/v1.0.0/assets/man/lidm.1 - source = lidm-config.5::https://raw.githubusercontent.com/javalsai/lidm/v1.0.0/assets/man/lidm-config.5 - sha256sums = 77e8aeeb8dd751620a63220fa6e419d9066b1b35d79e12ce5449a5a1acb24252 + 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.0/themes/default.ini + 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.0/assets/man/lidm-config.5 + sha256sums = 7bc64f0f10994c062ea80ea2c6ee9d45828567b448e170fb3e7af4111ce1c2dc sha256sums = a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542 sha256sums = 7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8 sha256sums = 5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f diff --git a/assets/pkg/aur/lidm-bin/PKGBUILD b/assets/pkg/aur/lidm-bin/PKGBUILD index 431ebda..47ca85c 100644 --- a/assets/pkg/aur/lidm-bin/PKGBUILD +++ b/assets/pkg/aur/lidm-bin/PKGBUILD @@ -1,7 +1,7 @@ # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # Maintainer: javalsai pkgname=lidm-bin -pkgver=1.0.0 +pkgver=1.1.0 pkgrel=1 depends=('pam') 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-config.5::https://raw.githubusercontent.com/javalsai/lidm/v$pkgver/assets/man/lidm-config.5" ) -sha256sums=('77e8aeeb8dd751620a63220fa6e419d9066b1b35d79e12ce5449a5a1acb24252' +sha256sums=('7bc64f0f10994c062ea80ea2c6ee9d45828567b448e170fb3e7af4111ce1c2dc' 'a8d29e220c23b48b5cd3aac0c0e395e90a9d6c9ca9c9c35a45ad6f3df5f55542' '7f2fb91f55088be1a9b1c93ecf5d6c1e437f369b56df2eacc9d10b00c93c39f8' '5dbe088ce29c95a400080190560d4308c10519a953e83d2d5020dfdf47dd830f') diff --git a/assets/pkg/aur/lidm-git/PKGBUILD b/assets/pkg/aur/lidm-git/PKGBUILD index 0d84340..82726b8 100644 --- a/assets/pkg/aur/lidm-git/PKGBUILD +++ b/assets/pkg/aur/lidm-git/PKGBUILD @@ -1,7 +1,7 @@ # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # Maintainer: javalsai pkgname=lidm-git -pkgver=1.0.0.r0.g2b1e469 +pkgver=1.1.0.r0.g11e9257 pkgrel=1 depends=('pam') makedepends=('git' 'make' 'gcc') diff --git a/assets/pkg/aur/lidm/.SRCINFO b/assets/pkg/aur/lidm/.SRCINFO index a8292d1..8cac047 100644 --- a/assets/pkg/aur/lidm/.SRCINFO +++ b/assets/pkg/aur/lidm/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = lidm pkgdesc = A fully colorful customizable TUI display manager made in C. (build latest tag) - pkgver = 1.0.0 + pkgver = 1.1.0 pkgrel = 1 url = https://github.com/javalsai/lidm arch = any @@ -8,7 +8,7 @@ pkgbase = lidm makedepends = git makedepends = gcc depends = pam - source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.0.0.tar.gz - sha256sums = 5a336c7aecc709d1514e6f16f63b316263894a08291a49aaae8ee1b6a06bad74 + source = tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v1.1.0.tar.gz + sha256sums = 4c39eb29f8a8b705b7a40f71df9b0ee2c8c140da039f933b2b895e649aaa8068 pkgname = lidm diff --git a/assets/pkg/aur/lidm/PKGBUILD b/assets/pkg/aur/lidm/PKGBUILD index fc41a61..f3d7696 100644 --- a/assets/pkg/aur/lidm/PKGBUILD +++ b/assets/pkg/aur/lidm/PKGBUILD @@ -1,7 +1,7 @@ # shellcheck disable=SC2034,SC2148,SC2128,SC2154,SC2164 # Maintainer: javalsai pkgname=lidm -pkgver=1.0.0 +pkgver=1.1.0 pkgrel=1 depends=('pam') makedepends=('git' 'gcc') @@ -10,7 +10,7 @@ arch=('any') url="https://github.com/javalsai/lidm" license=('GPL') source=("tarball.tar.gz::https://github.com/javalsai/lidm/archive/refs/tags/v$pkgver.tar.gz") -sha256sums=('5a336c7aecc709d1514e6f16f63b316263894a08291a49aaae8ee1b6a06bad74') +sha256sums=('4c39eb29f8a8b705b7a40f71df9b0ee2c8c140da039f933b2b895e649aaa8068') build() { tar -xzf "tarball.tar.gz" diff --git a/include/launch_state.h b/include/launch_state.h index e63ebe3..f1b508a 100644 --- a/include/launch_state.h +++ b/include/launch_state.h @@ -2,15 +2,16 @@ #define LAUNCHSTATEH_ #include -#include #include +#include "macros.h" + struct LaunchState { - int user_opt; - int session_opt; + char* NNULLABLE username; + char* NNULLABLE session_opt; }; -struct LaunchState read_launch_state(); +int read_launch_state(struct LaunchState* NNULLABLE state); bool write_launch_state(struct LaunchState state); #endif diff --git a/src/config.c b/src/config.c index 7619804..b379f20 100644 --- a/src/config.c +++ b/src/config.c @@ -126,7 +126,7 @@ struct parser_error parse_key(enum introspection_type typ, union typ_ptr at, aux_str = strdup(key); if (!aux_str) FAIL("allocation failure"); aux_err = parse_str_inplace(aux_str); - if (!aux_err.msg) { + if (aux_err.msg) { free(aux_str); return aux_err; } @@ -157,7 +157,7 @@ struct parser_error parse_key(enum introspection_type typ, union typ_ptr at, aux_str = strdup(key); if (!aux_str) FAIL("allocation failure"); aux_err = parse_str_inplace(aux_str); - if (!aux_err.msg) { + if (aux_err.msg) { free(aux_str); return aux_err; } @@ -170,7 +170,7 @@ struct parser_error parse_key(enum introspection_type typ, union typ_ptr at, #undef FAIL #undef NOFAIL -// NOLINTBEGIN(readability-identifier-length,readability-function-cognitive-complexity,readability-identifier-length) +// NOLINTBEGIN(readability-identifier-length,readability-function-cognitive-complexity) struct status config_line_handler(void* _config, char* table, char* k, char* v) { struct config* config = (struct config*)_config; @@ -213,11 +213,14 @@ struct status config_line_handler(void* _config, char* table, char* k, return ret; } - log_printf("[I] cfg parsed [%s.%s]\n", table, k); + if (this_intros_key->typ == STRING) + log_printf("[I] cfg parsed [%s.%s] (%s)\n", table, k, *k_addr.string); + else + log_printf("[I] cfg parsed [%s.%s]\n", table, k); return ret; } -// NOLINTEND(readability-identifier-length,readability-function-cognitive-complexity,readability-identifier-length) +// NOLINTEND(readability-identifier-length,readability-function-cognitive-complexity) int parse_config(struct config* NNULLABLE config, char* NNULLABLE path) { FILE* fd = fopen(path, "r"); @@ -232,9 +235,7 @@ int parse_config(struct config* NNULLABLE config, char* NNULLABLE path) { bool ret = read_desktop(fd, config, config_line_handler); (void)fclose(fd); - if (!ret) { - return -1; - } + if (!ret) return -1; return 0; } diff --git a/src/launch_state.c b/src/launch_state.c index 5a26fdb..ae16661 100644 --- a/src/launch_state.c +++ b/src/launch_state.c @@ -1,32 +1,52 @@ // Small file for saving last selection +#include +#include +#include + +#include "launch_state.h" + #define STATE_DIR "/var/lib/lidm" #define STATE_FILE "/var/lib/lidm/state" -#include "launch_state.h" +#define RWXR_X___ 0750 -struct LaunchState read_launch_state() { - struct LaunchState state; - state.user_opt = 1; - state.session_opt = 1; +int read_launch_state(struct LaunchState* NNULLABLE state) { FILE* state_fd = fopen(STATE_FILE, "r"); - if (state_fd == NULL) return state; - if (fscanf(state_fd, "%i;%i", &state.user_opt, &state.session_opt) != 2) { - state.user_opt = 1; - state.session_opt = 1; + if (state_fd == NULL) return -1; + + *state = (struct LaunchState){ + .username = NULL, + .session_opt = NULL, + }; + + size_t num = 0; + if (getline(&state->username, &num, state_fd) < 0) goto fail; + state->username[strcspn(state->username, "\n")] = 0; + + num = 0; + if (getline(&state->session_opt, &num, state_fd) < 0) { + free(state->session_opt); + goto fail; } + state->session_opt[strcspn(state->session_opt, "\n")] = 0; + (void)fclose(state_fd); - return state; + return 0; + +fail: + (void)fclose(state_fd); + return -1; } bool write_launch_state(struct LaunchState state) { FILE* state_fd = fopen(STATE_FILE, "w"); if (state_fd == NULL) { - if (mkdir(STATE_DIR, 0755) == -1) return false; + if (mkdir(STATE_DIR, RWXR_X___) == -1) return false; state_fd = fopen(STATE_FILE, "w"); if (state_fd == NULL) return false; } - (void)fprintf(state_fd, "%i;%i", state.user_opt, state.session_opt); + (void)fprintf(state_fd, "%s\n%s\n", state.username, state.session_opt); (void)fclose(state_fd); return true; } diff --git a/src/ui.c b/src/ui.c index f411c75..85ab74c 100644 --- a/src/ui.c +++ b/src/ui.c @@ -21,6 +21,7 @@ #include "efield.h" #include "keys.h" #include "launch_state.h" +#include "log.h" #include "ofield.h" #include "sessions.h" #include "ui.h" @@ -199,15 +200,33 @@ int load(struct Vector* users, struct Vector* sessions) { of_user = ofield_new(users->length); of_passwd = ofield_new(0); - struct LaunchState initial_state = read_launch_state(); - if (initial_state.user_opt > users->length || - initial_state.session_opt > - sessions->length + g_config->behavior.include_defshell) { - initial_state.user_opt = 1; - initial_state.session_opt = 1; + of_user.current_opt = users->length > 0; + of_session.current_opt = sessions->length > 0; + struct LaunchState initial_state; + if (read_launch_state(&initial_state) == 0) { + for (size_t i = 0; i < users->length; i++) { + struct user* user_i = (struct user*)vec_get(users, i); + if (strcmp(user_i->username, initial_state.username) == 0) { + of_user.current_opt = i + 1; + break; + } + } + + for (size_t i = 0; i < sessions->length; i++) { + struct session* session_i = (struct session*)vec_get(sessions, i); + if (strcmp(session_i->name, initial_state.session_opt) == 0) { + of_session.current_opt = i + 1; + break; + } + } + if (g_config->behavior.include_defshell) { + if (strcmp(st_user().shell, initial_state.session_opt) == 0) + of_session.current_opt = sessions->length + 1; + } + + free(initial_state.username); + free(initial_state.session_opt); } - of_user.current_opt = initial_state.user_opt; - of_session.current_opt = initial_state.session_opt; /// PRINTING const struct uint_point BOXSTART = box_start(); @@ -265,10 +284,11 @@ int load(struct Vector* users, struct Vector* sessions) { } } else { if (len == 1 && *seq == '\n') { - struct LaunchState ls; - ls.user_opt = of_user.current_opt; - ls.session_opt = of_session.current_opt; - write_launch_state(ls); + bool successful_write = write_launch_state((struct LaunchState){ + .username = st_user().username, + .session_opt = st_session(g_config->behavior.include_defshell).name, + }); + if (!successful_write) log_puts("[E] failed to write launch state"); if (!launch(st_user().username, of_passwd.efield.content, st_session(g_config->behavior.include_defshell),