Xwayland: Rename XwaylandUnmanaged to XwaylandOverrideRedirect

This commit is contained in:
Isaac Freund 2022-05-30 01:08:09 +02:00
parent 1e3b8ed161
commit 03e8da669c
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11
7 changed files with 43 additions and 44 deletions

View File

@ -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),
} }
} }
} }

View File

@ -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)
.{}, .{},

View File

@ -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;

View File

@ -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;
}; };

View File

@ -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);

View File

@ -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);
} }
} }

View File

@ -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;