Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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> {