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 "SkTypes.h"
12 #include "SkApplication.h"
13 #include "SkOSWindow_Win.h"
14
15 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
16
17 // Returns the main window Win32 class name.
register_class(HINSTANCE hInstance)18 static const TCHAR* register_class(HINSTANCE hInstance) {
19 WNDCLASSEX wcex;
20 // The main window class name
21 static const TCHAR gSZWindowClass[] = _T("SkiaApp");
22
23 wcex.cbSize = sizeof(WNDCLASSEX);
24
25 wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
26 wcex.lpfnWndProc = WndProc;
27 wcex.cbClsExtra = 0;
28 wcex.cbWndExtra = 0;
29 wcex.hInstance = hInstance;
30 wcex.hIcon = NULL;
31 wcex.hCursor = NULL;
32 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
33 wcex.lpszMenuName = NULL;
34 wcex.lpszClassName = gSZWindowClass;
35 wcex.hIconSm = NULL;
36
37 RegisterClassEx(&wcex);
38
39 return gSZWindowClass;
40 }
41
tchar_to_utf8(const TCHAR * str)42 static char* tchar_to_utf8(const TCHAR* str) {
43 #ifdef _UNICODE
44 int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL);
45 char* str8 = (char*) sk_malloc_throw(size+1);
46 WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL);
47 str8[size] = '\0';
48 return str8;
49 #else
50 return _strdup(str);
51 #endif
52 }
53
54 // This file can work with GUI or CONSOLE subsystem types since we define _tWinMain and main().
55
56 static int main_common(HINSTANCE hInstance, int show, int argc, char**argv);
57
_tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)58 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,
59 int nCmdShow) {
60
61 // convert from lpCmdLine to argc, argv.
62 char* argv[4096];
63 int argc = 0;
64 TCHAR exename[1024], *next;
65 int exenameLen = GetModuleFileName(NULL, exename, SK_ARRAY_COUNT(exename));
66 // we're ignoring the possibility that the exe name exceeds the exename buffer
67 (void) exenameLen;
68 argv[argc++] = tchar_to_utf8(exename);
69 TCHAR* arg = _tcstok_s(lpCmdLine, _T(" "), &next);
70 while (arg != NULL) {
71 argv[argc++] = tchar_to_utf8(arg);
72 arg = _tcstok_s(NULL, _T(" "), &next);
73 }
74 int result = main_common(hInstance, nCmdShow, argc, argv);
75 for (int i = 0; i < argc; ++i) {
76 sk_free(argv[i]);
77 }
78 return result;
79 }
80
main(int argc,char ** argv)81 int main(int argc, char**argv) {
82 return main_common(GetModuleHandle(NULL), SW_SHOW, argc, argv);
83 }
84
main_common(HINSTANCE hInstance,int show,int argc,char ** argv)85 static int main_common(HINSTANCE hInstance, int show, int argc, char**argv) {
86 const TCHAR* windowClass = register_class(hInstance);
87
88 application_init();
89
90 SkOSWindow::WindowInit winInit;
91 winInit.fInstance = hInstance;
92 winInit.fClass = windowClass;
93
94 create_sk_window(&winInit, argc, argv);
95 SkOSWindow::ForAllWindows([show](void* hWnd, SkOSWindow**) {
96 ShowWindow((HWND)hWnd, show);
97 UpdateWindow((HWND)hWnd); }
98 );
99
100 MSG msg;
101 // Main message loop
102 while (GetMessage(&msg, NULL, 0, 0)) {
103 if (true) {
104 TranslateMessage(&msg);
105 DispatchMessage(&msg);
106 }
107 }
108
109 application_term();
110
111 return (int) msg.wParam;
112 }
113
114 extern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv);
115
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)116 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
117 switch (message) {
118 case WM_COMMAND:
119 return DefWindowProc(hWnd, message, wParam, lParam);
120 case WM_DESTROY:
121 PostQuitMessage(0);
122 break;
123 default: {
124 SkOSWindow* window = SkOSWindow::GetOSWindowForHWND(hWnd);
125 if (window && window->wndProc(hWnd, message, wParam, lParam)) {
126 return 0;
127 } else {
128 return DefWindowProc(hWnd, message, wParam, lParam);
129 }
130 }
131 }
132 return 0;
133 }
134
135