@@ -20,10 +20,17 @@ use smithay::{
20
20
use std:: { collections:: HashSet , sync:: Mutex } ;
21
21
22
22
use super :: {
23
- Request , Workspace , WorkspaceCapabilities , WorkspaceClientHandler , WorkspaceGlobalData ,
24
- WorkspaceGroup , WorkspaceGroupHandle , WorkspaceHandler , WorkspaceState ,
23
+ Request , Workspace , WorkspaceCapabilities , WorkspaceGlobalData , WorkspaceGroup ,
24
+ WorkspaceGroupHandle , WorkspaceHandler , WorkspaceState ,
25
25
} ;
26
26
27
+ #[ derive( Debug , Default ) ]
28
+ pub struct WorkspaceManagerDataInner {
29
+ pub ( super ) requests : Vec < Request > ,
30
+ }
31
+
32
+ pub type WorkspaceManagerData = Mutex < WorkspaceManagerDataInner > ;
33
+
27
34
#[ derive( Default ) ]
28
35
pub struct WorkspaceGroupDataInner {
29
36
outputs : Vec < Output > ,
64
71
data_init : & mut DataInit < ' _ , D > ,
65
72
) {
66
73
let state = state. workspace_state_mut ( ) ;
67
- let instance = data_init. init ( resource, ( ) ) ;
74
+ let instance = data_init. init ( resource, WorkspaceManagerData :: default ( ) ) ;
68
75
for group in & mut state. groups {
69
76
send_group_to_client :: < D > ( dh, & instance, group) ;
70
77
}
@@ -77,29 +84,24 @@ where
77
84
}
78
85
}
79
86
80
- impl < D > Dispatch < ExtWorkspaceManagerV1 , ( ) , D > for WorkspaceState < D >
87
+ impl < D > Dispatch < ExtWorkspaceManagerV1 , WorkspaceManagerData , D > for WorkspaceState < D >
81
88
where
82
89
D : WorkspaceHandler ,
83
90
{
84
91
fn request (
85
92
state : & mut D ,
86
- client : & Client ,
93
+ _client : & Client ,
87
94
obj : & ExtWorkspaceManagerV1 ,
88
95
request : ext_workspace_manager_v1:: Request ,
89
- _data : & ( ) ,
96
+ data : & WorkspaceManagerData ,
90
97
dh : & DisplayHandle ,
91
98
_data_init : & mut DataInit < ' _ , D > ,
92
99
) {
93
100
match request {
94
101
ext_workspace_manager_v1:: Request :: Commit => {
95
102
if state. workspace_state ( ) . ext_instances . contains ( obj) {
96
- let mut client_state = client
97
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
98
- . unwrap ( )
99
- . workspace_state ( )
100
- . lock ( )
101
- . unwrap ( ) ;
102
- state. commit_requests ( dh, std:: mem:: take ( & mut client_state. requests ) ) ;
103
+ let mut data = data. lock ( ) . unwrap ( ) ;
104
+ state. commit_requests ( dh, std:: mem:: take ( & mut data. requests ) ) ;
103
105
}
104
106
}
105
107
ext_workspace_manager_v1:: Request :: Stop => {
@@ -114,7 +116,12 @@ where
114
116
}
115
117
}
116
118
117
- fn destroyed ( state : & mut D , _client : ClientId , resource : & ExtWorkspaceManagerV1 , _data : & ( ) ) {
119
+ fn destroyed (
120
+ state : & mut D ,
121
+ _client : ClientId ,
122
+ resource : & ExtWorkspaceManagerV1 ,
123
+ _data : & WorkspaceManagerData ,
124
+ ) {
118
125
state
119
126
. workspace_state_mut ( )
120
127
. ext_instances
@@ -128,10 +135,10 @@ where
128
135
{
129
136
fn request (
130
137
state : & mut D ,
131
- client : & Client ,
138
+ _client : & Client ,
132
139
obj : & ExtWorkspaceGroupHandleV1 ,
133
140
request : ext_workspace_group_handle_v1:: Request ,
134
- _data : & WorkspaceGroupData ,
141
+ data : & WorkspaceGroupData ,
135
142
_dh : & DisplayHandle ,
136
143
_data_init : & mut DataInit < ' _ , D > ,
137
144
) {
@@ -144,16 +151,17 @@ where
144
151
. find ( |g| g. ext_instances . contains ( obj) )
145
152
. map ( |g| g. id )
146
153
{
147
- let mut state = client
148
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
149
- . unwrap ( )
150
- . workspace_state ( )
151
- . lock ( )
152
- . unwrap ( ) ;
153
- state. requests . push ( Request :: Create {
154
- in_group : WorkspaceGroupHandle { id } ,
155
- name : workspace,
156
- } ) ;
154
+ if let Ok ( manager) = data. manager . upgrade ( ) {
155
+ let mut state = manager
156
+ . data :: < WorkspaceManagerData > ( )
157
+ . unwrap ( )
158
+ . lock ( )
159
+ . unwrap ( ) ;
160
+ state. requests . push ( Request :: Create {
161
+ in_group : WorkspaceGroupHandle { id } ,
162
+ name : workspace,
163
+ } ) ;
164
+ }
157
165
}
158
166
}
159
167
ext_workspace_group_handle_v1:: Request :: Destroy => {
@@ -183,10 +191,10 @@ where
183
191
{
184
192
fn request (
185
193
state : & mut D ,
186
- client : & Client ,
194
+ _client : & Client ,
187
195
obj : & ExtWorkspaceHandleV1 ,
188
196
request : ext_workspace_handle_v1:: Request ,
189
- _data : & WorkspaceData ,
197
+ data : & WorkspaceData ,
190
198
_dh : & DisplayHandle ,
191
199
_data_init : & mut DataInit < ' _ , D > ,
192
200
) {
@@ -195,39 +203,42 @@ where
195
203
if let Some ( workspace_handle) =
196
204
state. workspace_state ( ) . get_ext_workspace_handle ( obj)
197
205
{
198
- let mut state = client
199
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
200
- . unwrap ( )
201
- . workspace_state ( )
202
- . lock ( )
203
- . unwrap ( ) ;
204
- state. requests . push ( Request :: Activate ( workspace_handle) ) ;
206
+ if let Ok ( manager) = data. manager . upgrade ( ) {
207
+ let mut state = manager
208
+ . data :: < WorkspaceManagerData > ( )
209
+ . unwrap ( )
210
+ . lock ( )
211
+ . unwrap ( ) ;
212
+ state. requests . push ( Request :: Activate ( workspace_handle) ) ;
213
+ }
205
214
}
206
215
}
207
216
ext_workspace_handle_v1:: Request :: Deactivate => {
208
217
if let Some ( workspace_handle) =
209
218
state. workspace_state ( ) . get_ext_workspace_handle ( obj)
210
219
{
211
- let mut state = client
212
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
213
- . unwrap ( )
214
- . workspace_state ( )
215
- . lock ( )
216
- . unwrap ( ) ;
217
- state. requests . push ( Request :: Deactivate ( workspace_handle) ) ;
220
+ if let Ok ( manager) = data. manager . upgrade ( ) {
221
+ let mut state = manager
222
+ . data :: < WorkspaceManagerData > ( )
223
+ . unwrap ( )
224
+ . lock ( )
225
+ . unwrap ( ) ;
226
+ state. requests . push ( Request :: Deactivate ( workspace_handle) ) ;
227
+ }
218
228
}
219
229
}
220
230
ext_workspace_handle_v1:: Request :: Remove => {
221
231
if let Some ( workspace_handle) =
222
232
state. workspace_state ( ) . get_ext_workspace_handle ( obj)
223
233
{
224
- let mut state = client
225
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
226
- . unwrap ( )
227
- . workspace_state ( )
228
- . lock ( )
229
- . unwrap ( ) ;
230
- state. requests . push ( Request :: Remove ( workspace_handle) ) ;
234
+ if let Ok ( manager) = data. manager . upgrade ( ) {
235
+ let mut state = manager
236
+ . data :: < WorkspaceManagerData > ( )
237
+ . unwrap ( )
238
+ . lock ( )
239
+ . unwrap ( ) ;
240
+ state. requests . push ( Request :: Remove ( workspace_handle) ) ;
241
+ }
231
242
}
232
243
}
233
244
ext_workspace_handle_v1:: Request :: Assign { workspace_group } => {
@@ -241,16 +252,17 @@ where
241
252
. find ( |g| g. ext_instances . contains ( & workspace_group) )
242
253
. map ( |g| g. id )
243
254
{
244
- let mut state = client
245
- . get_data :: < <D as WorkspaceHandler >:: Client > ( )
246
- . unwrap ( )
247
- . workspace_state ( )
248
- . lock ( )
249
- . unwrap ( ) ;
250
- state. requests . push ( Request :: Assign {
251
- workspace : workspace_handle,
252
- group : WorkspaceGroupHandle { id : group_id } ,
253
- } ) ;
255
+ if let Ok ( manager) = data. manager . upgrade ( ) {
256
+ let mut state = manager
257
+ . data :: < WorkspaceManagerData > ( )
258
+ . unwrap ( )
259
+ . lock ( )
260
+ . unwrap ( ) ;
261
+ state. requests . push ( Request :: Assign {
262
+ workspace : workspace_handle,
263
+ group : WorkspaceGroupHandle { id : group_id } ,
264
+ } ) ;
265
+ }
254
266
}
255
267
}
256
268
}
0 commit comments