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