@ -617,6 +617,50 @@ void arrange_windows(swayc_t *container, double width, double height) {
layout_log ( & root_container , 0 ) ;
}
/**
* Get swayc in the direction of newly entered output .
*/
static swayc_t * get_swayc_in_output_direction ( swayc_t * output , enum movement_direction dir ) {
if ( ! output ) {
return NULL ;
}
swayc_t * ws = swayc_focus_by_type ( output , C_WORKSPACE ) ;
if ( ws & & ws - > children - > length > 0 ) {
switch ( dir ) {
case MOVE_LEFT :
// get most right child of new output
return ws - > children - > items [ ws - > children - > length - 1 ] ;
case MOVE_RIGHT :
// get most left child of new output
return ws - > children - > items [ 0 ] ;
case MOVE_UP :
case MOVE_DOWN :
{
swayc_t * focused_view = swayc_focus_by_type ( ws , C_VIEW ) ;
if ( focused_view & & focused_view - > parent ) {
swayc_t * parent = focused_view - > parent ;
if ( parent - > layout = = L_VERT ) {
if ( dir = = MOVE_UP ) {
// get child furthest down on new output
return parent - > children - > items [ parent - > children - > length - 1 ] ;
} else if ( dir = = MOVE_DOWN ) {
// get child furthest up on new output
return parent - > children - > items [ 0 ] ;
}
}
return focused_view ;
}
break ;
}
default :
break ;
}
}
return output ;
}
swayc_t * get_swayc_in_direction_under ( swayc_t * container , enum movement_direction dir , swayc_t * limit ) {
swayc_t * parent = container - > parent ;
if ( dir = = MOVE_PARENT ) {
@ -635,7 +679,8 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
sway_log ( L_DEBUG , " Moving from fullscreen view, skipping to output " ) ;
container = swayc_parent_by_type ( container , C_OUTPUT ) ;
get_absolute_center_position ( container , & abs_pos ) ;
return swayc_adjacent_output ( container , dir , & abs_pos , true ) ;
swayc_t * output = swayc_adjacent_output ( container , dir , & abs_pos , true ) ;
return get_swayc_in_output_direction ( output , dir ) ;
}
if ( container - > type = = C_WORKSPACE & & container - > fullscreen ) {
@ -649,7 +694,8 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
int diff = 0 ;
if ( parent - > type = = C_ROOT ) {
sway_log ( L_DEBUG , " Moving between outputs " ) ;
return swayc_adjacent_output ( container , dir , & abs_pos , true ) ;
swayc_t * output = swayc_adjacent_output ( container , dir , & abs_pos , true ) ;
return get_swayc_in_output_direction ( output , dir ) ;
} else {
if ( dir = = MOVE_LEFT | | dir = = MOVE_RIGHT ) {
if ( parent - > layout = = L_HORIZ ) {