1 // MainFrm.cpp : implementation of the CMainFrame class
2 //
3 
4 #ifdef _DEBUG
5 #include "stdafx.h"
6 #else
7 #include "stdafx.h"
8 #undef _DEBUG
9 #endif
10 
11 #include "Osmo4.h"
12 
13 #include <gpac/options.h>
14 #include <gpac/network.h>
15 
16 #include "MainFrm.h"
17 #include <gx.h>
18 
19 #ifdef _DEBUG
20 #define new DEBUG_NEW
21 #undef THIS_FILE
22 static char THIS_FILE[] = __FILE__;
23 #endif
24 
25 
26 
CChildView()27 CChildView::CChildView()
28 {
29 }
30 
~CChildView()31 CChildView::~CChildView()
32 {
33 	/*since the wndproc is overwritten by the terminal, we detach the handle otherwise we get a nice assertion
34 	failure from windows*/
35 	HWND hWnd = Detach();
36 	::PostMessage(hWnd, WM_QUIT, 0, 0);
37 }
38 
39 
BEGIN_MESSAGE_MAP(CChildView,CWnd)40 BEGIN_MESSAGE_MAP(CChildView,CWnd )
41 	//{{AFX_MSG_MAP(CChildView)
42 	//}}AFX_MSG_MAP
43 END_MESSAGE_MAP()
44 
45 
46 /////////////////////////////////////////////////////////////////////////////
47 // CChildView message handlers
48 
49 BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
50 {
51 	if (!CWnd::PreCreateWindow(cs))
52 		return FALSE;
53 
54 	cs.style &= ~WS_BORDER;
55 	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
56 	                                   NULL, HBRUSH(COLOR_WINDOW+1), NULL);
57 
58 	return TRUE;
59 }
60 
61 /////////////////////////////////////////////////////////////////////////////
62 // CMainFrame
63 
IMPLEMENT_DYNAMIC(CMainFrame,CFrameWnd)64 IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
65 
66 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
67 	//{{AFX_MSG_MAP(CMainFrame)
68 	ON_WM_CREATE()
69 	ON_WM_SETFOCUS()
70 	ON_COMMAND(ID_APP_EXIT, OnAppExit)
71 	ON_MESSAGE(WM_OPENURL, Open)
72 	ON_MESSAGE(WM_SETTINGCHANGE, OnSIPChange)
73 	ON_MESSAGE(WM_SETSIZE,OnSetSize)
74 	ON_MESSAGE(WM_NAVIGATE,OnNavigate)
75 	ON_WM_SIZE()
76 	ON_COMMAND(ID_FILE_STEP, OnFileStep)
77 	ON_UPDATE_COMMAND_UI(ID_FILE_STEP, OnUpdateFileStep)
78 	ON_COMMAND(ID_FILE_PAUSE, OnFilePause)
79 	ON_UPDATE_COMMAND_UI(ID_FILE_PAUSE, OnUpdateFilePause)
80 	ON_COMMAND(ID_FILE_STOP, OnFileStop)
81 	ON_UPDATE_COMMAND_UI(ID_FILE_STOP, OnUpdateFileStop)
82 	ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullscreen)
83 	ON_UPDATE_COMMAND_UI(ID_VIEW_FULLSCREEN, OnUpdateViewFullscreen)
84 	ON_WM_CLOSE()
85 	ON_COMMAND(ID_VIEW_FIT, OnViewFit)
86 	ON_UPDATE_COMMAND_UI(ID_VIEW_FIT, OnUpdateViewFit)
87 	ON_COMMAND(ID_VIEW_AR_ORIG, OnViewArOrig)
88 	ON_COMMAND(ID_VIEW_AR_FILL, OnViewArFill)
89 	ON_COMMAND(ID_VIEW_AR_43, OnViewAr43)
90 	ON_COMMAND(ID_VIEW_AR_169, OnViewAr169)
91 	ON_COMMAND(ID_NAV_NONE, OnNavNone)
92 	ON_COMMAND(ID_NAV_SLIDE, OnNavSlide)
93 	ON_COMMAND(ID_NAV_RESET, OnNaveReset)
94 	ON_COMMAND_RANGE(ID_NAV_NONE, ID_NAV_EXAMINE, OnSetNavigation)
95 	ON_WM_KEYDOWN()
96 	ON_WM_KEYUP()
97 	ON_COMMAND(ID_VIEW_TIMING, OnViewTiming)
98 	ON_UPDATE_COMMAND_UI(ID_VIEW_TIMING, OnUpdateViewTiming)
99 	ON_WM_INITMENUPOPUP()
100 	//}}AFX_MSG_MAP
101 END_MESSAGE_MAP()
102 
103 /////////////////////////////////////////////////////////////////////////////
104 // CMainFrame construction/destruction
105 
106 CMainFrame::CMainFrame()
107 {
108 	GXOpenInput();
109 	m_view_timing = 0;
110 	m_restore_fs = 0;
111 }
112 
~CMainFrame()113 CMainFrame::~CMainFrame()
114 {
115 	GXCloseInput();
116 }
117 
OnSetFocus(CWnd * pOldWnd)118 void CMainFrame::OnSetFocus(CWnd* pOldWnd)
119 {
120 	if (m_restore_fs) {
121 		m_restore_fs = 0;
122 		GetApp()->ShowTaskBar(0);
123 		OnViewFullscreen();
124 	}
125 }
126 
OnCreate(LPCREATESTRUCT lpCreateStruct)127 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
128 {
129 	COsmo4 *app = GetApp();
130 
131 	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
132 		return -1;
133 
134 	// create a view to occupy the client area of the frame
135 	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW | WS_BORDER,
136 	                      CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
137 	{
138 		TRACE0("Failed to create view window\n");
139 		return -1;
140 	}
141 	m_wndView.ShowWindow(SW_HIDE);
142 
143 
144 	if (!m_dumbWnd.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW | WS_BORDER,
145 	                      CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
146 	{
147 		TRACE0("Failed to create dumb window\n");
148 		return -1;
149 	}
150 	m_dumbWnd.SetWindowPos(this, 0, 0, app->m_screen_width, app->m_screen_height-app->m_menu_height, 0L);
151 	m_dumbWnd.ShowWindow(SW_HIDE);
152 
153 	if (!m_progBar.Create(IDD_CONTROL , this) ) {
154 		TRACE0("Failed to create status bar\n");
155 		return -1;      // fail to create
156 	}
157 	m_progBar.UpdateWindow();
158 	m_progBar.SetWindowPos(this, 0, 0, app->m_screen_width, app->m_menu_height, 0L);
159 	m_progBar.ShowWindow(SW_SHOWNORMAL);
160 
161 
162 //	m_wndCommandBar.m_bShowSharedNewButton = FALSE;
163 
164 	if (!m_wndCommandBar.Create(this)
165 	        || !m_wndCommandBar.InsertMenuBar(IDR_MENU)
166 	        || !m_wndCommandBar.AddAdornments()
167 	        || !m_wndCommandBar.LoadBitmap(IDR_MAINFRAME)
168 	   )
169 	{
170 		TRACE0("Failed to create CommandBar\n");
171 		return -1;      // fail to create
172 	}
173 
174 	CToolBarCtrl & toolBar = m_wndCommandBar.GetToolBarCtrl();
175 	TBBUTTON tb;
176 	memset(&tb, 0, sizeof(tb));
177 	tb.idCommand = ID_OPEN_FILE;
178 	tb.iBitmap = 0;
179 	tb.fsStyle = TBSTYLE_BUTTON;
180 	toolBar.AddButtons(1, &tb);
181 	tb.idCommand = 0;
182 	tb.iBitmap = 0;
183 	tb.fsStyle = TBSTYLE_SEP;
184 	toolBar.AddButtons(1, &tb);
185 	tb.idCommand = ID_FILE_PAUSE;
186 	tb.iBitmap = 1;
187 	tb.fsStyle = TBSTYLE_BUTTON;
188 	toolBar.AddButtons(1, &tb);
189 	tb.idCommand = ID_FILE_STEP;
190 	tb.iBitmap = 2;
191 	tb.fsStyle = TBSTYLE_BUTTON;
192 	toolBar.AddButtons(1, &tb);
193 	tb.idCommand = ID_FILE_STOP;
194 	tb.iBitmap = 3;
195 	tb.fsStyle = TBSTYLE_BUTTON;
196 	toolBar.AddButtons(1, &tb);
197 	tb.idCommand = 0;
198 	tb.iBitmap = 0;
199 	tb.fsStyle = TBSTYLE_SEP;
200 	toolBar.AddButtons(1, &tb);
201 
202 	SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
203 	SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE);
204 	SetWindowPos(NULL, 0, 0, app->m_screen_width, app->m_screen_height, 0L);
205 
206 	SetWindowText(_T("Osmo4"));
207 	return 0;
208 }
209 
SetPauseButton(Bool force_play_button)210 void CMainFrame::SetPauseButton(Bool force_play_button)
211 {
212 	CToolBarCtrl & toolBar = m_wndCommandBar.GetToolBarCtrl();
213 	TBBUTTON tb;
214 	memset(&tb, 0, sizeof(tb));
215 	tb.idCommand = ID_FILE_PAUSE;
216 	tb.fsStyle = TBSTYLE_BUTTON;
217 
218 	if (force_play_button || GetApp()->m_stopped || gf_term_get_option(GetApp()->m_term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED) {
219 		tb.iBitmap = 4;
220 	} else {
221 		tb.iBitmap = 1;
222 	}
223 	toolBar.DeleteButton(5);
224 	toolBar.InsertButton(5, &tb);
225 }
226 
227 
PreCreateWindow(CREATESTRUCT & cs)228 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
229 {
230 	if( !CFrameWnd::PreCreateWindow(cs) )
231 		return FALSE;
232 	// TODO: Modify the Window class or styles here by modifying
233 	//  the CREATESTRUCT cs
234 
235 
236 	cs.lpszClass = AfxRegisterWndClass(0);
237 	return TRUE;
238 }
239 
240 
241 /////////////////////////////////////////////////////////////////////////////
242 // CMainFrame diagnostics
243 
244 /*
245 #ifdef _DEBUG
246 void CMainFrame::AssertValid() const
247 {
248 	CFrameWnd::AssertValid();
249 }
250 
251 void CMainFrame::Dump(CDumpContext& dc) const
252 {
253 	CFrameWnd::Dump(dc);
254 }
255 
256 #endif //_DEBUG
257 */
258 
259 /////////////////////////////////////////////////////////////////////////////
260 // CMainFrame message handlers
OnCmdMsg(UINT nID,int nCode,void * pExtra,AFX_CMDHANDLERINFO * pHandlerInfo)261 BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
262 {
263 	// let the view have first crack at the command
264 	if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
265 		return TRUE;
266 
267 	// otherwise, do default handling
268 	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
269 }
270 
271 #define PROGRESS_TIMER	20
272 #define PROGRESS_REFRESH_MS		500
273 
ProgressTimer(HWND,UINT,UINT nID,DWORD)274 void CALLBACK EXPORT ProgressTimer(HWND , UINT , UINT nID , DWORD )
275 {
276 	if (nID != PROGRESS_TIMER) return;
277 	((CMainFrame *) GetApp()->m_pMainWnd)->UpdateTime();
278 }
279 
UpdateTime()280 void CMainFrame::UpdateTime()
281 {
282 	u32 now;
283 
284 	COsmo4 *app = GetApp();
285 	if (!app->m_open || app->m_stopped) return;
286 	now = gf_term_get_time_in_ms(app->m_term);
287 	if (!now) return;
288 
289 	if (app->m_can_seek && (now>=app->m_duration + 100)) {
290 		if (gf_term_get_option(app->m_term, GF_OPT_IS_FINISHED)) {
291 			if (app->m_Loop && m_full_screen) {
292 				gf_term_play_from_time(app->m_term, 0, 0);
293 			} else {
294 				OnFileStop();
295 				if (app->m_Loop) OnFilePause();
296 			}
297 			return;
298 		}
299 	}
300 
301 	if (!m_full_screen) m_progBar.SetPosition(now);
302 }
303 
CloseURL()304 void CMainFrame::CloseURL()
305 {
306 	COsmo4 *app = GetApp();
307 	if (!app->m_open) return;
308 	if (m_view_timing) KillTimer(PROGRESS_TIMER);
309 	gf_term_disconnect(app->m_term);
310 	app->m_open = 0;
311 	app->m_can_seek = 0;
312 	app->m_duration = (u32) -1;
313 	m_progBar.m_prev_time = 0;
314 	m_progBar.SetPosition(0);
315 }
316 
OnAppExit()317 void CMainFrame::OnAppExit()
318 {
319 	CloseURL();
320 	PostMessage(WM_QUIT);
321 }
322 
OnSize(UINT nType,int cx,int cy)323 void CMainFrame::OnSize(UINT nType, int cx, int cy)
324 {
325 	COsmo4 *app = GetApp();
326 	u32 disp_w, disp_h, c_w, c_h, x, y;
327 
328 	if (m_full_screen) return;
329 
330 	disp_w = app->m_screen_width;
331 	disp_h = app->m_screen_height;
332 	CFrameWnd::OnSize(nType, disp_w, disp_h);
333 
334 	x = y = 0;
335 	disp_h -= app->m_menu_height;
336 
337 	if (m_view_timing) {
338 		disp_h -= app->m_menu_height;
339 		y = app->m_menu_height;
340 		m_progBar.SetWindowPos(this, 0, 0, app->m_screen_width, app->m_menu_height, 0L);
341 		m_progBar.ShowWindow(SW_SHOWNORMAL);
342 	} else {
343 		m_progBar.ShowWindow(SW_HIDE);
344 	}
345 	m_dumbWnd.SetWindowPos(this, 0, y, disp_w, disp_h, 0L);
346 	m_dumbWnd.ShowWindow(SW_SHOW);
347 
348 	if (m_view_timing)
349 		SetTimer(PROGRESS_TIMER, PROGRESS_REFRESH_MS, ProgressTimer);
350 
351 	if (!app->m_scene_width || !app->m_scene_height) {
352 		m_wndView.SetWindowPos(this, 0, y, disp_w, disp_h, SWP_SHOWWINDOW);
353 		gf_term_set_size(app->m_term, disp_w, disp_h);
354 		return;
355 	}
356 
357 	if (!app->m_fit_screen && (app->m_scene_width < disp_w) && (app->m_scene_height < disp_h)) {
358 		c_w = app->m_scene_width;
359 		c_h = app->m_scene_height;
360 		x = (disp_w - c_w) / 2;
361 		y = (disp_h - c_h) / 2;
362 	} else {
363 		c_w = disp_w;
364 		c_h = disp_h;
365 	}
366 	m_wndView.SetWindowPos(this, x, y, c_w, c_h, SWP_SHOWWINDOW | SWP_NOZORDER);
367 	gf_term_set_size(app->m_term, c_w, c_h);
368 }
369 
370 
OnViewFullscreen()371 void CMainFrame::OnViewFullscreen()
372 {
373 	COsmo4 *app = GetApp();
374 	if (!app->m_open) return;
375 	u32 disp_w = app->m_screen_width;
376 	u32 disp_h = app->m_screen_height;
377 
378 	Bool is_full_screen = !m_full_screen;
379 
380 	/*prevent resize messages*/
381 	m_full_screen = 1;
382 
383 	HWND hWnd = GetSafeHwnd();
384 	::SetForegroundWindow(hWnd);
385 	::CommandBar_Show(m_wndCommandBar.GetSafeHwnd(), is_full_screen ? FALSE : TRUE);
386 	SHFullScreen(hWnd, SHFS_HIDESTARTICON | SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON);
387 
388 	if (is_full_screen) {
389 		m_dumbWnd.ShowWindow(SW_HIDE);
390 
391 		::MoveWindow(m_hWnd, 0, 0, disp_w, disp_h, 0);
392 		m_wndView.GetWindowRect(&m_view_rc);
393 		m_wndView.SetWindowPos(this, 0, 0, disp_w, disp_h, SWP_NOZORDER);
394 		gf_term_set_option(app->m_term, GF_OPT_FULLSCREEN, is_full_screen);
395 		m_full_screen = 1;
396 	} else {
397 		gf_term_set_option(app->m_term, GF_OPT_FULLSCREEN, is_full_screen);
398 		m_full_screen = 0;
399 		OnSetSize(0,0);
400 		m_dumbWnd.ShowWindow(SW_SHOW);
401 		gf_term_set_option(app->m_term, GF_OPT_REFRESH, 0);
402 	}
403 }
404 
405 
OnUpdateViewFullscreen(CCmdUI * pCmdUI)406 void CMainFrame::OnUpdateViewFullscreen(CCmdUI* pCmdUI)
407 {
408 	pCmdUI->Enable(GetApp()->m_open ? TRUE : FALSE);
409 }
410 
OnSetSize(WPARAM wParam,LPARAM lParam)411 LONG CMainFrame::OnSetSize(WPARAM wParam, LPARAM lParam)
412 {
413 	RECT rc;
414 	if (m_full_screen) return 0;
415 	GetWindowRect(&rc);
416 	SetWindowPos(NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SWP_NOZORDER | SWP_NOMOVE);
417 	return 1;
418 }
419 
Open(WPARAM wParam,LPARAM lParam)420 LONG CMainFrame::Open(WPARAM wParam, LPARAM lParam)
421 {
422 	COsmo4 *app = GetApp();
423 	CloseURL();
424 	char filename[5000];
425 	CE_WideToChar((u16 *) (LPCTSTR) app->m_filename, filename);
426 	app->m_stopped = 0;
427 
428 	if (app->m_reconnect_time) {
429 		gf_term_connect_from_time(app->m_term, filename, app->m_reconnect_time, 0);
430 		app->m_reconnect_time = 0;
431 	} else {
432 		gf_term_connect(app->m_term, filename);
433 	}
434 	app->SetBacklightState(1);
435 	return 1;
436 }
437 
438 
439 
440 
OnNavigate(WPARAM,LPARAM)441 LONG CMainFrame::OnNavigate(WPARAM /*wParam*/, LPARAM /*lParam*/)
442 {
443 	COsmo4 *app = GetApp();
444 	char to_url[MAX_PATH];
445 	CE_WideToChar((u16 *) (LPCTSTR) app->m_navigate_url, to_url);
446 
447 	if (gf_term_is_supported_url(app->m_term, to_url, 1, app->m_no_mime_fetch)) {
448 		char fileName[MAX_PATH];
449 		TCHAR w_to_url[MAX_PATH];
450 		CE_WideToChar((u16 *) (LPCTSTR) app->m_filename, fileName);
451 		char *str = gf_url_concatenate(fileName, to_url);
452 		if (!str) str = gf_strdup(to_url);
453 		CE_CharToWide(str, (u16 *)w_to_url);
454 		gf_free(str);
455 		app->m_filename = w_to_url;
456 		Open(0, 0);
457 	} else {
458 		SHELLEXECUTEINFO info;
459 		console_message = app->m_navigate_url;
460 		console_err = GF_OK;
461 		PostMessage(WM_CONSOLEMSG);
462 
463 
464 		if (m_full_screen) {
465 			OnViewFullscreen();
466 			app->ShowTaskBar(1);
467 			m_restore_fs = 1;
468 		}
469 
470 		memset(&info, 0, sizeof(SHELLEXECUTEINFO));
471 		info.cbSize = sizeof(SHELLEXECUTEINFO);
472 		info.lpVerb = L"open";
473 		info.fMask = SEE_MASK_NOCLOSEPROCESS;
474 		info.lpFile = L"iexplore";
475 		info.lpParameters = (LPCTSTR) app->m_navigate_url;
476 		info.nShow = SW_SHOWNORMAL;
477 		ShellExecuteEx(&info);
478 	}
479 	return 1;
480 }
481 
OnFilePause()482 void CMainFrame::OnFilePause()
483 {
484 	COsmo4 *app = GetApp();
485 	if (app->m_stopped) {
486 		char filename[5000];
487 		CE_WideToChar((u16 *) (LPCTSTR) app->m_filename, filename);
488 		app->m_stopped = 0;
489 		gf_term_connect(app->m_term, filename);
490 		app->SetBacklightState(1);
491 
492 		if (m_view_timing)
493 			SetTimer(PROGRESS_TIMER, PROGRESS_REFRESH_MS, ProgressTimer);
494 
495 		SetPauseButton();
496 	} else {
497 		app->Pause();
498 	}
499 }
OnUpdateFilePause(CCmdUI * pCmdUI)500 void CMainFrame::OnUpdateFilePause(CCmdUI* pCmdUI)
501 {
502 	COsmo4 *app = GetApp();
503 	pCmdUI->Enable((app->m_open || app->m_stopped) ? TRUE : FALSE);
504 }
OnFileStop()505 void CMainFrame::OnFileStop()
506 {
507 	COsmo4 *app = GetApp();
508 	if (!app->m_open) return;
509 	if (m_full_screen) OnViewFullscreen();
510 	app->m_stopped = 1;
511 	if (m_view_timing) KillTimer(PROGRESS_TIMER);
512 	gf_term_disconnect(app->m_term);
513 	m_progBar.SetPosition(0);
514 	app->SetBacklightState(0);
515 	SetPauseButton();
516 }
517 
OnUpdateFileStop(CCmdUI * pCmdUI)518 void CMainFrame::OnUpdateFileStop(CCmdUI* pCmdUI)
519 {
520 	pCmdUI->Enable( GetApp()->m_open  ? TRUE : FALSE);
521 }
522 
OnFileStep()523 void CMainFrame::OnFileStep()
524 {
525 	COsmo4 *app = GetApp();
526 	gf_term_set_option(app->m_term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE);
527 	app->SetBacklightState(0);
528 	SetPauseButton(1);
529 }
OnUpdateFileStep(CCmdUI * pCmdUI)530 void CMainFrame::OnUpdateFileStep(CCmdUI* pCmdUI)
531 {
532 	pCmdUI->Enable(GetApp()->m_open ? TRUE : FALSE);
533 }
534 
OnClose()535 void CMainFrame::OnClose()
536 {
537 	PostMessage(WM_DESTROY);
538 }
539 
OnSIPChange(WPARAM wParam,LPARAM lParam)540 LONG CMainFrame::OnSIPChange(WPARAM wParam, LPARAM lParam)
541 {
542 	if (wParam == SPI_SETSIPINFO) GetApp()->ShowTaskBar(0);
543 	return 1;
544 }
545 
OnViewFit()546 void CMainFrame::OnViewFit()
547 {
548 	COsmo4 *app = GetApp();
549 	app->m_fit_screen = !app->m_fit_screen;
550 	if (app->m_open) OnSetSize(0, 0);
551 }
552 
OnUpdateViewFit(CCmdUI * pCmdUI)553 void CMainFrame::OnUpdateViewFit(CCmdUI* pCmdUI)
554 {
555 	pCmdUI->SetCheck(GetApp()->m_fit_screen ? TRUE : FALSE);
556 }
557 
OnViewArOrig()558 void CMainFrame::OnViewArOrig()
559 {
560 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP);
561 }
OnViewArFill()562 void CMainFrame::OnViewArFill()
563 {
564 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN);
565 }
OnViewAr43()566 void CMainFrame::OnViewAr43()
567 {
568 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3);
569 }
OnViewAr169()570 void CMainFrame::OnViewAr169()
571 {
572 	gf_term_set_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9);
573 }
574 
OnNavNone()575 void CMainFrame::OnNavNone()
576 {
577 	gf_term_set_option(GetApp()->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_NONE);
578 }
579 
OnNavSlide()580 void CMainFrame::OnNavSlide()
581 {
582 	gf_term_set_option(GetApp()->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_SLIDE);
583 }
584 
OnNaveReset()585 void CMainFrame::OnNaveReset()
586 {
587 	gf_term_set_option(GetApp()->m_term, GF_OPT_NAVIGATION_TYPE, 0);
588 }
589 
ForwardMessage()590 void CMainFrame::ForwardMessage()
591 {
592 	const MSG *msg = GetCurrentMessage();
593 	m_wndView.SendMessage(msg->message, msg->wParam, msg->lParam);
594 }
OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)595 void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
596 {
597 	ForwardMessage();
598 }
OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags)599 void CMainFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
600 {
601 	ForwardMessage();
602 }
603 
604 
OnViewTiming()605 void CMainFrame::OnViewTiming()
606 {
607 	if (m_full_screen) return;
608 	if (m_view_timing) KillTimer(PROGRESS_TIMER);
609 	m_view_timing = !m_view_timing;
610 	OnSetSize(0, 0);
611 }
612 
OnUpdateViewTiming(CCmdUI * pCmdUI)613 void CMainFrame::OnUpdateViewTiming(CCmdUI* pCmdUI)
614 {
615 	pCmdUI->SetCheck(m_view_timing ? TRUE : FALSE);
616 }
617 
OnSetNavigation(UINT nID)618 void CMainFrame::OnSetNavigation(UINT nID)
619 {
620 	gf_term_set_option(GetApp()->m_term, GF_OPT_NAVIGATION, nID - ID_NAV_NONE);
621 }
622 
623 
OnInitMenuPopup(CMenu * pPopupMenu,UINT nIndex,BOOL bSysMenu)624 void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
625 {
626 	COsmo4 *app = GetApp();
627 	CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
628 
629 	u32 opt = gf_term_get_option(GetApp()->m_term, GF_OPT_ASPECT_RATIO);
630 	CheckMenuItem(pPopupMenu->m_hMenu, ID_VIEW_AR_ORIG, MF_BYCOMMAND| (opt==GF_ASPECT_RATIO_KEEP) ? MF_CHECKED : MF_UNCHECKED);
631 	CheckMenuItem(pPopupMenu->m_hMenu, ID_VIEW_AR_FILL, MF_BYCOMMAND| (opt==GF_ASPECT_RATIO_FILL_SCREEN) ? MF_CHECKED : MF_UNCHECKED);
632 	CheckMenuItem(pPopupMenu->m_hMenu, ID_VIEW_AR_43, MF_BYCOMMAND| (opt==GF_ASPECT_RATIO_4_3) ? MF_CHECKED : MF_UNCHECKED);
633 	CheckMenuItem(pPopupMenu->m_hMenu, ID_VIEW_AR_169, MF_BYCOMMAND| (opt==GF_ASPECT_RATIO_16_9) ? MF_CHECKED : MF_UNCHECKED);
634 
635 	CheckMenuItem(pPopupMenu->m_hMenu, ID_VIEW_FIT, MF_BYCOMMAND| app->m_fit_screen ? MF_CHECKED : MF_UNCHECKED);
636 
637 	u32 type;
638 	if (!app->m_open) type = GF_NAVIGATE_TYPE_NONE;
639 	else type = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION_TYPE);
640 
641 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_NONE, MF_BYCOMMAND | ((type==GF_NAVIGATE_TYPE_NONE) ? MF_GRAYED : MF_ENABLED) );
642 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_SLIDE, MF_BYCOMMAND | ((type==GF_NAVIGATE_TYPE_NONE) ? MF_GRAYED : MF_ENABLED) );
643 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_RESET, MF_BYCOMMAND | ((type==GF_NAVIGATE_TYPE_NONE) ? MF_GRAYED : MF_ENABLED) );
644 
645 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_WALK, MF_BYCOMMAND | ( (type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
646 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_FLY, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
647 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_EXAMINE, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
648 	EnableMenuItem(pPopupMenu->m_hMenu, ID_COLLIDE_OFF, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
649 	EnableMenuItem(pPopupMenu->m_hMenu, ID_COLLIDE_REG, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
650 	EnableMenuItem(pPopupMenu->m_hMenu, ID_COLLIDE_DISP, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
651 	EnableMenuItem(pPopupMenu->m_hMenu, ID_NAV_GRAVITY, MF_BYCOMMAND | ((type!=GF_NAVIGATE_TYPE_3D) ? MF_GRAYED : MF_ENABLED) );
652 
653 	if (type==GF_NAVIGATE_TYPE_NONE) {
654 		u32 mode = gf_term_get_option(app->m_term, GF_OPT_NAVIGATION);
655 		CheckMenuItem(pPopupMenu->m_hMenu, ID_NAV_NONE, MF_BYCOMMAND | ( (mode==GF_NAVIGATE_NONE) ? MF_CHECKED : MF_UNCHECKED) );
656 		CheckMenuItem(pPopupMenu->m_hMenu, ID_NAV_SLIDE, MF_BYCOMMAND | ( (mode==GF_NAVIGATE_SLIDE) ? MF_CHECKED : MF_UNCHECKED) );
657 		CheckMenuItem(pPopupMenu->m_hMenu, ID_NAV_WALK, MF_BYCOMMAND | ( (mode==GF_NAVIGATE_WALK) ? MF_CHECKED : MF_UNCHECKED) );
658 		CheckMenuItem(pPopupMenu->m_hMenu, ID_NAV_FLY, MF_BYCOMMAND | ((mode==GF_NAVIGATE_FLY) ? MF_CHECKED : MF_UNCHECKED) );
659 		CheckMenuItem(pPopupMenu->m_hMenu, ID_NAV_EXAMINE, MF_BYCOMMAND | ((mode==GF_NAVIGATE_EXAMINE) ? MF_CHECKED : MF_UNCHECKED) );
660 	}
661 }
662