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:
16HINSTANCE hInst;                            // current instance
17TCHAR szTitle[] = _T("SampleApp");          // The title bar text
18TCHAR szWindowClass[] = _T("SAMPLEAPP");    // the main window class name
19
20// Forward declarations of functions included in this code module:
21ATOM                MyRegisterClass(HINSTANCE hInstance);
22BOOL                InitInstance(HINSTANCE, int, LPTSTR);
23LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
24INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
25
26int 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//
74ATOM 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"
96extern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv);
97
98static SkOSWindow* gSkWind;
99
100char* 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*) sk_malloc_throw(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
124BOOL 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      sk_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//
171LRESULT 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.
190INT_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