2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 #include "launchersetup.h"
12 #include "wx/filename.h"
13 #include "wx/stdpaths.h"
16 #include "osregistry.h"
20 #include <sys/types.h>
25 #include "res/fs2_background.xpm"
26 #include "res/fs2_btn_help.xpm"
27 #include "res/fs2_btn_help-hover.xpm"
28 #include "res/fs2_btn_help-click.xpm"
29 #include "res/fs2_btn_play.xpm"
30 #include "res/fs2_btn_play-hover.xpm"
31 #include "res/fs2_btn_play-click.xpm"
32 #include "res/fs2_btn_pxo.xpm"
33 #include "res/fs2_btn_pxo-hover.xpm"
34 #include "res/fs2_btn_pxo-click.xpm"
35 #include "res/fs2_btn_quit.xpm"
36 #include "res/fs2_btn_quit-hover.xpm"
37 #include "res/fs2_btn_quit-click.xpm"
38 #include "res/fs2_btn_readme.xpm"
39 #include "res/fs2_btn_readme-hover.xpm"
40 #include "res/fs2_btn_readme-click.xpm"
41 #include "res/fs2_btn_setup.xpm"
42 #include "res/fs2_btn_setup-hover.xpm"
43 #include "res/fs2_btn_setup-click.xpm"
44 #include "res/fs2_btn_uninstall.xpm"
45 #include "res/fs2_btn_uninstall-hover.xpm"
46 #include "res/fs2_btn_uninstall-click.xpm"
47 #include "res/fs2_btn_update.xpm"
48 #include "res/fs2_btn_update-hover.xpm"
49 #include "res/fs2_btn_update-click.xpm"
50 #include "res/fs2_btn_volition.xpm"
51 #include "res/fs2_btn_volition-hover.xpm"
52 #include "res/fs2_btn_volition-click.xpm"
54 #include "res/fs2_snd_hover_wav.inc"
55 #include "res/fs2_snd_click_wav.inc"
57 #include "res/freespace_img.xpm"
58 #include "res/volition_img.xpm"
63 class LauncherApp: public wxApp
66 virtual bool OnInit();
70 IMPLEMENT_APP(LauncherApp)
72 bool LauncherApp::OnInit()
75 // make sure we create files with user access only
76 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
79 Launcher *frame = new Launcher(NULL);
89 bool wxBackgroundBitmap::ProcessEvent(wxEvent &Event)
91 if (Event.GetEventType() == wxEVT_ERASE_BACKGROUND) {
92 wxEraseEvent &EraseEvent = dynamic_cast<wxEraseEvent &>(Event);
93 wxDC *DC = EraseEvent.GetDC();
94 DC->DrawBitmap(Bitmap, 0, 0, false);
98 return Inherited::ProcessEvent(Event);
103 wxBEGIN_EVENT_TABLE(wxLauncherButton, wxStaticBitmap)
104 EVT_LEFT_DOWN(wxLauncherButton::onMouseDown)
105 EVT_LEFT_UP(wxLauncherButton::onMouseUp)
106 EVT_MOTION(wxLauncherButton::onMouseEnter)
110 wxLauncherButton::wxLauncherButton(wxWindow *parent, wxWindowID id, const wxBitmap& label, const wxPoint& pos, const wxSize& size)
112 this->Create(parent, id, label, pos, size);
114 parent->Connect(wxEVT_MOTION, wxMouseEventHandler(wxLauncherButton::onMouseLeave), NULL, this);
121 wxLauncherButton::~wxLauncherButton()
125 void wxLauncherButton::onMouseEnter(wxMouseEvent& event)
128 this->SetBitmap(m_bitmap_hover);
130 ((Launcher*)GetGrandParent())->SndPlayHover();
134 // hack to toggle off certain buttons that don't get the onMouseLeave
135 // call due to placement/overlap
139 const wxWindowList wl = GetParent()->GetChildren();
141 wxWindowList::compatibility_iterator node = wl.GetFirst();
144 wxLauncherButton *cur = (wxLauncherButton*)node->GetData();
146 if ( cur->GetId() != event.GetId() ) {
147 cur->onMouseLeave(mv);
150 node = node->GetNext();
158 void wxLauncherButton::onMouseLeave(wxMouseEvent& event)
161 this->SetBitmap(m_bitmap);
169 void wxLauncherButton::onMouseDown(wxMouseEvent& event)
171 this->SetBitmap(m_bitmap_pressed);
173 ((Launcher*)GetGrandParent())->SndPlayPressed();
178 void wxLauncherButton::onMouseUp(wxMouseEvent& event)
180 this->SetBitmap(m_bitmap_hover);
182 wxCommandEvent ev(wxEVT_COMMAND_BUTTON_CLICKED, event.GetId());
183 GetGrandParent()->GetEventHandler()->ProcessEvent(ev);
189 wxBEGIN_EVENT_TABLE(Launcher, wxDialog)
190 EVT_CLOSE(Launcher::OnClose)
191 EVT_BUTTON(ID_B_PLAY, Launcher::OnPlay)
192 EVT_BUTTON(ID_B_SETUP, Launcher::OnSetup)
193 EVT_BUTTON(ID_B_README, Launcher::OnReadme)
194 EVT_BUTTON(ID_B_UPDATE, Launcher::OnUpdate)
195 EVT_BUTTON(ID_B_HELP, Launcher::OnHelp)
196 EVT_BUTTON(ID_B_UNINSTALL, Launcher::OnUninstall)
197 EVT_BUTTON(ID_B_VOLITION, Launcher::OnVolition)
198 EVT_BUTTON(ID_B_PXO, Launcher::OnPXO)
199 EVT_BUTTON(ID_B_QUIT, Launcher::OnQuit)
203 Launcher::Launcher( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style )
204 : wxDialog( parent, id, title, pos, size, style )
206 this->SetBackgroundColour( wxColour( 0, 0, 0 ) );
211 this->SetClientSize(375, 440);
212 this->SetTitle( wxT("FreeSpace 2 Launcher") );
217 p_background = new wxBackgroundBitmap(fs2_background_xpm);
219 m_panel = new wxPanel(this);
220 m_panel->PushEventHandler(p_background);
223 m_btn_Play = new wxLauncherButton( m_panel, ID_B_PLAY, wxBitmap(fs2_btn_play_xpm), wxPoint(45, 102), wxSize(131, 58) );
224 m_btn_Play->SetBitmapHover( wxBitmap(fs2_btn_play_hover_xpm) );
225 m_btn_Play->SetBitmapPressed( wxBitmap(fs2_btn_play_click_xpm) );
227 m_btn_Setup = new wxLauncherButton( m_panel, ID_B_SETUP, wxBitmap(fs2_btn_setup_xpm), wxPoint(199, 102), wxSize(131, 58) );
228 m_btn_Setup->SetBitmapHover( wxBitmap(fs2_btn_setup_hover_xpm) );
229 m_btn_Setup->SetBitmapPressed( wxBitmap(fs2_btn_setup_click_xpm) );
231 m_btn_Readme = new wxLauncherButton( m_panel, ID_B_README, wxBitmap(fs2_btn_readme_xpm), wxPoint(45, 175), wxSize(131, 58) );
232 m_btn_Readme->SetBitmapHover( wxBitmap(fs2_btn_readme_hover_xpm) );
233 m_btn_Readme->SetBitmapPressed( wxBitmap(fs2_btn_readme_click_xpm) );
235 m_btn_Update = new wxLauncherButton( m_panel, ID_B_UPDATE, wxBitmap(fs2_btn_update_xpm), wxPoint(199, 175), wxSize(131, 58) );
236 m_btn_Update->SetBitmapHover( wxBitmap(fs2_btn_update_hover_xpm) );
237 m_btn_Update->SetBitmapPressed( wxBitmap(fs2_btn_update_click_xpm) );
239 m_btn_Help = new wxLauncherButton( m_panel, ID_B_HELP, wxBitmap(fs2_btn_help_xpm), wxPoint(45, 247), wxSize(131, 58) );
240 m_btn_Help->SetBitmapHover( wxBitmap(fs2_btn_help_hover_xpm) );
241 m_btn_Help->SetBitmapPressed( wxBitmap(fs2_btn_help_click_xpm) );
243 m_btn_Uninstall = new wxLauncherButton( m_panel, ID_B_UNINSTALL, wxBitmap(fs2_btn_uninstall_xpm), wxPoint(199, 247), wxSize(131, 58) );
244 m_btn_Uninstall->SetBitmapHover( wxBitmap(fs2_btn_uninstall_hover_xpm) );
245 m_btn_Uninstall->SetBitmapPressed( wxBitmap(fs2_btn_uninstall_click_xpm) );
247 m_btn_Volition = new wxLauncherButton( m_panel, ID_B_VOLITION, wxBitmap(fs2_btn_volition_xpm), wxPoint(15, 304), wxSize(90, 108) );
248 m_btn_Volition->SetBitmapHover( wxBitmap(fs2_btn_volition_hover_xpm) );
249 m_btn_Volition->SetBitmapPressed( wxBitmap(fs2_btn_volition_click_xpm) );
251 m_btn_PXO = new wxLauncherButton( m_panel, ID_B_PXO, wxBitmap(fs2_btn_pxo_xpm), wxPoint(249, 305), wxSize(114, 113) );
252 m_btn_PXO->SetBitmapHover( wxBitmap(fs2_btn_pxo_hover_xpm) );
253 m_btn_PXO->SetBitmapPressed( wxBitmap(fs2_btn_pxo_click_xpm) );
255 m_btn_Quit = new wxLauncherButton( m_panel, ID_B_QUIT, wxBitmap(fs2_btn_quit_xpm), wxPoint(116, 339), wxSize(131, 58) );
256 m_btn_Quit->SetBitmapHover( wxBitmap(fs2_btn_quit_hover_xpm) );
257 m_btn_Quit->SetBitmapPressed( wxBitmap(fs2_btn_quit_click_xpm) );
259 this->SetSizeHints( wxDefaultSize, wxDefaultSize );
260 this->SetTitle( wxT("FreeSpace Launcher") );
263 bSizer3 = new wxBoxSizer( wxVERTICAL );
265 wxStaticBitmap *m_bitmap1 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( freespace_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
266 bSizer3->Add( m_bitmap1, 0, wxALIGN_LEFT|wxALIGN_TOP|wxALL, 5 );
268 wxFlexGridSizer* fgSizer3;
269 fgSizer3 = new wxFlexGridSizer( 0, 2, 0, 0 );
270 fgSizer3->SetFlexibleDirection( wxBOTH );
271 fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
273 wxStaticBitmap *m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, wxBitmap( volition_img_xpm ), wxDefaultPosition, wxDefaultSize, 0 );
274 fgSizer3->Add( m_bitmap2, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
277 bSizer5 = new wxBoxSizer( wxVERTICAL );
279 m_btn_Play = new wxButton( this, ID_B_PLAY, wxT("Play FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
280 m_btn_Play->SetDefault();
281 bSizer5->Add( m_btn_Play, 0, wxALL|wxEXPAND, 5 );
283 m_btn_Setup = new wxButton( this, ID_B_SETUP, wxT("Setup"), wxDefaultPosition, wxDefaultSize, 0 );
284 bSizer5->Add( m_btn_Setup, 0, wxALL|wxEXPAND, 5 );
286 m_btn_Readme = new wxButton( this, ID_B_README, wxT("View README"), wxDefaultPosition, wxDefaultSize, 0 );
287 bSizer5->Add( m_btn_Readme, 0, wxALL|wxEXPAND, 5 );
289 m_btn_Update = new wxButton( this, ID_B_UPDATE, wxT("Update FreeSpace"), wxDefaultPosition, wxDefaultSize, 0 );
290 bSizer5->Add( m_btn_Update, 0, wxALL|wxEXPAND, 5 );
292 m_btn_Volition = new wxButton( this, ID_B_VOLITION, wxT("FreeSpace Webpage"), wxDefaultPosition, wxDefaultSize, 0 );
293 bSizer5->Add( m_btn_Volition, 0, wxALL|wxEXPAND, 5 );
295 m_btn_Uninstall = new wxButton( this, ID_B_UNINSTALL, wxT("Uninstall"), wxDefaultPosition, wxDefaultSize, 0 );
296 bSizer5->Add( m_btn_Uninstall, 0, wxALL|wxEXPAND, 5 );
298 m_btn_Quit = new wxButton( this, ID_B_QUIT, wxT("Quit"), wxDefaultPosition, wxDefaultSize, 0 );
299 bSizer5->Add( m_btn_Quit, 0, wxALL|wxEXPAND, 5 );
301 fgSizer3->Add( bSizer5, 1, wxALIGN_CENTER|wxALL, 10 );
303 bSizer3->Add( fgSizer3, 1, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxEXPAND, 5 );
305 this->SetSizer( bSizer3 );
307 bSizer3->Fit( this );
311 this->Centre( wxBOTH );
314 Launcher::~Launcher()
319 void Launcher::OnClose( wxCloseEvent& WXUNUSED(event) )
322 m_panel->RemoveEventHandler(p_background);
329 void Launcher::OnPlay( wxCommandEvent& WXUNUSED(event) )
331 wxString epath = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(true);
334 epath.Append( wxT("freespace2") );
336 epath.Append( wxT("freespace") );
340 epath.Append( wxT("_demo") );
344 epath.Append( wxT(".exe") );
347 wxExecute(epath, wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER | wxEXEC_HIDE_CONSOLE);
352 void Launcher::OnSetup( wxCommandEvent& WXUNUSED(event) )
354 LauncherSetup setup(this);
359 void Launcher::OnReadme( wxCommandEvent& WXUNUSED(event) )
361 wxLaunchDefaultApplication("README.txt");
364 void Launcher::OnUpdate( wxCommandEvent& WXUNUSED(event) )
366 wxMessageBox( wxT("Not implemented") );
369 void Launcher::OnHelp( wxCommandEvent& WXUNUSED(event) )
374 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
376 wxMessageBox( wxT("Not implemented") );
379 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
381 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
384 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
386 wxLaunchDefaultBrowser( wxT("http://www.pxo.net") );
389 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
394 void Launcher::JumpToSetup()
396 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
400 // FS1 doesn't do a setup jump so just go with what the user sets up
401 // and/or what the game binary will set
404 wxString title( wxT("Welcome to FreeSpace 2!") );
406 wxString message( wxT("Since this is your first time running FreeSapce2, "
407 "you will now be automatically taken to the Setup "
410 wxString ext_message( wxT("NOTE TO USER:\n"
411 "It is important that you view each section of "
412 "the Setup window and configure it to your "
413 "liking. Press the Help button if you have "
414 "questions about a particular section. Once you "
415 "are satisfied with your settings, select the OK "
416 "button at the bottom of the Setup window to "
419 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
420 prompt.SetExtendedMessage(ext_message);
424 // now jump to setup dialog
425 LauncherSetup setup(this);
431 void Launcher::SndPlayHover()
434 alSourcePlay(m_snd_hover_source_id);
438 void Launcher::SndPlayPressed()
441 alSourcePlay(m_snd_click_source_id);
445 void Launcher::SndEnable(bool enabled)
454 void Launcher::init_sound()
461 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
465 al_device = alcOpenDevice(NULL);
467 if (al_device == NULL) {
471 al_context = alcCreateContext(al_device, NULL);
473 if (al_context == NULL) {
474 alcCloseDevice(al_device);
478 alcMakeContextCurrent(al_context);
481 alGenBuffers(1, &m_snd_hover_buf_id);
482 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
484 alGenSources(1, &m_snd_hover_source_id);
485 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
486 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
489 alGenBuffers(1, &m_snd_click_buf_id);
490 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
492 alGenSources(1, &m_snd_click_source_id);
493 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
494 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
500 void Launcher::close_sound()
506 alSourceStop(m_snd_click_source_id);
508 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
509 alDeleteSources(1, &m_snd_click_source_id);
510 alDeleteBuffers(1, &m_snd_click_buf_id);
512 alSourceStop(m_snd_hover_source_id);
514 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
515 alDeleteSources(1, &m_snd_hover_source_id);
516 alDeleteBuffers(1, &m_snd_hover_buf_id);
518 alcMakeContextCurrent(NULL);
519 alcDestroyContext(al_context);
520 alcCloseDevice(al_device);