OSDN Git Service

[VM] Merge Upstream 2019-02-19.Only for DEVICES, not MACHINES YET.
[csp-qt/common_source_project-fm7.git] / source / src / win32 / osd.cpp
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2015.11.20-
6
7         [ win32 dependent ]
8 */
9
10 #include "osd.h"
11
12 void OSD::initialize(int rate, int samples)
13 {
14         // check os version
15         OSVERSIONINFO os_info;
16         os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
17         GetVersionEx(&os_info);
18         vista_or_later = (os_info.dwPlatformId == 2 && (os_info.dwMajorVersion > 6 || (os_info.dwMajorVersion == 6 && os_info.dwMinorVersion >= 0)));
19         
20         GdiplusStartup(&gdiToken, &gdiSI, NULL);
21         initialize_input();
22         initialize_screen();
23         initialize_sound(rate, samples);
24 #if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
25         CoInitialize(NULL);
26         initialize_video();
27 #endif
28 #ifdef USE_SOCKET
29         initialize_socket();
30 #endif
31 }
32
33 void OSD::release()
34 {
35         release_input();
36         release_screen();
37         release_sound();
38 #if defined(USE_MOVIE_PLAYER) || defined(USE_VIDEO_CAPTURE)
39         release_video();
40         CoUninitialize();
41 #endif
42 #ifdef USE_SOCKET
43         release_socket();
44 #endif
45         GdiplusShutdown(gdiToken);
46 }
47
48 void OSD::power_off()
49 {
50         PostMessage(main_window_handle, WM_CLOSE, 0, 0L);
51 }
52
53 void OSD::suspend()
54 {
55 #ifdef USE_MOVIE_PLAYER
56         if(now_movie_play && !now_movie_pause) {
57                 pause_movie();
58                 now_movie_pause = false;
59         }
60 #endif
61         mute_sound();
62 }
63
64 void OSD::restore()
65 {
66 #ifdef USE_MOVIE_PLAYER
67         if(now_movie_play && !now_movie_pause) {
68                 play_movie();
69         }
70 #endif
71 }
72
73 void OSD::lock_vm()
74 {
75         lock_count++;
76 }
77
78 void OSD::unlock_vm()
79 {
80         if(--lock_count <= 0) {
81                 force_unlock_vm();
82         }
83 }
84
85 void OSD::force_unlock_vm()
86 {
87         lock_count = 0;
88 }
89
90 void OSD::sleep(uint32_t ms)
91 {
92         Sleep(ms);
93 }
94
95 #ifdef USE_DEBUGGER
96 FARPROC hWndProc = NULL;
97 OSD *my_osd = NULL;
98
99 LRESULT CALLBACK MyWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
100 {
101         switch(iMsg) {
102         case WM_CLOSE:
103                 return 0;
104         case WM_PAINT:
105                 if(my_osd) {
106                         PAINTSTRUCT ps;
107                         HDC hdc = BeginPaint(hWnd, &ps);
108 #ifdef ONE_BOARD_MICRO_COMPUTER
109                         my_osd->reload_bitmap();
110 #endif
111                         my_osd->update_screen(hdc);
112                         EndPaint(hWnd, &ps);
113                 }
114                 return 0;
115         }
116         return DefWindowProc(hWnd, iMsg, wParam, lParam);
117 }
118
119 void OSD::start_waiting_in_debugger()
120 {
121         HMENU hMenu = GetMenu(main_window_handle);
122         
123         if(hMenu != NULL) {
124                 for(int i = 0;; i++) {
125                         if(EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_GRAYED) == -1) {
126                                 break;
127                         }
128                 }
129         }
130         hWndProc = (FARPROC)GetWindowLong(main_window_handle, GWL_WNDPROC);
131         SetWindowLong(main_window_handle, GWL_WNDPROC, (LONG)MyWndProc);
132         my_osd = this;
133 }
134
135 void OSD::finish_waiting_in_debugger()
136 {
137         HMENU hMenu = GetMenu(main_window_handle);
138         
139         if(hMenu != NULL) {
140                 for(int i = 0;; i++) {
141                         if(EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_ENABLED) == -1) {
142                                 break;
143                         }
144                 }
145         }
146         SetWindowLong(main_window_handle, GWL_WNDPROC, (LONG)hWndProc);
147         my_osd = NULL;
148 }
149
150 void OSD::process_waiting_in_debugger()
151 {
152         MSG msg;
153         
154         while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
155                 if(GetMessage(&msg, NULL, 0, 0)) {
156                         TranslateMessage(&msg);
157                         DispatchMessage(&msg);
158                 }
159         }
160 }
161 #endif