Luigit
repositories / dotfiles

dotfiles

bugabingas dorkfiles

owned by admin

quickshell/nuguland/test-fixtures/ui/session-bus.c

Raw
// Read-only substitutes for the properties consumed by Niri 26.04:
// https://github.com/niri-wm/niri/tree/8ed0da44d974c32c6877d2f4630c314da0717ecb/src/dbus
// No session, power, locale mutation, or host-bus access is implemented.
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <systemd/sd-bus.h>

static int property(sd_bus *bus, const char *path, const char *interface,
                    const char *name, sd_bus_message *reply, void *data,
                    sd_bus_error *error) {
    (void)bus; (void)path; (void)data; (void)error;
    printf("read %s.%s\n", interface, name);
    if (!strcmp(name, "LidClosed")) return sd_bus_message_append(reply, "b", 0);
    const char *value = !strcmp(name, "X11Layout") ? "us" : !strcmp(name, "X11Model") ? "pc105" : "";
    return sd_bus_message_append(reply, "s", value);
}
static const sd_bus_vtable login[] = {
    SD_BUS_VTABLE_START(0),
    SD_BUS_PROPERTY("LidClosed", "b", property, 0, SD_BUS_VTABLE_PROPERTY_CONST),
    SD_BUS_VTABLE_END
};
static const sd_bus_vtable locale[] = {
    SD_BUS_VTABLE_START(0),
    SD_BUS_PROPERTY("X11Model", "s", property, 0, SD_BUS_VTABLE_PROPERTY_CONST),
    SD_BUS_PROPERTY("X11Layout", "s", property, 0, SD_BUS_VTABLE_PROPERTY_CONST),
    SD_BUS_PROPERTY("X11Variant", "s", property, 0, SD_BUS_VTABLE_PROPERTY_CONST),
    SD_BUS_PROPERTY("X11Options", "s", property, 0, SD_BUS_VTABLE_PROPERTY_CONST),
    SD_BUS_VTABLE_END
};
int main(void) {
    assert(getenv("NUGULAND_UI_SANDBOX") && !strcmp(getenv("NUGULAND_UI_SANDBOX"), "1"));
    assert(getenv("HOME") && !strcmp(getenv("HOME"), "/home/test"));
    assert(access("/home/oli", F_OK) != 0 && access("/run/dbus/system_bus_socket", F_OK) != 0);
    const char *address = getenv("DBUS_SESSION_BUS_ADDRESS");
    assert(address && !strncmp(address, "unix:path=/tmp/dbus-", strlen("unix:path=/tmp/dbus-")));
    assert(!strchr(address, ';'));
    assert(getenv("DBUS_SYSTEM_BUS_ADDRESS") && !strcmp(address, getenv("DBUS_SYSTEM_BUS_ADDRESS")));
    setvbuf(stdout, NULL, _IONBF, 0);
    sd_bus *bus = NULL;
    assert(sd_bus_new(&bus) >= 0);
    assert(sd_bus_set_address(bus, address) >= 0);
    assert(sd_bus_set_bus_client(bus, 1) >= 0);
    assert(sd_bus_start(bus) >= 0);
    assert(sd_bus_add_object_vtable(bus, NULL, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", login, NULL) >= 0);
    assert(sd_bus_add_object_vtable(bus, NULL, "/org/freedesktop/locale1", "org.freedesktop.locale1", locale, NULL) >= 0);
    assert(sd_bus_request_name(bus, "org.freedesktop.login1", 0) > 0);
    assert(sd_bus_request_name(bus, "org.freedesktop.locale1", 0) > 0);
    puts("session fixtures ready");
    for (;;) {
        int result = sd_bus_process(bus, NULL);
        assert(result >= 0);
        if (result == 0) assert(sd_bus_wait(bus, UINT64_MAX) >= 0);
    }
}