diff --git a/src/apps/people/PeopleApp.cpp b/src/apps/people/PeopleApp.cpp index 6f49470ca8..09f448038c 100644 --- a/src/apps/people/PeopleApp.cpp +++ b/src/apps/people/PeopleApp.cpp @@ -49,7 +49,7 @@ struct people_field gFields[] = { TPeopleApp::TPeopleApp(void) : BApplication(APP_SIG), - fHaveWindow(false) + fWindowCount(0) { fPosition.Set(6, TITLE_BAR_HEIGHT, 6 + WIND_WIDTH, TITLE_BAR_HEIGHT + WIND_HEIGHT); BPoint pos = fPosition.LeftTop(); @@ -179,9 +179,17 @@ TPeopleApp::MessageReceived(BMessage *msg) { switch (msg->what) { case M_NEW: + case B_SILENT_RELAUNCH: NewWindow(); break; + case M_WINDOW_QUITS: + SavePreferences(msg); + fWindowCount--; + if (fWindowCount < 1) + PostMessage(B_QUIT_REQUESTED); + break; + default: BApplication::MessageReceived(msg); } @@ -212,7 +220,7 @@ TPeopleApp::RefsReceived(BMessage *message) void TPeopleApp::ReadyToRun(void) { - if (!fHaveWindow) + if (fWindowCount < 1) NewWindow(); } @@ -224,7 +232,7 @@ TPeopleApp::NewWindow(entry_ref *ref) window = new TPeopleWindow(fPosition, "New Person", ref); window->Show(); - fHaveWindow = true; + fWindowCount++; fPosition.OffsetBy(20, 20); if (fPosition.bottom > BScreen(B_MAIN_SCREEN_ID).Frame().bottom) @@ -248,3 +256,20 @@ TPeopleApp::FindWindow(entry_ref ref) } return NULL; } + + +void +TPeopleApp::SavePreferences(BMessage* message) +{ + BRect frame; + if (message->FindRect("frame", &frame) != B_OK) + return; + + BPoint leftTop = frame.LeftTop(); + + if (fPrefs) { + fPrefs->Seek(0, 0); + fPrefs->Write(&leftTop, sizeof(BPoint)); + } +} + diff --git a/src/apps/people/PeopleApp.h b/src/apps/people/PeopleApp.h index cf1f677e54..8e69ed5416 100644 --- a/src/apps/people/PeopleApp.h +++ b/src/apps/people/PeopleApp.h @@ -34,7 +34,8 @@ enum messages{ M_UNDO, M_SELECT, M_GROUP_MENU, M_DIRTY, M_NAME, M_NICKNAME, M_COMPANY, M_ADDRESS, M_CITY, M_STATE, M_ZIP, M_COUNTRY, M_HPHONE, - M_WPHONE, M_FAX, M_EMAIL, M_URL, M_GROUP + M_WPHONE, M_FAX, M_EMAIL, M_URL, M_GROUP, + M_WINDOW_QUITS }; enum fields { @@ -63,8 +64,11 @@ class TPeopleApp : public BApplication { BFile *fPrefs; private: - bool fHaveWindow; + void SavePreferences(BMessage* message); + + uint32 fWindowCount; BRect fPosition; }; #endif /* PEOPLEAPP_H */ + diff --git a/src/apps/people/PeopleWindow.cpp b/src/apps/people/PeopleWindow.cpp index baa5226163..dda65d41fd 100644 --- a/src/apps/people/PeopleWindow.cpp +++ b/src/apps/people/PeopleWindow.cpp @@ -44,7 +44,7 @@ TPeopleWindow::TPeopleWindow(BRect frame, const char *title, entry_ref *ref) menu = new BMenu("File"); menu->AddItem(item = new BMenuItem("New Person" B_UTF8_ELLIPSIS, new BMessage(M_NEW), 'N')); item->SetTarget(NULL, be_app); - menu->AddItem(new BMenuItem("Close", new BMessage(B_CLOSE_REQUESTED), 'W')); + menu->AddItem(new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED), 'W')); menu->AddSeparatorItem(); menu->AddItem(fSave = new BMenuItem("Save", new BMessage(M_SAVE), 'S')); fSave->SetEnabled(FALSE); @@ -52,7 +52,9 @@ TPeopleWindow::TPeopleWindow(BRect frame, const char *title, entry_ref *ref) menu->AddItem(fRevert = new BMenuItem("Revert", new BMessage(M_REVERT), 'R')); fRevert->SetEnabled(FALSE); menu->AddSeparatorItem(); - menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q')); + item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'); + item->SetTarget(NULL, be_app); + menu->AddItem(item); menuBar->AddItem(menu); menu = new BMenu("Edit"); @@ -93,7 +95,6 @@ TPeopleWindow::~TPeopleWindow(void) WatchChanges(false); delete fRef; - delete fPanel; } @@ -268,12 +269,9 @@ TPeopleWindow::MessageReceived(BMessage* msg) bool TPeopleWindow::QuitRequested(void) { - int32 count = 0; - int32 index = 0; - BPoint pos; - BRect r; - status_t result; - TPeopleWindow *window; + printf("TPeopleWindow::QuitRequested(void)\n"); + + status_t result; if (fView->CheckSave()) { result = (new BAlert("", "Save changes before quitting?", @@ -289,20 +287,16 @@ TPeopleWindow::QuitRequested(void) return false; } - while ((window = (TPeopleWindow *)be_app->WindowAt(index++))) { - if (window->FindView("PeopleView")) - count++; - } + if (fPanel) + delete fPanel; - if (count == 1) { - r = Frame(); - pos = r.LeftTop(); - if (((TPeopleApp*)be_app)->fPrefs) { - ((TPeopleApp*)be_app)->fPrefs->Seek(0, 0); - ((TPeopleApp*)be_app)->fPrefs->Write(&pos, sizeof(BPoint)); - } - be_app->PostMessage(B_QUIT_REQUESTED); + BMessage message(M_WINDOW_QUITS); + message.AddRect("frame", Frame()); + if (be_app->Lock()) { + be_app->PostMessage(&message); + be_app->Unlock(); } + return true; }