| git.druid.rocks | index | militantprogrammer | astral_canvas | src/ | platform/ | platform.c |
src/platform/platform.c
#include "platform.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
Print / log the four env vars
(XDG_SESSION_TYPE, WAYLAND_DISPLAY, DISPLAY, XDG_RUNTIME_DIR)
so you can see what the process inherited.
*/
const char *convertBackendToString(Backend backend)
{
switch (backend) {
case BACKEND_X11:
return "x11";
case BACKEND_WAYLAND:
return "wayland";
case BACKEND_AUTO:
return "auto";
default:
return "invalid";
}
}
DisplayKind GetDisplay(void)
{
const char *wayland = getenv("WAYLAND_DISPLAY");
const char *x11 = getenv("DISPLAY");
if (wayland && wayland[0])
return DISPLAY_WAYLAND;
if (x11 && x11[0])
return DISPLAY_X11;
return DISPLAY_NULL;
}
int platformOpen(Platform *platform, const char *title, int width, int height)
{
int rc = -1;
DisplayKind kind;
if (platform->backend == BACKEND_X11)
kind = DISPLAY_X11;
else if (platform->backend == BACKEND_WAYLAND)
kind = DISPLAY_WAYLAND;
else
kind = GetDisplay();
if (kind == DISPLAY_WAYLAND) {
rc = platformWaylandOpen(platform, title, width, height);
if (rc != 0) {
fprintf(stderr, "failed setting up Wayland, trying X11\n");
rc = platformX11Open(platform, title, width, height);
}
} else if (kind == DISPLAY_X11) {
rc = platformX11Open(platform, title, width, height);
if (rc != 0) {
fprintf(stderr, "failed setting up X11, trying Wayland\n");
rc = platformWaylandOpen(platform, title, width, height);
}
} else {
rc = platformWaylandOpen(platform, title, width, height);
if (rc != 0)
rc = platformX11Open(platform, title, width, height);
}
if (rc != 0)
return -1;
eventQueueInit(&platform->events);
platform->running = true;
if (platform->scale <= 0)
platform->scale = 1;
return 0;
}
void platformClose(Platform *platform)
{
if (!platform)
return;
if (platform->destroy)
platform->destroy(platform);
memset(platform, 0, sizeof(*platform));
}
bool platformPop(Platform *platform, Event *out)
{
return eventQueuePop(&platform->events, out);
}