Home | History | Annotate | Download | only in win
      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.
     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 
     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 
     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 
     81 int main(int argc, char**argv) {
     82     return main_common(GetModuleHandle(NULL), SW_SHOW, argc, argv);
     83 }
     84 
     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 
    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