// 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 #include #include #include #include #include #include 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); } }