git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit5b1103f799a72ed0062b68b02501657bce8e1c6b
parentb2ca7fe5ec
authorLucas Galante <[email protected]>
date2026-06-19 15:00
protocol: allow windows to request popup mode via zcce_toplevel_v1

 protocol/cce-window-management-v1.xml | 12 +++++++++++-
 src/server/cce_window_management.rs   | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/protocol/cce-window-management-v1.xml b/protocol/cce-window-management-v1.xml
index 858451b..53b536f 100644
--- a/protocol/cce-window-management-v1.xml
+++ b/protocol/cce-window-management-v1.xml
@@ -1490,7 +1490,7 @@
       </description>
     </event>
   </interface>
-  <interface name="zcce_toplevel_v1" version="1">
+  <interface name="zcce_toplevel_v1" version="2">
     <description summary="toplevel window management controls">
       An interface to control and listen to CCE-specific window management states
       for a client surface.
@@ -1523,6 +1523,16 @@
     <request name="set_minimized">
       <description summary="request minimized state"/>
     </request>
+    <request name="set_popup" since="2">
+      <description summary="request popup mode">
+        Explicitly request the compositor to place the window in popup mode.
+      </description>
+    </request>
+    <request name="unset_popup" since="2">
+      <description summary="unset popup mode">
+        Request the compositor to return the window to normal tiling mode.
+      </description>
+    </request>
     <event name="floating_state">
       <description summary="floating status event">
         Sent by the compositor to inform the client of its current floating status.
diff --git a/src/server/cce_window_management.rs b/src/server/cce_window_management.rs
index e78d92d..e88b133 100644
--- a/src/server/cce_window_management.rs
+++ b/src/server/cce_window_management.rs
@@ -227,6 +227,39 @@ unsafe extern "C" fn toplevel_set_minimized(
     }
 }
 
+unsafe extern "C" fn toplevel_set_popup(
+    _client: *mut ffi::wl_client,
+    resource: *mut ffi::wl_resource,
+) {
+    let data = ffi::wl_resource_get_user_data(resource) as *mut CceToplevelData;
+    if data.is_null() {
+        return;
+    }
+    let server = (*data).server;
+    let window_key = (*data).window_key;
+    if let Some(window) = resolve_window(server, window_key) {
+        (*window).tiling_mode = crate::tiling::TilingMode::Popup;
+        (*window).mode_locked = true;
+        (*server).wm.dirty_windowing();
+    }
+}
+
+unsafe extern "C" fn toplevel_unset_popup(
+    _client: *mut ffi::wl_client,
+    resource: *mut ffi::wl_resource,
+) {
+    let data = ffi::wl_resource_get_user_data(resource) as *mut CceToplevelData;
+    if data.is_null() {
+        return;
+    }
+    let server = (*data).server;
+    let window_key = (*data).window_key;
+    if let Some(window) = resolve_window(server, window_key) {
+        (*window).mode_locked = false;
+        (*server).wm.dirty_windowing();
+    }
+}
+
 static CCE_TOPLEVEL_INTERFACE: ffi::zcce_toplevel_v1_interface = ffi::zcce_toplevel_v1_interface {
     destroy: Some(toplevel_destroy),
     set_floating: Some(toplevel_set_floating),
@@ -236,6 +269,8 @@ static CCE_TOPLEVEL_INTERFACE: ffi::zcce_toplevel_v1_interface = ffi::zcce_tople
     set_fullscreen: Some(toplevel_set_fullscreen),
     unset_fullscreen: Some(toplevel_unset_fullscreen),
     set_minimized: Some(toplevel_set_minimized),
+    set_popup: Some(toplevel_set_popup),
+    unset_popup: Some(toplevel_unset_popup),
 };
 
 unsafe fn resolve_window(server: *mut Server, key: SlotMapKey) -> Option<*mut Window> {