From 515d86daceb5b0a6d57bf5ceda244fe3017f71a8 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 18 May 2019 12:19:57 +0200 Subject: [PATCH] debug_server: build a new debug window Use radio buttons laid out vertically so that locales with long labels (no short word for "write core file") can still look nice. This is open for experiment, buttons laid out vertically are another option. At least now we have a window t work from, as BAlert doesn't cut it here. While I'm at it, use a ladybug icon for this one, so it's visibly different from normal application alerts. Change-Id: I08ba9573f132901484224e107404348e7dca97f4 Reviewed-on: https://review.haiku-os.org/c/1459 Reviewed-by: waddlesplash --- data/artwork/icons/Misc_Bug | Bin 0 -> 8842 bytes src/servers/debug/DebugServer.cpp | 38 +------- src/servers/debug/DebugWindow.cpp | 136 ++++++++++++++++++++++++++++ src/servers/debug/DebugWindow.h | 43 +++++++++ src/servers/debug/Jamfile | 2 + src/servers/debug/debug_server.rdef | 72 +++------------ 6 files changed, 197 insertions(+), 94 deletions(-) create mode 100644 data/artwork/icons/Misc_Bug create mode 100644 src/servers/debug/DebugWindow.cpp create mode 100644 src/servers/debug/DebugWindow.h diff --git a/data/artwork/icons/Misc_Bug b/data/artwork/icons/Misc_Bug new file mode 100644 index 0000000000000000000000000000000000000000..0281261bb45d1d3cdf273450c1e739323da71174 GIT binary patch literal 8842 zcmeHMYitx%6u!&aQfTE(Kv7%+gn}50VhlpM!%8WbmZCItSaf^9QjHgV8coMCl^SNW5L$nZGwqUDEKw^a; z!YS0);UUsP~ahA$QD;otK(N|XO4M!sJyPcMx1%QdU0J1EhPKOYYwZc z646+*h@}##40B(161(^@=pt5RSSW*N92+;vH>lK-NIc&lhLY4D;@rJQvB<49ZW%fl zgKWA<&*-+L6t2!hR@Cr>zDl{1j-N%o2|1o`f_g~}3cmG{d z(tWnHlqE}ds0viM_Axo<^UrVdmP_nVgBd{H&9g4b4+k<5rlLd&KG6XEy9Qv*COg z^43#TlQgWPeKK0pnh=7hi-c$~lA*Om)>vgE46`kijYShW_Y*DArwa+%wfSJxkLxvf zfG3*-u_>pJ2uYfMr_i}>r!XthDRgi^lsVaNGni(jF3I;g>nq4)#_&3;2zC~7*05gi zsWzT-7B&<;oyB)YNuDs0x^TRuXT(O>LH?REW){C%dvpK%wjMIYAN8=U)yN$=bn~Gq zCGwFU)T&bAC$>A-Z-*}T42n_@&Y+e&6+6LBJ05iO%RKl(2Os6Z8-UYqJRIuKaGkZb zz7x?)%}lCU7bGeai>4t)oz1}-eAZhd17F!0IV2OUMjU_IkZpw4f&`TbB@8?rOipl1 zrZsH&^0)F!;cQbXW9q895joGei=Li&U9Rlln!Qth&e8ujxzUF`&kJM4F4mpna^0OW zklbWa=q0%^zqqPO)&iBeBQ%iQu5xlKxgp8T&TT^Uqe$3>Gw!EI_yC*n;O7?!47C1M zZmLL-mz=j4V38n;5N|Qi3|#7aD>q&(g>csA#Ctg}%yhkL%xwQQt1BRe^m>QW)xl|fYY^v|9xe%T@?LaV5d@_9C@!#tjj(mHxV$Q33_HFM9*Vb #include @@ -13,16 +16,13 @@ #include #include -#include #include #include #include -#include #include #include #include #include -#include #include #include @@ -36,28 +36,10 @@ #include -enum { - kActionKillTeam, - kActionDebugTeam, - kActionWriteCoreFile, - kActionSaveReportTeam, - kActionPromptUser -}; - - static const char* kDebuggerSignature = "application/x-vnd.Haiku-Debugger"; static const int32 MSG_DEBUG_THIS_TEAM = 'dbtt'; -//#define HANDOVER_USE_GDB 1 -#define HANDOVER_USE_DEBUGGER 1 - -#undef B_TRANSLATION_CONTEXT -#define B_TRANSLATION_CONTEXT "DebugServer" - -#define USE_GUI true - // define to false if the debug server shouldn't use GUI (i.e. an alert) - //#define TRACE_DEBUG_SERVER #ifdef TRACE_DEBUG_SERVER # define TRACE(x) debug_printf x @@ -893,22 +875,10 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message) _NotifyAppServer(fTeam); _NotifyRegistrar(fTeam, true, false); - BString buffer( - B_TRANSLATE("The application:\n\n %app\n\n" - "has encountered an error which prevents it from continuing. Haiku " - "will terminate the application and clean up.")); - buffer.ReplaceFirst("%app", fTeamInfo.args); + DebugWindow *alert = new DebugWindow(fTeamInfo.args); // TODO: It would be nice if the alert would go away automatically // if someone else kills our teams. - BAlert *alert = new BAlert(NULL, buffer.String(), - B_TRANSLATE("Terminate"), B_TRANSLATE("Debug"), - B_TRANSLATE("Write core file"), - B_WIDTH_AS_USUAL, B_WARNING_ALERT); -#ifdef HANDOVER_USE_DEBUGGER - alert->AddButton(B_TRANSLATE("Save report")); -#endif - alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); debugAction = alert->Go(); if (debugAction < 0) { // Happens when closed by escape key diff --git a/src/servers/debug/DebugWindow.cpp b/src/servers/debug/DebugWindow.cpp new file mode 100644 index 0000000000..cf2c00c6da --- /dev/null +++ b/src/servers/debug/DebugWindow.cpp @@ -0,0 +1,136 @@ +/* + * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk. + * Distributed under the terms of the MIT License. + */ + +#include "DebugWindow.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "DebugServer" + + +DebugWindow::DebugWindow(const char* appName) + : + BWindow(BRect(0, 0, 100, 50), "Crashed program", B_MODAL_WINDOW, + B_CLOSE_ON_ESCAPE | B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS), + fBitmap(BRect(0, 0, 31, 31), B_RGBA32), + fSemaphore(create_sem(0, "DebugWindow")), + fAction(kActionKillTeam) +{ + BString buffer(B_TRANSLATE( + "The application:\n\n %app\n\n" + "has encountered an error which prevents it from continuing. Haiku " + "will terminate the application and clean up.")); + buffer.ReplaceFirst("%app", appName); + + BResources resources; + resources.SetToImage(B_TRANSLATION_CONTEXT); + printf("init %s\n", strerror(resources.InitCheck())); + size_t size; + const uint8* iconData = (const uint8*)resources.LoadResource('VICN', 2, + &size); + printf("icon %p\n", iconData); + BIconUtils::GetVectorIcon(iconData, size, &fBitmap); + BStripeView *stripeView = new BStripeView(fBitmap); + + BTextView *message = new BTextView("_tv_"); + message->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); + rgb_color textColor = ui_color(B_PANEL_TEXT_COLOR); + message->SetFontAndColor(be_plain_font, B_FONT_ALL, &textColor); + message->MakeEditable(false); + message->MakeSelectable(false); + message->SetWordWrap(true); + message->SetText(buffer); + message->SetExplicitMaxSize(BSize(B_SIZE_UNSET, B_SIZE_UNSET)); + message->SetExplicitMinSize(BSize(310, B_SIZE_UNSET)); + + BRadioButton *terminate = new BRadioButton("terminate", + B_TRANSLATE("Terminate"), new BMessage(kActionKillTeam)); +#ifdef HANDOVER_USE_DEBUGGER + BRadioButton *report = new BRadioButton("report", + B_TRANSLATE("Save report"), new BMessage(kActionSaveReportTeam)); +#endif + BRadioButton *debug = new BRadioButton("debug", + B_TRANSLATE("Debug"), new BMessage(kActionDebugTeam)); + BRadioButton *core = new BRadioButton("core", + B_TRANSLATE("Write core file"), new BMessage(kActionWriteCoreFile)); + + BButton *close = new BButton("close", B_TRANSLATE("Oh no!"), + new BMessage(B_QUIT_REQUESTED)); + + terminate->SetValue(B_CONTROL_ON); + + BLayoutBuilder::Group<>(this) + .AddGroup(B_HORIZONTAL) + .Add(stripeView) + .AddGroup(B_VERTICAL) + .SetInsets(B_USE_SMALL_SPACING) + .Add(message) + .AddGroup(B_VERTICAL, 0) + .Add(terminate) + .Add(debug) + .Add(report) + .Add(core) + .End() + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(close) + .End() + .End() + .End(); + + ResizeToPreferred(); + CenterOnScreen(); +} + + +DebugWindow::~DebugWindow() +{ + delete_sem(fSemaphore); +} + + +void +DebugWindow::MessageReceived(BMessage* message) +{ + switch(message->what) { + case B_QUIT_REQUESTED: + release_sem(fSemaphore); + break; + + case kActionKillTeam: + case kActionDebugTeam: + case kActionWriteCoreFile: + case kActionSaveReportTeam: + fAction = message->what; + return; + } + + BWindow::MessageReceived(message); +} + + +int32 +DebugWindow::Go() +{ + Show(); + + // Wait for user to close the window + acquire_sem(fSemaphore); + return fAction; +} + + diff --git a/src/servers/debug/DebugWindow.h b/src/servers/debug/DebugWindow.h new file mode 100644 index 0000000000..58929dcbd4 --- /dev/null +++ b/src/servers/debug/DebugWindow.h @@ -0,0 +1,43 @@ +/* + * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk. + * Distributed under the terms of the MIT License. + */ + +#ifndef DEBUGWINDOW_H +#define DEBUGWINDOW_H + + +#include +#include + + +enum { + kActionKillTeam, + kActionDebugTeam, + kActionWriteCoreFile, + kActionSaveReportTeam, + kActionPromptUser +}; + + +//#define HANDOVER_USE_GDB 1 +#define HANDOVER_USE_DEBUGGER 1 + +#define USE_GUI true + // define to false if the debug server shouldn't use GUI (i.e. an alert) + +class DebugWindow : public BWindow { +public: + DebugWindow(const char* appName); + ~DebugWindow(); + + void MessageReceived(BMessage* message); + int32 Go(); +private: + BBitmap fBitmap; + sem_id fSemaphore; + int32 fAction; +}; + + +#endif /* !DEBUGWINDOW_H */ diff --git a/src/servers/debug/Jamfile b/src/servers/debug/Jamfile index ac4d06e834..2957421f2d 100644 --- a/src/servers/debug/Jamfile +++ b/src/servers/debug/Jamfile @@ -11,6 +11,7 @@ AddResources debug_server : debug_server.rdef ; Server debug_server : DebugServer.cpp + DebugWindow.cpp : be libdebug.so @@ -23,5 +24,6 @@ DoCatalogs debug_server : x-vnd.Haiku-debug_server : DebugServer.cpp + DebugWindow.cpp ; diff --git a/src/servers/debug/debug_server.rdef b/src/servers/debug/debug_server.rdef index 4b59226108..e0884d1bbd 100644 --- a/src/servers/debug/debug_server.rdef +++ b/src/servers/debug/debug_server.rdef @@ -11,15 +11,13 @@ resource app_version { middle = 0, minor = 0, - variety = B_APPV_ALPHA, + variety = B_APPV_BETA, internal = 0, short_info = "debug_server", - long_info = "debug_server ©2005-2008 Haiku" + long_info = "debug_server ©2005-2019 Haiku" }; -#ifdef HAIKU_TARGET_PLATFORM_HAIKU - resource vector_icon array { $"6E636966080401690501020106023D01D9B77467381D063DADE44676E44A002A" $"73F8E4C9FFB88F59020106022D7A45BA2EA23CB7EA302A87478DE44A570C60FF" @@ -52,60 +50,14 @@ resource vector_icon array { $"3FB83F3CF122BCF1223FB83F49E07DC85506" }; -#else - -resource large_icon array { - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF" - $"FFFFFFFFFF000000000000000000000000000000FFFF003FD9D9D90000FFFFFF" - $"FFFFFFFF003F3F3F3F3F3F3F3F3F3F3F3F3F3F3F00003FD9D9D9D9D9D90000FF" - $"FFFFFFFF003FD9D9D9D9D900000000D9D9D9D9D93F3FAAAAD9D9D9D9D9D98300" - $"FFFFFFFF003FD9D9D9D9000E1817180000D9D9D9D9838383AAAAD9D9D983AA00" - $"FFFFFFFF1100000000003F3F3F3F171718008383833F3FD93F3FAAAA83AAAA00" - $"FFFFFFFFFF1111110000000000153F171515003F3FD9D9D9D9D93F3FAAAAAA00" - $"FFFFFFFFFFFFFFFF001515151600153F151500D9D9D9D9D9D9D9D9D983AA0111" - $"FFFFFFFFFFFFFF00150400000416001517150F00D900003F3FD9D9D9D9AA0017" - $"FFFFFFFFFFFFFF001500000809041500180F0E000083013F3FD9D9D9D9830011" - $"FFFFFFFFFFFFFF00150008D1AA053F00170F0F00170000D9D9D9D9D983AA0111" - $"FFFFFFFFFFFFFF003F08AAAAD1043F00170F0F000000D9D9D9D9D983AA001111" - $"FFFFFFFFFFFF00003FAAD9D9AA3F0017170F0F00D9D9D9D9D9D983AA001111FF" - $"FFFFFFFFFF001ED900AAD9AAD9170018170F0F00D9D9D9D9D983AA001111FFFF" - $"FFFFFFFF003FD9D900D9AAD900001718170F0F00D9D9D9D983AA001111FFFFFF" - $"FFFFFF003FD983AAAAD983AA00171817170F0F00AAAAD983AA001111FFFFFFFF" - $"FFFF003FD98383D9AAD983AA00171817170F0000AAAA83AA001111FFFFFFFFFF" - $"FF003FD9838300AAD9AAD1D9AA000017180000AAAA83AA001111FFFFFFFFFFFF" - $"003FD98383003FAAAAD1D9AA3FD9D9000000AAAA83AA001111FFFFFFFFFFFFFF" - $"00D98383003FD9D98383003FD9D98383003FD98383001111FFFFFFFFFFFFFFFF" - $"FF0000003FD9D98383003FD9D98383003FD98383001111FFFFFFFFFFFFFFFFFF" - $"FFFF003FD9D98383003FD9D98383003FD98383001111FFFFFFFFFFFFFFFFFFFF" - $"FFFF00D9838306003FD9D98383003FD98383001111FFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFF0000001000D9D98383003FD98383001111FFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFF000000003FD98300001111FFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFF000000111111FFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +resource(2, "ladybug") vector_icon array { + $"6E636966050501020106063E40000000000000003E400048000048000001FFC7" + $"C770FB2A2A97FD1818BEFE0808F8DB0B0BDAFF000004018D0200000250010000" + $"80D0010000FF05FF0402043D24C36524B9B624243A262E22C22237542B55C022" + $"C7634D40C2C1C4B754300202372C3C2C322C373332333C3306033A3228523C4A" + $"285631BFD7B34400024727C401B4F3402B2F542E4D305B0B0A02010002402E8B" + $"0000000000003DB13B4668BA4A02760A00010030222201178400040A01010020" + $"22220A0001031001178300040A000101201C250A0001012016320A000101202C" + $"2E0A0001012024390A030102000A040101023E29983C00CDBBD7AB3E12F54939" + $"38C565E20A040101023CD23C3DD777BDAF413CB4B44AB872C24995" }; - -resource mini_icon array { - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFF0000FFFFFF" - $"FFFFFF0000000000000000D9D90000FF" - $"FFFF00D9D9D9D9D9D9D9D9AAAAD98300" - $"FFFF0000000000000083833F3FAAAA00" - $"FFFF1111110017171301D9D9D9D9AA00" - $"FFFFFFFF000400001700D9083FD98301" - $"FFFFFF0000D1AA00170008D9D9830011" - $"FFFF00D900AA83001700D9D9830011FF" - $"FF00D98300D983001700AA830011FFFF" - $"00D98300008300AA0000AA0011FFFFFF" - $"008300D98300AA00D9830011FFFFFFFF" - $"FF00D98300D900D9830011FFFFFFFFFF" - $"FFFF0000000000000011FFFFFFFFFFFF" - $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" -}; - -#endif // HAIKU_TARGET_PLATFORM_HAIKU