diff --git a/src/nsmd.cpp b/src/nsmd.cpp index 6dbcbcc..493bb26 100644 --- a/src/nsmd.cpp +++ b/src/nsmd.cpp @@ -1277,7 +1277,7 @@ close_session ( ) if ( gui_is_active ) { - osc_server->send( gui_addr, "/nsm/gui/session/name", "", "" ); + osc_server->send( gui_addr, "/nsm/gui/session/name", "", "" ); //Empty string = no current session } } @@ -1466,9 +1466,8 @@ load_session_file ( const char * path ) 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 + //Send two parameters to signal that the session was loaded: simple session-name, relative session path below session root + DMESSAGE( "Informing GUI about running session name: %s with relative path %s", session_name, session_path + strlen( session_root ) ); osc_server->send( gui_addr, "/nsm/gui/session/name", session_name, session_path + strlen( session_root )); } @@ -1663,7 +1662,9 @@ OSC_HANDLER( new ) { osc_server->send( gui_addr, "/nsm/gui/session/session", &argv[0]->s ); - osc_server->send( gui_addr, "/nsm/gui/session/name", &argv[0]->s, &argv[0]->s ); + //Send two parameters to signal that the session was loaded: simple session-name, relative session path below session root + DMESSAGE( "Informing GUI about running session name: %s with relative path %s", session_name, session_path + strlen( session_root ) ); + osc_server->send( gui_addr, "/nsm/gui/session/name", session_name, session_path + strlen( session_root )); } save_session_file(); @@ -2294,32 +2295,45 @@ announce_gui( const char *url, bool is_reply ) //The server was started directly and instructed to connect to a running GUI. osc_server->send( gui_addr, "/nsm/gui/server_announce", "hi" ); + //The session root is not inluced in /nsm/gui/session/name + //For the general information we need to send this message: 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 - MESSAGE ( "Informing GUI about %li already running clients", client.size() ); - for ( std::list::iterator i = client.begin(); - i != client.end(); - ++i ) + + + //Send session name and relative path. If both are empty it signals that no session is currently open, + //which is the default state if a GUI started nsmd. + //No session_path without session_name. We only need to test for session_name. + if ( !session_name || session_name[0] == '\0' ) { - Client *c = *i; - osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->executable_path ); // we send new twice. see announce() comment - if ( c->status ) - 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 ); - if ( c->label() ) // could be NULL - osc_server->send( gui_addr, "/nsm/gui/client/label", c->client_id, c->label() ); - if ( c->active ) - osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name ); // upgrade to pretty-name + DMESSAGE( "Informing GUI that no session is running by sending two empty strings" ); + osc_server->send( gui_addr, "/nsm/gui/session/name", "", "" ); //Empty string = no current session } + else + { + // Send a list of clients to the newly registered GUI in case there was already a session open + // First clients, then session name was original nsmd order. + // We keep it that way, the only change is that we made even the attempt dependent on a running session. + MESSAGE ( "Informing GUI about %li already running clients", client.size() ); + for ( std::list::iterator i = client.begin(); + i != client.end(); + ++i ) + { + Client *c = *i; + osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->executable_path ); // we send new twice. see announce() comment + if ( c->status ) + 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 ); + if ( c->label() ) // could be NULL + osc_server->send( gui_addr, "/nsm/gui/client/label", c->client_id, c->label() ); + if ( c->active ) + osc_server->send( gui_addr, "/nsm/gui/client/new", c->client_id, c->name ); // upgrade to pretty-name + } - //Send two parameters. The first one is the short session name, which is the directory name. - //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( "Informing GUI about running session name: %s with relative path %s", session_name, session_path + strlen( session_root ) ); + osc_server->send( gui_addr, "/nsm/gui/session/name", session_name, session_path + strlen( session_root )); + } DMESSAGE( "Registration with GUI complete\n" ); }