Skip to content

Commit bc8eded

Browse files
committed
client-toolkit/toplevel-info: Make version 2 of protocol a requirement
This makes `foreign_toplevel` in `ToplevelInfo` no longer an `Option`. Cosmic-comp has supported version 2 of this protocol for a while, so supporting version 1 is no longer necessary.
1 parent 29ab323 commit bc8eded

File tree

1 file changed

+46
-55
lines changed

1 file changed

+46
-55
lines changed

client-toolkit/src/toplevel_info.rs

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use cosmic_protocols::{
55
workspace::v1::client::zcosmic_workspace_handle_v1,
66
};
77
use sctk::registry::RegistryState;
8-
use wayland_client::{protocol::wl_output, Connection, Dispatch, Proxy, QueueHandle};
8+
use wayland_client::{protocol::wl_output, Connection, Dispatch, QueueHandle};
99
use wayland_protocols::ext::foreign_toplevel_list::v1::client::{
1010
ext_foreign_toplevel_handle_v1, ext_foreign_toplevel_list_v1,
1111
};
@@ -20,30 +20,48 @@ pub struct ToplevelGeometry {
2020
pub height: i32,
2121
}
2222

23-
#[derive(Clone, Debug, Default)]
23+
#[derive(Clone, Debug)]
2424
pub struct ToplevelInfo {
2525
pub title: String,
2626
pub app_id: String,
27-
/// Requires zcosmic_toplevel_info_v1 version 2
2827
pub identifier: Option<String>,
2928
pub state: HashSet<zcosmic_toplevel_handle_v1::State>,
3029
pub output: HashSet<wl_output::WlOutput>,
31-
/// Requires zcosmic_toplevel_info_v1 version 2
3230
pub geometry: HashMap<wl_output::WlOutput, ToplevelGeometry>,
3331
pub workspace: HashSet<zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1>,
34-
/// Requires zcosmic_toplevel_info_v1 version 2
35-
pub foreign_toplevel: Option<ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1>,
32+
pub foreign_toplevel: ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1,
3633
}
3734

38-
#[derive(Debug, Default)]
35+
#[derive(Debug)]
3936
struct ToplevelData {
4037
current_info: Option<ToplevelInfo>,
4138
pending_info: ToplevelInfo,
4239
has_cosmic_info: bool,
4340
}
4441

