Xwayland: Rename XwaylandUnmanaged to XwaylandOverrideRedirect
This commit is contained in:
parent
1e3b8ed161
commit
03e8da669c
@ -37,7 +37,7 @@ const Output = @import("Output.zig");
|
|||||||
const Seat = @import("Seat.zig");
|
const Seat = @import("Seat.zig");
|
||||||
const View = @import("View.zig");
|
const View = @import("View.zig");
|
||||||
const ViewStack = @import("view_stack.zig").ViewStack;
|
const ViewStack = @import("view_stack.zig").ViewStack;
|
||||||
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
|
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
|
||||||
|
|
||||||
const Mode = union(enum) {
|
const Mode = union(enum) {
|
||||||
passthrough: void,
|
passthrough: void,
|
||||||
@ -315,9 +315,9 @@ fn handleButton(listener: *wl.Listener(*wlr.Pointer.event.Button), event: *wlr.P
|
|||||||
self.seat.focus(null);
|
self.seat.focus(null);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.xwayland_unmanaged => |xwayland_unmanaged| {
|
.xwayland_override_redirect => |override_redirect| {
|
||||||
if (build_options.xwayland) {
|
if (build_options.xwayland) {
|
||||||
self.seat.setFocusRaw(.{ .xwayland_unmanaged = xwayland_unmanaged });
|
self.seat.setFocusRaw(.{ .xwayland_override_redirect = override_redirect });
|
||||||
} else {
|
} else {
|
||||||
unreachable;
|
unreachable;
|
||||||
}
|
}
|
||||||
@ -537,7 +537,7 @@ const SurfaceAtResult = struct {
|
|||||||
parent: union(enum) {
|
parent: union(enum) {
|
||||||
view: *View,
|
view: *View,
|
||||||
layer_surface: *LayerSurface,
|
layer_surface: *LayerSurface,
|
||||||
xwayland_unmanaged: if (build_options.xwayland) *XwaylandUnmanaged else void,
|
xwayland_override_redirect: if (build_options.xwayland) *XwaylandOverrideRedirect else void,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -565,21 +565,21 @@ pub fn surfaceAt(self: Self) ?SurfaceAtResult {
|
|||||||
//
|
//
|
||||||
// fullscreen:
|
// fullscreen:
|
||||||
// 1. overlay layer toplevels and popups
|
// 1. overlay layer toplevels and popups
|
||||||
// 2. xwayland unmanaged stuff
|
// 2. xwayland override redirect windows
|
||||||
// 3. fullscreen view toplevels and popups
|
// 3. fullscreen view toplevels and popups
|
||||||
//
|
//
|
||||||
// non-fullscreen:
|
// non-fullscreen:
|
||||||
// 1. overlay layer toplevels and popups
|
// 1. overlay layer toplevels and popups
|
||||||
// 2. top, bottom, background layer popups
|
// 2. top, bottom, background layer popups
|
||||||
// 3. top layer toplevels
|
// 3. top layer toplevels
|
||||||
// 4. xwayland unmanaged stuff
|
// 4. xwayland override redirect windows
|
||||||
// 5. view toplevels and popups
|
// 5. view toplevels and popups
|
||||||
// 6. bottom, background layer toplevels
|
// 6. bottom, background layer toplevels
|
||||||
|
|
||||||
if (layerSurfaceAt(output.getLayer(.overlay).*, ox, oy)) |s| return s;
|
if (layerSurfaceAt(output.getLayer(.overlay).*, ox, oy)) |s| return s;
|
||||||
|
|
||||||
if (fullscreen_view) |view| {
|
if (fullscreen_view) |view| {
|
||||||
if (build_options.xwayland) if (xwaylandUnmanagedSurfaceAt(lx, ly)) |s| return s;
|
if (build_options.xwayland) if (xwaylandOverrideRedirectSurfaceAt(lx, ly)) |s| return s;
|
||||||
var sx: f64 = undefined;
|
var sx: f64 = undefined;
|
||||||
var sy: f64 = undefined;
|
var sy: f64 = undefined;
|
||||||
if (view.surfaceAt(ox, oy, &sx, &sy)) |found| {
|
if (view.surfaceAt(ox, oy, &sx, &sy)) |found| {
|
||||||
@ -597,7 +597,7 @@ pub fn surfaceAt(self: Self) ?SurfaceAtResult {
|
|||||||
|
|
||||||
if (layerSurfaceAt(output.getLayer(.top).*, ox, oy)) |s| return s;
|
if (layerSurfaceAt(output.getLayer(.top).*, ox, oy)) |s| return s;
|
||||||
|
|
||||||
if (build_options.xwayland) if (xwaylandUnmanagedSurfaceAt(lx, ly)) |s| return s;
|
if (build_options.xwayland) if (xwaylandOverrideRedirectSurfaceAt(lx, ly)) |s| return s;
|
||||||
|
|
||||||
if (viewSurfaceAt(output, ox, oy)) |s| return s;
|
if (viewSurfaceAt(output, ox, oy)) |s| return s;
|
||||||
|
|
||||||
@ -721,8 +721,8 @@ fn viewSurfaceAt(output: *const Output, ox: f64, oy: f64) ?SurfaceAtResult {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn xwaylandUnmanagedSurfaceAt(lx: f64, ly: f64) ?SurfaceAtResult {
|
fn xwaylandOverrideRedirectSurfaceAt(lx: f64, ly: f64) ?SurfaceAtResult {
|
||||||
var it = server.root.xwayland_unmanaged_views.first;
|
var it = server.root.xwayland_override_redirect_views.first;
|
||||||
while (it) |node| : (it = node.next) {
|
while (it) |node| : (it = node.next) {
|
||||||
const xwayland_surface = node.data.xwayland_surface;
|
const xwayland_surface = node.data.xwayland_surface;
|
||||||
var sx: f64 = undefined;
|
var sx: f64 = undefined;
|
||||||
@ -737,7 +737,7 @@ fn xwaylandUnmanagedSurfaceAt(lx: f64, ly: f64) ?SurfaceAtResult {
|
|||||||
.surface = found,
|
.surface = found,
|
||||||
.sx = sx,
|
.sx = sx,
|
||||||
.sy = sy,
|
.sy = sy,
|
||||||
.parent = .{ .xwayland_unmanaged = &node.data },
|
.parent = .{ .xwayland_override_redirect = &node.data },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -912,7 +912,7 @@ pub fn checkFocusFollowsCursor(self: *Self) void {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.layer_surface => {},
|
.layer_surface => {},
|
||||||
.xwayland_unmanaged => assert(build_options.xwayland),
|
.xwayland_override_redirect => assert(build_options.xwayland),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ const util = @import("util.zig");
|
|||||||
const Output = @import("Output.zig");
|
const Output = @import("Output.zig");
|
||||||
const View = @import("View.zig");
|
const View = @import("View.zig");
|
||||||
const ViewStack = @import("view_stack.zig").ViewStack;
|
const ViewStack = @import("view_stack.zig").ViewStack;
|
||||||
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
|
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
|
||||||
const DragIcon = @import("DragIcon.zig");
|
const DragIcon = @import("DragIcon.zig");
|
||||||
|
|
||||||
new_output: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleNewOutput),
|
new_output: wl.Listener(*wlr.Output) = wl.Listener(*wlr.Output).init(handleNewOutput),
|
||||||
@ -58,10 +58,10 @@ noop_output: Output = undefined,
|
|||||||
|
|
||||||
drag_icons: std.SinglyLinkedList(DragIcon) = .{},
|
drag_icons: std.SinglyLinkedList(DragIcon) = .{},
|
||||||
|
|
||||||
/// This list stores all unmanaged Xwayland windows. This needs to be in root
|
/// This list stores all "override redirect" Xwayland windows. This needs to be in root
|
||||||
/// since X is like the wild west and who knows where these things will go.
|
/// since X is like the wild west and who knows where these things will place themselves.
|
||||||
xwayland_unmanaged_views: if (build_options.xwayland)
|
xwayland_override_redirect_views: if (build_options.xwayland)
|
||||||
std.TailQueue(XwaylandUnmanaged)
|
std.TailQueue(XwaylandOverrideRedirect)
|
||||||
else
|
else
|
||||||
void = if (build_options.xwayland)
|
void = if (build_options.xwayland)
|
||||||
.{},
|
.{},
|
||||||
|
@ -39,14 +39,14 @@ const Output = @import("Output.zig");
|
|||||||
const SeatStatus = @import("SeatStatus.zig");
|
const SeatStatus = @import("SeatStatus.zig");
|
||||||
const View = @import("View.zig");
|
const View = @import("View.zig");
|
||||||
const ViewStack = @import("view_stack.zig").ViewStack;
|
const ViewStack = @import("view_stack.zig").ViewStack;
|
||||||
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
|
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
|
||||||
|
|
||||||
const log = std.log.scoped(.seat);
|
const log = std.log.scoped(.seat);
|
||||||
const PointerConstraint = @import("PointerConstraint.zig");
|
const PointerConstraint = @import("PointerConstraint.zig");
|
||||||
|
|
||||||
const FocusTarget = union(enum) {
|
const FocusTarget = union(enum) {
|
||||||
view: *View,
|
view: *View,
|
||||||
xwayland_unmanaged: *XwaylandUnmanaged,
|
xwayland_override_redirect: *XwaylandOverrideRedirect,
|
||||||
layer: *LayerSurface,
|
layer: *LayerSurface,
|
||||||
none: void,
|
none: void,
|
||||||
};
|
};
|
||||||
@ -210,7 +210,7 @@ fn pendingFilter(view: *View, filter_tags: u32) bool {
|
|||||||
|
|
||||||
/// Switch focus to the target, handling unfocus and input inhibition
|
/// Switch focus to the target, handling unfocus and input inhibition
|
||||||
/// properly. This should only be called directly if dealing with layers or
|
/// properly. This should only be called directly if dealing with layers or
|
||||||
/// unmanaged xwayland views.
|
/// override redirect xwayland views.
|
||||||
pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
||||||
// If the target is already focused, do nothing
|
// If the target is already focused, do nothing
|
||||||
if (std.meta.eql(new_focus, self.focused)) return;
|
if (std.meta.eql(new_focus, self.focused)) return;
|
||||||
@ -218,9 +218,9 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
|||||||
// Obtain the target surface
|
// Obtain the target surface
|
||||||
const target_surface = switch (new_focus) {
|
const target_surface = switch (new_focus) {
|
||||||
.view => |target_view| target_view.surface.?,
|
.view => |target_view| target_view.surface.?,
|
||||||
.xwayland_unmanaged => |target_xwayland_unmanaged| blk: {
|
.xwayland_override_redirect => |target_override_redirect| blk: {
|
||||||
assert(build_options.xwayland);
|
assert(build_options.xwayland);
|
||||||
break :blk target_xwayland_unmanaged.xwayland_surface.surface;
|
break :blk target_override_redirect.xwayland_surface.surface;
|
||||||
},
|
},
|
||||||
.layer => |target_layer| target_layer.wlr_layer_surface.surface,
|
.layer => |target_layer| target_layer.wlr_layer_surface.surface,
|
||||||
.none => null,
|
.none => null,
|
||||||
@ -236,7 +236,7 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
|||||||
view.pending.focus -= 1;
|
view.pending.focus -= 1;
|
||||||
if (view.pending.focus == 0) view.setActivated(false);
|
if (view.pending.focus == 0) view.setActivated(false);
|
||||||
},
|
},
|
||||||
.xwayland_unmanaged, .layer, .none => {},
|
.xwayland_override_redirect, .layer, .none => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the new focus
|
// Set the new focus
|
||||||
@ -248,7 +248,7 @@ pub fn setFocusRaw(self: *Self, new_focus: FocusTarget) void {
|
|||||||
target_view.pending.urgent = false;
|
target_view.pending.urgent = false;
|
||||||
},
|
},
|
||||||
.layer => |target_layer| assert(self.focused_output == target_layer.output),
|
.layer => |target_layer| assert(self.focused_output == target_layer.output),
|
||||||
.xwayland_unmanaged, .none => {},
|
.xwayland_override_redirect, .none => {},
|
||||||
}
|
}
|
||||||
self.focused = new_focus;
|
self.focused = new_focus;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ const Output = @import("Output.zig");
|
|||||||
const Root = @import("Root.zig");
|
const Root = @import("Root.zig");
|
||||||
const StatusManager = @import("StatusManager.zig");
|
const StatusManager = @import("StatusManager.zig");
|
||||||
const XdgToplevel = @import("XdgToplevel.zig");
|
const XdgToplevel = @import("XdgToplevel.zig");
|
||||||
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
|
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
|
||||||
const XwaylandView = @import("XwaylandView.zig");
|
const XwaylandView = @import("XwaylandView.zig");
|
||||||
const IdleInhibitorManager = @import("IdleInhibitorManager.zig");
|
const IdleInhibitorManager = @import("IdleInhibitorManager.zig");
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ fn handleNewXwaylandSurface(listener: *wl.Listener(*wlr.XwaylandSurface), xwayla
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (xwayland_surface.override_redirect) {
|
if (xwayland_surface.override_redirect) {
|
||||||
_ = XwaylandUnmanaged.create(xwayland_surface) catch {
|
_ = XwaylandOverrideRedirect.create(xwayland_surface) catch {
|
||||||
log.err("out of memory", .{});
|
log.err("out of memory", .{});
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
@ -47,8 +47,7 @@ set_override_redirect: wl.Listener(*wlr.XwaylandSurface) =
|
|||||||
// Listeners that are only active while mapped
|
// Listeners that are only active while mapped
|
||||||
commit: wl.Listener(*wlr.Surface) = wl.Listener(*wlr.Surface).init(handleCommit),
|
commit: wl.Listener(*wlr.Surface) = wl.Listener(*wlr.Surface).init(handleCommit),
|
||||||
|
|
||||||
/// The unmanged surface will add itself to the list of unmanaged views
|
/// The override redirect surface will add itself to the list in Root when it is mapped.
|
||||||
/// in Root when it is mapped.
|
|
||||||
pub fn create(xwayland_surface: *wlr.XwaylandSurface) error{OutOfMemory}!*Self {
|
pub fn create(xwayland_surface: *wlr.XwaylandSurface) error{OutOfMemory}!*Self {
|
||||||
const node = try util.gpa.create(std.TailQueue(Self).Node);
|
const node = try util.gpa.create(std.TailQueue(Self).Node);
|
||||||
const self = &node.data;
|
const self = &node.data;
|
||||||
@ -92,14 +91,13 @@ fn handleDestroy(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandS
|
|||||||
pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: *wlr.XwaylandSurface) void {
|
pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface: *wlr.XwaylandSurface) void {
|
||||||
const self = @fieldParentPtr(Self, "map", listener);
|
const self = @fieldParentPtr(Self, "map", listener);
|
||||||
|
|
||||||
// Add self to the list of unmanaged views in the root
|
|
||||||
const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self);
|
const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self);
|
||||||
server.root.xwayland_unmanaged_views.prepend(node);
|
server.root.xwayland_override_redirect_views.prepend(node);
|
||||||
|
|
||||||
xwayland_surface.surface.?.events.commit.add(&self.commit);
|
xwayland_surface.surface.?.events.commit.add(&self.commit);
|
||||||
|
|
||||||
if (self.xwayland_surface.overrideRedirectWantsFocus()) {
|
if (self.xwayland_surface.overrideRedirectWantsFocus()) {
|
||||||
server.input_manager.defaultSeat().setFocusRaw(.{ .xwayland_unmanaged = self });
|
server.input_manager.defaultSeat().setFocusRaw(.{ .xwayland_override_redirect = self });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,9 +105,8 @@ pub fn handleMap(listener: *wl.Listener(*wlr.XwaylandSurface), xwayland_surface:
|
|||||||
fn handleUnmap(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandSurface) void {
|
fn handleUnmap(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandSurface) void {
|
||||||
const self = @fieldParentPtr(Self, "unmap", listener);
|
const self = @fieldParentPtr(Self, "unmap", listener);
|
||||||
|
|
||||||
// Remove self from the list of unmanaged views in the root
|
|
||||||
const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self);
|
const node = @fieldParentPtr(std.TailQueue(Self).Node, "data", self);
|
||||||
server.root.xwayland_unmanaged_views.remove(node);
|
server.root.xwayland_override_redirect_views.remove(node);
|
||||||
|
|
||||||
self.commit.link.remove();
|
self.commit.link.remove();
|
||||||
|
|
||||||
@ -118,7 +115,9 @@ fn handleUnmap(listener: *wl.Listener(*wlr.XwaylandSurface), _: *wlr.XwaylandSur
|
|||||||
var seat_it = server.input_manager.seats.first;
|
var seat_it = server.input_manager.seats.first;
|
||||||
while (seat_it) |seat_node| : (seat_it = seat_node.next) {
|
while (seat_it) |seat_node| : (seat_it = seat_node.next) {
|
||||||
const seat = &seat_node.data;
|
const seat = &seat_node.data;
|
||||||
if (seat.focused == .xwayland_unmanaged and seat.focused.xwayland_unmanaged == self) {
|
if (seat.focused == .xwayland_override_redirect and
|
||||||
|
seat.focused.xwayland_override_redirect == self)
|
||||||
|
{
|
||||||
seat.focus(null);
|
seat.focus(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,7 +136,7 @@ fn handleSetOverrideRedirect(
|
|||||||
) void {
|
) void {
|
||||||
const self = @fieldParentPtr(Self, "set_override_redirect", listener);
|
const self = @fieldParentPtr(Self, "set_override_redirect", listener);
|
||||||
|
|
||||||
log.debug("xwayland surface unset override redirect, switching to managed", .{});
|
log.debug("xwayland surface unset override redirect", .{});
|
||||||
|
|
||||||
assert(!xwayland_surface.override_redirect);
|
assert(!xwayland_surface.override_redirect);
|
||||||
|
|
@ -31,7 +31,7 @@ const Output = @import("Output.zig");
|
|||||||
const View = @import("View.zig");
|
const View = @import("View.zig");
|
||||||
const ViewStack = @import("view_stack.zig").ViewStack;
|
const ViewStack = @import("view_stack.zig").ViewStack;
|
||||||
const XdgPopup = @import("XdgPopup.zig");
|
const XdgPopup = @import("XdgPopup.zig");
|
||||||
const XwaylandUnmanaged = @import("XwaylandUnmanaged.zig");
|
const XwaylandOverrideRedirect = @import("XwaylandOverrideRedirect.zig");
|
||||||
|
|
||||||
const log = std.log.scoped(.xwayland);
|
const log = std.log.scoped(.xwayland);
|
||||||
|
|
||||||
@ -287,20 +287,20 @@ fn handleSetOverrideRedirect(
|
|||||||
) void {
|
) void {
|
||||||
const self = @fieldParentPtr(Self, "set_override_redirect", listener);
|
const self = @fieldParentPtr(Self, "set_override_redirect", listener);
|
||||||
|
|
||||||
log.debug("xwayland surface set override redirect, switching to unmanaged", .{});
|
log.debug("xwayland surface set override redirect", .{});
|
||||||
|
|
||||||
assert(xwayland_surface.override_redirect);
|
assert(xwayland_surface.override_redirect);
|
||||||
|
|
||||||
if (xwayland_surface.mapped) handleUnmap(&self.unmap, xwayland_surface);
|
if (xwayland_surface.mapped) handleUnmap(&self.unmap, xwayland_surface);
|
||||||
handleDestroy(&self.destroy, xwayland_surface);
|
handleDestroy(&self.destroy, xwayland_surface);
|
||||||
|
|
||||||
const unmanaged = XwaylandUnmanaged.create(xwayland_surface) catch {
|
const override_redirect = XwaylandOverrideRedirect.create(xwayland_surface) catch {
|
||||||
log.err("out of memory", .{});
|
log.err("out of memory", .{});
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (xwayland_surface.mapped) {
|
if (xwayland_surface.mapped) {
|
||||||
XwaylandUnmanaged.handleMap(&unmanaged.map, xwayland_surface);
|
XwaylandOverrideRedirect.handleMap(&override_redirect.map, xwayland_surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ pub fn renderOutput(output: *Output) void {
|
|||||||
// Always clear with solid black for fullscreen
|
// Always clear with solid black for fullscreen
|
||||||
server.renderer.clear(&[_]f32{ 0, 0, 0, 1 });
|
server.renderer.clear(&[_]f32{ 0, 0, 0, 1 });
|
||||||
renderView(output, view, &now);
|
renderView(output, view, &now);
|
||||||
if (build_options.xwayland) renderXwaylandUnmanaged(output, &now);
|
if (build_options.xwayland) renderXwaylandOverrideRedirect(output, &now);
|
||||||
} else {
|
} else {
|
||||||
// No fullscreen view, so render normal layers/views
|
// No fullscreen view, so render normal layers/views
|
||||||
server.renderer.clear(&server.config.background_color);
|
server.renderer.clear(&server.config.background_color);
|
||||||
@ -117,7 +117,7 @@ pub fn renderOutput(output: *Output) void {
|
|||||||
renderView(output, view, &now);
|
renderView(output, view, &now);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (build_options.xwayland) renderXwaylandUnmanaged(output, &now);
|
if (build_options.xwayland) renderXwaylandOverrideRedirect(output, &now);
|
||||||
|
|
||||||
renderLayer(output, output.getLayer(.top).*, &now, .toplevels);
|
renderLayer(output, output.getLayer(.top).*, &now, .toplevels);
|
||||||
|
|
||||||
@ -241,11 +241,11 @@ fn renderDragIcons(output: *const Output, now: *os.timespec) void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Render all xwayland unmanaged windows that appear on the output
|
/// Render all override redirect xwayland windows that appear on the output
|
||||||
fn renderXwaylandUnmanaged(output: *const Output, now: *os.timespec) void {
|
fn renderXwaylandOverrideRedirect(output: *const Output, now: *os.timespec) void {
|
||||||
const output_box = server.root.output_layout.getBox(output.wlr_output).?;
|
const output_box = server.root.output_layout.getBox(output.wlr_output).?;
|
||||||
|
|
||||||
var it = server.root.xwayland_unmanaged_views.last;
|
var it = server.root.xwayland_override_redirect_views.last;
|
||||||
while (it) |node| : (it = node.prev) {
|
while (it) |node| : (it = node.prev) {
|
||||||
const xwayland_surface = node.data.xwayland_surface;
|
const xwayland_surface = node.data.xwayland_surface;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user