@@ -5,7 +5,7 @@ use cosmic_protocols::{
5
5
workspace:: v1:: client:: zcosmic_workspace_handle_v1,
6
6
} ;
7
7
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 } ;
9
9
use wayland_protocols:: ext:: foreign_toplevel_list:: v1:: client:: {
10
10
ext_foreign_toplevel_handle_v1, ext_foreign_toplevel_list_v1,
11
11
} ;
@@ -20,30 +20,48 @@ pub struct ToplevelGeometry {
20
20
pub height : i32 ,
21
21
}
22
22
23
- #[ derive( Clone , Debug , Default ) ]
23
+ #[ derive( Clone , Debug ) ]
24
24
pub struct ToplevelInfo {
25
25
pub title : String ,
26
26
pub app_id : String ,
27
- /// Requires zcosmic_toplevel_info_v1 version 2
28
27
pub identifier : Option < String > ,
29
28
pub state : HashSet < zcosmic_toplevel_handle_v1:: State > ,
30
29
pub output : HashSet < wl_output:: WlOutput > ,
31
- /// Requires zcosmic_toplevel_info_v1 version 2
32
30
pub geometry : HashMap < wl_output:: WlOutput , ToplevelGeometry > ,
33
31
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 ,
36
33
}
37
34
38
- #[ derive( Debug , Default ) ]
35
+ #[ derive( Debug ) ]
39
36
struct ToplevelData {
40
37
current_info : Option < ToplevelInfo > ,
41
38
pending_info : ToplevelInfo ,
42
39
has_cosmic_info : bool ,
43
40
}
44
41
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
+
45
62
#[ derive( Debug ) ]
46
63
pub struct ToplevelInfoState {
64
+ pub foreign_toplevel_list : ext_foreign_toplevel_list_v1:: ExtForeignToplevelListV1 ,
47
65
pub cosmic_toplevel_info : zcosmic_toplevel_info_v1:: ZcosmicToplevelInfoV1 ,
48
66
toplevels : Vec < (
49
67
zcosmic_toplevel_handle_v1:: ZcosmicToplevelHandleV1 ,
@@ -58,24 +76,23 @@ impl ToplevelInfoState {
58
76
+ Dispatch < ext_foreign_toplevel_list_v1:: ExtForeignToplevelListV1 , GlobalData >
59
77
+ ' static ,
60
78
{
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 ( ) ?;
61
86
let cosmic_toplevel_info = registry
62
87
. bind_one :: < zcosmic_toplevel_info_v1:: ZcosmicToplevelInfoV1 , _ , _ > (
63
88
qh,
64
- 1 ..=2 ,
89
+ 2 ..=2 ,
65
90
GlobalData ,
66
91
)
67
92
. 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
- }
77
93
78
94
Some ( Self {
95
+ foreign_toplevel_list,
79
96
cosmic_toplevel_info,
80
97
toplevels : Vec :: new ( ) ,
81
98
} )
@@ -140,7 +157,6 @@ pub trait ToplevelInfoHandler: Sized {
140
157
toplevel : & zcosmic_toplevel_handle_v1:: ZcosmicToplevelHandleV1 ,
141
158
) ;
142
159
143
- /// Only sent for zcosmic_toplevel_info_v1 version 2
144
160
fn info_done ( & mut self , _conn : & Connection , _qh : & QueueHandle < Self > ) { }
145
161
146
162
fn finished ( & mut self , _conn : & Connection , _qh : & QueueHandle < Self > ) { }
@@ -163,18 +179,12 @@ where
163
179
qh : & QueueHandle < D > ,
164
180
) {
165
181
match event {
166
- zcosmic_toplevel_info_v1:: Event :: Toplevel { toplevel } => {
167
- state
168
- . toplevel_info_state ( )
169
- . toplevels
170
- . push ( ( toplevel, ToplevelData :: default ( ) ) ) ;
171
- }
172
182
zcosmic_toplevel_info_v1:: Event :: Done => {
173
183
state. info_done ( conn, qh) ;
174
184
}
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 => { }
178
188
_ => unreachable ! ( ) ,
179
189
}
180
190
}
@@ -196,8 +206,8 @@ where
196
206
toplevel : & zcosmic_toplevel_handle_v1:: ZcosmicToplevelHandleV1 ,
197
207
event : zcosmic_toplevel_handle_v1:: Event ,
198
208
_: & GlobalData ,
199
- conn : & Connection ,
200
- qh : & QueueHandle < D > ,
209
+ _conn : & Connection ,
210
+ _qh : & QueueHandle < D > ,
201
211
) {
202
212
let data = & mut state
203
213
. toplevel_info_state ( )
@@ -207,12 +217,6 @@ where
207
217
. expect ( "Received event for dead toplevel" )
208
218
. 1 ;
209
219
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
- }
216
220
zcosmic_toplevel_handle_v1:: Event :: OutputEnter { output } => {
217
221
data. pending_info . output . insert ( output) ;
218
222
}
@@ -254,23 +258,11 @@ where
254
258
} ,
255
259
) ;
256
260
}
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 { .. } => { }
274
266
_ => unreachable ! ( ) ,
275
267
}
276
268
}
@@ -299,8 +291,7 @@ where
299
291
let cosmic_toplevel = info_state
300
292
. cosmic_toplevel_info
301
293
. 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) ;
304
295
info_state. toplevels . push ( ( cosmic_toplevel, toplevel_data) ) ;
305
296
}
306
297
ext_foreign_toplevel_list_v1:: Event :: Finished => {
@@ -334,7 +325,7 @@ where
334
325
. toplevel_info_state ( )
335
326
. toplevels
336
327
. iter_mut ( )
337
- . find ( |( _, data) | data. pending_info . foreign_toplevel . as_ref ( ) == Some ( handle) )
328
+ . find ( |( _, data) | data. pending_info . foreign_toplevel == * handle)
338
329
. expect ( "Received event for dead toplevel" ) ;
339
330
match event {
340
331
ext_foreign_toplevel_handle_v1:: Event :: Closed => {
0 commit comments