42+
impl ToplevelData {
43+
fn new(foreign_toplevel: ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1) -> Self {
44+
let pending_info = ToplevelInfo {
45+
title: String::new(),
46+
app_id: String::new(),
47+
identifier: None,
48+
state: HashSet::new(),
49+
output: HashSet::new(),
50+
geometry: HashMap::new(),
51+
workspace: HashSet::new(),
52+
foreign_toplevel,
53+
};
54+
Self {
55+
current_info: None,
56+
pending_info,
57+
has_cosmic_info: false,
58+
}
59+
}
60+
}
61+
4562
#[derive(Debug)]
4663
pub struct ToplevelInfoState {
64+
pub foreign_toplevel_list: ext_foreign_toplevel_list_v1::ExtForeignToplevelListV1,
4765
pub cosmic_toplevel_info: zcosmic_toplevel_info_v1::ZcosmicToplevelInfoV1,
4866
toplevels: Vec<(
4967
zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
@@ -58,24 +76,23 @@ impl ToplevelInfoState {
5876
+ Dispatch<ext_foreign_toplevel_list_v1::ExtForeignToplevelListV1, GlobalData>
5977
+ 'static,
6078
{
79+
let foreign_toplevel_list = registry
80+
.bind_one::<ext_foreign_toplevel_list_v1::ExtForeignToplevelListV1, _, _>(
81+
qh,
82+
1..=1,
83+
GlobalData,
84+
)
85+
.ok()?;
6186
let cosmic_toplevel_info = registry
6287
.bind_one::<zcosmic_toplevel_info_v1::ZcosmicToplevelInfoV1, _, _>(
6388
qh,
64-
1..=2,
89+
2..=2,
6590
GlobalData,
6691
)
6792
.ok()?;
68-
if cosmic_toplevel_info.version() >= 2 {
69-
let _ = registry
70-
.bind_one::<ext_foreign_toplevel_list_v1::ExtForeignToplevelListV1, _, _>(
71-
qh,
72-
1..=1,
73-
GlobalData,
74-
)
75-
.ok()?;
76-
}
7793

7894
Some(Self {
95+
foreign_toplevel_list,
7996
cosmic_toplevel_info,
8097
toplevels: Vec::new(),
8198
})
@@ -140,7 +157,6 @@ pub trait ToplevelInfoHandler: Sized {
140157
toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
141158
);
142159

143-
/// Only sent for zcosmic_toplevel_info_v1 version 2
144160
fn info_done(&mut self, _conn: &Connection, _qh: &QueueHandle<Self>) {}
145161

146162
fn finished(&mut self, _conn: &Connection, _qh: &QueueHandle<Self>) {}
@@ -163,18 +179,12 @@ where
163179
qh: &QueueHandle<D>,
164180
) {
165181
match event {
166-
zcosmic_toplevel_info_v1::Event::Toplevel { toplevel } => {
167-
state
168-
.toplevel_info_state()
169-
.toplevels
170-
.push((toplevel, ToplevelData::default()));
171-
}
172182
zcosmic_toplevel_info_v1::Event::Done => {
173183
state.info_done(conn, qh);
174184
}
175-
zcosmic_toplevel_info_v1::Event::Finished => {
176-
state.finished(conn, qh);
177-
}
185+
// Not used in protocol version 2
186+
zcosmic_toplevel_info_v1::Event::Toplevel { .. }
187+
| zcosmic_toplevel_info_v1::Event::Finished => {}
178188
_ => unreachable!(),
179189
}
180190
}
@@ -196,8 +206,8 @@ where
196206
toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
197207
event: zcosmic_toplevel_handle_v1::Event,
198208
_: &GlobalData,
199-
conn: &Connection,
200-
qh: &QueueHandle<D>,
209+
_conn: &Connection,
210+
_qh: &QueueHandle<D>,
201211
) {
202212
let data = &mut state
203213
.toplevel_info_state()
@@ -207,12 +217,6 @@ where
207217
.expect("Received event for dead toplevel")
208218
.1;
209219
match event {
210-
zcosmic_toplevel_handle_v1::Event::AppId { app_id } => {
211-
data.pending_info.app_id = app_id;
212-
}
213-
zcosmic_toplevel_handle_v1::Event::Title { title } => {
214-
data.pending_info.title = title;
215-
}
216220
zcosmic_toplevel_handle_v1::Event::OutputEnter { output } => {
217221
data.pending_info.output.insert(output);
218222
}
@@ -254,23 +258,11 @@ where
254258
},
255259
);
256260
}
257-
zcosmic_toplevel_handle_v1::Event::Done => {
258-
let is_new = data.current_info.is_none();
259-
data.current_info = Some(data.pending_info.clone());
260-
if is_new {
261-
state.new_toplevel(conn, qh, toplevel);
262-
} else {
263-
state.update_toplevel(conn, qh, toplevel);
264-
}
265-
}
266-
zcosmic_toplevel_handle_v1::Event::Closed => {
267-
state.toplevel_closed(conn, qh, toplevel);
268-
269-
let toplevels = &mut state.toplevel_info_state().toplevels;
270-
if let Some(idx) = toplevels.iter().position(|(handle, _)| handle == toplevel) {
271-
toplevels.remove(idx);
272-
}
273-
}
261+
// Not used in protocol version 2
262+
zcosmic_toplevel_handle_v1::Event::AppId { .. }
263+
| zcosmic_toplevel_handle_v1::Event::Title { .. }
264+
| zcosmic_toplevel_handle_v1::Event::Done { .. }
265+
| zcosmic_toplevel_handle_v1::Event::Closed { .. } => {}
274266
_ => unreachable!(),
275267
}
276268
}
@@ -299,8 +291,7 @@ where
299291
let cosmic_toplevel = info_state
300292
.cosmic_toplevel_info
301293
.get_cosmic_toplevel(&toplevel, qh, GlobalData);
302-
let mut toplevel_data = ToplevelData::default();
303-
toplevel_data.pending_info.foreign_toplevel = Some(toplevel);
294+
let toplevel_data = ToplevelData::new(toplevel);
304295
info_state.toplevels.push((cosmic_toplevel, toplevel_data));
305296
}
306297
ext_foreign_toplevel_list_v1::Event::Finished => {
@@ -334,7 +325,7 @@ where
334325
.toplevel_info_state()
335326
.toplevels
336327
.iter_mut()
337-
.find(|(_, data)| data.pending_info.foreign_toplevel.as_ref() == Some(handle))
328+
.find(|(_, data)| data.pending_info.foreign_toplevel == *handle)
338329
.expect("Received event for dead toplevel");
339330
match event {
340331
ext_foreign_toplevel_handle_v1::Event::Closed => {

0 commit comments

Comments
 (0)