From a5f5bba78e9ccd7bc0ec8dcfc4565fd3cd85fb49 Mon Sep 17 00:00:00 2001 From: Harrison DiAmbrosio Date: Mon, 15 Dec 2025 23:14:33 -0500 Subject: [PATCH] fullscreen mostly implemented --- runtime/share/mezzaluna/master.lua | 7 ----- src/Root.zig | 4 +++ src/Seat.zig | 43 +++++++++++++++++++----------- src/Server.zig | 7 +++++ src/View.zig | 10 ++++--- src/lua/View.zig | 2 ++ 6 files changed, 47 insertions(+), 26 deletions(-) diff --git a/runtime/share/mezzaluna/master.lua b/runtime/share/mezzaluna/master.lua index 68b6fcf..ae539cf 100644 --- a/runtime/share/mezzaluna/master.lua +++ b/runtime/share/mezzaluna/master.lua @@ -169,13 +169,6 @@ local master = function() end }) - - mez.hook.add("ViewRequestFullscreen", { - callback = function (view_id) - mez.view.toggle_fullscreen(view_id) - end - }) - mez.input.add_keymap("alt", "p", { press = function() mez.api.spawn("wmenu-run") diff --git a/src/Root.zig b/src/Root.zig index d043580..54e55ca 100644 --- a/src/Root.zig +++ b/src/Root.zig @@ -101,6 +101,10 @@ pub fn viewById(self: *Root, id: u64) ?*View { return view_snd.view; } } + + if(output.fullscreen) |fullscreen| { + if(fullscreen.id == id) return fullscreen; + } } return null; diff --git a/src/Seat.zig b/src/Seat.zig index 8b2bafc..2cddf72 100644 --- a/src/Seat.zig +++ b/src/Seat.zig @@ -88,11 +88,11 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void { } }; - // Remove focus from the current surface unless - // - current has exclusive keyboard interactivity - // - the current view is fullscreen and - // - to focus is a content level view - // - to focus is a bottom or background level layer + // Remove focus from the current surface unless: + // - current and to focus are the same surface + // - current layer has exclusive keyboard interactivity + // - current is fullscreen and to focus is content + // - current is fullscreen and layer is bottom or background if (self.focused_surface) |current_focus| { const current_surface = switch(current_focus) { .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 - // Don't change focus under these circumstances - if(current_focus == .layer_surface) { - if(current_focus.layer_surface.wlr_layer_surface.current.keyboard_interactive == .exclusive) return; - } else if(current_focus == .view and current_focus.view.fullscreen) { // Current focus is a fullscreened view - switch (to_focus.?) { - .layer_surface => |*layer_surface| { - const layer = layer_surface.*.wlr_layer_surface.current.layer; - if(layer == .background or layer == .bottom) return; + if(to_focus != null) { + switch (current_focus) { + .layer_surface => |*current_layer_surface| { + if(current_layer_surface.*.wlr_layer_surface.current.keyboard_interactive == .exclusive) return; }, - .view => |*view| { - if(!view.*.fullscreen) return; // TODO: Is this the correct conditional + .view => |*current_view| { + 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 if(current_focus == .view and current_focus.view.fullscreen){ + return; } // Clear the focus if applicable @@ -128,6 +137,7 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void { } } + if(to_focus != null) { server.seat.wlr_seat.keyboardNotifyEnter( surface.?, @@ -135,12 +145,13 @@ pub fn focusSurface(self: *Seat, to_focus: ?FocusData) void { null ); if(to_focus.? != .layer_surface) { + if(to_focus.? == .view) to_focus.?.view.focused = true; if(wlr.XdgSurface.tryFromWlrSurface(surface.?)) |xdg_surface| { _ = 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 { diff --git a/src/Server.zig b/src/Server.zig index 5d81622..eaf9306 100644 --- a/src/Server.zig +++ b/src/Server.zig @@ -238,7 +238,14 @@ fn handleRequestActivate( if(event.surface.data == null) return; const scene_node_data: *SceneNodeData = @ptrCast(@alignCast(event.surface.data.?)); + 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 }); } else { std.log.warn("Ignoring request to activate non-view", .{}); diff --git a/src/View.zig b/src/View.zig index 08daa3e..97f68bc 100644 --- a/src/View.zig +++ b/src/View.zig @@ -105,12 +105,13 @@ pub fn deinit(self: *View) void { } pub fn close(self: *View) void { - self.xdg_toplevel.sendClose(); if(self.focused) { + if(self.fullscreen) self.toggleFullscreen(); self.focused = false; - _ = self.xdg_toplevel.base.role_data.toplevel.?.setActivated(false); - server.seat.focused_surface = null; + server.seat.focusSurface(null); } + + self.xdg_toplevel.sendClose(); } pub fn toggleFullscreen(self: *View) void { @@ -263,6 +264,7 @@ fn handleRequestMinimize( ) void { const view: *View = @fieldParentPtr("request_minimize", listener); server.events.exec("ViewRequestMinimize", .{view.id}); + std.log.debug("request_minimize unimplemented", .{}); } fn handleSetAppId( @@ -270,6 +272,7 @@ fn handleSetAppId( ) void { const view: *View = @fieldParentPtr("set_app_id", listener); server.events.exec("ViewAppIdUpdate", .{view.id}); + std.log.debug("request_set_app_id unimplemented", .{}); } fn handleSetTitle( @@ -277,4 +280,5 @@ fn handleSetTitle( ) void { const view: *View = @fieldParentPtr("set_title", listener); server.events.exec("ViewTitleUpdate", .{view.id}); + std.log.debug("request_set_title unimplemented", .{}); } diff --git a/src/lua/View.zig b/src/lua/View.zig index 7218feb..a38a01f 100644 --- a/src/lua/View.zig +++ b/src/lua/View.zig @@ -196,7 +196,9 @@ pub fn set_focused(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); + std.log.debug("fullscreen view {d}", .{view_id}); if(LuaUtils.viewById(view_id)) |v| { + std.log.debug("toggling fullscreen", .{}); v.toggleFullscreen(); }