From 060184bcb4495e307a6744aa7561054b4f5b6830 Mon Sep 17 00:00:00 2001 From: cylgom Date: Sat, 30 Jun 2018 15:48:05 +0200 Subject: [PATCH] initial work on wayland --- src/config.h | 1 + src/desktop.c | 29 ++++++++++++++++++++--------- src/login.c | 8 +++++++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/config.h b/src/config.h index ced5d27..21a9285 100644 --- a/src/config.h +++ b/src/config.h @@ -34,6 +34,7 @@ /* paths */ #define LY_PATH "/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/env" #define LY_PATH_XSESSIONS "/usr/share/xsessions" +#define LY_PATH_WSESSIONS "/usr/share/wayland-sessions" /* console */ #define LY_CONSOLE_DEV "/dev/console" diff --git a/src/desktop.c b/src/desktop.c index 775e0fc..43ffa2c 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -11,8 +11,8 @@ #define LY_XSESSION_EXEC "Exec=" #define LY_XSESSION_NAME "Name=" -/* returns a list containing all the DE for all the display servers */ -struct delist_t* list_de(void) +// searches a folder +void get_desktops(char* sessions_dir, struct delist_t* list, int* remote_count, short x) { /* xsession */ FILE* file; @@ -22,18 +22,17 @@ struct delist_t* list_de(void) char path[LY_LIM_PATH]; char* name; char* command; - /* de list */ - int count = 2; - struct delist_t* list = init_list(count); + int count = *remote_count; + /* reads xorg's desktop environments entries */ - dir = opendir(LY_PATH_XSESSIONS); + dir = opendir(sessions_dir); /* exits if the folder can't be read */ if(!dir) { error_print(LY_ERR_DELIST); end_list(list, count); - return NULL; + return; } /* cycles through the folder */ @@ -46,7 +45,7 @@ struct delist_t* list_de(void) } /* opens xsession file */ - snprintf(path, sizeof(path), "%s/%s", LY_PATH_XSESSIONS, + snprintf(path, sizeof(path), "%s/%s", sessions_dir, dir_info->d_name); file = fopen(path, "r"); @@ -77,12 +76,24 @@ struct delist_t* list_de(void) list->props = realloc(list->props, (count + 1) * (sizeof * (list->props))); list->props[count].cmd = command; - list->props[count].type = xorg; + list->props[count].type = x ? xorg : wayland; ++count; fclose(file); } closedir(dir); + *remote_count = count; +} + +/* returns a list containing all the DE for all the display servers */ +struct delist_t* list_de(void) +{ + /* de list */ + int count = 2; + struct delist_t* list = init_list(count); + + get_desktops(LY_PATH_XSESSIONS, list, &count, true); + get_desktops(LY_PATH_WSESSIONS, list, &count, false); end_list(list, count); return list; } diff --git a/src/login.c b/src/login.c index dc6cdf7..94861e9 100644 --- a/src/login.c +++ b/src/login.c @@ -495,7 +495,13 @@ int xinitrc) void launch_wayland(struct passwd* pwd, pam_handle_t* pam_handle, const char* de_command) { - exit(EXIT_FAILURE); + char cmd[32]; + extern char** environ; + char* argv[] = {pwd->pw_shell, "-l", "-c", cmd, NULL}; + snprintf(cmd, 32, "exec %s", de_command); + reset_terminal(pwd); + execve(pwd->pw_shell, argv, environ); + exit(EXIT_SUCCESS); } void launch_shell(struct passwd* pwd, pam_handle_t* pam_handle)