Display a single window!
This commit is contained in:
parent
c87fa2d4af
commit
bad5007670
12 changed files with 1084 additions and 554 deletions
93
src/WindowManager.zig
Normal file
93
src/WindowManager.zig
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
// SPDX-FileCopyrightText: 2025 Ben Buhse <me@benbuhse.email>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
const WindowManager = @This();
|
||||
|
||||
context: *Context,
|
||||
|
||||
window_manager_v1: *river.WindowManagerV1,
|
||||
|
||||
seats: wl.list.Head(Seat, .link),
|
||||
outputs: wl.list.Head(Output, .link),
|
||||
windows: wl.list.Head(Window, .link),
|
||||
|
||||
pub fn init(wm: *WindowManager, context: *Context, window_manager_v1: *river.WindowManagerV1) void {
|
||||
assert(wm == &context.wm);
|
||||
wm.* = .{
|
||||
.context = context,
|
||||
.window_manager_v1 = window_manager_v1,
|
||||
.seats = undefined,
|
||||
.outputs = undefined,
|
||||
.windows = undefined,
|
||||
};
|
||||
|
||||
wm.seats.init();
|
||||
wm.outputs.init();
|
||||
wm.windows.init();
|
||||
|
||||
wm.window_manager_v1.setListener(*WindowManager, windowManagerV1Listener, wm);
|
||||
}
|
||||
|
||||
fn windowManagerV1Listener(window_manager_v1: *river.WindowManagerV1, event: river.WindowManagerV1.Event, wm: *WindowManager) void {
|
||||
assert(wm.window_manager_v1 == window_manager_v1);
|
||||
const context = wm.context;
|
||||
switch (event) {
|
||||
.unavailable => {
|
||||
log.err("Window manager unavailable (some other wm instance is running). Exiting", .{});
|
||||
std.posix.exit(1);
|
||||
},
|
||||
.manage_start => {
|
||||
log.debug("1", .{});
|
||||
var it = wm.windows.iterator(.forward);
|
||||
while (it.next()) |window| {
|
||||
window.manage();
|
||||
}
|
||||
window_manager_v1.manageFinish();
|
||||
},
|
||||
.render_start => {
|
||||
log.debug("2", .{});
|
||||
var it = wm.windows.iterator(.forward);
|
||||
while (it.next()) |window| {
|
||||
window.render();
|
||||
}
|
||||
window_manager_v1.renderFinish();
|
||||
},
|
||||
.output => |ev| {
|
||||
log.debug("3", .{});
|
||||
var output = context.allocator.create(Output) catch @panic("out-of-memory; exiting.");
|
||||
output.init(context, ev.id);
|
||||
wm.outputs.append(output);
|
||||
},
|
||||
.seat => |ev| {
|
||||
log.debug("4", .{});
|
||||
var seat = context.allocator.create(Seat) catch @panic("out-of-memory; exiting.");
|
||||
seat.init(context, ev.id);
|
||||
wm.seats.append(seat);
|
||||
},
|
||||
.window => |ev| {
|
||||
log.debug("5", .{});
|
||||
var window = context.allocator.create(Window) catch @panic("out-of-memory; exiting.");
|
||||
window.init(context, ev.id);
|
||||
wm.windows.append(window);
|
||||
},
|
||||
else => |ev| {
|
||||
log.debug("unhandled event: {s}", .{@tagName(ev)});
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
const wayland = @import("wayland");
|
||||
const wl = wayland.client.wl;
|
||||
const river = wayland.client.river;
|
||||
|
||||
const Context = @import("main.zig").Context;
|
||||
const Output = @import("Output.zig");
|
||||
const Window = @import("Window.zig");
|
||||
|
||||
const log = std.log.scoped(.WindowManager);
|
||||
|
||||
const Seat = @import("Seat.zig");
|
||||
Loading…
Add table
Add a link
Reference in a new issue