From b3f2ebf008490ab0b37e7d12fb6e2702f45bcd2b Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 2 Jul 2015 17:54:51 -0400 Subject: [PATCH] Debugger: More work on signal configuration. - Introduce SignalDispositionEditWindow for add/editing disposition exceptions. SignalsConfigView: - Factor out helper class SignalDispositionMenu. Use accordingly in SignalsConfigView and SignalDispositionEditWindow. - Watch table selection changes to update button statuses appropriately. - On add/edit request, show disposition edit window. - Listen for disposition changes from team and react accordingly. UiUtils: - Add helper function to map signal defines to strings. Together with the previous set of commits, this implements #9720. --- src/apps/debugger/Jamfile | 2 + src/apps/debugger/MessageCodes.h | 2 + .../SignalsConfigView.cpp | 124 ++++++++-- .../team_settings_window/SignalsConfigView.h | 18 +- .../gui/util/SignalDispositionMenu.cpp | 36 +++ .../gui/util/SignalDispositionMenu.h | 20 ++ .../SignalDispositionEditWindow.cpp | 223 ++++++++++++++++++ .../SignalDispositionEditWindow.h | 62 +++++ .../debugger/user_interface/util/UiUtils.cpp | 55 +++++ .../debugger/user_interface/util/UiUtils.h | 2 + 10 files changed, 524 insertions(+), 20 deletions(-) create mode 100644 src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.cpp create mode 100644 src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.h create mode 100644 src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.cpp create mode 100644 src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.h diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 9c0692064f..2b8ae87e97 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -299,11 +299,13 @@ Application Debugger : ActionMenuItem.cpp GuiSettingsUtils.cpp SettingsMenu.cpp + SignalDispositionMenu.cpp TargetAddressTableColumn.cpp # user_interface/gui/utility_windows BreakpointEditWindow.cpp ExpressionPromptWindow.cpp + SignalDispositionEditWindow.cpp StartTeamWindow.cpp WatchPromptWindow.cpp diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index da21be5302..450bade7ab 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -69,6 +69,8 @@ enum { MSG_TEAM_SETTINGS_WINDOW_CLOSED = 'tswc', MSG_SHOW_BREAKPOINT_EDIT_WINDOW = 'sbew', MSG_BREAKPOINT_EDIT_WINDOW_CLOSED = 'bewc', + MSG_SHOW_SIGNAL_DISPOSITION_EDIT_WINDOW = 'sdew', + MSG_SIGNAL_DISPOSITION_EDIT_WINDOW_CLOSED = 'sdec', MSG_SHOW_START_TEAM_WINDOW = 'sstw', MSG_START_TEAM_WINDOW_CLOSED = 'stwc', MSG_START_NEW_TEAM = 'sttt', diff --git a/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.cpp b/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.cpp index 92a93b90c9..fef46159ca 100644 --- a/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.cpp +++ b/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.cpp @@ -15,6 +15,8 @@ #include "table/TableColumns.h" #include "MessageCodes.h" +#include "SignalDispositionEditWindow.h" +#include "SignalDispositionMenu.h" #include "SignalDispositionTypes.h" #include "UiUtils.h" #include "UserInterface.h" @@ -73,11 +75,18 @@ public: switch (columnIndex) { case 0: - value = info->signal; + { + BString tempValue; + value.SetTo(UiUtils::SignalNameToString(info->signal, + tempValue)); return true; + } case 1: - value = info->disposition; + { + value.SetTo(UiUtils::SignalDispositionToString( + info->disposition), B_VARIANT_DONT_COPY_DATA); return true; + } default: break; } @@ -85,6 +94,15 @@ public: return false; } + bool SignalDispositionInfoAt(int32 rowIndex, SignalDispositionInfo*& _info) + { + _info = fDispositions.ItemAt(rowIndex); + if (_info == NULL) + return false; + + return true; + } + void Update(int32 signal, int32 disposition) { for (int32 i = 0; i < fDispositions.CountItems(); i++) { @@ -168,7 +186,8 @@ SignalsConfigView::SignalsConfigView(::Team* team, fAddDispositionButton(NULL), fEditDispositionButton(NULL), fRemoveDispositionButton(NULL), - fDispositionModel(NULL) + fDispositionModel(NULL), + fEditWindow(NULL) { SetName("Signals"); fTeam->AddListener(this); @@ -178,6 +197,7 @@ SignalsConfigView::SignalsConfigView(::Team* team, SignalsConfigView::~SignalsConfigView() { fTeam->RemoveListener(this); + BMessenger(fEditWindow).SendMessage(B_QUIT_REQUESTED); } @@ -219,6 +239,10 @@ void SignalsConfigView::MessageReceived(BMessage* message) { switch (message->what) { + case MSG_SIGNAL_DISPOSITION_EDIT_WINDOW_CLOSED: + { + fEditWindow = NULL; + } case MSG_SET_DEFAULT_SIGNAL_DISPOSITION: { int32 disposition; @@ -229,15 +253,64 @@ SignalsConfigView::MessageReceived(BMessage* message) break; } case MSG_ADD_DISPOSITION_EXCEPTION: - { - break; - } case MSG_EDIT_DISPOSITION_EXCEPTION: { + if (fEditWindow != NULL) { + AutoLocker lock(fEditWindow); + if (lock.IsLocked()) + fEditWindow->Activate(true); + } else { + int32 signal = 0; + if (message->what == MSG_EDIT_DISPOSITION_EXCEPTION) { + TableSelectionModel* model + = fDispositionExceptions->SelectionModel(); + SignalDispositionInfo* info; + if (fDispositionModel->SignalDispositionInfoAt( + model->RowAt(0), info)) { + signal = info->signal; + } + } + + try { + fEditWindow = SignalDispositionEditWindow::Create(fTeam, + signal, fListener, this); + if (fEditWindow != NULL) + fEditWindow->Show(); + } catch (...) { + // TODO: notify user + } + } break; } case MSG_REMOVE_DISPOSITION_EXCEPTION: { + TableSelectionModel* model + = fDispositionExceptions->SelectionModel(); + for (int32 i = 0; i < model->CountRows(); i++) { + SignalDispositionInfo* info; + if (fDispositionModel->SignalDispositionInfoAt(model->RowAt(i), + info)) { + fListener->RemoveCustomSignalDispositionRequested( + info->signal); + } + } + break; + } + case MSG_SET_CUSTOM_SIGNAL_DISPOSITION: + { + int32 signal; + int32 disposition; + if (message->FindInt32("signal", &signal) == B_OK + && message->FindInt32("disposition", &disposition) == B_OK) { + fDispositionModel->Update(signal, disposition); + } + break; + } + case MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION: + { + int32 signal; + if (message->FindInt32("signal", &signal) == B_OK) + fDispositionModel->Remove(signal); break; } default: @@ -247,24 +320,45 @@ SignalsConfigView::MessageReceived(BMessage* message) } +void +SignalsConfigView::CustomSignalDispositionChanged( + const Team::CustomSignalDispositionEvent& event) +{ + BMessage message(MSG_SET_CUSTOM_SIGNAL_DISPOSITION); + message.AddInt32("signal", event.Signal()); + message.AddInt32("disposition", event.Disposition()); + + BMessenger(this).SendMessage(&message); +} + + +void +SignalsConfigView::CustomSignalDispositionRemoved( + const Team::CustomSignalDispositionEvent& event) +{ + BMessage message(MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION); + message.AddInt32("signal", event.Signal()); + + BMessenger(this).SendMessage(&message); +} + + void SignalsConfigView::TableSelectionChanged(Table* table) { + TableSelectionModel* model = fDispositionExceptions->SelectionModel(); + int32 rowCount = model->CountRows(); + fEditDispositionButton->SetEnabled(rowCount == 1); + fRemoveDispositionButton->SetEnabled(rowCount > 0); } void SignalsConfigView::_Init() { - BMenu* dispositionMenu = new BMenu("signalDispositionsMenu"); - - for (int i = 0; i < SIGNAL_DISPOSITION_MAX; i++) { - BMessage* message = new BMessage( - MSG_SET_DEFAULT_SIGNAL_DISPOSITION); - message->AddInt32("disposition", i); - dispositionMenu->AddItem(new BMenuItem( - UiUtils::SignalDispositionToString(i), message)); - } + SignalDispositionMenu* dispositionMenu = new SignalDispositionMenu( + "signalDispositionsMenu", + new BMessage(MSG_SET_DEFAULT_SIGNAL_DISPOSITION)); BGroupView* customDispositionsGroup = new BGroupView(); BLayoutBuilder::Group<>(customDispositionsGroup, B_VERTICAL, 0.0) diff --git a/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.h b/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.h index 1701d1f6e6..b929739674 100644 --- a/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.h +++ b/src/apps/debugger/user_interface/gui/team_settings_window/SignalsConfigView.h @@ -17,6 +17,7 @@ class BButton; class BMenuField; +class SignalDispositionEditWindow; class UserInterfaceListener; @@ -35,15 +36,21 @@ public: virtual void AttachedToWindow(); virtual void MessageReceived(BMessage* message); - // Team::Listener - - // TableListener - virtual void TableSelectionChanged(Table* table); - private: class SignalDispositionModel; private: + // Team::Listener + virtual void CustomSignalDispositionChanged( + const Team::CustomSignalDispositionEvent& + event); + virtual void CustomSignalDispositionRemoved( + const Team::CustomSignalDispositionEvent& + event); + + // TableListener + virtual void TableSelectionChanged(Table* table); + void _Init(); void _UpdateSignalConfigState(); @@ -58,6 +65,7 @@ private: BButton* fEditDispositionButton; BButton* fRemoveDispositionButton; SignalDispositionModel* fDispositionModel; + SignalDispositionEditWindow* fEditWindow; }; diff --git a/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.cpp b/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.cpp new file mode 100644 index 0000000000..7776aa428c --- /dev/null +++ b/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.cpp @@ -0,0 +1,36 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ + + +#include "SignalDispositionMenu.h" + +#include + +#include + +#include "SignalDispositionTypes.h" +#include "UiUtils.h" + + +SignalDispositionMenu::SignalDispositionMenu(const char* label, + BMessage* baseMessage) + : + BMenu(label) +{ + for (int i = 0; i < SIGNAL_DISPOSITION_MAX; i++) { + BMessage* message = NULL; + if (baseMessage != NULL) { + message = new BMessage(*baseMessage); + message->AddInt32("disposition", i); + } + + AddItem(new BMenuItem(UiUtils::SignalDispositionToString(i), message)); + } +} + + +SignalDispositionMenu::~SignalDispositionMenu() +{ +} diff --git a/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.h b/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.h new file mode 100644 index 0000000000..c8b941ce18 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/util/SignalDispositionMenu.h @@ -0,0 +1,20 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef SIGNAL_DISPOSITION_MENU_H +#define SIGNAL_DISPOSITION_MENU_H + + +#include + + +class SignalDispositionMenu : public BMenu { +public: + SignalDispositionMenu(const char* label, + BMessage* baseMessage = NULL); + virtual ~SignalDispositionMenu(); +}; + + +#endif // SIGNAL_DISPOSITION_MENU_H diff --git a/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.cpp b/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.cpp new file mode 100644 index 0000000000..757e2e338e --- /dev/null +++ b/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.cpp @@ -0,0 +1,223 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#include "SignalDispositionEditWindow.h" + +#include + +#include +#include +#include + +#include +#include + +#include "MessageCodes.h" +#include "SignalDispositionMenu.h" +#include "SignalDispositionTypes.h" +#include "UiUtils.h" +#include "UserInterface.h" +#include "Team.h" + + +enum { + MSG_SELECTED_SIGNAL_CHANGED = 'ssic', + MSG_SELECTED_DISPOSITION_CHANGED = 'sdic', + MSG_SAVE_SIGNAL_DISPOSITION = 'ssid' +}; + + +SignalDispositionEditWindow::SignalDispositionEditWindow(::Team* team, + int32 signal, UserInterfaceListener* listener, BHandler* target) + : + BWindow(BRect(), "Edit breakpoint", B_FLOATING_WINDOW, + B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), + fTeam(team), + fListener(listener), + fEditMode(signal > 0), + fCurrentSignal(signal), + fSaveButton(NULL), + fCancelButton(NULL), + fSignalSelectionField(NULL), + fDispositionSelectionField(NULL), + fTarget(target) +{ +} + + +SignalDispositionEditWindow::~SignalDispositionEditWindow() +{ + BMessenger(fTarget).SendMessage(MSG_SIGNAL_DISPOSITION_EDIT_WINDOW_CLOSED); +} + + +SignalDispositionEditWindow* +SignalDispositionEditWindow::Create(::Team* team, int32 signal, + UserInterfaceListener* listener, BHandler* target) +{ + SignalDispositionEditWindow* self = new SignalDispositionEditWindow( + team, signal, listener, target); + + try { + self->_Init(); + } catch (...) { + delete self; + throw; + } + + return self; + +} + +void +SignalDispositionEditWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case MSG_SELECTED_SIGNAL_CHANGED: + { + int32 signal; + if (message->FindInt32("signal", &signal) == B_OK) + fCurrentSignal = signal; + break; + } + case MSG_SELECTED_DISPOSITION_CHANGED: + { + int32 disposition; + if (message->FindInt32("disposition", &disposition) == B_OK) + fCurrentDisposition = disposition; + break; + } + case MSG_SAVE_SIGNAL_DISPOSITION: + { + fListener->SetCustomSignalDispositionRequested(fCurrentSignal, + fCurrentDisposition); + // fall through + } + case B_CANCEL: + Quit(); + break; + + default: + BWindow::MessageReceived(message); + break; + } + +} + + +void +SignalDispositionEditWindow::Show() +{ + CenterOnScreen(); + BWindow::Show(); +} + + +void +SignalDispositionEditWindow::_Init() +{ + SignalDispositionMenu* menu = new SignalDispositionMenu("dispositionMenu", + new BMessage(MSG_SELECTED_DISPOSITION_CHANGED)); + + BLayoutBuilder::Group<>(this, B_VERTICAL) + .SetInsets(B_USE_DEFAULT_SPACING) + .AddGroup(B_HORIZONTAL) + .Add((fSignalSelectionField = new BMenuField("Signal:", + _BuildSignalSelectionMenu()))) + .Add((fDispositionSelectionField = new BMenuField("Disposition:", + menu))) + .End() + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add((fSaveButton = new BButton("Save", + new BMessage(MSG_SAVE_SIGNAL_DISPOSITION)))) + .Add((fCancelButton = new BButton("Cancel", + new BMessage(B_CANCEL)))) + .End() + .End(); + + fSignalSelectionField->Menu()->SetLabelFromMarked(true); + fSignalSelectionField->Menu()->SetTargetForItems(this); + menu->SetLabelFromMarked(true); + menu->SetTargetForItems(this); + + AutoLocker< ::Team> teamLocker(fTeam); + _UpdateState(); + + // if we're editing an existing row, don't allow changing the signal + // selection + if (fEditMode) + fSignalSelectionField->SetEnabled(false); + + +} + + +BMenu* +SignalDispositionEditWindow::_BuildSignalSelectionMenu() +{ + BMenu* menu = new BMenu("signals"); + BMenuItem* item; + + #undef ADD_SIGNAL_MENU_ITEM + #define ADD_SIGNAL_MENU_ITEM(x) \ + menu->AddItem((item = new BMenuItem(#x, new BMessage( \ + MSG_SELECTED_SIGNAL_CHANGED)))); \ + item->Message()->AddInt32("signal", x); + + ADD_SIGNAL_MENU_ITEM(SIGHUP) + ADD_SIGNAL_MENU_ITEM(SIGINT) + ADD_SIGNAL_MENU_ITEM(SIGQUIT) + ADD_SIGNAL_MENU_ITEM(SIGILL) + ADD_SIGNAL_MENU_ITEM(SIGCHLD) + ADD_SIGNAL_MENU_ITEM(SIGABRT) + ADD_SIGNAL_MENU_ITEM(SIGPIPE) + ADD_SIGNAL_MENU_ITEM(SIGFPE) + ADD_SIGNAL_MENU_ITEM(SIGKILL) + ADD_SIGNAL_MENU_ITEM(SIGSTOP) + ADD_SIGNAL_MENU_ITEM(SIGSEGV) + ADD_SIGNAL_MENU_ITEM(SIGCONT) + ADD_SIGNAL_MENU_ITEM(SIGTSTP) + ADD_SIGNAL_MENU_ITEM(SIGALRM) + ADD_SIGNAL_MENU_ITEM(SIGTERM) + ADD_SIGNAL_MENU_ITEM(SIGTTIN) + ADD_SIGNAL_MENU_ITEM(SIGTTOU) + ADD_SIGNAL_MENU_ITEM(SIGUSR1) + ADD_SIGNAL_MENU_ITEM(SIGUSR2) + ADD_SIGNAL_MENU_ITEM(SIGWINCH) + ADD_SIGNAL_MENU_ITEM(SIGKILLTHR) + ADD_SIGNAL_MENU_ITEM(SIGTRAP) + ADD_SIGNAL_MENU_ITEM(SIGPOLL) + ADD_SIGNAL_MENU_ITEM(SIGPROF) + ADD_SIGNAL_MENU_ITEM(SIGSYS) + ADD_SIGNAL_MENU_ITEM(SIGURG) + ADD_SIGNAL_MENU_ITEM(SIGVTALRM) + ADD_SIGNAL_MENU_ITEM(SIGXCPU) + ADD_SIGNAL_MENU_ITEM(SIGXFSZ) + ADD_SIGNAL_MENU_ITEM(SIGBUS) + + BString signalName; + for (int32 i = SIGRTMIN; i <= SIGRTMAX; i++) { + menu->AddItem((item = new BMenuItem(UiUtils::SignalNameToString(i, + signalName), new BMessage(MSG_SELECTED_SIGNAL_CHANGED)))); + item->Message()->AddInt32("signal", i); + } + + return menu; +} + + +void +SignalDispositionEditWindow::_UpdateState() +{ + if (fCurrentSignal <= 0) + fCurrentSignal = SIGHUP; + + fSignalSelectionField->Menu()->ItemAt(fCurrentSignal - 1)->SetMarked(true); + + fCurrentDisposition = fTeam->SignalDispositionFor(fCurrentSignal); + fDispositionSelectionField->Menu()->ItemAt(fCurrentDisposition)->SetMarked( + true); +} + diff --git a/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.h b/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.h new file mode 100644 index 0000000000..bd4dd95d8f --- /dev/null +++ b/src/apps/debugger/user_interface/gui/utility_windows/SignalDispositionEditWindow.h @@ -0,0 +1,62 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef SIGNAL_DISPOSITION_EDIT_WINDOW_H +#define SIGNAL_DISPOSITION_EDIT_WINDOW_H + + +#include + +#include "Team.h" + +#include "types/Types.h" + + +class BButton; +class BMenu; +class BMenuField; +class Team; +class UserInterfaceListener; + + +class SignalDispositionEditWindow : public BWindow { +public: + SignalDispositionEditWindow( + ::Team* team, + int32 signal, + UserInterfaceListener* listener, + BHandler* target); + + ~SignalDispositionEditWindow(); + + static SignalDispositionEditWindow* Create(::Team* team, + int32 signal, + UserInterfaceListener* listener, + BHandler* target); + // throws + + virtual void MessageReceived(BMessage* message); + + virtual void Show(); + +private: + void _Init(); + BMenu* _BuildSignalSelectionMenu(); + void _UpdateState(); + +private: + ::Team* fTeam; + UserInterfaceListener* fListener; + bool fEditMode; + int32 fCurrentSignal; + int32 fCurrentDisposition; + BButton* fSaveButton; + BButton* fCancelButton; + BMenuField* fSignalSelectionField; + BMenuField* fDispositionSelectionField; + BHandler* fTarget; +}; + + +#endif // SIGNAL_DISPOSITION_EDIT_WINDOW diff --git a/src/apps/debugger/user_interface/util/UiUtils.cpp b/src/apps/debugger/user_interface/util/UiUtils.cpp index d952a95ad7..b1d326eb13 100644 --- a/src/apps/debugger/user_interface/util/UiUtils.cpp +++ b/src/apps/debugger/user_interface/util/UiUtils.cpp @@ -562,6 +562,61 @@ UiUtils::FormatSIMDValue(const BVariant& value, uint32 bitSize, } +const char* +UiUtils::SignalNameToString(int32 signal, BString& _output) +{ + #undef DEFINE_SIGNAL_STRING + #define DEFINE_SIGNAL_STRING(x) \ + case x: \ + _output = #x; \ + return _output.String(); + + switch (signal) { + DEFINE_SIGNAL_STRING(SIGHUP) + DEFINE_SIGNAL_STRING(SIGINT) + DEFINE_SIGNAL_STRING(SIGQUIT) + DEFINE_SIGNAL_STRING(SIGILL) + DEFINE_SIGNAL_STRING(SIGCHLD) + DEFINE_SIGNAL_STRING(SIGABRT) + DEFINE_SIGNAL_STRING(SIGPIPE) + DEFINE_SIGNAL_STRING(SIGFPE) + DEFINE_SIGNAL_STRING(SIGKILL) + DEFINE_SIGNAL_STRING(SIGSTOP) + DEFINE_SIGNAL_STRING(SIGSEGV) + DEFINE_SIGNAL_STRING(SIGCONT) + DEFINE_SIGNAL_STRING(SIGTSTP) + DEFINE_SIGNAL_STRING(SIGALRM) + DEFINE_SIGNAL_STRING(SIGTERM) + DEFINE_SIGNAL_STRING(SIGTTIN) + DEFINE_SIGNAL_STRING(SIGTTOU) + DEFINE_SIGNAL_STRING(SIGUSR1) + DEFINE_SIGNAL_STRING(SIGUSR2) + DEFINE_SIGNAL_STRING(SIGWINCH) + DEFINE_SIGNAL_STRING(SIGKILLTHR) + DEFINE_SIGNAL_STRING(SIGTRAP) + DEFINE_SIGNAL_STRING(SIGPOLL) + DEFINE_SIGNAL_STRING(SIGPROF) + DEFINE_SIGNAL_STRING(SIGSYS) + DEFINE_SIGNAL_STRING(SIGURG) + DEFINE_SIGNAL_STRING(SIGVTALRM) + DEFINE_SIGNAL_STRING(SIGXCPU) + DEFINE_SIGNAL_STRING(SIGXFSZ) + DEFINE_SIGNAL_STRING(SIGBUS) + default: + break; + } + + if (signal == SIGRTMIN) + _output = "SIGRTMIN"; + else if (signal == SIGRTMAX) + _output = "SIGRTMAX"; + else + _output.SetToFormat("SIGRTMIN+%" B_PRId32, signal - SIGRTMIN); + + return _output.String(); +} + + const char* UiUtils::SignalDispositionToString(int disposition) { diff --git a/src/apps/debugger/user_interface/util/UiUtils.h b/src/apps/debugger/user_interface/util/UiUtils.h index 6290049d42..9919fca50f 100644 --- a/src/apps/debugger/user_interface/util/UiUtils.h +++ b/src/apps/debugger/user_interface/util/UiUtils.h @@ -75,6 +75,8 @@ public: uint32 bitSize, uint32 format, BString& _output); + static const char* SignalNameToString(int32 signal, + BString& _output); static const char* SignalDispositionToString(int disposition); };