Debugger: add support for executable file refs

Adds support for handling executable files in the
Debugger::RefsReceived function.

This change
* makes Deskbar menu->Recent Applications->Debugger->A recently opened
  executable open the executable instead of simply opening the
  Teams window, and
* allows dragging and dropping an executable onto the application's
  icon.

Change-Id: I8e70e7929188301ce976f1f14e885236d3cb2b0a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/6299
Reviewed-by: Rene Gollent <[email protected]>
Tested-by: Automation <[email protected]>
This commit is contained in:
Zardshard
2023-04-03 21:50:03 +00:00
committed by waddlesplash
parent d0b67fcc80
commit c0a43216c6
4 changed files with 65 additions and 22 deletions
+49 -19
View File
@@ -254,6 +254,7 @@ private:
virtual void TeamDebuggerCountChanged(int32 count); virtual void TeamDebuggerCountChanged(int32 count);
private: private:
status_t _ShowStartTeamWindow(TargetHostInterface* interface);
status_t _StartNewTeam(TargetHostInterface* interface, status_t _StartNewTeam(TargetHostInterface* interface,
const char* teamPath, const char* args); const char* teamPath, const char* args);
status_t _HandleOptions(const Options& options); status_t _HandleOptions(const Options& options);
@@ -371,19 +372,13 @@ Debugger::MessageReceived(BMessage* message)
->ActiveInterfaceAt(0); ->ActiveInterfaceAt(0);
} }
BMessenger messenger(fStartTeamWindow); _ShowStartTeamWindow(hostInterface);
if (!messenger.IsValid()) {
fStartTeamWindow = StartTeamWindow::Create(hostInterface);
if (fStartTeamWindow == NULL)
break;
fStartTeamWindow->Show();
} else
fStartTeamWindow->Activate();
break; break;
} }
case MSG_START_TEAM_WINDOW_CLOSED: case MSG_START_TEAM_WINDOW_CLOSED:
{ {
fStartTeamWindow = NULL; fStartTeamWindow = NULL;
Quit();
break; break;
} }
case MSG_SHOW_CONNECTION_CONFIG_WINDOW: case MSG_SHOW_CONNECTION_CONFIG_WINDOW:
@@ -489,7 +484,7 @@ Debugger::ReadyToRun()
{ {
TargetHostInterfaceRoster* roster = TargetHostInterfaceRoster::Default(); TargetHostInterfaceRoster* roster = TargetHostInterfaceRoster::Default();
AutoLocker<TargetHostInterfaceRoster> lock(roster); AutoLocker<TargetHostInterfaceRoster> lock(roster);
if (roster->CountRunningTeamDebuggers() == 0) if (roster->CountRunningTeamDebuggers() == 0 && fStartTeamWindow == NULL)
PostMessage(MSG_SHOW_TEAMS_WINDOW); PostMessage(MSG_SHOW_TEAMS_WINDOW);
} }
@@ -517,17 +512,35 @@ Debugger::RefsReceived(BMessage* message)
if (path.SetTo(&ref) != B_OK) if (path.SetTo(&ref) != B_OK)
continue; continue;
// check, whether this is a core file ElfFile elfFile;
{ if (elfFile.Init(path.Path()) != B_OK)
ElfFile elfFile; continue;
if (elfFile.Init(path.Path()) != B_OK || elfFile.Type() != ET_CORE)
continue;
}
// handle the core file switch (elfFile.Type()) {
Options options; case ET_CORE:
options.coreFilePath = path.Path(); {
_HandleOptions(options); // open the core file
Options options;
options.coreFilePath = path.Path();
_HandleOptions(options);
break;
}
case ET_EXEC:
case ET_DYN:
{
// ask the user for arguments to pass to the executable
TargetHostInterface* hostInterface = TargetHostInterfaceRoster::Default()
->ActiveInterfaceAt(0);
status_t error = _ShowStartTeamWindow(hostInterface);
if (error != B_OK)
continue;
BMessage message(MSG_SET_TEAM_PATH);
message.AddRef("refs", &ref);
fStartTeamWindow->PostMessage(&message);
break;
}
}
} }
} }
@@ -570,6 +583,23 @@ Debugger::TeamDebuggerCountChanged(int32 count)
} }
status_t
Debugger::_ShowStartTeamWindow(TargetHostInterface* interface)
{
if (fStartTeamWindow == NULL) {
TargetHostInterface* hostInterface = TargetHostInterfaceRoster::Default()
->ActiveInterfaceAt(0);
fStartTeamWindow = StartTeamWindow::Create(hostInterface);
if (fStartTeamWindow == NULL)
return B_NO_MEMORY;
fStartTeamWindow->Show();
} else
fStartTeamWindow->Activate();
return B_OK;
}
status_t status_t
Debugger::_StartNewTeam(TargetHostInterface* interface, const char* path, Debugger::_StartNewTeam(TargetHostInterface* interface, const char* path,
const char* args) const char* args)
+1
View File
@@ -4,6 +4,7 @@ resource(1, "BEOS:APP_SIG") #'MIMS' "application/x-vnd.Haiku-Debugger";
resource app_name_catalog_entry "x-vnd.Haiku-Debugger:System name:Debugger"; resource app_name_catalog_entry "x-vnd.Haiku-Debugger:System name:Debugger";
resource file_types message { resource file_types message {
"types" = "application/x-vnd.Be-elfexecutable",
"types" = "application/x-vnd.haiku-core-file" "types" = "application/x-vnd.haiku-core-file"
}; };
@@ -19,8 +19,7 @@
enum { enum {
MSG_BROWSE_TEAM = 'brte', MSG_BROWSE_TEAM = 'brte'
MSG_SET_TEAM_PATH = 'setp'
}; };
@@ -161,7 +160,6 @@ StartTeamWindow::MessageReceived(BMessage* message)
if (alert != NULL) if (alert != NULL)
alert->Go(); alert->Go();
} else { } else {
be_app->PostMessage(MSG_START_TEAM_WINDOW_CLOSED);
PostMessage(B_QUIT_REQUESTED); PostMessage(B_QUIT_REQUESTED);
} }
break; break;
@@ -172,3 +170,11 @@ StartTeamWindow::MessageReceived(BMessage* message)
} }
} }
bool
StartTeamWindow::QuitRequested()
{
be_app->PostMessage(MSG_START_TEAM_WINDOW_CLOSED);
return true;
}
@@ -16,6 +16,11 @@ class BTextControl;
class TargetHostInterface; class TargetHostInterface;
enum {
MSG_SET_TEAM_PATH = 'setp'
};
class StartTeamWindow : public BWindow class StartTeamWindow : public BWindow
{ {
public: public:
@@ -29,6 +34,7 @@ public:
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
virtual bool QuitRequested();
virtual void Show(); virtual void Show();