diff --git a/session-manager/src/nsmd.C b/session-manager/src/nsmd.C index 8bb9e62..68c0921 100644 --- a/session-manager/src/nsmd.C +++ b/session-manager/src/nsmd.C @@ -1789,6 +1789,31 @@ OSC_HANDLER( reply ) /* GUI operations */ /******************/ + +OSC_HANDLER( stop ) +{ + Client *c = get_client_by_id( &client, &argv[0]->s ); + + if ( c ) + { + if ( c->pid != 0 ) + { + kill( c->pid, SIGTERM ); + + if ( gui_is_active ) + osc_server->send( gui_addr, "/reply", "Client stopped." ); + } + } + else + { + if ( gui_is_active ) + osc_server->send( gui_addr, "/error", -10, "No such client." ); + } + + + return 0; +} + OSC_HANDLER( remove ) { Client *c = get_client_by_id( &client, &argv[0]->s ); @@ -2041,6 +2066,7 @@ int main(int argc, char *argv[]) /* */ osc_server->add_method( "/nsm/gui/gui_announce", "", OSC_NAME( gui_announce ), NULL, "" ); + osc_server->add_method( "/nsm/gui/client/stop", "s", OSC_NAME( stop ), NULL, "client_id" ); osc_server->add_method( "/nsm/gui/client/remove", "s", OSC_NAME( remove ), NULL, "client_id" ); osc_server->add_method( "/nsm/gui/client/resume", "s", OSC_NAME( resume ), NULL, "client_id" ); osc_server->add_method( "/nsm/gui/client/save", "s", OSC_NAME( client_save ), NULL, "client_id" ); diff --git a/session-manager/src/session-manager.C b/session-manager/src/session-manager.C index 13b9b2c..da2325e 100644 --- a/session-manager/src/session-manager.C +++ b/session-manager/src/session-manager.C @@ -92,6 +92,7 @@ class NSM_Client : public Fl_Group Fl_Light_Button *_gui; Fl_Button *_remove_button; Fl_Button *_restart_button; + Fl_Button *_kill_button; void set_label ( void ) @@ -180,11 +181,17 @@ public: { _remove_button->show(); _restart_button->show(); + _kill_button->hide(); + _gui->deactivate(); + _dirty->deactivate(); color( fl_darker( FL_RED ) ); redraw(); } else { + _gui->activate(); + _dirty->activate(); + _kill_button->show(); _restart_button->hide(); _remove_button->hide(); } @@ -272,6 +279,14 @@ public: osc->send( (*d)->addr, "/nsm/gui/client/resume", _client_id ); } } + else if ( o == _kill_button ) + { + MESSAGE( "Sending stop" ); + foreach_daemon ( d ) + { + osc->send( (*d)->addr, "/nsm/gui/client/stop", _client_id ); + } + } } @@ -341,6 +356,17 @@ public: o->callback( cb_button, this ); } + xx -= 25 + ss; + + { Fl_Button *o = _kill_button = new Fl_Button( xx, yy, 25, hh, "@square" ); + o->labelsize( 9 ); + o->box( FL_UP_BOX ); + o->type(0); + o->color( FL_RED ); + o->value( 0 ); + o->tooltip( "Stop" ); + o->callback( cb_button, this ); + } xx -= 25 + ss;