From 9246051de047dd10ffade7cd240c69714c535b85 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Fri, 11 Sep 2026 13:31:37 -0700 Subject: [PATCH] new envs --- doc/ENV.md | 5 +++++ include/Mw/LowLevel.h | 11 ++++++++--- src/backend/wayland/wayland.c | 35 ++++++++++++++++++++++++----------- src/backend/x11.c | 30 ++++++++++++++++++++++-------- src/lowlevel.c | 18 +++++++++++++++--- 5 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 doc/ENV.md diff --git a/doc/ENV.md b/doc/ENV.md new file mode 100644 index 0000000..001c301 --- /dev/null +++ b/doc/ENV.md @@ -0,0 +1,5 @@ +Platforms that support both X11 and Wayland (Linux, namely) support launching Milsko programs with following environment variables: + +- `MW_BACKEND`: set to either `wayland` or `x11` to force which display protocol Wayland uses +- `MW_FORCE_CSD`: set to force the wayland backend to use CSD instead of SSD +- `MW_LIGHT_THEME`/`MW_DARK_THEME`: set to have either wayland or x11 ignore the system's appearence settings and either just use light theme/dark theme. diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 6647672..8822f68 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -41,6 +41,11 @@ struct _MwLLCommon { MwBool supports_transparency; MwLLHandler handler; + +#if defined(USE_WAYLAND) || defined(USE_X11) + /* 0 = default, 1 = light, 2 = dark */ + int theme_override; +#endif }; struct _MwLLCommonColor { @@ -364,9 +369,9 @@ MWDECL void* (*MwFLFontLoad)(unsigned char* data, unsigned int size, int px); MWDECL void (*MwFLFontFree)(void* handle); #ifdef _WIN32 -MWDECL void *MwLL_winmmLib; -MWDECL long (__stdcall* MwLL_PFN_timeGetTime)(void); -MWDECL unsigned int (__stdcall* MwLL_PFN_timeBeginPeriod)(unsigned int period); +MWDECL void* MwLL_winmmLib; +MWDECL long(__stdcall* MwLL_PFN_timeGetTime)(void); +MWDECL unsigned int(__stdcall* MwLL_PFN_timeBeginPeriod)(unsigned int period); #endif #ifdef __cplusplus diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index 34d2e13..6d34e49 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -942,11 +942,13 @@ static void dark_theme_listener(MwLL handle, MwU32 new_value) { static void detect_dark_theme(MwLL handle) { MwU32 value = 0; - MwLLDBusPortalGet(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings", "org.freedesktop.appearance", "color-scheme", &value); - handle->wayland.dark_theme = (value == 1) ? 1 : 0; - - MwLLDBusPortalWatch(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings"); - + if(handle->common.theme_override != 0) { + handle->wayland.dark_theme = (handle->common.theme_override == 2) ? 1 : 0; + } else { + MwLLDBusPortalGet(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings", "org.freedesktop.appearance", "color-scheme", &value); + handle->wayland.dark_theme = (value == 1) ? 1 : 0; + MwLLDBusPortalWatch(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings"); + } MwLLDispatch(handle, dark_theme, &handle->wayland.dark_theme); } #endif @@ -1381,9 +1383,8 @@ static int MwLLPendingImpl(MwLL handle) { } #ifdef USE_DBUS - if(wl_call_tbl.has_dbus) { + if(wl_call_tbl.has_dbus || handle->common.theme_override == 0) { if(handle->wayland.dark_theme_detection) { - handle->wayland.dark_theme_detection = MwFALSE; detect_dark_theme(handle); MwLLDispatch(handle, draw, NULL); @@ -1907,10 +1908,22 @@ static void MwLLClipImpl(MwLL handle, MwRect* rect) { static int MwLLWaylandCallInitImpl(void) { #ifdef __linux__ - MwBool loadWayland = MwFALSE; - if(getenv("MILSKO_BACKEND")) { - loadWayland |= - (strcmp(getenv("MILSKO_BACKEND"), "wayland") == 0); + MwBool loadWayland = MwFALSE; + char* milsko_backend_env = getenv("MILSKO_BACKEND"); + char* mw_backend_env = getenv("MW_BACKEND"); + + if(milsko_backend_env || mw_backend_env) { + if(milsko_backend_env) { + /* + * (deprecated since 1.5+ but we have no reason to ever remove the old variable. + * MW_BACKEND is just the one that's documented) + */ + printf("[WARNING] MILSKO_BACKEND env is deprecated, use MW_BACKEND instead.\n"); + loadWayland |= (strcmp(milsko_backend_env, "wayland") == 0); + } else { + loadWayland |= (strcmp(mw_backend_env, "wayland") == 0); + } + } else if(getenv("WAYLAND_DISPLAY")) { loadWayland |= (getenv("WAYLAND_DISPLAY") != NULL); } diff --git a/src/backend/x11.c b/src/backend/x11.c index cc4d22b..8b908e4 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -327,9 +327,12 @@ static XVisualInfo* get_visual_info(Display* display) { static void detect_dark_theme(MwLL handle) { MwU32 value = 0; MwU32 dark_theme = 0; - MwLLDBusPortalGet(&xsymtbl.dbus, &handle->x11.dbus, "org.freedesktop.portal.Settings", "org.freedesktop.appearance", "color-scheme", &value); - - dark_theme = (value == 1) ? 1 : 0; + if(handle->common.theme_override != 0) { + dark_theme = (handle->common.theme_override == 2) ? 1 : 0; + } else { + MwLLDBusPortalGet(&xsymtbl.dbus, &handle->x11.dbus, "org.freedesktop.portal.Settings", "org.freedesktop.appearance", "color-scheme", &value); + dark_theme = (value == 1) ? 1 : 0; + } MwLLDispatch(handle, dark_theme, &dark_theme); } @@ -652,7 +655,7 @@ static int MwLLPendingImpl(MwLL handle) { if(handle->x11.dark_theme_detection) { handle->x11.dark_theme_detection = MwFALSE; #ifdef USE_DBUS - if(xsymtbl.has_dbus) { + if(xsymtbl.has_dbus || handle->common.theme_override == 0) { detect_dark_theme(handle); MwLLDispatch(handle, draw, NULL); } @@ -1403,10 +1406,21 @@ static void MwLLClipImpl(MwLL handle, MwRect* rect) { } static int MwLLX11CallInitImpl(void) { - MwBool loadX11 = MwFALSE; - if(getenv("MILSKO_BACKEND")) { - loadX11 |= - (strcmp(getenv("MILSKO_BACKEND"), "x11") == 0); + MwBool loadX11 = MwFALSE; + char* milsko_backend_env = getenv("MILSKO_BACKEND"); + char* mw_backend_env = getenv("MW_BACKEND"); + + if(milsko_backend_env || mw_backend_env) { + if(milsko_backend_env) { + /* + * (deprecated since 1.5+ but we have no reason to ever remove the old variable. + * MW_BACKEND is just the one that's documented) + */ + printf("[WARNING] MILSKO_BACKEND env is deprecated, use MW_BACKEND instead.\n"); + loadX11 |= (strcmp(milsko_backend_env, "x11") == 0); + } else { + loadX11 |= (strcmp(mw_backend_env, "x11") == 0); + } } else if(getenv("DISPLAY")) { loadX11 |= (getenv("DISPLAY") != NULL); } diff --git a/src/lowlevel.c b/src/lowlevel.c index 2fe1535..32070d9 100644 --- a/src/lowlevel.c +++ b/src/lowlevel.c @@ -1,9 +1,9 @@ #include #ifdef _WIN32 -void *MwLL_winmmLib; -long (__stdcall* MwLL_PFN_timeGetTime)(void); -unsigned int (__stdcall* MwLL_PFN_timeBeginPeriod)(unsigned int period); +void* MwLL_winmmLib; +long(__stdcall* MwLL_PFN_timeGetTime)(void); +unsigned int(__stdcall* MwLL_PFN_timeBeginPeriod)(unsigned int period); #endif MwLL (*MwLLCreate)(MwLL parent, int x, int y, int width, int height) = NULL; @@ -66,10 +66,22 @@ void (*MwLLRaise)(MwLL handle) = NULL; void (*MwLLClip)(MwLL handle, MwRect* rect) = NULL; void MwLLCreateCommon(MwLL handle) { +#if defined(USE_WAYLAND) || defined(USE_X11) + char* light_theme = getenv("MW_LIGHT_THEME"); + char* dark_theme = getenv("MW_DARK_THEME"); +#endif + handle->common.handler = malloc(sizeof(*handle->common.handler)); memset(handle->common.handler, 0, sizeof(*handle->common.handler)); handle->common.supports_transparency = 0; + +#if defined(USE_WAYLAND) || defined(USE_X11) + if(light_theme || dark_theme) { + handle->common.theme_override = (light_theme != NULL) ? 1 : ((dark_theme != NULL) ? 2 : 0); + } + +#endif } void MwLLDestroyCommon(MwLL handle) {