@@ -42,8 +42,14 @@ pub enum PointerFocusTarget {
4242 surface : WlSurface ,
4343 toplevel : Option < PointerFocusToplevel > ,
4444 } ,
45- StackUI ( CosmicStack ) ,
46- WindowUI ( CosmicWindow ) ,
45+ StackUI {
46+ stack : CosmicStack ,
47+ is_border : bool ,
48+ } ,
49+ WindowUI {
50+ window : CosmicWindow ,
51+ is_border : bool ,
52+ } ,
4753 ResizeFork ( ResizeForkTarget ) ,
4854 ZoomUI ( ZoomFocusTarget ) ,
4955}
@@ -114,8 +120,8 @@ impl PointerFocusTarget {
114120 fn inner_pointer_target ( & self ) -> & dyn PointerTarget < State > {
115121 match self {
116122 PointerFocusTarget :: WlSurface { surface, .. } => surface,
117- PointerFocusTarget :: StackUI ( u ) => u ,
118- PointerFocusTarget :: WindowUI ( u ) => u ,
123+ PointerFocusTarget :: StackUI { stack , .. } => stack ,
124+ PointerFocusTarget :: WindowUI { window , .. } => window ,
119125 PointerFocusTarget :: ResizeFork ( f) => f,
120126 PointerFocusTarget :: ZoomUI ( e) => e,
121127 }
@@ -124,8 +130,8 @@ impl PointerFocusTarget {
124130 fn inner_touch_target ( & self ) -> & dyn TouchTarget < State > {
125131 match self {
126132 PointerFocusTarget :: WlSurface { surface, .. } => surface,
127- PointerFocusTarget :: StackUI ( u ) => u ,
128- PointerFocusTarget :: WindowUI ( u ) => u ,
133+ PointerFocusTarget :: StackUI { stack , .. } => stack ,
134+ PointerFocusTarget :: WindowUI { window , .. } => window ,
129135 PointerFocusTarget :: ResizeFork ( f) => f,
130136 PointerFocusTarget :: ZoomUI ( e) => e,
131137 }
@@ -174,8 +180,8 @@ impl PointerFocusTarget {
174180 . find ( |( w, _) | w. wl_surface ( ) . map ( |s2| s == * s2) . unwrap_or ( false ) )
175181 . map ( |( s, _) | s)
176182 } ) ,
177- PointerFocusTarget :: StackUI ( stack) => Some ( stack. active ( ) ) ,
178- PointerFocusTarget :: WindowUI ( window) => Some ( window. surface ( ) ) ,
183+ PointerFocusTarget :: StackUI { stack, .. } => Some ( stack. active ( ) ) ,
184+ PointerFocusTarget :: WindowUI { window, .. } => Some ( window. surface ( ) ) ,
179185 _ => None ,
180186 }
181187 }
@@ -188,6 +194,24 @@ impl PointerFocusTarget {
188194 _ => false ,
189195 }
190196 }
197+
198+ pub fn should_follow_focus ( & self , relative_pos : Point < f64 , Logical > ) -> bool {
199+ match self {
200+ PointerFocusTarget :: WlSurface { toplevel, .. } => {
201+ toplevel. as_ref ( ) . is_none_or ( |toplevel| match toplevel {
202+ PointerFocusToplevel :: Popup ( popup) => {
203+ popup. geometry ( ) . contains ( relative_pos. to_i32_round ( ) )
204+ }
205+ PointerFocusToplevel :: Surface ( surface) => {
206+ surface. 0 . geometry ( ) . contains ( relative_pos. to_i32_round ( ) )
207+ }
208+ } )
209+ }
210+ PointerFocusTarget :: StackUI { is_border, .. }
211+ | PointerFocusTarget :: WindowUI { is_border, .. } => !* is_border,
212+ PointerFocusTarget :: ResizeFork ( _) | PointerFocusTarget :: ZoomUI ( _) => false ,
213+ }
214+ }
191215}
192216
193217impl KeyboardFocusTarget {
@@ -259,8 +283,8 @@ impl IsAlive for PointerFocusTarget {
259283 match self {
260284 // XXX? does this change anything
261285 PointerFocusTarget :: WlSurface { surface, .. } => surface. alive ( ) ,
262- PointerFocusTarget :: StackUI ( e ) => e . alive ( ) ,
263- PointerFocusTarget :: WindowUI ( e ) => e . alive ( ) ,
286+ PointerFocusTarget :: StackUI { stack , .. } => stack . alive ( ) ,
287+ PointerFocusTarget :: WindowUI { window , .. } => window . alive ( ) ,
264288 PointerFocusTarget :: ResizeFork ( f) => f. alive ( ) ,
265289 PointerFocusTarget :: ZoomUI ( _) => true ,
266290 }
@@ -547,8 +571,8 @@ impl WaylandFocus for PointerFocusTarget {
547571 Some ( match self {
548572 PointerFocusTarget :: WlSurface { surface, .. } => Cow :: Borrowed ( surface) ,
549573 PointerFocusTarget :: ResizeFork ( _)
550- | PointerFocusTarget :: StackUI ( _ )
551- | PointerFocusTarget :: WindowUI ( _ )
574+ | PointerFocusTarget :: StackUI { .. }
575+ | PointerFocusTarget :: WindowUI { .. }
552576 | PointerFocusTarget :: ZoomUI ( _) => {
553577 return None ;
554578 }
@@ -557,12 +581,12 @@ impl WaylandFocus for PointerFocusTarget {
557581 fn same_client_as ( & self , object_id : & ObjectId ) -> bool {
558582 match self {
559583 PointerFocusTarget :: WlSurface { surface, .. } => surface. id ( ) . same_client_as ( object_id) ,
560- PointerFocusTarget :: StackUI ( stack) => stack
584+ PointerFocusTarget :: StackUI { stack, .. } => stack
561585 . active ( )
562586 . wl_surface ( )
563587 . map ( |s| s. id ( ) . same_client_as ( object_id) )
564588 . unwrap_or ( false ) ,
565- PointerFocusTarget :: WindowUI ( window) => window
589+ PointerFocusTarget :: WindowUI { window, .. } => window
566590 . wl_surface ( )
567591 . map ( |s| s. id ( ) . same_client_as ( object_id) )
568592 . unwrap_or ( false ) ,
0 commit comments