@ -13,14 +13,29 @@ void output_get_scaled_size(wlc_handle handle, struct wlc_size *size) {
}
swayc_t * output_by_name ( const char * name , const struct wlc_point * abs_pos ) {
swayc_t * output = NULL ;
// If there is no output directly next to the current one, use
// swayc_opposite_output to wrap.
if ( strcasecmp ( name , " left " ) = = 0 ) {
return swayc_adjacent_output ( NULL , MOVE_LEFT , abs_pos , true ) ;
output = swayc_adjacent_output ( NULL , MOVE_LEFT , abs_pos , true ) ;
if ( ! output ) {
output = swayc_opposite_output ( MOVE_RIGHT , abs_pos ) ;
}
} else if ( strcasecmp ( name , " right " ) = = 0 ) {
return swayc_adjacent_output ( NULL , MOVE_RIGHT , abs_pos , true ) ;
output = swayc_adjacent_output ( NULL , MOVE_RIGHT , abs_pos , true ) ;
if ( ! output ) {
output = swayc_opposite_output ( MOVE_LEFT , abs_pos ) ;
}
} else if ( strcasecmp ( name , " up " ) = = 0 ) {
return swayc_adjacent_output ( NULL , MOVE_UP , abs_pos , true ) ;
output = swayc_adjacent_output ( NULL , MOVE_UP , abs_pos , true ) ;
if ( ! output ) {
output = swayc_opposite_output ( MOVE_DOWN , abs_pos ) ;
}
} else if ( strcasecmp ( name , " down " ) = = 0 ) {
return swayc_adjacent_output ( NULL , MOVE_DOWN , abs_pos , true ) ;
output = swayc_adjacent_output ( NULL , MOVE_DOWN , abs_pos , true ) ;
if ( ! output ) {
output = swayc_opposite_output ( MOVE_UP , abs_pos ) ;
}
} else {
for ( int i = 0 ; i < root_container . children - > length ; + + i ) {
swayc_t * c = root_container . children - > items [ i ] ;
@ -29,7 +44,58 @@ swayc_t *output_by_name(const char* name, const struct wlc_point *abs_pos) {
}
}
}
return NULL ;
return output ;
}
swayc_t * swayc_opposite_output ( enum movement_direction dir ,
const struct wlc_point * abs_pos ) {
// Search through all the outputs and pick the output whose edge covers the
// given position, and is at leftmost/rightmost/upmost/downmost side of the
// screen (decided by the direction given).
swayc_t * opposite = NULL ;
char * dir_text = NULL ;
switch ( dir ) {
case MOVE_LEFT :
case MOVE_RIGHT : ;
for ( int i = 0 ; i < root_container . children - > length ; + + i ) {
swayc_t * c = root_container . children - > items [ i ] ;
if ( abs_pos - > y > = c - > y & & abs_pos - > y < = c - > y + c - > height ) {
if ( ! opposite ) {
opposite = c ;
} else if ( ( dir = = MOVE_LEFT & & c - > x < opposite - > x )
| | ( dir = = MOVE_RIGHT & & c - > x > opposite - > x ) ) {
opposite = c ;
}
}
}
dir_text = dir = = MOVE_LEFT ? " leftmost " : " rightmost " ;
break ;
case MOVE_UP :
case MOVE_DOWN : ;
for ( int i = 0 ; i < root_container . children - > length ; + + i ) {
swayc_t * c = root_container . children - > items [ i ] ;
if ( abs_pos - > x > = c - > x & & abs_pos - > x < = c - > x + c - > width ) {
if ( ! opposite ) {
opposite = c ;
} else if ( ( dir = = MOVE_UP & & c - > y < opposite - > y )
| | ( dir = = MOVE_DOWN & & c - > y > opposite - > y ) ) {
opposite = c ;
}
}
}
dir_text = dir = = MOVE_UP ? " upmost " : " downmost " ;
break ;
default :
sway_abort ( " Function called with invalid argument. " ) ;
break ;
}
if ( opposite ) {
sway_log ( L_DEBUG , " %s (%.0fx%.0f+%.0f+%.0f) is %s from y-position %i " ,
opposite - > name , opposite - > width , opposite - > height , opposite - > x , opposite - > y ,
dir_text , abs_pos - > y ) ;
}
return opposite ;
}
// Position is where on the edge (as absolute position) the adjacent output should be searched for.