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:
parent
1c397f231c
commit
515d86dace
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -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 */
|
|
@ -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
|
||||
;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue