From 45a24f90b99b2264e2a8fd9356d6ee11c3d7d83e Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sun, 16 Nov 2025 08:26:47 +0900 Subject: [PATCH] mdm --- mdm/CMakeLists.txt | 17 +++++++++++- mdm/login.c | 29 ++++++++++++++++++++ mdm/main.c | 30 ++++++++++++++++++++- mdm/mdm.h | 11 ++++++++ mdm/xserver.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 mdm/login.c create mode 100644 mdm/mdm.h create mode 100644 mdm/xserver.c diff --git a/mdm/CMakeLists.txt b/mdm/CMakeLists.txt index b3776a4..2610e02 100644 --- a/mdm/CMakeLists.txt +++ b/mdm/CMakeLists.txt @@ -2,6 +2,9 @@ project( mdm ) +find_package(PkgConfig) +pkg_check_modules(X11 REQUIRED x11) + file( GLOB mdm_SRC @@ -13,10 +16,22 @@ add_executable( ${mdm_SRC} ) +target_include_directories( + mdm + PRIVATE + ${X11_INCLUDE_DIRS} +) + +target_link_directories( + mdm + PRIVATE + ${X11_LIBRARY_DIRS} +) + target_link_libraries( mdm PRIVATE - MDELib + ${X11_LIBRARIES} MDELib Mw ) include(GNUInstallDirs) diff --git a/mdm/login.c b/mdm/login.c new file mode 100644 index 0000000..c09a2fd --- /dev/null +++ b/mdm/login.c @@ -0,0 +1,29 @@ +#include "mdm.h" + +#include + +void make_login_window(void){ + MwWidget w, pic, userlabel, usercombo, passlabel, passentry; + + MwLibraryInit(); + + w = MwVaCreateWidget(MwWindowClass, "login", NULL, (x_width() - 366) / 2, (x_height() - 183) / 2, 366, 183, + MwNhasBorder, 1, + MwNinverted, 0, + NULL); + pic = MwVaCreateWidget(MwImageClass, "image", w, 10, 10, 80, 137, + MwNhasBorder, 1, + NULL); + userlabel = MwVaCreateWidget(MwLabelClass, "userlabel", w, 95, 10, MwTextWidth(w, "User:"), 16, + MwNtext, "User:", + NULL); + usercombo = MwCreateWidget(MwComboBoxClass, "usercombo", w, 95, 10+16+5, 265, 18); + passlabel = MwVaCreateWidget(MwLabelClass, "passlabel", w, 95, 10+16+5+18+5, MwTextWidth(w, "Password:"), 16, + MwNtext, "Password:", + NULL); + passentry = MwVaCreateWidget(MwEntryClass, "passentry", w, 95, 10+16+5+18+5+16+5, 265, 18, + MwNhideInput, 1, + NULL); + + MwLoop(w); +} diff --git a/mdm/main.c b/mdm/main.c index 979a1cd..0231884 100644 --- a/mdm/main.c +++ b/mdm/main.c @@ -1 +1,29 @@ -int main(){} +#include "mdm.h" + +#include +#include + +int is_launch_x = 1; + +int main(int argc, char** argv){ + int i, st; + + for(i = 1; i < argc; i++){ + if(argv[i][0] == '-'){ + if(strcmp(argv[i], "-X") == 0 || strcmp(argv[i], "--no-launch-x") == 0){ + is_launch_x = 0; + }else{ + fprintf(stderr, "%s: bad option: %s\n", argv[0], argv[i]); + return 1; + } + } + } + + if(is_launch_x){ + if((st = launch_x()) != 0) return st; + } + + init_x(); + + make_login_window(); +} diff --git a/mdm/mdm.h b/mdm/mdm.h new file mode 100644 index 0000000..60b27ed --- /dev/null +++ b/mdm/mdm.h @@ -0,0 +1,11 @@ +#ifndef __MDM_H__ +#define __MDM_H__ + +int launch_x(void); +int x_width(void); +int x_height(void); +void init_x(void); + +void make_login_window(void); + +#endif diff --git a/mdm/xserver.c b/mdm/xserver.c new file mode 100644 index 0000000..1bef1b0 --- /dev/null +++ b/mdm/xserver.c @@ -0,0 +1,67 @@ +#include "mdm.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static pid_t x_server; +static int got_usr1; +static Display* display; + +static void catch_usr1(int sig){ + got_usr1 = 1; +} + +int launch_x(void){ + got_usr1 = 0; + + signal(SIGUSR1, catch_usr1); + + if((x_server = fork()) == 0){ + signal(SIGUSR1, SIG_IGN); + execlp("X", "X", ":0", NULL); + _exit(-1); + }else{ + while(!got_usr1){ + if(waitpid(x_server, NULL, WNOHANG) != 0){ + fprintf(stderr, "server died. what happened?\n"); + return 1; + } + usleep(1000); + } + } + + setenv("DISPLAY", ":0", 1); + + return 0; +} + +void init_x(void){ + XColor bg; + + display = XOpenDisplay(NULL); + + bg.red = 0x1c * 256; + bg.green = 0x45 * 256; + bg.blue = 0x73 * 256; + XAllocColor(display, DefaultColormap(display, DefaultScreen(display)), &bg); + + XSetWindowBackground(display, DefaultRootWindow(display), bg.pixel); + XClearWindow(display, DefaultRootWindow(display)); + XFlush(display); +} + +int x_width(void){ + return DisplayWidth(display, DefaultScreen(display)); +} + +int x_height(void){ + return DisplayHeight(display, DefaultScreen(display)); +}