diff --git a/src/apps/mediaplayer/MainApp.cpp b/src/apps/mediaplayer/MainApp.cpp index 4d8a530841..87e7ebfe98 100644 --- a/src/apps/mediaplayer/MainApp.cpp +++ b/src/apps/mediaplayer/MainApp.cpp @@ -46,7 +46,6 @@ const char* kAppSig = "application/x-vnd.Haiku-MediaPlayer"; static const char* kMediaServerSig = B_MEDIA_SERVER_SIGNATURE; static const char* kMediaServerAddOnSig = "application/x-vnd.Be.addon-host"; - MainApp::MainApp() : BApplication(kAppSig), @@ -59,7 +58,10 @@ MainApp::MainApp() fLastFilePanelFolder(), fMediaServerRunning(false), - fMediaAddOnServerRunning(false) + fMediaAddOnServerRunning(false), + + fAudioWindowFrameSaved(false), + fLastSavedAudioWindowCreationTime(0) { mpSettings settings = Settings::CurrentSettings(); fLastFilePanelFolder = settings.filePanelFolder; @@ -107,7 +109,7 @@ MainApp::NewWindow() { BAutolock _(this); fPlayerCount++; - BWindow* window = new MainWin(); + BWindow* window = new MainWin(fFirstWindow == NULL); if (fFirstWindow == NULL) fFirstWindow = window; return window; @@ -219,10 +221,36 @@ MainApp::MessageReceived(BMessage* message) { switch (message->what) { case M_PLAYER_QUIT: + { + // store the window settings of this instance + MainWin* window = NULL; + bool audioOnly = false; + BRect windowFrame; + bigtime_t creationTime; + if (message->FindPointer("instance", (void**)&window) == B_OK + && message->FindBool("audio only", &audioOnly) == B_OK + && message->FindRect("window frame", &windowFrame) == B_OK + && message->FindInt64("creation time", &creationTime) == B_OK) { + if (window == fFirstWindow) + fFirstWindow = NULL; + if (audioOnly) { + if (!fAudioWindowFrameSaved + || creationTime < fLastSavedAudioWindowCreationTime) { + fAudioWindowFrameSaved = true; + fLastSavedAudioWindowCreationTime = creationTime; + mpSettings settings + = Settings::Default()->CurrentSettings(); + settings.audioPlayerWindowFrame = windowFrame; + Settings::Default()->SaveSettings(settings); + } + } + } + // quit if this was the last player window fPlayerCount--; if (fPlayerCount == 0) PostMessage(B_QUIT_REQUESTED); break; + } case B_SOME_APP_LAUNCHED: case B_SOME_APP_QUIT: @@ -288,7 +316,8 @@ MainApp::MessageReceived(BMessage* message) case M_SAVE_PANEL_RESULT: _HandleSavePanelResult(message); break; - case B_CANCEL: { + case B_CANCEL: + { // The user canceled a file panel, but store at least the current // file panel folder. uint32 oldWhat; diff --git a/src/apps/mediaplayer/MainApp.h b/src/apps/mediaplayer/MainApp.h index e0e792c31b..25cc6ff967 100644 --- a/src/apps/mediaplayer/MainApp.h +++ b/src/apps/mediaplayer/MainApp.h @@ -96,6 +96,9 @@ private: bool fMediaServerRunning; bool fMediaAddOnServerRunning; + + bool fAudioWindowFrameSaved; + bigtime_t fLastSavedAudioWindowCreationTime; }; extern MainApp* gMainApp; diff --git a/src/apps/mediaplayer/MainWin.cpp b/src/apps/mediaplayer/MainWin.cpp index 44e7f0043e..df7050dd40 100644 --- a/src/apps/mediaplayer/MainWin.cpp +++ b/src/apps/mediaplayer/MainWin.cpp @@ -100,10 +100,11 @@ enum { //#define printf(a...) -MainWin::MainWin() +MainWin::MainWin(bool isFirstWindow) : - BWindow(BRect(100,100,400,300), NAME, B_TITLED_WINDOW, + BWindow(BRect(100, 100, 400, 300), NAME, B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS /* | B_WILL_ACCEPT_FIRST_CLICK */), + fCreationTime(system_time()), fInfoWin(NULL), fPlaylistWindow(NULL), fHasFile(false), @@ -130,6 +131,15 @@ MainWin::MainWin() MoveBy(pos * 25, pos * 25); pos = (pos + 1) % 15; + if (isFirstWindow) { + BRect frame = Settings::Default() + ->CurrentSettings().audioPlayerWindowFrame; + if (frame.IsValid()) { + MoveTo(frame.LeftTop()); + ResizeTo(frame.Width(), frame.Height()); + } + } + BRect rect = Bounds(); // background @@ -697,7 +707,26 @@ MainWin::WindowActivated(bool active) bool MainWin::QuitRequested() { - be_app->PostMessage(M_PLAYER_QUIT); + BMessage message(M_PLAYER_QUIT); + message.AddPointer("instance", this); + message.AddRect("window frame", Frame()); + message.AddBool("audio only", !fHasVideo); + message.AddInt64("creation time", fCreationTime); + if (!fHasVideo && fHasAudio) { + // store playlist and position if this is audio + BMessage playlistArchive; + + BAutolock controllerLocker(fController); + playlistArchive.AddInt64("position", fController->TimePosition()); + controllerLocker.Unlock(); + + BAutolock playlistLocker(fPlaylist); + if (fPlaylist->Archive(&playlistArchive) != B_OK + || message.AddMessage("playlist", &playlistArchive) != B_OK) { + fprintf(stderr, "Failed to store current playlist.\n"); + } + } + be_app->PostMessage(&message); return true; } @@ -917,7 +946,7 @@ MainWin::_SetupWindow() if (!fIsFullscreen) { // Resize to 100% but stay on screen - _ResizeWindow(100, true); + _ResizeWindow(100, !fHasVideo, true); } else { // Make sure we relayout the video view when in full screen mode FrameResized(Frame().Width(), Frame().Height()); @@ -1181,7 +1210,7 @@ MainWin::_CurrentVideoSizeInPercent() const void -MainWin::_ResizeWindow(int percent, bool stayOnScreen) +MainWin::_ResizeWindow(int percent, bool keepWidth, bool stayOnScreen) { // Get required window size int videoWidth; @@ -1197,6 +1226,8 @@ MainWin::_ResizeWindow(int percent, bool stayOnScreen) _GetMinimumWindowSize(width, height); width = max_c(width, videoWidth) - 1; + if (keepWidth) + width = max_c(width, (int)Frame().Width()); height = height + videoHeight - 1; if (stayOnScreen) { diff --git a/src/apps/mediaplayer/MainWin.h b/src/apps/mediaplayer/MainWin.h index 13ebc63a14..979859403b 100644 --- a/src/apps/mediaplayer/MainWin.h +++ b/src/apps/mediaplayer/MainWin.h @@ -43,7 +43,7 @@ class PlaylistWindow; class MainWin : public BWindow { public: - MainWin(); + MainWin(bool isFirstWindow); virtual ~MainWin(); virtual void FrameResized(float newWidth, float newHeight); @@ -86,6 +86,7 @@ private: int& videoHeight) const; int _CurrentVideoSizeInPercent() const; void _ResizeWindow(int percent, + bool keepWidth = false, bool stayOnScreen = false); void _ResizeVideoView(int x, int y, int width, int height); @@ -114,6 +115,8 @@ private: void _AdoptGlobalSettings(); + bigtime_t fCreationTime; + BMenuBar* fMenuBar; BView* fBackground; VideoView* fVideoView; diff --git a/src/apps/mediaplayer/settings/Settings.cpp b/src/apps/mediaplayer/settings/Settings.cpp index 28a22db20b..4b2bff938b 100644 --- a/src/apps/mediaplayer/settings/Settings.cpp +++ b/src/apps/mediaplayer/settings/Settings.cpp @@ -22,7 +22,8 @@ mpSettings::operator!=(const mpSettings& other) const || useOverlays != other.useOverlays || scaleBilinear != other.scaleBilinear || backgroundMovieVolumeMode != other.backgroundMovieVolumeMode - || filePanelFolder != other.filePanelFolder; + || filePanelFolder != other.filePanelFolder + || audioPlayerWindowFrame != other.audioPlayerWindowFrame; } @@ -58,6 +59,9 @@ Settings::LoadSettings(mpSettings& settings) const // an "unset" entry_ref settings.filePanelFolder = fSettingsMessage.GetValue( "filePanelDirectory", defaultFilePanelFolder); + + settings.audioPlayerWindowFrame = fSettingsMessage.GetValue( + "audioPlayerWindowFrame", BRect()); } @@ -83,6 +87,9 @@ Settings::SaveSettings(const mpSettings& settings) fSettingsMessage.SetValue("filePanelDirectory", settings.filePanelFolder); + fSettingsMessage.SetValue("audioPlayerWindowFrame", + settings.audioPlayerWindowFrame); + // Save at this point, although saving is also done on destruction, // this will make sure the settings are saved even when the player // crashes. @@ -103,7 +110,7 @@ Settings::CurrentSettings() { mpSettings settings; sGlobalInstance.LoadSettings(settings); - return settings; + return settings; } diff --git a/src/apps/mediaplayer/settings/Settings.h b/src/apps/mediaplayer/settings/Settings.h index 86bdd58ce7..13b031d332 100644 --- a/src/apps/mediaplayer/settings/Settings.h +++ b/src/apps/mediaplayer/settings/Settings.h @@ -32,6 +32,8 @@ struct mpSettings { entry_ref filePanelFolder; bool operator!=(const mpSettings& other) const; + + BRect audioPlayerWindowFrame; }; #define SETTINGS_FILENAME "MediaPlayer"