| @@ -302,39 +302,37 @@ handle_client_process_death ( int pid ) | |||
| if ( c ) | |||
| { | |||
| bool dead_because_we_said = false; | |||
| bool dead_because_we_said = ( c->pending_command() == COMMAND_KILL || | |||
| c->pending_command() == COMMAND_QUIT ); | |||
| if ( c->pending_command() == COMMAND_KILL || | |||
| c->pending_command() == COMMAND_QUIT ) | |||
| if ( dead_because_we_said ) | |||
| { | |||
| dead_because_we_said = true; | |||
| MESSAGE( "Client %s terminated because we told it to.", c->name ); | |||
| } | |||
| else | |||
| { | |||
| MESSAGE( "Client %s died unexpectedly.", c->name ); | |||
| } | |||
| c->pending_command( COMMAND_NONE ); | |||
| c->active = false; | |||
| c->pid = 0; | |||
| if ( dead_because_we_said ) | |||
| if ( c->pending_command() == COMMAND_QUIT ) | |||
| { | |||
| MESSAGE( "Client %s terminated because we told it to.", c->name ); | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" ); | |||
| client.remove( c ); | |||
| client.remove(c); | |||
| delete c; | |||
| } | |||
| else | |||
| { | |||
| MESSAGE( "Client %s died unexpectedly.", c->name ); | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" ); | |||
| } | |||
| } | |||
| c->pending_command( COMMAND_NONE ); | |||
| c->active = false; | |||
| c->pid = 0; | |||
| } | |||
| } | |||
| @@ -995,6 +993,21 @@ command_all_clients_to_save ( ) | |||
| } | |||
| } | |||
| void | |||
| command_client_to_stop ( Client *c ) | |||
| { | |||
| MESSAGE( "Stopping client %s", c->name ); | |||
| if ( c->pid > 0 ) | |||
| { | |||
| c->pending_command( COMMAND_KILL ); | |||
| kill( c->pid, SIGTERM ); | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" ); | |||
| } | |||
| } | |||
| void | |||
| command_client_to_quit ( Client *c ) | |||
| @@ -1015,10 +1028,10 @@ command_client_to_quit ( Client *c ) | |||
| if ( c->pid > 0 ) | |||
| { | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "kill" ); | |||
| osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "quit" ); | |||
| /* should be kill? */ | |||
| c->pending_command( COMMAND_KILL ); | |||
| c->pending_command( COMMAND_QUIT ); | |||
| // this is a dumb client... try and kill it | |||
| kill( c->pid, SIGTERM ); | |||
| @@ -1897,13 +1910,10 @@ OSC_HANDLER( stop ) | |||
| if ( c ) | |||
| { | |||
| if ( c->pid != 0 ) | |||
| { | |||
| kill( c->pid, SIGTERM ); | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/reply", "Client stopped." ); | |||
| } | |||
| command_client_to_stop( c ); | |||
| if ( gui_is_active ) | |||
| osc_server->send( gui_addr, "/reply", "Client stopped." ); | |||
| } | |||
| else | |||
| { | |||