@ -377,10 +377,11 @@ static bool container_move_in_direction(struct sway_container *container,
return false ;
}
static struct cmd_results * cmd_move_container ( int argc , char * * argv ) {
static struct cmd_results * cmd_move_container ( bool no_auto_back_and_forth ,
int argc , char * * argv ) {
struct cmd_results * error = NULL ;
if ( ( error = checkarg ( argc , " move container/window " ,
EXPECTED_AT_LEAST , 3 ) ) ) {
EXPECTED_AT_LEAST , 2 ) ) ) {
return error ;
}
@ -400,29 +401,6 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
" Can't move fullscreen global container " ) ;
}
bool no_auto_back_and_forth = false ;
while ( strcasecmp ( argv [ 0 ] , " --no-auto-back-and-forth " ) = = 0 ) {
no_auto_back_and_forth = true ;
if ( - - argc < 3 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
+ + argv ;
}
while ( strcasecmp ( argv [ 1 ] , " --no-auto-back-and-forth " ) = = 0 ) {
no_auto_back_and_forth = true ;
if ( - - argc < 3 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
argv + + ;
}
while ( strcasecmp ( argv [ 1 ] , " to " ) = = 0 ) {
if ( - - argc < 3 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
argv + + ;
}
struct sway_seat * seat = config - > handler_context . seat ;
struct sway_container * old_parent = container - > parent ;
struct sway_workspace * old_ws = container - > workspace ;
@ -430,18 +408,18 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
struct sway_node * destination = NULL ;
// determine destination
if ( strcasecmp ( argv [ 1 ] , " workspace " ) = = 0 ) {
if ( strcasecmp ( argv [ 0 ] , " workspace " ) = = 0 ) {
// move container to workspace x
struct sway_workspace * ws = NULL ;
char * ws_name = NULL ;
if ( strcasecmp ( argv [ 2 ] , " next " ) = = 0 | |
strcasecmp ( argv [ 2 ] , " prev " ) = = 0 | |
strcasecmp ( argv [ 2 ] , " next_on_output " ) = = 0 | |
strcasecmp ( argv [ 2 ] , " prev_on_output " ) = = 0 | |
strcasecmp ( argv [ 2 ] , " current " ) = = 0 ) {
ws = workspace_by_name ( argv [ 2 ] ) ;
} else if ( strcasecmp ( argv [ 2 ] , " back_and_forth " ) = = 0 ) {
if ( ! ( ws = workspace_by_name ( argv [ 2 ] ) ) ) {
if ( strcasecmp ( argv [ 1 ] , " next " ) = = 0 | |
strcasecmp ( argv [ 1 ] , " prev " ) = = 0 | |
strcasecmp ( argv [ 1 ] , " next_on_output " ) = = 0 | |
strcasecmp ( argv [ 1 ] , " prev_on_output " ) = = 0 | |
strcasecmp ( argv [ 1 ] , " current " ) = = 0 ) {
ws = workspace_by_name ( argv [ 1 ] ) ;
} else if ( strcasecmp ( argv [ 1 ] , " back_and_forth " ) = = 0 ) {
if ( ! ( ws = workspace_by_name ( argv [ 1 ] ) ) ) {
if ( seat - > prev_workspace_name ) {
ws_name = strdup ( seat - > prev_workspace_name ) ;
} else {
@ -450,19 +428,19 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
}
}
} else {
if ( strcasecmp ( argv [ 2 ] , " number " ) = = 0 ) {
// move "container to workspace number x"
if ( argc < 4 ) {
if ( strcasecmp ( argv [ 1 ] , " number " ) = = 0 ) {
// move [window|container] [to] " workspace number x"
if ( argc < 3 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
if ( ! isdigit ( argv [ 3 ] [ 0 ] ) ) {
if ( ! isdigit ( argv [ 2 ] [ 0 ] ) ) {
return cmd_results_new ( CMD_INVALID ,
" Invalid workspace number '%s' " , argv [ 3 ] ) ;
" Invalid workspace number '%s' " , argv [ 2 ] ) ;
}
ws_name = join_args ( argv + 3, argc - 3 ) ;
ws_name = join_args ( argv + 2, argc - 2 ) ;
ws = workspace_by_number ( ws_name ) ;
} else {
ws_name = join_args ( argv + 2, argc - 2 ) ;
ws_name = join_args ( argv + 1, argc - 1 ) ;
ws = workspace_by_name ( ws_name ) ;
}
@ -497,19 +475,19 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
free ( ws_name ) ;
struct sway_container * dst = seat_get_focus_inactive_tiling ( seat , ws ) ;
destination = dst ? & dst - > node : & ws - > node ;
} else if ( strcasecmp ( argv [ 1 ] , " output " ) = = 0 ) {
struct sway_output * new_output = output_in_direction ( argv [ 2 ] ,
} else if ( strcasecmp ( argv [ 0 ] , " output " ) = = 0 ) {
struct sway_output * new_output = output_in_direction ( argv [ 1 ] ,
old_output , container - > x , container - > y ) ;
if ( ! new_output ) {
return cmd_results_new ( CMD_FAILURE ,
" Can't find output with name/direction '%s' " , argv [ 2 ] ) ;
" Can't find output with name/direction '%s' " , argv [ 1 ] ) ;
}
destination = seat_get_focus_inactive ( seat , & new_output - > node ) ;
} else if ( strcasecmp ( argv [ 1 ] , " mark " ) = = 0 ) {
struct sway_container * dest_con = container_find_mark ( argv [ 2 ] ) ;
} else if ( strcasecmp ( argv [ 0 ] , " mark " ) = = 0 ) {
struct sway_container * dest_con = container_find_mark ( argv [ 1 ] ) ;
if ( dest_con = = NULL ) {
return cmd_results_new ( CMD_FAILURE ,
" Mark '%s' not found " , argv [ 2 ] ) ;
" Mark '%s' not found " , argv [ 1 ] ) ;
}
destination = & dest_con - > node ;
} else {
@ -635,19 +613,17 @@ static void workspace_move_to_output(struct sway_workspace *workspace,
static struct cmd_results * cmd_move_workspace ( int argc , char * * argv ) {
struct cmd_results * error = NULL ;
if ( ( error = checkarg ( argc , " move workspace " , EXPECTED_AT_LEAST , 2 ) ) ) {
if ( ( error = checkarg ( argc , " move workspace " , EXPECTED_AT_LEAST , 1 ) ) ) {
return error ;
}
while ( strcasecmp ( argv [ 1 ] , " to " ) = = 0 ) {
if ( - - argc < 3 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
+ + argv ;
if ( strcasecmp ( argv [ 0 ] , " output " ) = = 0 ) {
- - argc ; + + argv ;
}
if ( strcasecmp ( argv [ 1 ] , " output " ) ! = 0 ) {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
if ( ! argc ) {
return cmd_results_new ( CMD_INVALID ,
" Expected 'move workspace to [output] <output>' " ) ;
}
struct sway_workspace * workspace = config - > handler_context . workspace ;
@ -658,11 +634,11 @@ static struct cmd_results *cmd_move_workspace(int argc, char **argv) {
struct sway_output * old_output = workspace - > output ;
int center_x = workspace - > width / 2 + workspace - > x ,
center_y = workspace - > height / 2 + workspace - > y ;
struct sway_output * new_output = output_in_direction ( argv [ 2 ] ,
struct sway_output * new_output = output_in_direction ( argv [ 0 ] ,
old_output , center_x , center_y ) ;
if ( ! new_output ) {
return cmd_results_new ( CMD_FAILURE ,
" Can't find output with name/direction '%s' " , argv [ 2 ] ) ;
" Can't find output with name/direction '%s' " , argv [ 0 ] ) ;
}
workspace_move_to_output ( workspace , new_output ) ;
@ -675,9 +651,9 @@ static struct cmd_results *cmd_move_workspace(int argc, char **argv) {
static struct cmd_results * cmd_move_in_direction (
enum wlr_direction direction , int argc , char * * argv ) {
int move_amt = 10 ;
if ( argc > 1 ) {
if ( argc ) {
char * inv ;
move_amt = ( int ) strtol ( argv [ 1 ] , & inv , 10 ) ;
move_amt = ( int ) strtol ( argv [ 0 ] , & inv , 10 ) ;
if ( * inv ! = ' \0 ' & & strcasecmp ( inv , " px " ) ! = 0 ) {
return cmd_results_new ( CMD_FAILURE , " Invalid distance specified " ) ;
}
@ -769,7 +745,7 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {
}
if ( ! argc ) {
return cmd_results_new ( CMD_ FAILURE , expected_position_syntax ) ;
return cmd_results_new ( CMD_ INVALID , expected_position_syntax ) ;
}
bool absolute = false ;
@ -779,17 +755,20 @@ static struct cmd_results *cmd_move_to_position(int argc, char **argv) {
+ + argv ;
}
if ( ! argc ) {
return cmd_results_new ( CMD_ FAILURE , expected_position_syntax ) ;
return cmd_results_new ( CMD_ INVALID , expected_position_syntax ) ;
}
if ( strcmp ( argv [ 0 ] , " position " ) = = 0 ) {
- - argc ;
+ + argv ;
}
if ( ! argc ) {
return cmd_results_new ( CMD_ FAILURE , expected_position_syntax ) ;
return cmd_results_new ( CMD_ INVALID , expected_position_syntax ) ;
}
if ( strcmp ( argv [ 0 ] , " cursor " ) = = 0 | | strcmp ( argv [ 0 ] , " mouse " ) = = 0 | |
strcmp ( argv [ 0 ] , " pointer " ) = = 0 ) {
if ( absolute ) {
return cmd_results_new ( CMD_INVALID , expected_position_syntax ) ;
}
struct sway_seat * seat = config - > handler_context . seat ;
if ( ! seat - > cursor ) {
return cmd_results_new ( CMD_FAILURE , " No cursor device " ) ;
@ -875,6 +854,18 @@ static struct cmd_results *cmd_move_to_scratchpad(void) {
return cmd_results_new ( CMD_SUCCESS , NULL ) ;
}
static const char expected_full_syntax [ ] = " Expected "
" 'move left|right|up|down [<amount> [px]]' "
" or 'move [--no-auto-back-and-forth] [window|container] [to] workspace "
" <name>|next|prev|next_on_output|prev_on_output|current|(number <num>)' "
" or 'move [window|container] [to] output <name/id>|left|right|up|down' "
" or 'move [window|container] [to] mark <mark>' "
" or 'move [window|container] [to] scratchpad' "
" or 'move workspace to [output] <name/id>|left|right|up|down' "
" or 'move [window|container] [to] [absolute] position <x> [px] <y> [px]' "
" or 'move [window|container] [to] [absolute] position center' "
" or 'move [window|container] [to] position mouse|cursor|pointer' " ;
struct cmd_results * cmd_move ( int argc , char * * argv ) {
struct cmd_results * error = NULL ;
if ( ( error = checkarg ( argc , " move " , EXPECTED_AT_LEAST , 1 ) ) ) {
@ -886,31 +877,55 @@ struct cmd_results *cmd_move(int argc, char **argv) {
}
if ( strcasecmp ( argv [ 0 ] , " left " ) = = 0 ) {
return cmd_move_in_direction ( WLR_DIRECTION_LEFT , argc , argv ) ;
return cmd_move_in_direction ( WLR_DIRECTION_LEFT , - - argc , + + argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " right " ) = = 0 ) {
return cmd_move_in_direction ( WLR_DIRECTION_RIGHT , argc , argv ) ;
return cmd_move_in_direction ( WLR_DIRECTION_RIGHT , - - argc , + + argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " up " ) = = 0 ) {
return cmd_move_in_direction ( WLR_DIRECTION_UP , argc , argv ) ;
return cmd_move_in_direction ( WLR_DIRECTION_UP , - - argc , + + argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " down " ) = = 0 ) {
return cmd_move_in_direction ( WLR_DIRECTION_DOWN , argc , argv ) ;
} else if ( ( strcasecmp ( argv [ 0 ] , " container " ) = = 0
| | strcasecmp ( argv [ 0 ] , " window " ) = = 0 ) | |
( strcasecmp ( argv [ 0 ] , " --no-auto-back-and-forth " ) & & argc > = 2
& & ( strcasecmp ( argv [ 1 ] , " container " ) = = 0
| | strcasecmp ( argv [ 1 ] , " window " ) = = 0 ) ) ) {
return cmd_move_container ( argc , argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " workspace " ) = = 0 ) {
return cmd_move_in_direction ( WLR_DIRECTION_DOWN , - - argc , + + argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " workspace " ) = = 0 & & argc > = 2
& & ( strcasecmp ( argv [ 1 ] , " to " ) = = 0 | |
strcasecmp ( argv [ 1 ] , " output " ) = = 0 ) ) {
argc - = 2 ; argv + = 2 ;
return cmd_move_workspace ( argc , argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " scratchpad " ) = = 0
| | ( strcasecmp ( argv [ 0 ] , " to " ) = = 0 & & argc = = 2
& & strcasecmp ( argv [ 1 ] , " scratchpad " ) = = 0 ) ) {
}
bool no_auto_back_and_forth = false ;
if ( strcasecmp ( argv [ 0 ] , " --no-auto-back-and-forth " ) = = 0 ) {
no_auto_back_and_forth = true ;
- - argc ; + + argv ;
}
if ( strcasecmp ( argv [ 0 ] , " window " ) = = 0 | |
strcasecmp ( argv [ 0 ] , " container " ) = = 0 ) {
- - argc ; + + argv ;
}
if ( strcasecmp ( argv [ 0 ] , " to " ) = = 0 ) {
- - argc ; + + argv ;
}
if ( ! argc ) {
return cmd_results_new ( CMD_INVALID , expected_full_syntax ) ;
}
// Only `move [window|container] [to] workspace` supports
// `--no-auto-back-and-forth` so treat others as invalid syntax
if ( no_auto_back_and_forth & & strcasecmp ( argv [ 0 ] , " workspace " ) ! = 0 ) {
return cmd_results_new ( CMD_INVALID , expected_full_syntax ) ;
}
if ( strcasecmp ( argv [ 0 ] , " workspace " ) = = 0 | |
strcasecmp ( argv [ 0 ] , " output " ) = = 0 | |
strcasecmp ( argv [ 0 ] , " mark " ) = = 0 ) {
return cmd_move_container ( no_auto_back_and_forth , argc , argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " scratchpad " ) = = 0 ) {
return cmd_move_to_scratchpad ( ) ;
} else if ( strcasecmp ( argv [ 0 ] , " position " ) = = 0 ) {
return cmd_move_to_position ( argc , argv ) ;
} else if ( strcasecmp ( argv [ 0 ] , " absolute " ) = = 0 ) {
} else if ( strcasecmp ( argv [ 0 ] , " position " ) = = 0 | |
( argc > 1 & & strcasecmp ( argv [ 0 ] , " absolute " ) = = 0 & &
strcasecmp ( argv [ 1 ] , " position " ) = = 0 ) ) {
return cmd_move_to_position ( argc , argv ) ;
} else {
return cmd_results_new ( CMD_INVALID , expected_syntax ) ;
}
return cmd_results_new ( CMD_SUCCESS , NULL ) ;
return cmd_results_new ( CMD_INVALID , expected_full_syntax ) ;
}