diff --git a/scripts/randomwallpaper/build.zig b/scripts/randomwallpaper/build.zig index 7c0ab4d..d16c03f 100644 --- a/scripts/randomwallpaper/build.zig +++ b/scripts/randomwallpaper/build.zig @@ -12,8 +12,8 @@ pub fn build(b: *std.build.Builder) void { }); exe.linkLibC(); - exe.linkSystemLibrary("x11"); - exe.linkSystemLibrary("xinerama"); + exe.linkSystemLibrary("xcb"); + exe.linkSystemLibrary("xcb-xinerama"); exe.strip = mode != .Debug; diff --git a/scripts/randomwallpaper/src/ffi.zig b/scripts/randomwallpaper/src/ffi.zig index 0c29743..bd0255c 100644 --- a/scripts/randomwallpaper/src/ffi.zig +++ b/scripts/randomwallpaper/src/ffi.zig @@ -1,5 +1,4 @@ pub const c = @cImport({ - @cInclude("stdlib.h"); - @cInclude("X11/Xlib.h"); - @cInclude("X11/extensions/Xinerama.h"); + @cInclude("xcb/xcb.h"); + @cInclude("xcb/xinerama.h"); }); diff --git a/scripts/randomwallpaper/src/main.zig b/scripts/randomwallpaper/src/main.zig index cb0ba69..8335b08 100644 --- a/scripts/randomwallpaper/src/main.zig +++ b/scripts/randomwallpaper/src/main.zig @@ -1,7 +1,6 @@ const std = @import("std"); const xinerama = @import("xinerama.zig"); const Walker = @import("Walker.zig"); -const c = @import("ffi.zig").c; pub const std_options = struct { pub const log_level = .debug; diff --git a/scripts/randomwallpaper/src/xinerama.zig b/scripts/randomwallpaper/src/xinerama.zig index 4526cbb..5e0ddbb 100644 --- a/scripts/randomwallpaper/src/xinerama.zig +++ b/scripts/randomwallpaper/src/xinerama.zig @@ -1,19 +1,23 @@ const std = @import("std"); const c = @import("ffi.zig").c; -pub fn getHeadCount() !i32 { - const display_name = c.getenv("DISPLAY") orelse return error.DisplayNotSet; - const display = c.XOpenDisplay(display_name) orelse return error.CouldntOpenDisplay; +pub fn getHeadCount() !u32 { + const connection = c.xcb_connect(null, null).?; + if (c.xcb_connection_has_error(connection) > 0) return error.ConnectionFailed; + defer c.xcb_disconnect(connection); - defer _ = c.XCloseDisplay(display); + var err: ?*c.xcb_generic_error_t = null; - if (c.XineramaIsActive(display) == 0) { - return error.XineramaError; - } + const is_active_cookie = c.xcb_xinerama_is_active(connection); + const is_active_reply = c.xcb_xinerama_is_active_reply(connection, is_active_cookie, &err); + if (err) |_| return error.FailedToQueryXinerama; + defer std.c.free(is_active_reply); + if (is_active_reply.*.state == 0) return error.XineramaInactive; - var screens: c_int = 0; - const info = c.XineramaQueryScreens(display, &screens) orelse return error.XineramaError; - defer _ = c.XFree(info); + const query_screens_cookie = c.xcb_xinerama_query_screens(connection); + const query_screens_reply = c.xcb_xinerama_query_screens_reply(connection, query_screens_cookie, &err); + if (err) |_| return error.FailedToQueryXinerama; + defer std.c.free(query_screens_reply); - return screens; + return query_screens_reply.*.number; }