From 04743aeb5ff6eeb74afaf322a6d21c4f4939883b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 23 Jun 2009 12:14:05 +0000 Subject: [PATCH] Filled up the quitting code path a bit. The TeamDebugger throws up an alert asking what to do with the debugged team. Killing it is not yet implemented. Then it notifies the application about the quit request. That in turn tears down the TeamDebugger and if no other ones are left, it quits itself. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31201 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debugger/Debugger.cpp | 16 ++++++++- src/apps/debugger/TeamDebugger.cpp | 54 +++++++++++++++++++++++++++++- src/apps/debugger/TeamDebugger.h | 6 ++++ 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/apps/debugger/Debugger.cpp b/src/apps/debugger/Debugger.cpp index a21741af8a..8eb9332218 100644 --- a/src/apps/debugger/Debugger.cpp +++ b/src/apps/debugger/Debugger.cpp @@ -177,6 +177,19 @@ public: virtual void MessageReceived(BMessage* message) { switch (message->what) { + case MSG_DEBUGGER_QUIT_REQUESTED: + { + TeamDebugger* debugger = NULL; + if (message->FindPointer("debugger", + (void**)&debugger) == B_OK + && fTeamDebuggers.HasItem(debugger)) { + fTeamDebuggers.RemoveItem(debugger); + debugger->DeleteSelf(); + if (fTeamDebuggers.CountItems() == 0) + PostMessage(B_QUIT_REQUESTED); + } + break; + } default: BApplication::MessageReceived(message); break; @@ -257,7 +270,8 @@ printf("debugger for team %ld created and initialized successfully!\n", team); virtual bool QuitRequested() { // TODO:... - return true; +// return true; +return BApplication::QuitRequested(); } private: diff --git a/src/apps/debugger/TeamDebugger.cpp b/src/apps/debugger/TeamDebugger.cpp index 40ffa4b05e..dc6b7e09f0 100644 --- a/src/apps/debugger/TeamDebugger.cpp +++ b/src/apps/debugger/TeamDebugger.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -183,6 +184,14 @@ TeamDebugger::Init(team_id teamID, thread_id threadID, bool stopInMain) } +void +TeamDebugger::DeleteSelf() +{ + Lock(); + Quit(); +} + + void TeamDebugger::MessageReceived(BMessage* message) { @@ -310,7 +319,50 @@ TeamDebugger::ClearBreakpointRequested(target_addr_t address) bool TeamDebugger::TeamWindowQuitRequested(TeamWindow* window) { - // TODO:... + // TODO: Is this what shall happen? + if (!fTeam->Lock()) + return true; + + BString name(fTeam->Name()); + + fTeam->Unlock(); + + BString message; + message << "What shall be done about the debugged team '"; + message << name; + message << "'?"; + + name.Remove(0, name.FindLast('/') + 1); + + BString killLabel("Kill "); + killLabel << name; + + BString resumeLabel("Resume "); + resumeLabel << name; + + BAlert* alert = new BAlert("Quit Debugger", message.String(), + killLabel.String(), "Cancel", resumeLabel.String()); + + switch (alert->Go()) { + case 0: + // TODO: Implement killing the team. + alert = new BAlert("TODO", "That is not nice and I won't do it " + "either! Test failed. Nice to know how you think about these " + "matters.", "Ugh!"); + alert->Go(); + break; + case 1: + return false; + case 2: + // Detach from the team and resume and stopped threads. Seems to be + // the default action anyways. + break; + } + + BMessage quitMessage(MSG_DEBUGGER_QUIT_REQUESTED); + quitMessage.AddPointer("debugger", this); + be_app->PostMessage(&quitMessage); + return true; } diff --git a/src/apps/debugger/TeamDebugger.h b/src/apps/debugger/TeamDebugger.h index 2bf1e7e17b..c85d9b4e99 100644 --- a/src/apps/debugger/TeamDebugger.h +++ b/src/apps/debugger/TeamDebugger.h @@ -19,6 +19,10 @@ class DebuggerInterface; class TeamDebugModel; +enum { + MSG_DEBUGGER_QUIT_REQUESTED = 'dbqt' +}; + class TeamDebugger : private BLooper, private TeamWindow::Listener, private JobListener, private Team::Listener { @@ -31,6 +35,8 @@ public: team_id TeamID() const { return fTeamID; } + void DeleteSelf(); + private: virtual void MessageReceived(BMessage* message);