fullscreen mostly implemented

This commit is contained in:
Harrison DiAmbrosio 2025-12-15 23:14:33 -05:00
parent a90c106b8c
commit a5f5bba78e
6 changed files with 47 additions and 26 deletions

View file

@ -169,13 +169,6 @@ local master = function()
end end
}) })
mez.hook.add("ViewRequestFullscreen", {
callback = function (view_id)
mez.view.toggle_fullscreen(view_id)
end
})
mez.input.add_keymap("alt", "p", { mez.input.add_keymap("alt", "p", {
press = function() press = function()
mez.api.spawn("wmenu-run") mez.api.spawn("wmenu-run")

View file

@ -101,6 +101,10 @@ pub fn viewById(self: *Root, id: u64) ?*View {
return view_snd.view; return view_snd.view;
} }
} }
if(output.fullscreen) |fullscreen| {
if(fullscreen.id == id) return fullscreen;
}
} }
return null; return null;

View file

@ -88,11 +88,11 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void {
} }
}; };
// Remove focus from the current surface unless // Remove focus from the current surface unless:
// - current has exclusive keyboard interactivity // - current and to focus are the same surface
// - the current view is fullscreen and // - current layer has exclusive keyboard interactivity
// - to focus is a content level view // - current is fullscreen and to focus is content
// - to focus is a bottom or background level layer // - current is fullscreen and layer is bottom or background
if (self.focused_surface) |current_focus| { if (self.focused_surface) |current_focus| {
const current_surface = switch(current_focus) { const current_surface = switch(current_focus) {
.view => current_focus.view.xdg_toplevel.base.surface, .view => current_focus.view.xdg_toplevel.base.surface,
@ -101,20 +101,29 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void {
}; };
if (current_surface == surface) return; // Same surface if (current_surface == surface) return; // Same surface
// Don't change focus under these circumstances if(to_focus != null) {
if(current_focus == .layer_surface) { switch (current_focus) {
if(current_focus.layer_surface.wlr_layer_surface.current.keyboard_interactive == .exclusive) return; .layer_surface => |*current_layer_surface| {
} else if(current_focus == .view and current_focus.view.fullscreen) { // Current focus is a fullscreened view if(current_layer_surface.*.wlr_layer_surface.current.keyboard_interactive == .exclusive) return;
switch (to_focus.?) {
.layer_surface => |*layer_surface| {
const layer = layer_surface.*.wlr_layer_surface.current.layer;
if(layer == .background or layer == .bottom) return;
}, },
.view => |*view| { .view => |*current_view| {
if(!view.*.fullscreen) return; // TODO: Is this the correct conditional if(current_view.*.fullscreen) {
switch (to_focus.?) {
.layer_surface => |*layer_surface| {
const layer = layer_surface.*.wlr_layer_surface.current.layer;
if(layer == .background or layer == .bottom) return;
},
.view => |*view| {
if(!view.*.fullscreen) return;
},
else => {}
}
}
}, },
else => {} else => {}
} }
} else if(current_focus == .view and current_focus.view.fullscreen){
return;
} }
// Clear the focus if applicable // Clear the focus if applicable
@ -128,6 +137,7 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void {
} }
} }
if(to_focus != null) { if(to_focus != null) {
server.seat.wlr_seat.keyboardNotifyEnter( server.seat.wlr_seat.keyboardNotifyEnter(
surface.?, surface.?,
@ -135,12 +145,13 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void {
null null
); );
if(to_focus.? != .layer_surface) { if(to_focus.? != .layer_surface) {
if(to_focus.? == .view) to_focus.?.view.focused = true;
if(wlr.XdgSurface.tryFromWlrSurface(surface.?)) |xdg_surface| { if(wlr.XdgSurface.tryFromWlrSurface(surface.?)) |xdg_surface| {
_ = xdg_surface.role_data.toplevel.?.setActivated(true); _ = xdg_surface.role_data.toplevel.?.setActivated(true);
} }
} }
self.focused_surface = to_focus;
} }
self.focused_surface = to_focus;
} }
pub fn focusOutput(self: *Seat, output: *Output) void { pub fn focusOutput(self: *Seat, output: *Output) void {

View file

@ -238,7 +238,14 @@ fn handleRequestActivate(
if(event.surface.data == null) return; if(event.surface.data == null) return;
const scene_node_data: *SceneNodeData = @ptrCast(@alignCast(event.surface.data.?)); const scene_node_data: *SceneNodeData = @ptrCast(@alignCast(event.surface.data.?));
if(scene_node_data.* == .view) { if(scene_node_data.* == .view) {
if(server.seat.focused_output) |output| {
if(output.fullscreen) |fullscreen| {
server.seat.focusSurface(.{ .view = fullscreen });
return;
}
}
server.seat.focusSurface(Seat.FocusData{ .view = scene_node_data.view }); server.seat.focusSurface(Seat.FocusData{ .view = scene_node_data.view });
} else { } else {
std.log.warn("Ignoring request to activate non-view", .{}); std.log.warn("Ignoring request to activate non-view", .{});

View file

@ -105,12 +105,13 @@ pub fn deinit(self: *View) void {
} }
pub fn close(self: *View) void { pub fn close(self: *View) void {
self.xdg_toplevel.sendClose();
if(self.focused) { if(self.focused) {
if(self.fullscreen) self.toggleFullscreen();
self.focused = false; self.focused = false;
_ = self.xdg_toplevel.base.role_data.toplevel.?.setActivated(false); server.seat.focusSurface(null);
server.seat.focused_surface = null;
} }
self.xdg_toplevel.sendClose();
} }
pub fn toggleFullscreen(self: *View) void { pub fn toggleFullscreen(self: *View) void {
@ -263,6 +264,7 @@ fn handleRequestMinimize(
) void { ) void {
const view: *View = @fieldParentPtr("request_minimize", listener); const view: *View = @fieldParentPtr("request_minimize", listener);
server.events.exec("ViewRequestMinimize", .{view.id}); server.events.exec("ViewRequestMinimize", .{view.id});
std.log.debug("request_minimize unimplemented", .{});
} }
fn handleSetAppId( fn handleSetAppId(
@ -270,6 +272,7 @@ fn handleSetAppId(
) void { ) void {
const view: *View = @fieldParentPtr("set_app_id", listener); const view: *View = @fieldParentPtr("set_app_id", listener);
server.events.exec("ViewAppIdUpdate", .{view.id}); server.events.exec("ViewAppIdUpdate", .{view.id});
std.log.debug("request_set_app_id unimplemented", .{});
} }
fn handleSetTitle( fn handleSetTitle(
@ -277,4 +280,5 @@ fn handleSetTitle(
) void { ) void {
const view: *View = @fieldParentPtr("set_title", listener); const view: *View = @fieldParentPtr("set_title", listener);
server.events.exec("ViewTitleUpdate", .{view.id}); server.events.exec("ViewTitleUpdate", .{view.id});
std.log.debug("request_set_title unimplemented", .{});
} }

View file

@ -196,7 +196,9 @@ pub fn set_focused(L: *zlua.Lua) i32 {
pub fn toggle_fullscreen(L: *zlua.Lua) i32 { pub fn toggle_fullscreen(L: *zlua.Lua) i32 {
const view_id = LuaUtils.coerceInteger(u64, L.checkInteger(1)) catch view_id_err(L); const view_id = LuaUtils.coerceInteger(u64, L.checkInteger(1)) catch view_id_err(L);
std.log.debug("fullscreen view {d}", .{view_id});
if(LuaUtils.viewById(view_id)) |v| { if(LuaUtils.viewById(view_id)) |v| {
std.log.debug("toggling fullscreen", .{});
v.toggleFullscreen(); v.toggleFullscreen();
} }