diff --git a/headers/os/app/Roster.h b/headers/os/app/Roster.h index 559544ebf7..69a11a7777 100644 --- a/headers/os/app/Roster.h +++ b/headers/os/app/Roster.h @@ -183,7 +183,9 @@ private: const BList* messageList, int argc, const char* const* args, const char** environment, - team_id* appTeam) const; + team_id* appTeam, + thread_id* appThread, + bool launchSuspended) const; status_t _UpdateActiveApp(team_id team) const; diff --git a/headers/private/app/RosterPrivate.h b/headers/private/app/RosterPrivate.h index 88006f1706..33c2e507c3 100644 --- a/headers/private/app/RosterPrivate.h +++ b/headers/private/app/RosterPrivate.h @@ -30,9 +30,10 @@ class BRoster::Private { status_t Launch(const char* mimeType, const entry_ref* ref, const BList* messageList, int argc, const char* const* args, - const char** environment, team_id* appTeam) + const char** environment, team_id* appTeam, + thread_id* appThread, bool launchSuspended) { return fRoster->_LaunchApp(mimeType, ref, messageList, argc, - args, environment, appTeam); } + args, environment, appTeam, appThread, launchSuspended); } status_t ShutDown(bool reboot, bool confirm, bool synchronous) { return fRoster->_ShutDown(reboot, confirm, synchronous); } diff --git a/src/kits/app/Roster.cpp b/src/kits/app/Roster.cpp index deaef0b4a6..df8ec689d1 100644 --- a/src/kits/app/Roster.cpp +++ b/src/kits/app/Roster.cpp @@ -923,7 +923,7 @@ BRoster::Launch(const char* mimeType, BMessage* initialMessage, messageList.AddItem(initialMessage); return _LaunchApp(mimeType, NULL, &messageList, 0, NULL, - (const char**)environ, _appTeam); + (const char**)environ, _appTeam, NULL, false); } @@ -935,7 +935,7 @@ BRoster::Launch(const char* mimeType, BList* messageList, return B_BAD_VALUE; return _LaunchApp(mimeType, NULL, messageList, 0, NULL, - (const char**)environ, _appTeam); + (const char**)environ, _appTeam, NULL, false); } @@ -947,7 +947,7 @@ BRoster::Launch(const char* mimeType, int argc, const char* const* args, return B_BAD_VALUE; return _LaunchApp(mimeType, NULL, NULL, argc, args, (const char**)environ, - _appTeam); + _appTeam, NULL, false); } @@ -963,7 +963,7 @@ BRoster::Launch(const entry_ref* ref, const BMessage* initialMessage, messageList.AddItem(const_cast(initialMessage)); return _LaunchApp(NULL, ref, &messageList, 0, NULL, (const char**)environ, - _appTeam); + _appTeam, NULL, false); } @@ -975,7 +975,7 @@ BRoster::Launch(const entry_ref* ref, const BList* messageList, return B_BAD_VALUE; return _LaunchApp(NULL, ref, messageList, 0, NULL, (const char**)environ, - appTeam); + appTeam, NULL, false); } @@ -987,7 +987,7 @@ BRoster::Launch(const entry_ref* ref, int argc, const char* const* args, return B_BAD_VALUE; return _LaunchApp(NULL, ref, NULL, argc, args, (const char**)environ, - appTeam); + appTeam, NULL, false); } @@ -1800,6 +1800,10 @@ BRoster::_UpdateActiveApp(team_id team) const \c B_REFS_RECEIVED message, if no arguments are supplied via \a argc and \args. + If \a launchSuspended is set to true, the main thread of the loaded app + (returned in \a appThread) is kept in the suspended state and not + automatically resumed. + \param mimeType MIME type for which the application shall be launched. May be \c NULL. \param ref entry_ref referring to the file for which an application shall @@ -1811,6 +1815,10 @@ BRoster::_UpdateActiveApp(team_id team) const to the launched application. \param appTeam Pointer to a pre-allocated team_id variable to be set to the team ID of the launched application. + \param appThread Pointer to a pre-allocated thread_id variable to + be set to the thread ID of the launched main thread. + \param launchSuspended Indicates whether to keep the app thread in the + suspended state or resume it. \return A status code. \retval B_OK Everything went fine. @@ -1828,7 +1836,8 @@ BRoster::_UpdateActiveApp(team_id team) const status_t BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, const BList* messageList, int argc, const char* const* args, - const char** environment, team_id* _appTeam) const + const char** environment, team_id* _appTeam, + thread_id* _appThread, bool launchSuspended) const { DBG(OUT("BRoster::_LaunchApp()")); @@ -1856,6 +1865,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, status_t error = B_OK; ArgVector argVector; team_id team = -1; + thread_id appThread = -1; do { // find the app @@ -1900,7 +1910,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, if (error == B_OK && !alreadyRunning) { DBG(OUT(" token: %lu\n", appToken)); // load the app image - thread_id appThread = load_image(argVector.Count(), + appThread = load_image(argVector.Count(), const_cast(argVector.Args()), environment); // get the app team @@ -1922,7 +1932,7 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, DBG(OUT(" set thread and team: %s (%lx)\n", strerror(error), error)); // resume the launched team - if (error == B_OK) + if (error == B_OK && !launchSuspended) error = resume_thread(appThread); DBG(OUT(" resume thread: %s (%lx)\n", strerror(error), error)); @@ -1983,6 +1993,9 @@ BRoster::_LaunchApp(const char* mimeType, const entry_ref* ref, error = B_ALREADY_RUNNING; else if (_appTeam) *_appTeam = team; + + if (_appThread != NULL) + *_appThread = appThread; } DBG(OUT("BRoster::_LaunchApp() done: %s (%lx)\n", diff --git a/src/servers/launch/Job.cpp b/src/servers/launch/Job.cpp index 5cb9c985b2..374a526dd9 100644 --- a/src/servers/launch/Job.cpp +++ b/src/servers/launch/Job.cpp @@ -352,7 +352,7 @@ Job::Launch() signature << Name(); status_t status = BRoster::Private().Launch(signature.String(), NULL, - NULL, 0, NULL, &environment[0], &fTeam); + NULL, 0, NULL, &environment[0], &fTeam, NULL, false); _SetLaunchStatus(status); return status; } @@ -378,7 +378,7 @@ Job::Launch() // Launch via entry_ref status = BRoster::Private().Launch(NULL, &ref, NULL, count, &args[0], - &environment[0], &fTeam); + &environment[0], &fTeam, NULL, false); _SetLaunchStatus(status); return status; }