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 <waddlesplash@gmail.com>
This commit is contained in:
Adrien Destugues 2019-05-18 12:19:57 +02:00 committed by waddlesplash
parent 1c397f231c
commit 515d86dace
6 changed files with 197 additions and 94 deletions

BIN
data/artwork/icons/Misc_Bug Normal file

Binary file not shown.

View File

@ -1,10 +1,13 @@
/*
* Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk.
* Copyright 2011-2014, Rene Gollent, rene@gollent.com.
* Copyright 2005-2009, Ingo Weinhold, bonefish@users.sf.net.
* Distributed under the terms of the MIT License.
*/
#include "DebugWindow.h"
#include <map>
#include <errno.h>
@ -13,16 +16,13 @@
#include <strings.h>
#include <unistd.h>
#include <Alert.h>
#include <AppMisc.h>
#include <AutoDeleter.h>
#include <Autolock.h>
#include <Catalog.h>
#include <debug_support.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <Invoker.h>
#include <Locale.h>
#include <Path.h>
#include <DriverSettings.h>
@ -36,28 +36,10 @@
#include <util/DoublyLinkedList.h>
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

View File

@ -0,0 +1,136 @@
/*
* Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk.
* Distributed under the terms of the MIT License.
*/
#include "DebugWindow.h"
#include <stdio.h>
#include <Button.h>
#include <Catalog.h>
#include <GroupLayout.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <IconUtils.h>
#include <Resources.h>
#include <RadioButton.h>
#include <StripeView.h>
#include <TextView.h>
#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;
}

View File

@ -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 <Bitmap.h>
#include <Window.h>
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 */

View File

@ -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
;

View File

@ -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