This commit is contained in:
IoIxD 2026-09-11 13:31:37 -07:00
commit 9246051de0
5 changed files with 74 additions and 25 deletions

5
doc/ENV.md Normal file
View file

@ -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.

View file

@ -41,6 +41,11 @@ struct _MwLLCommon {
MwBool supports_transparency; MwBool supports_transparency;
MwLLHandler handler; MwLLHandler handler;
#if defined(USE_WAYLAND) || defined(USE_X11)
/* 0 = default, 1 = light, 2 = dark */
int theme_override;
#endif
}; };
struct _MwLLCommonColor { struct _MwLLCommonColor {

View file

@ -942,11 +942,13 @@ static void dark_theme_listener(MwLL handle, MwU32 new_value) {
static void detect_dark_theme(MwLL handle) { static void detect_dark_theme(MwLL handle) {
MwU32 value = 0; MwU32 value = 0;
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); 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; handle->wayland.dark_theme = (value == 1) ? 1 : 0;
MwLLDBusPortalWatch(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings"); MwLLDBusPortalWatch(&wl_call_tbl.dbus, &handle->wayland.dbus, "org.freedesktop.portal.Settings");
}
MwLLDispatch(handle, dark_theme, &handle->wayland.dark_theme); MwLLDispatch(handle, dark_theme, &handle->wayland.dark_theme);
} }
#endif #endif
@ -1381,9 +1383,8 @@ static int MwLLPendingImpl(MwLL handle) {
} }
#ifdef USE_DBUS #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) { if(handle->wayland.dark_theme_detection) {
handle->wayland.dark_theme_detection = MwFALSE; handle->wayland.dark_theme_detection = MwFALSE;
detect_dark_theme(handle); detect_dark_theme(handle);
MwLLDispatch(handle, draw, NULL); MwLLDispatch(handle, draw, NULL);
@ -1908,9 +1909,21 @@ static void MwLLClipImpl(MwLL handle, MwRect* rect) {
static int MwLLWaylandCallInitImpl(void) { static int MwLLWaylandCallInitImpl(void) {
#ifdef __linux__ #ifdef __linux__
MwBool loadWayland = MwFALSE; MwBool loadWayland = MwFALSE;
if(getenv("MILSKO_BACKEND")) { char* milsko_backend_env = getenv("MILSKO_BACKEND");
loadWayland |= char* mw_backend_env = getenv("MW_BACKEND");
(strcmp(getenv("MILSKO_BACKEND"), "wayland") == 0);
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")) { } else if(getenv("WAYLAND_DISPLAY")) {
loadWayland |= (getenv("WAYLAND_DISPLAY") != NULL); loadWayland |= (getenv("WAYLAND_DISPLAY") != NULL);
} }

View file

@ -327,9 +327,12 @@ static XVisualInfo* get_visual_info(Display* display) {
static void detect_dark_theme(MwLL handle) { static void detect_dark_theme(MwLL handle) {
MwU32 value = 0; MwU32 value = 0;
MwU32 dark_theme = 0; MwU32 dark_theme = 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); MwLLDBusPortalGet(&xsymtbl.dbus, &handle->x11.dbus, "org.freedesktop.portal.Settings", "org.freedesktop.appearance", "color-scheme", &value);
dark_theme = (value == 1) ? 1 : 0; dark_theme = (value == 1) ? 1 : 0;
}
MwLLDispatch(handle, dark_theme, &dark_theme); MwLLDispatch(handle, dark_theme, &dark_theme);
} }
@ -652,7 +655,7 @@ static int MwLLPendingImpl(MwLL handle) {
if(handle->x11.dark_theme_detection) { if(handle->x11.dark_theme_detection) {
handle->x11.dark_theme_detection = MwFALSE; handle->x11.dark_theme_detection = MwFALSE;
#ifdef USE_DBUS #ifdef USE_DBUS
if(xsymtbl.has_dbus) { if(xsymtbl.has_dbus || handle->common.theme_override == 0) {
detect_dark_theme(handle); detect_dark_theme(handle);
MwLLDispatch(handle, draw, NULL); MwLLDispatch(handle, draw, NULL);
} }
@ -1404,9 +1407,20 @@ static void MwLLClipImpl(MwLL handle, MwRect* rect) {
static int MwLLX11CallInitImpl(void) { static int MwLLX11CallInitImpl(void) {
MwBool loadX11 = MwFALSE; MwBool loadX11 = MwFALSE;
if(getenv("MILSKO_BACKEND")) { char* milsko_backend_env = getenv("MILSKO_BACKEND");
loadX11 |= char* mw_backend_env = getenv("MW_BACKEND");
(strcmp(getenv("MILSKO_BACKEND"), "x11") == 0);
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")) { } else if(getenv("DISPLAY")) {
loadX11 |= (getenv("DISPLAY") != NULL); loadX11 |= (getenv("DISPLAY") != NULL);
} }

View file

@ -66,10 +66,22 @@ void (*MwLLRaise)(MwLL handle) = NULL;
void (*MwLLClip)(MwLL handle, MwRect* rect) = NULL; void (*MwLLClip)(MwLL handle, MwRect* rect) = NULL;
void MwLLCreateCommon(MwLL handle) { 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)); handle->common.handler = malloc(sizeof(*handle->common.handler));
memset(handle->common.handler, 0, sizeof(*handle->common.handler)); memset(handle->common.handler, 0, sizeof(*handle->common.handler));
handle->common.supports_transparency = 0; 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) { void MwLLDestroyCommon(MwLL handle) {