@ -211,8 +211,8 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
list_t * res_list = create_list ( ) ;
list_t * res_list = create_list ( ) ;
char * exec = strdup ( _exec ) ;
char * exec = strdup ( _exec ) ;
char * head = exec ;
char * head = exec ;
char * cmdlist ;
char * cmd ;
char * cmd ;
char matched_delim = ' ; ' ;
list_t * views = NULL ;
list_t * views = NULL ;
if ( seat = = NULL ) {
if ( seat = = NULL ) {
@ -227,16 +227,13 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
head = exec ;
head = exec ;
do {
do {
// Split command list
for ( ; isspace ( * head ) ; + + head ) { }
cmdlist = argsep ( & head , " ; " ) ;
// Extract criteria (valid for this command list only).
do {
if ( matched_delim = = ' ; ' ) {
// Skip leading whitespace
for ( ; isspace ( * cmdlist ) ; + + cmdlist ) { }
// Extract criteria (valid for this command chain only).
config - > handler_context . using_criteria = false ;
config - > handler_context . using_criteria = false ;
if ( * cmdlist = = ' [ ' ) {
if ( * head = = ' [ ' ) {
char * error = NULL ;
char * error = NULL ;
struct criteria * criteria = criteria_parse ( cmdlist , & error ) ;
struct criteria * criteria = criteria_parse ( head , & error ) ;
if ( ! criteria ) {
if ( ! criteria ) {
list_add ( res_list ,
list_add ( res_list ,
cmd_results_new ( CMD_INVALID , " %s " , error ) ) ;
cmd_results_new ( CMD_INVALID , " %s " , error ) ) ;
@ -245,71 +242,71 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
}
}
list_free ( views ) ;
list_free ( views ) ;
views = criteria_get_views ( criteria ) ;
views = criteria_get_views ( criteria ) ;
cmdlist + = strlen ( criteria - > raw ) ;
head + = strlen ( criteria - > raw ) ;
criteria_destroy ( criteria ) ;
criteria_destroy ( criteria ) ;
config - > handler_context . using_criteria = true ;
config - > handler_context . using_criteria = true ;
// Skip leading whitespace
// Skip leading whitespace
for ( ; isspace ( * cmdlist ) ; + + cmdlist ) { }
for ( ; isspace ( * head ) ; + + head ) { }
}
// Split command chain into commands
cmd = argsep ( & cmdlist , " , " ) ;
for ( ; isspace ( * cmd ) ; + + cmd ) { }
if ( strcmp ( cmd , " " ) = = 0 ) {
sway_log ( SWAY_INFO , " Ignoring empty command. " ) ;
continue ;
}
}
sway_log ( SWAY_INFO , " Handling command '%s' " , cmd ) ;
}
//TODO better handling of argv
// Split command list
int argc ;
cmd = argsep ( & head , " ;, " , & matched_delim ) ;
char * * argv = split_args ( cmd , & argc ) ;
for ( ; isspace ( * cmd ) ; + + cmd ) { }
if ( strcmp ( argv [ 0 ] , " exec " ) ! = 0 & &
strcmp ( argv [ 0 ] , " exec_always " ) ! = 0 & &
if ( strcmp ( cmd , " " ) = = 0 ) {
strcmp ( argv [ 0 ] , " mode " ) ! = 0 ) {
sway_log ( SWAY_INFO , " Ignoring empty command. " ) ;
int i ;
continue ;
for ( i = 1 ; i < argc ; + + i ) {
}
if ( * argv [ i ] = = ' \" ' | | * argv [ i ] = = ' \' ' ) {
sway_log ( SWAY_INFO , " Handling command '%s' " , cmd ) ;
strip_quotes ( argv [ i ] ) ;
//TODO better handling of argv
}
int argc ;
char * * argv = split_args ( cmd , & argc ) ;
if ( strcmp ( argv [ 0 ] , " exec " ) ! = 0 & &
strcmp ( argv [ 0 ] , " exec_always " ) ! = 0 & &
strcmp ( argv [ 0 ] , " mode " ) ! = 0 ) {
for ( int i = 1 ; i < argc ; + + i ) {
if ( * argv [ i ] = = ' \" ' | | * argv [ i ] = = ' \' ' ) {
strip_quotes ( argv [ i ] ) ;
}
}
}
}
struct cmd_handler * handler = find_handler ( argv [ 0 ] , NULL , 0 ) ;
}
if ( ! handler ) {
struct cmd_handler * handler = find_handler ( argv [ 0 ] , NULL , 0 ) ;
list_add ( res_list , cmd_results_new ( CMD_INVALID ,
if ( ! handler ) {
" Unknown/invalid command '%s' " , argv [ 0 ] ) ) ;
list_add ( res_list , cmd_results_new ( CMD_INVALID ,
" Unknown/invalid command '%s' " , argv [ 0 ] ) ) ;
free_argv ( argc , argv ) ;
goto cleanup ;
}
// Var replacement, for all but first argument of set
for ( int i = handler - > handle = = cmd_set ? 2 : 1 ; i < argc ; + + i ) {
argv [ i ] = do_var_replacement ( argv [ i ] ) ;
}
if ( ! config - > handler_context . using_criteria ) {
// The container or workspace which this command will run on.
struct sway_node * node = con ? & con - > node :
seat_get_focus_inactive ( seat , & root - > node ) ;
set_config_node ( node ) ;
struct cmd_results * res = handler - > handle ( argc - 1 , argv + 1 ) ;
list_add ( res_list , res ) ;
if ( res - > status = = CMD_INVALID ) {
free_argv ( argc , argv ) ;
free_argv ( argc , argv ) ;
goto cleanup ;
goto cleanup ;
}
}
} else {
// Var replacement, for all but first argument of set
for ( int i = 0 ; i < views - > length ; + + i ) {
for ( int i = handler - > handle = = cmd_set ? 2 : 1 ; i < argc ; + + i ) {
struct sway_view * view = views - > items [ i ] ;
argv [ i ] = do_var_replacement ( argv [ i ] ) ;
set_config_node ( & view - > container - > node ) ;
}
if ( ! config - > handler_context . using_criteria ) {
// The container or workspace which this command will run on.
struct sway_node * node = con ? & con - > node :
seat_get_focus_inactive ( seat , & root - > node ) ;
set_config_node ( node ) ;
struct cmd_results * res = handler - > handle ( argc - 1 , argv + 1 ) ;
struct cmd_results * res = handler - > handle ( argc - 1 , argv + 1 ) ;
list_add ( res_list , res ) ;
list_add ( res_list , res ) ;
if ( res - > status = = CMD_INVALID ) {
if ( res - > status = = CMD_INVALID ) {
free_argv ( argc , argv ) ;
free_argv ( argc , argv ) ;
goto cleanup ;
goto cleanup ;
}
}
} else {
for ( int i = 0 ; i < views - > length ; + + i ) {
struct sway_view * view = views - > items [ i ] ;
set_config_node ( & view - > container - > node ) ;
struct cmd_results * res = handler - > handle ( argc - 1 , argv + 1 ) ;
list_add ( res_list , res ) ;
if ( res - > status = = CMD_INVALID ) {
free_argv ( argc , argv ) ;
goto cleanup ;
}
}
}
}
free_argv ( argc , argv ) ;
}
} while ( cmdlist ) ;
free_argv ( argc , argv ) ;
} while ( head ) ;
} while ( head ) ;
cleanup :
cleanup :
free ( exec ) ;
free ( exec ) ;