diff --git a/src/nsmd.cpp b/src/nsmd.cpp index ab37bbf..13742f0 100644 --- a/src/nsmd.cpp +++ b/src/nsmd.cpp @@ -252,8 +252,8 @@ public: executable_path = 0; pre_existing = false; launch_error = 0; - dirty = NULL; - status = NULL; + dirty = 0; + status = 0; name_with_id = 0; } @@ -271,7 +271,6 @@ public: if (name_with_id) free(name_with_id); - name = executable_path = client_id = capabilities = name_with_id = NULL; } }; @@ -353,17 +352,20 @@ handle_client_process_death ( int pid ) //Decide if the client terminated or if removed from the session if ( c->pending_command() == COMMAND_QUIT ) { + + c->status = "removed"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); client.remove(c); //This will not remove the clients save data delete c; } else { + c->status = "stopped"; if ( gui_is_active ) { - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); if ( c->launch_error ) { /* NSM API treats the stopped status as switch. You can only remove stopped. @@ -732,13 +734,14 @@ launch ( const char *executable, const char *client_id ) MESSAGE( "Process %s has pid: %i", executable, pid ); //We do not have a name yet, use executable + c->status = "launch"; if ( gui_is_active ) { //At this point we do not know if launched program will start or fail //And we do not know if it has nsm-support or not. This will be decided if it announces. osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name ); osc_server->send( gui_addr, "/nsm/gui/client/label", c->client_id, "" ); //clear label from potential previous-and-fixed launch error - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "launch" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } return true; @@ -754,14 +757,16 @@ command_client_to_save ( Client *c ) c->pending_command( COMMAND_SAVE ); + c->status = "save"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "save" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } else if ( c->is_dumb_client() && c->pid ) { // this is a dumb client... + c->status = "noop"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "noop" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } } @@ -785,9 +790,10 @@ void command_client_to_switch ( Client *c, const char *new_client_id ) c->pending_command( COMMAND_OPEN ); + c->status = "switch"; if ( gui_is_active ) { - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "switch" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); osc_server->send( gui_addr, "/nsm/gui/client/switch", old_client_id, c->client_id ); } @@ -803,8 +809,9 @@ purge_inactive_clients ( ) { if ( ! (*i)->active ) { + (*i)->status = "removed"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", (*i)->client_id, (*i)->status = "removed" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", (*i)->client_id, (*i)->status ); delete *i; @@ -968,10 +975,11 @@ OSC_HANDLER( announce ) APP_TITLE, ":server-control:broadcast:optional-gui:" ); + c->status = "open"; if ( gui_is_active ) { osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name ); - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "open" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); if ( c->is_capable_of( ":optional-gui:" ) ) osc_server->send( gui_addr, "/nsm/gui/client/has_optional_gui", c->client_id ); @@ -1169,8 +1177,9 @@ command_client_to_stop ( Client *c ) kill( c->pid, SIGTERM ); + c->status = "stopped"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "stopped" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } } @@ -1185,15 +1194,17 @@ command_client_to_quit ( Client *c ) kill( c->pid, SIGTERM ); + c->status = "quit"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "quit" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } else if ( c->is_dumb_client() ) { if ( c->pid > 0 ) { + c->status = "quit"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "quit" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); /* should be kill? */ c->pending_command( COMMAND_QUIT ); @@ -1203,8 +1214,9 @@ command_client_to_quit ( Client *c ) } else { + c->status = "removed"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } } } @@ -1432,7 +1444,8 @@ load_session_file ( const char * path ) new_clients.clear(); if ( gui_is_active ) - { + { //This is not the case when --load-session was used. GUI announce will come later. + //Send two parameters to signal that the session was loaded. First is the direct session name, //second is the full filepath. //See function announce_gui for a full description where /nsm/gui/session/name is also send from @@ -2081,8 +2094,9 @@ OSC_HANDLER( error ) MESSAGE( "Client \"%s\" replied with error: %s (%i) in %fms", c->name_with_id, message, err_code, c->milliseconds_since_last_command() ); c->pending_command( COMMAND_NONE ); + c->status = "error"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "error" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); return 0; } @@ -2103,8 +2117,9 @@ OSC_HANDLER( reply ) c->pending_command( COMMAND_NONE ); + c->status = "ready"; if ( gui_is_active ) - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "ready" ); + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); } else MESSAGE( "Reply from unknown client" ); @@ -2149,7 +2164,10 @@ OSC_HANDLER( remove ) if ( c->pid == 0 && ! c->active ) { - osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status = "removed" ); + + c->status = "removed"; + if ( gui_is_active ) + osc_server->send( gui_addr, "/nsm/gui/client/status", c->client_id, c->status ); client.remove( c ); @@ -2245,6 +2263,8 @@ announce_gui( const char *url, bool is_reply ) // If a GUI connects to an existing server with a running session this will trigger a list of // clients send to the new GUI. + MESSAGE ( "A GUI announced to us from the URL %s", url ); + gui_addr = lo_address_new_from_url( url ); gui_is_active = true; //global state @@ -2258,6 +2278,7 @@ announce_gui( const char *url, bool is_reply ) osc_server->send( gui_addr, "/nsm/gui/session/root", session_root ); // Send a list of clients to the newly registered GUI in case there was already a session open + DMESSAGE ( "Informing GUI about %li already running clients", client.size() ); for ( std::list::iterator i = client.begin(); i != client.end(); ++i ) @@ -2272,9 +2293,10 @@ announce_gui( const char *url, bool is_reply ) //The second parameter is the full file path. //If both are empty it signals that no session is currently open, which is the default state if //a GUI started nsmd. + DMESSAGE( "Informing GUI about potentially running session name: %s", session_name ); osc_server->send( gui_addr, "/nsm/gui/session/name", session_name ? session_name : "", session_path ? session_path : "" ); - DMESSAGE( "Registered with GUI" ); + DMESSAGE( "Registration with GUI complete" ); }