From 3fdab584468f3b71e8a1ecc4238ed6699cfe78cd Mon Sep 17 00:00:00 2001 From: John Scipione Date: Sat, 18 Aug 2012 03:31:21 -0400 Subject: [PATCH] Set the about window object to NULL on close or quit. Pass the BHandler object that opened the about window to BAboutWindow. When the window closes, send a kAboutWindowClosed message back to the handler. This allows the handler to set the variable to NULL. Implement the new about dialog constructor in all apps that use it. Remove the old constructor. This now works reliably for all cases I tested without crashing and does the right thing on close. The setup and teardown is a bit more complicated than I wanted though. Unfortunately this seems to be necessary when not using a BAlert. Fetching the app icon does not work reliably yet. This is because for replicants the app may not be running. I may have to pass the icon in instead of grabbing it from the signature. --- headers/private/shared/AboutWindow.h | 10 ++-- src/apps/activitymonitor/ActivityView.cpp | 21 ++++++-- src/apps/deskcalc/CalcView.cpp | 34 ++++++++----- src/apps/deskcalc/CalcView.h | 4 +- .../processcontroller/ProcessController.cpp | 46 ++++++++++------- .../processcontroller/ProcessController.h | 3 +- src/kits/shared/AboutWindow.cpp | 48 ++++++------------ src/preferences/locale/LocalePreflet.cpp | 50 ++++++++++++------- 8 files changed, 120 insertions(+), 96 deletions(-) diff --git a/headers/private/shared/AboutWindow.h b/headers/private/shared/AboutWindow.h index 3741d2c3bc..c314a7c5f8 100644 --- a/headers/private/shared/AboutWindow.h +++ b/headers/private/shared/AboutWindow.h @@ -11,16 +11,16 @@ #include +const int32 kAboutWindowClosed = 'abwc'; + class AboutView; class BPoint; +class BHandler; class BAboutWindow : public BWindow { public: - BAboutWindow(const char* appName, - int32 firstCopyrightYear, - const char** authors = NULL, - const char* extraInfo = NULL); - BAboutWindow(const char* appName, + BAboutWindow(BHandler* handler, + const char* appName, const char* signature); virtual ~BAboutWindow(); diff --git a/src/apps/activitymonitor/ActivityView.cpp b/src/apps/activitymonitor/ActivityView.cpp index 664ef9a564..13959ccbbf 100644 --- a/src/apps/activitymonitor/ActivityView.cpp +++ b/src/apps/activitymonitor/ActivityView.cpp @@ -601,7 +601,9 @@ ActivityView::~ActivityView() delete fOffscreen; delete fSystemInfoHandler; - fAboutWindow->Quit(); + // replicant deleted, destroy the about window + if (fAboutWindow != NULL) + fAboutWindow->Quit(); } @@ -618,9 +620,6 @@ ActivityView::_Init(const BMessage* settings) #endif SetViewColor(B_TRANSPARENT_COLOR); - fAboutWindow = new BAboutWindow(kAppName, kSignature); - fAboutWindow->AddCopyright(2008, "Haiku, Inc."); - fLastRefresh = 0; fDrawResolution = 1; fZooming = false; @@ -648,6 +647,8 @@ ActivityView::_Init(const BMessage* settings) const char* name; for (int32 i = 0; settings->FindString("source", i, &name) == B_OK; i++) AddDataSource(DataSource::FindSource(name), settings); + + fAboutWindow = NULL; } @@ -1111,7 +1112,17 @@ ActivityView::MessageReceived(BMessage* message) switch (message->what) { case B_ABOUT_REQUESTED: - fAboutWindow->Show(); + if (fAboutWindow == NULL) { + fAboutWindow = new BAboutWindow(this, kAppName, kSignature); + fAboutWindow->AddCopyright(2008, "Haiku, Inc."); + fAboutWindow->Show(); + } else + fAboutWindow->Activate(); + + break; + + case kAboutWindowClosed: + fAboutWindow = NULL; break; case kMsgUpdateResolution: diff --git a/src/apps/deskcalc/CalcView.cpp b/src/apps/deskcalc/CalcView.cpp index 285671cf5d..814c36f543 100644 --- a/src/apps/deskcalc/CalcView.cpp +++ b/src/apps/deskcalc/CalcView.cpp @@ -184,7 +184,9 @@ CalcView::~CalcView() delete fOptions; free(fKeypadDescription); - fAboutWindow->Quit(); + // replicant deleted, destroy the about window + if (fAboutWindow != NULL) + fAboutWindow->Quit(); } @@ -268,7 +270,24 @@ CalcView::MessageReceived(BMessage* message) // (replicant) about box requested case B_ABOUT_REQUESTED: - fAboutWindow->Show(); + if (fAboutWindow == NULL) { + // create the about window + const char* extraCopyrights[] = { + "1997, 1998 R3 Software Ltd.", + NULL + }; + + fAboutWindow = new BAboutWindow(this, kAppName, kSignature); + fAboutWindow->AddCopyright(2006, "Haiku, Inc.", + extraCopyrights); + fAboutWindow->Show(); + } else + fAboutWindow->Activate(); + + break; + + case kAboutWindowClosed: + fAboutWindow = NULL; break; case MSG_UNFLASH_KEY: @@ -971,16 +990,6 @@ CalcView::SetKeypadMode(uint8 mode) void CalcView::_Init(BMessage* settings) { - // create the about window - const char* extraCopyrights[] = { - "1997, 1998 R3 Software Ltd.", - NULL - }; - - fAboutWindow = new BAboutWindow(kAppName, kSignature); - fAboutWindow->AddCopyright(2006, "Haiku, Inc.", - extraCopyrights); - // create expression text view fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); AddChild(fExpressionTextView); @@ -991,6 +1000,7 @@ CalcView::_Init(BMessage* settings) // fetch the calc icon for compact view _FetchAppIcon(fCalcIcon); + fAboutWindow = NULL; } diff --git a/src/apps/deskcalc/CalcView.h b/src/apps/deskcalc/CalcView.h index 50a121df7d..446d44dfd9 100644 --- a/src/apps/deskcalc/CalcView.h +++ b/src/apps/deskcalc/CalcView.h @@ -50,9 +50,7 @@ class CalcView : public BView { CalcView(BRect frame, rgb_color rgbBaseColor, BMessage* settings); - CalcView(BMessage* archive); - virtual ~CalcView(); virtual void AttachedToWindow(); @@ -62,7 +60,7 @@ class CalcView : public BView { virtual void MouseUp(BPoint point); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MakeFocus(bool focused = true); - virtual void ResizeTo(float width, float height); + virtual void ResizeTo(float width, float height); virtual void FrameResized(float width, float height); // Archive this view. diff --git a/src/apps/processcontroller/ProcessController.cpp b/src/apps/processcontroller/ProcessController.cpp index 8f9417554c..cbecafe1c4 100644 --- a/src/apps/processcontroller/ProcessController.cpp +++ b/src/apps/processcontroller/ProcessController.cpp @@ -204,6 +204,10 @@ ProcessController::~ProcessController() delete fMessageRunner; gPCView = NULL; + + // replicant deleted, destroy the about window + if (fAboutWindow != NULL) + fAboutWindow->Quit(); } @@ -217,10 +221,11 @@ ProcessController::Init() memset(fCPUTimes, 0, sizeof(fCPUTimes)); memset(fPrevActive, 0, sizeof(fPrevActive)); fPrevTime = 0; + fAboutWindow = NULL; } -ProcessController * +ProcessController* ProcessController::Instantiate(BMessage *data) { if (!validate_instantiation(data, kClassName)) @@ -421,7 +426,29 @@ ProcessController::MessageReceived(BMessage *message) } case B_ABOUT_REQUESTED: - AboutRequested(); + if (fAboutWindow == NULL) { + const char* extraCopyrights[] = { + "1997-2001 Georges-Edouard Berenger", + NULL + }; + + const char* authors[] = { + "Georges-Edouard Berenger", + NULL + }; + + fAboutWindow = new BAboutWindow(this, + B_TRANSLATE_SYSTEM_NAME("ProcessController"), kSignature); + fAboutWindow->AddCopyright(2007, "Haiku, Inc.", extraCopyrights); + fAboutWindow->AddAuthors(authors); + fAboutWindow->Show(); + } else + fAboutWindow->Activate(); + + break; + + case kAboutWindowClosed: + fAboutWindow = NULL; break; default: @@ -430,21 +457,6 @@ ProcessController::MessageReceived(BMessage *message) } -void -ProcessController::AboutRequested() -{ - const char* authors[] = { - "Georges-Edouard Berenger", - NULL - }; - - BAboutWindow about(B_TRANSLATE_SYSTEM_NAME("ProcessController"), 2007, authors, - "Copyright 1997-2001\n" - "Georges-Edouard Berenger."); - about.Show(); -} - - void ProcessController::DefaultColors() { diff --git a/src/apps/processcontroller/ProcessController.h b/src/apps/processcontroller/ProcessController.h index d158c6b8cb..33e3dc2bb3 100644 --- a/src/apps/processcontroller/ProcessController.h +++ b/src/apps/processcontroller/ProcessController.h @@ -25,6 +25,7 @@ #include +class BAboutWindow; class BMessageRunner; class ThreadBarMenu; @@ -44,7 +45,6 @@ class ProcessController : public BView { static ProcessController* Instantiate(BMessage* data); virtual status_t Archive(BMessage *data, bool deep = true) const; - void AboutRequested(); void Update(); void DefaultColors(); @@ -58,6 +58,7 @@ class ProcessController : public BView { private: void Init(); + BAboutWindow* fAboutWindow; bool fTemp; float fMemoryUsage; float fLastBarHeight[B_MAX_CPU_COUNT]; diff --git a/src/kits/shared/AboutWindow.cpp b/src/kits/shared/AboutWindow.cpp index 74dbef066c..c480033bbd 100644 --- a/src/kits/shared/AboutWindow.cpp +++ b/src/kits/shared/AboutWindow.cpp @@ -208,27 +208,15 @@ AboutView::AppIcon(const char* signature) if (signature == NULL) return NULL; - app_info appInfo; - if (be_roster->GetAppInfo(signature, &appInfo) != B_OK) + entry_ref ref; + if (be_roster->FindApp(signature, &ref) != B_OK) return NULL; - BFile file(&appInfo.ref, B_READ_ONLY); - BAppFileInfo appMime(&file); - if (appMime.InitCheck() != B_OK) - return NULL; - - // fetch the app icon BBitmap* icon = new BBitmap(BRect(0.0, 0.0, 127.0, 127.0), B_RGBA32); - if (appMime.GetIcon(icon, B_LARGE_ICON) == B_OK) - return icon; - - // couldn't find the app icon - // fetch the generic 3 boxes icon - BMimeType defaultAppMime; - defaultAppMime.SetTo(B_APP_MIME_TYPE); - if (defaultAppMime.GetIcon(icon, B_LARGE_ICON) == B_OK) + if (BNodeInfo::GetTrackerIcon(&ref, icon) == B_OK) return icon; + delete icon; return NULL; } @@ -236,23 +224,11 @@ AboutView::AppIcon(const char* signature) // #pragma mark - -BAboutWindow::BAboutWindow(const char* appName, int32 firstCopyrightYear, - const char** authors, const char* extraInfo) - : BWindow(BRect(0.0, 0.0, 200.0, 140.0), appName, B_TITLED_WINDOW, - B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE - | B_AUTO_UPDATE_SIZE_LIMITS) -{ - _Init(appName, NULL); - AddCopyright(firstCopyrightYear, "Haiku, Inc.", NULL); - AddAuthors(authors); - AddExtraInfo(extraInfo); -} - - -BAboutWindow::BAboutWindow(const char* appName, const char* signature) +BAboutWindow::BAboutWindow(BHandler* handler, const char* appName, const char* signature) : BWindow(BRect(0.0, 0.0, 310.0, 140.0), appName, B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE - | B_AUTO_UPDATE_SIZE_LIMITS) + | B_AUTO_UPDATE_SIZE_LIMITS), + fCaller(handler) { _Init(appName, signature); } @@ -269,10 +245,14 @@ BAboutWindow::~BAboutWindow() bool BAboutWindow::QuitRequested() { - while (!IsHidden()) - Hide(); + if (fCaller != NULL) { + status_t status; + BMessenger messenger(fCaller, NULL, &status); + if (status == B_OK && messenger.IsValid()) + messenger.SendMessage(new BMessage(kAboutWindowClosed)); + } - return false; + return true; } diff --git a/src/preferences/locale/LocalePreflet.cpp b/src/preferences/locale/LocalePreflet.cpp index 5db4bfb600..81dc7eda44 100644 --- a/src/preferences/locale/LocalePreflet.cpp +++ b/src/preferences/locale/LocalePreflet.cpp @@ -21,6 +21,7 @@ #define B_TRANSLATION_CONTEXT "Locale Preflet" +const char* kAppName = B_TRANSLATE("Locale"); const char* kSignature = "application/x-vnd.Haiku-Locale"; @@ -29,13 +30,13 @@ class LocalePreflet : public BApplication { LocalePreflet(); virtual ~LocalePreflet(); - virtual void AboutRequested(); virtual void MessageReceived(BMessage* message); private: status_t _RestartApp(const char* signature) const; LocaleWindow* fLocaleWindow; + BAboutWindow* fAboutWindow; }; @@ -44,30 +45,19 @@ private: LocalePreflet::LocalePreflet() : - BApplication(kSignature) + BApplication(kSignature), + fLocaleWindow(new LocaleWindow()), + fAboutWindow(NULL) { - fLocaleWindow = new LocaleWindow(); - fLocaleWindow->Show(); } LocalePreflet::~LocalePreflet() { -} - - -void -LocalePreflet::AboutRequested() -{ - const char* authors[] = { - "Axel Dörfler", - "Adrien Destugues", - "Oliver Tappe", - NULL - }; - BAboutWindow about(B_TRANSLATE("Locale"), 2005, authors); - about.Show(); + // replicant deleted, destroy the about window + if (fAboutWindow != NULL) + fAboutWindow->Quit(); } @@ -81,7 +71,29 @@ LocalePreflet::MessageReceived(BMessage* message) _RestartApp("application/x-vnd.Be-TSKB"); } break; - + + case B_ABOUT_REQUESTED: + if (fAboutWindow == NULL) { + const char* authors[] = { + "Axel Dörfler", + "Adrien Destugues", + "Oliver Tappe", + NULL + }; + + fAboutWindow = new BAboutWindow(this, kAppName, kSignature); + fAboutWindow->AddCopyright(2005, "Haiku, Inc."); + fAboutWindow->AddAuthors(authors); + fAboutWindow->Show(); + } else + fAboutWindow->Activate(); + + break; + + case kAboutWindowClosed: + fAboutWindow = NULL; + break; + default: BApplication::MessageReceived(message); break;