diff --git a/src/kits/tracker/FSUtils.cpp b/src/kits/tracker/FSUtils.cpp index 077e0802c5..35082115ab 100644 --- a/src/kits/tracker/FSUtils.cpp +++ b/src/kits/tracker/FSUtils.cpp @@ -3022,12 +3022,20 @@ TrackerOpenWith(const BMessage *refs) return B_OK; } + static void AsynchLaunchBinder(void (*func)(const entry_ref *, const BMessage *, bool on), - const entry_ref *entry, const BMessage *message, bool on) + const entry_ref *appRef, const BMessage *refs, bool openWithOK) { - Thread::Launch(NewFunctionObject(func, entry, message, on), - B_NORMAL_PRIORITY, "LaunchTask"); + BMessage *task = new BMessage; + task->AddPointer("function", (void *)func); + task->AddMessage("refs", refs); + task->AddBool("openWithOK", openWithOK); + if (appRef != NULL) + task->AddRef("appRef", appRef); + + extern BLooper *gLaunchLooper; + gLaunchLooper->PostMessage(task); } static bool diff --git a/src/kits/tracker/Tracker.cpp b/src/kits/tracker/Tracker.cpp index 94d8dc5955..dc6ae31290 100644 --- a/src/kits/tracker/Tracker.cpp +++ b/src/kits/tracker/Tracker.cpp @@ -107,6 +107,40 @@ namespace BPrivate { NodePreloader *gPreloader = NULL; +class LaunchLooper : public BLooper { +public: + LaunchLooper() + : + BLooper("launch looper") + { + } + + virtual void + MessageReceived(BMessage *message) + { + void (*function)(const entry_ref *, const BMessage *, bool); + BMessage refs; + bool openWithOK; + entry_ref appRef; + + if (message->FindPointer("function", (void **)&function) != B_OK + || message->FindMessage("refs", &refs) != B_OK + || message->FindBool("openWithOK", &openWithOK) != B_OK) { + printf("incomplete launch message\n"); + return; + } + + if (message->FindRef("appRef", &appRef) == B_OK) + function(&appRef, &refs, openWithOK); + else + function(NULL, &refs, openWithOK); + } +}; + +BLooper *gLaunchLooper = NULL; + +// #pragma mark - + void InitIconPreloader() { @@ -204,11 +238,16 @@ TTracker::TTracker() //This is how often it should update the free space bar on the volume icons SetPulseRate(1000000); + + gLaunchLooper = new LaunchLooper(); + gLaunchLooper->Run(); } TTracker::~TTracker() { + gLaunchLooper->Lock(); + gLaunchLooper->Quit(); }