Skip to content

Commit a5e635d

Browse files
committed
WIP update dialog
1 parent c8f5c72 commit a5e635d

4 files changed

Lines changed: 20 additions & 31 deletions

File tree

src/shell/xdg/dialog.rs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ use crate::shell::xdg::window::inner::{
55
determine_decoration_mode, determine_window_state, determine_wm_capabilities, WindowInner,
66
};
77
use crate::shell::xdg::window::WindowConfigure;
8+
use crate::shell::xdg::window::ToplevelDecorationData;
89
use crate::shell::xdg::Dispatch2;
910
use crate::shell::xdg::WindowDecorations;
11+
use crate::shell::xdg::WindowHandler;
1012
use crate::shell::WaylandSurface;
1113
use crate::{
12-
compositor::{Surface, SurfaceData},
14+
compositor::{CompositorHandler, Surface, SurfaceData},
1315
globals::ProvidesBoundGlobal,
16+
output::OutputHandler,
1417
};
1518
use crate::{error::GlobalError, shell::xdg::XdgShellSurface};
1619
use std::num::NonZeroU32;
@@ -77,12 +80,7 @@ impl Dialog {
7780
decorations: WindowDecorations,
7881
) -> Result<Self, GlobalError>
7982
where
80-
D: Dispatch<wl_surface::WlSurface, SurfaceData<()>>
81-
+ Dispatch<xdg_surface::XdgSurface, DialogData>
82-
+ Dispatch<xdg_dialog_v1::XdgDialogV1, DialogData>
83-
+ Dispatch<xdg_toplevel::XdgToplevel, DialogData>
84-
+ Dispatch<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, DialogData>
85-
+ 'static,
83+
D: CompositorHandler + DialogHandler + OutputHandler + WindowHandler + 'static,
8684
GLOBAL: ProvidesBoundGlobal<xdg_wm_dialog_v1::XdgWmDialogV1, 1>
8785
+ ProvidesBoundGlobal<xdg_wm_base::XdgWmBase, 5>,
8886
{
@@ -101,11 +99,7 @@ impl Dialog {
10199
decorations: WindowDecorations,
102100
) -> Result<Self, GlobalError>
103101
where
104-
D: Dispatch<xdg_surface::XdgSurface, DialogData>
105-
+ Dispatch<xdg_dialog_v1::XdgDialogV1, DialogData>
106-
+ Dispatch<xdg_toplevel::XdgToplevel, DialogData>
107-
+ Dispatch<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, DialogData>
108-
+ 'static,
102+
D: DialogHandler + WindowHandler + 'static,
109103
GLOBAL: ProvidesBoundGlobal<xdg_wm_dialog_v1::XdgWmDialogV1, 1>
110104
+ ProvidesBoundGlobal<xdg_wm_base::XdgWmBase, 5>,
111105
{
@@ -159,7 +153,7 @@ impl Dialog {
159153
pub fn from_toplevel_decoration(
160154
decoration: &zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1,
161155
) -> Option<Dialog> {
162-
decoration.data::<DialogData>().and_then(|data| data.dialog())
156+
decoration.data::<ToplevelDecorationData<DialogData>>().and_then(|data| data.0.dialog())
163157
}
164158

165159
pub fn xdg_dialog(&self) -> &XdgDialogV1 {
@@ -315,18 +309,14 @@ where
315309
) {
316310
if let Some(dialog) = Dialog::from_toplevel_decoration(decoration) {
317311
match event {
318-
zxdg_toplevel_decoration_v1::Event::Configure { mode } => match mode {
319-
wayland_client::WEnum::Value(mode) => {
312+
zxdg_toplevel_decoration_v1::Event::Configure { mode } =>
313+
if mode.available_since().is_some_and(|v| v <= decoration.version()) {
320314
let mode = determine_decoration_mode(mode);
321315
dialog.inner.window.pending_configure.lock().unwrap().decoration_mode =
322316
mode;
323-
}
324-
325-
wayland_client::WEnum::Unknown(unknown) => {
326-
log::error!(target: "sctk", "unknown decoration mode 0x{:x}", unknown);
327-
}
328-
},
329-
317+
} else {
318+
log::error!(target: "sctk", "unknown decoration mode 0x{:?}", mode);
319+
},
330320
_ => unreachable!(),
331321
}
332322
}

src/shell/xdg/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::error::GlobalError;
2525
use crate::globals::{GlobalData, ProvidesBoundGlobal};
2626
use crate::registry::GlobalProxy;
2727
use crate::shell::xdg::dialog::{Dialog, DialogData, DialogHandler};
28+
use crate::shell::xdg::window::ToplevelDecorationData;
2829

2930
use self::window::inner::WindowInner;
3031
use self::window::{Window, WindowData, WindowDecorations, WindowHandler};
@@ -78,7 +79,7 @@ impl XdgShell {
7879
) -> Option<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1>
7980
where
8081
D: Send + Sync + 'static,
81-
State: Dispatch<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, D> + 'static,
82+
State: WindowHandler + 'static,
8283
{
8384
// If server side decorations are available, create the toplevel decoration.
8485
decoration_manager.and_then(|decoration_manager| {
@@ -89,7 +90,7 @@ impl XdgShell {
8990
_ => {
9091
// Create the toplevel decoration.
9192
let toplevel_decoration =
92-
decoration_manager.get_toplevel_decoration(xdg_toplevel, qh, data);
93+
decoration_manager.get_toplevel_decoration(xdg_toplevel, qh, ToplevelDecorationData(data));
9394

9495
// Tell the compositor we would like a specific mode.
9596
let mode = match decorations {
@@ -178,11 +179,7 @@ impl XdgShell {
178179
parent: &xdg_toplevel::XdgToplevel,
179180
) -> Result<Dialog, GlobalError>
180181
where
181-
State: Dispatch<xdg_surface::XdgSurface, DialogData>
182-
+ Dispatch<xdg_toplevel::XdgToplevel, DialogData>
183-
+ Dispatch<xdg_dialog_v1::XdgDialogV1, DialogData>
184-
+ Dispatch<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, DialogData>
185-
+ DialogHandler
182+
State: WindowHandler + DialogHandler
186183
+ 'static,
187184
{
188185
let decoration_manager = self.xdg_decoration_manager.get().ok();

src/shell/xdg/window/inner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::{
2424
};
2525

2626
use super::{
27-
DecorationMode, Window, WindowConfigure, WindowData, WindowHandler, WindowManagerCapabilities,
27+
DecorationMode, ToplevelDecorationData, Window, WindowConfigure, WindowData, WindowHandler, WindowManagerCapabilities,
2828
WindowState,
2929
};
3030

@@ -205,7 +205,7 @@ where
205205
}
206206
}
207207

208-
impl<D> Dispatch2<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, D> for WindowData
208+
impl<D, U> Dispatch2<zxdg_toplevel_decoration_v1::ZxdgToplevelDecorationV1, D> for ToplevelDecorationData<U>
209209
where
210210
D: WindowHandler,
211211
{

src/shell/xdg/window/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,5 @@ impl PartialEq for Window {
321321

322322
#[derive(Debug, Clone)]
323323
pub struct WindowData(pub(crate) Weak<WindowInner>);
324+
325+
pub struct ToplevelDecorationData<U>(pub U);

0 commit comments

Comments
 (0)