1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include <windows.h>
9 #include <tchar.h>
10
11 #include "SkApplication.h"
12
13 #define MAX_LOADSTRING 100
14
15 // Global Variables:
16 HINSTANCE hInst; // current instance
17 TCHAR szTitle[] = _T("SampleApp"); // The title bar text
18 TCHAR szWindowClass[] = _T("SAMPLEAPP"); // the main window class name
19
20 // Forward declarations of functions included in this code module:
21 ATOM MyRegisterClass(HINSTANCE hInstance);
22 BOOL InitInstance(HINSTANCE, int, LPTSTR);
23 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
24 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
25
_tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)26 int APIENTRY _tWinMain(HINSTANCE hInstance,
27 HINSTANCE hPrevInstance,
28 LPTSTR lpCmdLine,
29 int nCmdShow)
30 {
31 UNREFERENCED_PARAMETER(hPrevInstance);
32
33 MSG msg;
34
35 // Initialize global strings
36 MyRegisterClass(hInstance);
37
38 // Perform application initialization:
39 if (!InitInstance (hInstance, nCmdShow, lpCmdLine))
40 {
41 return FALSE;
42 }
43
44 // Main message loop:
45 while (GetMessage(&msg, NULL, 0, 0))
46 {
47 if (true)
48 {
49 TranslateMessage(&msg);
50 DispatchMessage(&msg);
51 }
52 }
53
54 application_term();
55
56 return (int) msg.wParam;
57 }
58
59
60
61 //
62 // FUNCTION: MyRegisterClass()
63 //
64 // PURPOSE: Registers the window class.
65 //
66 // COMMENTS:
67 //
68 // This function and its usage are only necessary if you want this code
69 // to be compatible with Win32 systems prior to the 'RegisterClassEx'
70 // function that was added to Windows 95. It is important to call this function
71 // so that the application will get 'well formed' small icons associated
72 // with it.
73 //
MyRegisterClass(HINSTANCE hInstance)74 ATOM MyRegisterClass(HINSTANCE hInstance)
75 {
76 WNDCLASSEX wcex;
77
78 wcex.cbSize = sizeof(WNDCLASSEX);
79
80 wcex.style = CS_HREDRAW | CS_VREDRAW;
81 wcex.lpfnWndProc = WndProc;
82 wcex.cbClsExtra = 0;
83 wcex.cbWndExtra = 0;
84 wcex.hInstance = hInstance;
85 wcex.hIcon = NULL;
86 wcex.hCursor = NULL;
87 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
88 wcex.lpszMenuName = NULL;
89 wcex.lpszClassName = szWindowClass;
90 wcex.hIconSm = NULL;
91
92 return RegisterClassEx(&wcex);
93 }
94
95 #include "SkOSWindow_Win.h"
96 extern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv);
97
98 static SkOSWindow* gSkWind;
99
tchar_to_utf8(const TCHAR * str)100 char* tchar_to_utf8(const TCHAR* str) {
101 #ifdef _UNICODE
102 int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL);
103 char* str8 = (char*) malloc(size+1);
104 WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL);
105 str8[size] = '\0';
106 return str8;
107 #else
108 return _strdup(str);
109 #endif
110 }
111
112 //
113 // FUNCTION: InitInstance(HINSTANCE, int, LPTSTR)
114 //
115 // PURPOSE: Saves instance handle and creates main window
116 //
117 // COMMENTS:
118 //
119 // In this function, we save the instance handle in a global variable and
120 // create and display the main program window.
121 //
122
123
InitInstance(HINSTANCE hInstance,int nCmdShow,LPTSTR lpCmdLine)124 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow, LPTSTR lpCmdLine)
125 {
126 application_init();
127
128 hInst = hInstance; // Store instance handle in our global variable
129
130 HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
131 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
132
133 if (!hWnd)
134 {
135 return FALSE;
136 }
137
138 char* argv[4096];
139 int argc = 0;
140 TCHAR exename[1024], *next;
141 int exenameLen = GetModuleFileName(NULL, exename, SK_ARRAY_COUNT(exename));
142 // we're ignoring the possibility that the exe name exceeds the exename buffer
143 (void) exenameLen;
144 argv[argc++] = tchar_to_utf8(exename);
145 TCHAR* arg = _tcstok_s(lpCmdLine, _T(" "), &next);
146 while (arg != NULL) {
147 argv[argc++] = tchar_to_utf8(arg);
148 arg = _tcstok_s(NULL, _T(" "), &next);
149 }
150
151 gSkWind = create_sk_window(hWnd, argc, argv);
152 for (int i = 0; i < argc; ++i) {
153 free(argv[i]);
154 }
155 ShowWindow(hWnd, nCmdShow);
156 UpdateWindow(hWnd);
157
158 return TRUE;
159 }
160
161 //
162 // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
163 //
164 // PURPOSE: Processes messages for the main window.
165 //
166 // WM_COMMAND - process the application menu
167 // WM_PAINT - Paint the main window
168 // WM_DESTROY - post a quit message and return
169 //
170 //
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)171 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
172 {
173 switch (message) {
174 case WM_COMMAND:
175 return DefWindowProc(hWnd, message, wParam, lParam);
176 case WM_DESTROY:
177 PostQuitMessage(0);
178 break;
179 default:
180 if (gSkWind->wndProc(hWnd, message, wParam, lParam)) {
181 return 0;
182 } else {
183 return DefWindowProc(hWnd, message, wParam, lParam);
184 }
185 }
186 return 0;
187 }
188
189 // Message handler for about box.
About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)190 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
191 {
192 UNREFERENCED_PARAMETER(lParam);
193 switch (message)
194 {
195 case WM_INITDIALOG:
196 return (INT_PTR)TRUE;
197
198 case WM_COMMAND:
199 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
200 {
201 EndDialog(hDlg, LOWORD(wParam));
202 return (INT_PTR)TRUE;
203 }
204 break;
205 }
206 return (INT_PTR)FALSE;
207 }
208