diff --git a/src/apps/pulse/CPUButton.cpp b/src/apps/pulse/CPUButton.cpp index 42701cfdf5..354a8c9432 100644 --- a/src/apps/pulse/CPUButton.cpp +++ b/src/apps/pulse/CPUButton.cpp @@ -277,7 +277,7 @@ CPUButton::MessageReceived(BMessage *message) { switch (message->what) { case B_ABOUT_REQUESTED: { - PulseApp::ShowAbout(false); + be_app->PostMessage(B_ABOUT_REQUESTED); break; } case PV_REPLICANT_PULSE: { @@ -330,7 +330,7 @@ CPUButton::AttachedToWindow() delete prefs; } else { PulseApp *pulseapp = (PulseApp *)be_app; - UpdateColors(pulseapp->prefs->normal_bar_color); + UpdateColors(pulseapp->fPrefs->normal_bar_color); _AddDragger(); } diff --git a/src/apps/pulse/DeskbarPulseView.cpp b/src/apps/pulse/DeskbarPulseView.cpp index b5be675fe3..39ac67b5ee 100644 --- a/src/apps/pulse/DeskbarPulseView.cpp +++ b/src/apps/pulse/DeskbarPulseView.cpp @@ -29,13 +29,17 @@ #define B_TRANSLATION_CONTEXT "DeskbarPulseView" -DeskbarPulseView::DeskbarPulseView(BRect rect) : MiniPulseView(rect, "DeskbarPulseView") { +DeskbarPulseView::DeskbarPulseView(BRect rect) + : MiniPulseView(rect, "DeskbarPulseView") +{ messagerunner = NULL; prefs = NULL; - prefswindow = NULL; } -DeskbarPulseView::DeskbarPulseView(BMessage *message) : MiniPulseView(message) { + +DeskbarPulseView::DeskbarPulseView(BMessage *message) + : MiniPulseView(message) +{ mode1->SetLabel(B_TRANSLATE("Normal mode")); mode1->SetMessage(new BMessage(PV_NORMAL_MODE)); mode2->SetLabel(B_TRANSLATE("Mini mode")); @@ -61,10 +65,12 @@ DeskbarPulseView::DeskbarPulseView(BMessage *message) : MiniPulseView(message) { SetViewColor(idle_color); messagerunner = NULL; - prefswindow = NULL; } -void DeskbarPulseView::AttachedToWindow() { + +void +DeskbarPulseView::AttachedToWindow() +{ BMessenger messenger(this); mode1->SetTarget(messenger); mode2->SetTarget(messenger); @@ -86,7 +92,10 @@ void DeskbarPulseView::AttachedToWindow() { 200000, -1); } -void DeskbarPulseView::MouseDown(BPoint point) { + +void +DeskbarPulseView::MouseDown(BPoint point) +{ BPoint cursor; uint32 buttons; MakeFocus(true); @@ -103,11 +112,17 @@ void DeskbarPulseView::MouseDown(BPoint point) { } else MiniPulseView::MouseDown(point); } -void DeskbarPulseView::Pulse() { + +void +DeskbarPulseView::Pulse() +{ // Override and do nothing here } -void DeskbarPulseView::MessageReceived(BMessage *message) { + +void +DeskbarPulseView::MessageReceived(BMessage *message) +{ switch (message->what) { case PV_NORMAL_MODE: SetMode(true); @@ -118,16 +133,16 @@ void DeskbarPulseView::MessageReceived(BMessage *message) { Remove(); break; case PV_PREFERENCES: - if (prefswindow != NULL) { - prefswindow->Activate(true); - break; - } - prefswindow = new PrefsWindow(prefs->prefs_window_rect, - "Pulse settings", new BMessenger(this), prefs); - prefswindow->Show(); + { + message->AddMessenger("settingsListener", this); + // Spawn the app and open the window there, not in DeskBar process. + be_roster->Launch("applicaiton/x-vnd.Haiku-Pulse", message); break; - case PV_ABOUT: { - PulseApp::ShowAbout(false); + } + case PV_ABOUT: + { + BMessage aboutRequest(B_ABOUT_REQUESTED); + be_roster->Launch("applicaiton/x-vnd.Haiku-Pulse", &aboutRequest); break; } case PV_QUIT: @@ -146,9 +161,6 @@ void DeskbarPulseView::MessageReceived(BMessage *message) { Update(); Draw(Bounds()); break; - case PRV_QUIT: - prefswindow = NULL; - break; case PV_CPU_MENU_ITEM: ChangeCPUState(message); break; @@ -158,19 +170,28 @@ void DeskbarPulseView::MessageReceived(BMessage *message) { } } -DeskbarPulseView *DeskbarPulseView::Instantiate(BMessage *data) { - if (!validate_instantiation(data, "DeskbarPulseView")) return NULL; + +DeskbarPulseView * +DeskbarPulseView::Instantiate(BMessage *data) +{ + if (!validate_instantiation(data, "DeskbarPulseView")) + return NULL; return new DeskbarPulseView(data); } -status_t DeskbarPulseView::Archive(BMessage *data, bool deep) const { +status_t +DeskbarPulseView::Archive(BMessage *data, bool deep) const +{ PulseView::Archive(data, deep); data->AddString("add_on", APP_SIGNATURE); data->AddString("class", "DeskbarPulseView"); return B_OK; } -void DeskbarPulseView::Remove() { + +void +DeskbarPulseView::Remove() +{ // Remove ourselves from the deskbar by name BDeskbar *deskbar = new BDeskbar(); status_t err = deskbar->RemoveItem("DeskbarPulseView"); @@ -187,15 +208,19 @@ void DeskbarPulseView::Remove() { delete deskbar; } -void DeskbarPulseView::SetMode(bool normal) { + +void +DeskbarPulseView::SetMode(bool normal) +{ if (normal) prefs->window_mode = NORMAL_WINDOW_MODE; else prefs->window_mode = MINI_WINDOW_MODE; prefs->Save(); be_roster->Launch(APP_SIGNATURE); } -DeskbarPulseView::~DeskbarPulseView() { + +DeskbarPulseView::~DeskbarPulseView() +{ if (messagerunner != NULL) delete messagerunner; - if (prefswindow != NULL && prefswindow->Lock()) prefswindow->Quit(); if (prefs != NULL) delete prefs; } diff --git a/src/apps/pulse/DeskbarPulseView.h b/src/apps/pulse/DeskbarPulseView.h index 984d7560f6..8ca2170fb9 100644 --- a/src/apps/pulse/DeskbarPulseView.h +++ b/src/apps/pulse/DeskbarPulseView.h @@ -15,7 +15,9 @@ #include "PrefsWindow.h" #include -class DeskbarPulseView : public MiniPulseView { + +class DeskbarPulseView : public MiniPulseView +{ public: DeskbarPulseView(BRect rect); DeskbarPulseView(BMessage *message); @@ -32,7 +34,6 @@ class DeskbarPulseView : public MiniPulseView { void Remove(); void SetMode(bool normal); - PrefsWindow *prefswindow; Prefs *prefs; BMessageRunner *messagerunner; }; diff --git a/src/apps/pulse/PrefsWindow.cpp b/src/apps/pulse/PrefsWindow.cpp index 3521b81c48..f880be57f6 100644 --- a/src/apps/pulse/PrefsWindow.cpp +++ b/src/apps/pulse/PrefsWindow.cpp @@ -135,6 +135,6 @@ PrefsWindow::MessageReceived(BMessage *message) bool PrefsWindow::QuitRequested() { - fTarget.SendMessage(new BMessage(PRV_QUIT)); + be_app->PostMessage(new BMessage(PRV_QUIT)); return true; } diff --git a/src/apps/pulse/ProgressBar.cpp b/src/apps/pulse/ProgressBar.cpp index 2b64ebd649..6857f1a7c3 100644 --- a/src/apps/pulse/ProgressBar.cpp +++ b/src/apps/pulse/ProgressBar.cpp @@ -67,7 +67,7 @@ ProgressBar::UpdateColors(int32 color, bool fade) void ProgressBar::AttachedToWindow() { - Prefs *prefs = ((PulseApp *)be_app)->prefs; + Prefs *prefs = ((PulseApp *)be_app)->fPrefs; UpdateColors(prefs->normal_bar_color, prefs->normal_fade_colors); } diff --git a/src/apps/pulse/PulseApp.cpp b/src/apps/pulse/PulseApp.cpp index f95f1165ca..4b96a03609 100644 --- a/src/apps/pulse/PulseApp.cpp +++ b/src/apps/pulse/PulseApp.cpp @@ -35,10 +35,12 @@ PulseApp::PulseApp(int argc, char **argv) - : BApplication(APP_SIGNATURE) + : BApplication(APP_SIGNATURE), + fPrefs(new Prefs()), + fRunFromReplicant(false), + fIsRunning(false), + fPrefsWindow(NULL) { - prefs = new Prefs(); - int mini = false, deskbar = false, normal = false; uint32 framecolor = 0, activecolor = 0, idlecolor = 0; @@ -84,10 +86,10 @@ PulseApp::PulseApp(int argc, char **argv) } break; case 'w': - prefs->deskbar_icon_width = atoi(optarg); - if (prefs->deskbar_icon_width < GetMinimumViewWidth()) - prefs->deskbar_icon_width = GetMinimumViewWidth(); - else if (prefs->deskbar_icon_width > 50) prefs->deskbar_icon_width = 50; + fPrefs->deskbar_icon_width = atoi(optarg); + if (fPrefs->deskbar_icon_width < GetMinimumViewWidth()) + fPrefs->deskbar_icon_width = GetMinimumViewWidth(); + else if (fPrefs->deskbar_icon_width > 50) fPrefs->deskbar_icon_width = 50; break; case 'h': case '?': @@ -100,48 +102,47 @@ PulseApp::PulseApp(int argc, char **argv) } if (deskbar) { - prefs->window_mode = DESKBAR_MODE; + fPrefs->window_mode = DESKBAR_MODE; if (activecolor != 0) - prefs->deskbar_active_color = activecolor; + fPrefs->deskbar_active_color = activecolor; if (idlecolor != 0) - prefs->deskbar_idle_color = idlecolor; + fPrefs->deskbar_idle_color = idlecolor; if (framecolor != 0) - prefs->deskbar_frame_color = framecolor; + fPrefs->deskbar_frame_color = framecolor; } else if (mini) { - prefs->window_mode = MINI_WINDOW_MODE; + fPrefs->window_mode = MINI_WINDOW_MODE; if (activecolor != 0) - prefs->mini_active_color = activecolor; + fPrefs->mini_active_color = activecolor; if (idlecolor != 0) - prefs->mini_idle_color = idlecolor; + fPrefs->mini_idle_color = idlecolor; if (framecolor != 0) - prefs->mini_frame_color = framecolor; + fPrefs->mini_frame_color = framecolor; } else if (normal) - prefs->window_mode = NORMAL_WINDOW_MODE; + fPrefs->window_mode = NORMAL_WINDOW_MODE; - prefs->Save(); - BuildPulse(); + fPrefs->Save(); +} + + +void +PulseApp::ReadyToRun() +{ + if (!fRunFromReplicant) + BuildPulse(); + + fIsRunning = true; } void PulseApp::BuildPulse() { - // Remove this case for Deskbar add on API - - // If loading the replicant fails, launch the app instead - // This allows having the replicant and the app open simultaneously - if (prefs->window_mode == DESKBAR_MODE && LoadInDeskbar()) { - PostMessage(new BMessage(B_QUIT_REQUESTED)); - return; - } else if (prefs->window_mode == DESKBAR_MODE) - prefs->window_mode = NORMAL_WINDOW_MODE; - PulseWindow *pulseWindow = NULL; - if (prefs->window_mode == MINI_WINDOW_MODE) - pulseWindow = new PulseWindow(prefs->mini_window_rect); + if (fPrefs->window_mode == MINI_WINDOW_MODE) + pulseWindow = new PulseWindow(fPrefs->mini_window_rect); else - pulseWindow = new PulseWindow(prefs->normal_window_rect); + pulseWindow = new PulseWindow(fPrefs->normal_window_rect); pulseWindow->MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN); pulseWindow->Show(); @@ -150,32 +151,75 @@ PulseApp::BuildPulse() PulseApp::~PulseApp() { - // Load the replicant after we save our preferences so they don't - // get overwritten by DeskbarPulseView's instance - prefs->Save(); - if (prefs->window_mode == DESKBAR_MODE) - LoadInDeskbar(); + fPrefs->Save(); - delete prefs; + delete fPrefs; +} + + +void +PulseApp::MessageReceived(BMessage* message) +{ + switch (message->what) { + case PV_PREFERENCES: + { + // This message can be posted before ReadyToRun from + // BRoster::Launch, in that case, take note to not show the main + // window but only the preferences + if (!fIsRunning) + fRunFromReplicant = true; + BMessenger from; + message->FindMessenger("settingsListener", &from); + + + if (fPrefsWindow != NULL) { + fPrefsWindow->Activate(true); + break; + } + // If the window is already open, bring it to the front + if (fPrefsWindow != NULL) { + fPrefsWindow->Activate(true); + break; + } + // Otherwise launch a new preferences window + PulseApp *pulseapp = (PulseApp *)be_app; + fPrefsWindow = new PrefsWindow(pulseapp->fPrefs->prefs_window_rect, + B_TRANSLATE("Pulse settings"), &from, + pulseapp->fPrefs); + if (fRunFromReplicant) { + fPrefsWindow->SetFlags(fPrefsWindow->Flags() + | B_QUIT_ON_WINDOW_CLOSE); + } + fPrefsWindow->Show(); + + break; + } + + case PV_ABOUT: + // This message can be posted before ReadyToRun from + // BRoster::Launch, in that case, take note to not show the main + // window but only the about box + if (!fIsRunning) + fRunFromReplicant = true; + PostMessage(B_ABOUT_REQUESTED); + break; + + case PRV_QUIT: + fPrefsWindow = NULL; + fRunFromReplicant = false; + break; + + default: + BApplication::MessageReceived(message); + break; + } } void PulseApp::AboutRequested() { - PulseApp::ShowAbout(true); -} - - -void -PulseApp::ShowAbout(bool asApplication) -{ - // static version to be used in replicant mode - BString name; - if (asApplication) - name = B_TRANSLATE_SYSTEM_NAME("Pulse"); - else - name = B_TRANSLATE("Pulse"); + BString name = B_TRANSLATE("Pulse"); BString message = B_TRANSLATE( "%s\n\nBy David Ramsey and Arve Hjønnevåg\n" @@ -184,6 +228,9 @@ PulseApp::ShowAbout(bool asApplication) BAlert *alert = new BAlert(B_TRANSLATE("Info"), message.String(), B_TRANSLATE("OK")); + if (fRunFromReplicant) + alert->SetFlags(alert->Flags() | B_QUIT_ON_WINDOW_CLOSE); + BTextView* view = alert->TextView(); BFont font; @@ -196,6 +243,7 @@ PulseApp::ShowAbout(bool asApplication) alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); // Use the asynchronous version so we don't block the window's thread alert->Go(NULL); + fRunFromReplicant = false; } // #pragma mark - @@ -259,10 +307,10 @@ LoadInDeskbar() } // Must be 16 pixels high, the width is retrieved from the Prefs class - int width = pulseapp->prefs->deskbar_icon_width; + int width = pulseapp->fPrefs->deskbar_icon_width; int min_width = GetMinimumViewWidth(); if (width < min_width) { - pulseapp->prefs->deskbar_icon_width = min_width; + pulseapp->fPrefs->deskbar_icon_width = min_width; width = min_width; } diff --git a/src/apps/pulse/PulseApp.h b/src/apps/pulse/PulseApp.h index 266af30d4f..97a3e2c0af 100644 --- a/src/apps/pulse/PulseApp.h +++ b/src/apps/pulse/PulseApp.h @@ -16,20 +16,28 @@ #include #include "Prefs.h" +#include "PrefsWindow.h" class PulseApp : public BApplication { public: - PulseApp(int argc, char **argv); - ~PulseApp(); + PulseApp(int argc, char **argv); + ~PulseApp(); - virtual void AboutRequested(); - static void ShowAbout(bool asApplication); - - Prefs* prefs; + virtual void MessageReceived(BMessage* message); + virtual void ReadyToRun(); + virtual void AboutRequested(); private: - void BuildPulse(); + void BuildPulse(); + +public: + Prefs* fPrefs; + +private: + bool fRunFromReplicant; + bool fIsRunning; + PrefsWindow* fPrefsWindow; }; extern bool LastEnabledCPU(unsigned int cpu); diff --git a/src/apps/pulse/PulseWindow.cpp b/src/apps/pulse/PulseWindow.cpp index c27d4ad3f2..6ae131a373 100644 --- a/src/apps/pulse/PulseWindow.cpp +++ b/src/apps/pulse/PulseWindow.cpp @@ -30,7 +30,7 @@ PulseWindow::PulseWindow(BRect rect) : BWindow(rect, B_TRANSLATE_SYSTEM_NAME("Pulse"), B_TITLED_WINDOW, - B_NOT_RESIZABLE | B_NOT_ZOOMABLE) + B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_QUIT_ON_WINDOW_CLOSE) { SetPulseRate(200000); @@ -40,10 +40,10 @@ PulseWindow::PulseWindow(BRect rect) AddChild(fNormalPulseView); fMiniPulseView = new MiniPulseView(bounds, "MiniPulseView", - pulseapp->prefs); + pulseapp->fPrefs); AddChild(fMiniPulseView); - fMode = pulseapp->prefs->window_mode; + fMode = pulseapp->fPrefs->window_mode; if (fMode == MINI_WINDOW_MODE) { SetLook(B_MODAL_WINDOW_LOOK); SetFeel(B_NORMAL_WINDOW_FEEL); @@ -53,8 +53,6 @@ PulseWindow::PulseWindow(BRect rect) ResizeTo(rect.Width(), rect.Height()); } else fMiniPulseView->Hide(); - - fPrefsWindow = NULL; } @@ -63,9 +61,9 @@ PulseWindow::~PulseWindow() PulseApp *pulseapp = (PulseApp *)be_app; if (fMode == NORMAL_WINDOW_MODE) - pulseapp->prefs->normal_window_rect = Frame(); + pulseapp->fPrefs->normal_window_rect = Frame(); else if (fMode == MINI_WINDOW_MODE) - pulseapp->prefs->mini_window_rect = Frame(); + pulseapp->fPrefs->mini_window_rect = Frame(); } @@ -85,25 +83,14 @@ PulseWindow::MessageReceived(BMessage *message) case PRV_MINI_CHANGE_COLOR: fMiniPulseView->UpdateColors(message); break; - case PRV_QUIT: - fPrefsWindow = NULL; - break; case PV_PREFERENCES: { - // If the window is already open, bring it to the front - if (fPrefsWindow != NULL) { - fPrefsWindow->Activate(true); - break; - } - // Otherwise launch a new preferences window - PulseApp *pulseapp = (PulseApp *)be_app; - fPrefsWindow = new PrefsWindow(pulseapp->prefs->prefs_window_rect, - B_TRANSLATE("Pulse settings"), new BMessenger(this), - pulseapp->prefs); - fPrefsWindow->Show(); + DetachCurrentMessage(); + message->AddMessenger("settingsListener", this); + be_app->PostMessage(message); break; } case PV_ABOUT: { - PulseApp::ShowAbout(true); + be_app->PostMessage(B_ABOUT_REQUESTED); break; } case PV_QUIT: @@ -131,27 +118,27 @@ PulseWindow::SetMode(int newmode) switch (newmode) { case PV_NORMAL_MODE: if (fMode == MINI_WINDOW_MODE) { - pulseapp->prefs->mini_window_rect = Frame(); - pulseapp->prefs->window_mode = NORMAL_WINDOW_MODE; - pulseapp->prefs->Save(); + pulseapp->fPrefs->mini_window_rect = Frame(); + pulseapp->fPrefs->window_mode = NORMAL_WINDOW_MODE; + pulseapp->fPrefs->Save(); } fMiniPulseView->Hide(); fNormalPulseView->Show(); fMode = NORMAL_WINDOW_MODE; SetType(B_TITLED_WINDOW); SetFlags(B_NOT_RESIZABLE | B_NOT_ZOOMABLE); - ResizeTo(pulseapp->prefs->normal_window_rect.IntegerWidth(), - pulseapp->prefs->normal_window_rect.IntegerHeight()); - MoveTo(pulseapp->prefs->normal_window_rect.left, - pulseapp->prefs->normal_window_rect.top); + ResizeTo(pulseapp->fPrefs->normal_window_rect.IntegerWidth(), + pulseapp->fPrefs->normal_window_rect.IntegerHeight()); + MoveTo(pulseapp->fPrefs->normal_window_rect.left, + pulseapp->fPrefs->normal_window_rect.top); MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN); break; case PV_MINI_MODE: if (fMode == NORMAL_WINDOW_MODE) { - pulseapp->prefs->normal_window_rect = Frame(); - pulseapp->prefs->window_mode = MINI_WINDOW_MODE; - pulseapp->prefs->Save(); + pulseapp->fPrefs->normal_window_rect = Frame(); + pulseapp->fPrefs->window_mode = MINI_WINDOW_MODE; + pulseapp->fPrefs->Save(); } fNormalPulseView->Hide(); fMiniPulseView->Show(); @@ -160,10 +147,10 @@ PulseWindow::SetMode(int newmode) SetFeel(B_NORMAL_WINDOW_FEEL); SetFlags(B_NOT_ZOOMABLE); SetSizeLimits(GetMinimumViewWidth() - 1, 4096, 2, 4096); - ResizeTo(pulseapp->prefs->mini_window_rect.IntegerWidth(), - pulseapp->prefs->mini_window_rect.IntegerHeight()); - MoveTo(pulseapp->prefs->mini_window_rect.left, - pulseapp->prefs->mini_window_rect.top); + ResizeTo(pulseapp->fPrefs->mini_window_rect.IntegerWidth(), + pulseapp->fPrefs->mini_window_rect.IntegerHeight()); + MoveTo(pulseapp->fPrefs->mini_window_rect.left, + pulseapp->fPrefs->mini_window_rect.top); MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN); break; @@ -171,8 +158,8 @@ PulseWindow::SetMode(int newmode) // Do not set window's mode to DESKBAR_MODE because the // destructor needs to save the correct BRect. ~PulseApp() // will handle launching the replicant after our prefs are saved. - pulseapp->prefs->window_mode = DESKBAR_MODE; - PostMessage(B_QUIT_REQUESTED); + pulseapp->fPrefs->window_mode = DESKBAR_MODE; + LoadInDeskbar(); break; } } @@ -181,6 +168,5 @@ PulseWindow::SetMode(int newmode) bool PulseWindow::QuitRequested() { - be_app->PostMessage(B_QUIT_REQUESTED); return true; } diff --git a/src/apps/pulse/PulseWindow.h b/src/apps/pulse/PulseWindow.h index 0f9b35186a..79ee0c0424 100644 --- a/src/apps/pulse/PulseWindow.h +++ b/src/apps/pulse/PulseWindow.h @@ -16,7 +16,6 @@ #include "NormalPulseView.h" #include "MiniPulseView.h" -#include "PrefsWindow.h" class PulseWindow : public BWindow { @@ -32,7 +31,6 @@ class PulseWindow : public BWindow { private: NormalPulseView* fNormalPulseView; MiniPulseView* fMiniPulseView; - PrefsWindow* fPrefsWindow; int32 fMode; };