@ -429,13 +429,31 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
}
}
// Handle changing focus when clicking on a container
if ( cont & & state = = WLR_BUTTON_PRESSED ) {
// Default case: focus the container that was just clicked.
node = & cont - > node ;
// If the container is a tab/stacked container and the click happened
// on a tab, switch to the tab. If the tab contents were already
// focused, focus the tab container itself. If the tab container was
// already focused, cycle back to focusing the tab contents.
if ( on_titlebar ) {
struct sway_container * focus = seat_get_focused_container ( seat ) ;
if ( focus = = cont | | ! container_has_ancestor ( focus , cont ) ) {
node = seat_get_focus_inactive ( seat , & cont - > node ) ;
}
}
seat_set_focus ( seat , node ) ;
transaction_commit_dirty ( ) ;
}
// Handle beginning floating move
if ( cont & & is_floating_or_child & & ! is_fullscreen_or_child & &
state = = WLR_BUTTON_PRESSED ) {
uint32_t btn_move = config - > floating_mod_inverse ? BTN_RIGHT : BTN_LEFT ;
if ( button = = btn_move & & ( mod_pressed | | on_titlebar ) ) {
seat_set_focus_container ( seat ,
seat_get_focus_inactive_view ( seat , & cont - > node ) ) ;
seatop_begin_move_floating ( seat , container_toplevel_ancestor ( cont ) ) ;
return ;
}
@ -471,25 +489,18 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
if ( config - > tiling_drag & & ( mod_pressed | | on_titlebar ) & &
state = = WLR_BUTTON_PRESSED & & ! is_floating_or_child & &
cont & & cont - > pending . fullscreen_mode = = FULLSCREEN_NONE ) {
struct sway_container * focus = seat_get_focused_container ( seat ) ;
bool focused = focus = = cont | | container_has_ancestor ( focus , cont ) ;
if ( on_titlebar & & ! focused ) {
node = seat_get_focus_inactive ( seat , & cont - > node ) ;
seat_set_focus ( seat , node ) ;
}
// If moving a container by its title bar, use a threshold for the drag
if ( ! mod_pressed & & config - > tiling_drag_threshold > 0 ) {
seatop_begin_move_tiling_threshold ( seat , cont ) ;
} else {
seatop_begin_move_tiling ( seat , cont ) ;
}
return ;
}
// Handle mousedown on a container surface
if ( surface & & cont & & state = = WLR_BUTTON_PRESSED ) {
seat_set_focus_container ( seat , cont ) ;
seatop_begin_down ( seat , cont , time_msec , sx , sy ) ;
seat_pointer_notify_button ( seat , time_msec , button , WLR_BUTTON_PRESSED ) ;
return ;
@ -497,9 +508,6 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
// Handle clicking a container surface or decorations
if ( cont & & state = = WLR_BUTTON_PRESSED ) {
node = seat_get_focus_inactive ( seat , & cont - > node ) ;
seat_set_focus ( seat , node ) ;
transaction_commit_dirty ( ) ;
seat_pointer_notify_button ( seat , time_msec , button , state ) ;
return ;
}