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"
53 #include "res/fs2_help_txt.h"
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) )
371 wxDialog *help = new wxDialog(this, wxID_ANY, wxT("Launcher Help"), wxDefaultPosition, wxDefaultSize, wxCAPTION|wxSYSTEM_MENU);
374 bSizer = new wxBoxSizer( wxVERTICAL );
377 wxSize txtsize = help->GetTextExtent( wxT(" This opens a Help document containing information about the LauncherWW") );
378 txtsize.SetHeight(420);
380 wxTextCtrl *m_help_txt = new wxTextCtrl( help, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
381 m_help_txt->SetMinSize(txtsize);
382 m_help_txt->AppendText(fs2_help_txt);
383 m_help_txt->SetInsertionPoint(0);
384 bSizer->Add( m_help_txt, 0, wxALL|wxEXPAND, 5 );
386 wxButton *m_b_Ok = new wxButton( help, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
387 bSizer->Add( m_b_Ok, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxALL, 5 );
389 help->SetSizer( bSizer );
393 help->Centre( wxBOTH );
400 void Launcher::OnUninstall( wxCommandEvent& WXUNUSED(event) )
402 wxMessageBox( wxT("Not implemented") );
405 void Launcher::OnVolition( wxCommandEvent& WXUNUSED(event) )
407 wxLaunchDefaultBrowser( wxT("http://www.volition-inc.com") );
410 void Launcher::OnPXO( wxCommandEvent& WXUNUSED(event) )
412 wxLaunchDefaultBrowser( wxT("http://www.pxo.net") );
415 void Launcher::OnQuit( wxCommandEvent& WXUNUSED(event) )
420 void Launcher::JumpToSetup()
422 if ( !os_config_read_uint(NULL, "StraightToSetup", 1) ) {
426 // FS1 doesn't do a setup jump so just go with what the user sets up
427 // and/or what the game binary will set
430 wxString title( wxT("Welcome to FreeSpace 2!") );
432 wxString message( wxT("Since this is your first time running FreeSapce2, ")
433 wxT("you will now be automatically taken to the Setup ")
436 wxString ext_message( wxT("NOTE TO USER:\n")
437 wxT("It is important that you view each section of ")
438 wxT("the Setup window and configure it to your ")
439 wxT("liking. Press the Help button if you have ")
440 wxT("questions about a particular section. Once you ")
441 wxT("are satisfied with your settings, select the OK ")
442 wxT("button at the bottom of the Setup window to ")
445 wxMessageDialog prompt(this, message, title, wxOK | wxICON_INFORMATION);
446 prompt.SetExtendedMessage(ext_message);
450 // now jump to setup dialog
451 LauncherSetup setup(this);
457 void Launcher::SndPlayHover()
460 alSourcePlay(m_snd_hover_source_id);
464 void Launcher::SndPlayPressed()
467 alSourcePlay(m_snd_click_source_id);
471 void Launcher::SndEnable(bool enabled)
480 void Launcher::init_sound()
487 if ( os_config_read_uint("Audio", "LauncherSoundEnabled", 1) == 0 ) {
491 al_device = alcOpenDevice(NULL);
493 if (al_device == NULL) {
497 al_context = alcCreateContext(al_device, NULL);
499 if (al_context == NULL) {
500 alcCloseDevice(al_device);
504 alcMakeContextCurrent(al_context);
507 alGenBuffers(1, &m_snd_hover_buf_id);
508 alBufferData(m_snd_hover_buf_id, AL_FORMAT_MONO8, fs2_snd_hover_wav, sizeof(fs2_snd_hover_wav), 22050);
510 alGenSources(1, &m_snd_hover_source_id);
511 alSourcef(m_snd_hover_source_id, AL_GAIN, 1.0f);
512 alSourcei(m_snd_hover_source_id, AL_BUFFER, m_snd_hover_buf_id);
515 alGenBuffers(1, &m_snd_click_buf_id);
516 alBufferData(m_snd_click_buf_id, AL_FORMAT_MONO8, fs2_snd_click_wav, sizeof(fs2_snd_click_wav), 22050);
518 alGenSources(1, &m_snd_click_source_id);
519 alSourcef(m_snd_click_source_id, AL_GAIN, 1.0f);
520 alSourcei(m_snd_click_source_id, AL_BUFFER, m_snd_click_buf_id);
526 void Launcher::close_sound()
532 alSourceStop(m_snd_click_source_id);
534 alSourcei(m_snd_click_source_id, AL_BUFFER, 0);
535 alDeleteSources(1, &m_snd_click_source_id);
536 alDeleteBuffers(1, &m_snd_click_buf_id);
538 alSourceStop(m_snd_hover_source_id);
540 alSourcei(m_snd_hover_source_id, AL_BUFFER, 0);
541 alDeleteSources(1, &m_snd_hover_source_id);
542 alDeleteBuffers(1, &m_snd_hover_buf_id);
544 alcMakeContextCurrent(NULL);
545 alcDestroyContext(al_context);
546 alcCloseDevice(al_device);