@ -286,8 +286,8 @@ struct sway_container *workspace_by_name(const char *name) {
* the end and beginning . If next is false , the previous workspace is returned ,
* the end and beginning . If next is false , the previous workspace is returned ,
* otherwise the next one is returned .
* otherwise the next one is returned .
*/
*/
struct sway_container * workspace_output_prev_next_impl (
static struct sway_container * workspace_output_prev_next_impl (
struct sway_container * output , bool next ) {
struct sway_container * output , int dir ) {
if ( ! output ) {
if ( ! output ) {
return NULL ;
return NULL ;
}
}
@ -302,27 +302,17 @@ struct sway_container *workspace_output_prev_next_impl(
focus :
focus :
container_parent ( focus , C_WORKSPACE ) ) ;
container_parent ( focus , C_WORKSPACE ) ) ;
int i ;
int index = list_find ( output - > children , workspace ) ;
for ( i = 0 ; i < output - > children - > length ; i + + ) {
size_t new_index = wrap ( index + dir , output - > children - > length ) ;
if ( output - > children - > items [ i ] = = workspace ) {
return output - > children - > items [ new_index ] ;
return output - > children - > items [
wrap ( i + ( next ? 1 : - 1 ) , output - > children - > length ) ] ;
}
}
// Doesn't happen, at worst the for loop returns the previously active
// workspace
return NULL ;
}
}
/**
/**
* Get the previous or next workspace . If the first / last workspace on an output
* Get the previous or next workspace . If the first / last workspace on an output
* is active , proceed to the previous / next output ' s previous / next workspace . If
* is active , proceed to the previous / next output ' s previous / next workspace .
* next is false , the previous workspace is returned , otherwise the next one is
* returned .
*/
*/
struct sway_container * workspace_prev_next_impl (
static struct sway_container * workspace_prev_next_impl (
struct sway_container * workspace , bool next ) {
struct sway_container * workspace , int dir ) {
if ( ! workspace ) {
if ( ! workspace ) {
return NULL ;
return NULL ;
}
}
@ -331,52 +321,40 @@ struct sway_container *workspace_prev_next_impl(
return NULL ;
return NULL ;
}
}
struct sway_container * current_output = workspace - > parent ;
struct sway_container * output = workspace - > parent ;
int offset = next ? 1 : - 1 ;
int index = list_find ( output - > children , workspace ) ;
int start = next ? 0 : 1 ;
int new_index = index + dir ;
int end ;
if ( next ) {
end = current_output - > children - > length - 1 ;
} else {
end = current_output - > children - > length ;
}
int i ;
for ( i = start ; i < end ; i + + ) {
if ( current_output - > children - > items [ i ] = = workspace ) {
return current_output - > children - > items [ i + offset ] ;
}
}
// Given workspace is the first/last on the output, jump to the
if ( new_index > = 0 & & new_index < output - > children - > length ) {
// previous/next output
return output - > children - > items [ index + dir ] ;
int num_outputs = root_container . children - > length ;
for ( i = 0 ; i < num_outputs ; i + + ) {
if ( root_container . children - > items [ i ] = = current_output ) {
struct sway_container * next_output = root_container . children - > items [
wrap ( i + offset , num_outputs ) ] ;
return workspace_output_prev_next_impl ( next_output , next ) ;
}
}
}
// Doesn't happen, at worst the for loop returns the previously active
// Look on a different output
// workspace on the active output
int output_index = list_find ( root_container . children , output ) ;
return NULL ;
new_index = wrap ( output_index + dir , root_container . children - > length ) ;
output = root_container . children - > items [ new_index ] ;
if ( dir = = 1 ) {
return output - > children - > items [ 0 ] ;
} else {
return output - > children - > items [ output - > children - > length - 1 ] ;
}
}
}
struct sway_container * workspace_output_next ( struct sway_container * current ) {
struct sway_container * workspace_output_next ( struct sway_container * current ) {
return workspace_output_prev_next_impl ( current , true ) ;
return workspace_output_prev_next_impl ( current , 1 ) ;
}
}
struct sway_container * workspace_next ( struct sway_container * current ) {
struct sway_container * workspace_next ( struct sway_container * current ) {
return workspace_prev_next_impl ( current , true ) ;
return workspace_prev_next_impl ( current , 1 ) ;
}
}
struct sway_container * workspace_output_prev ( struct sway_container * current ) {
struct sway_container * workspace_output_prev ( struct sway_container * current ) {
return workspace_output_prev_next_impl ( current , false ) ;
return workspace_output_prev_next_impl ( current , - 1 ) ;
}
}
struct sway_container * workspace_prev ( struct sway_container * current ) {
struct sway_container * workspace_prev ( struct sway_container * current ) {
return workspace_prev_next_impl ( current , false ) ;
return workspace_prev_next_impl ( current , - 1 ) ;
}
}
bool workspace_switch ( struct sway_container * workspace ,
bool workspace_switch ( struct sway_container * workspace ,