12f18b292ff155af7df35930474857b507dbf18feTony Barbour/*
22f18b292ff155af7df35930474857b507dbf18feTony Barbour * Copyright (C) 2016 Google, Inc.
32f18b292ff155af7df35930474857b507dbf18feTony Barbour *
42f18b292ff155af7df35930474857b507dbf18feTony Barbour * Permission is hereby granted, free of charge, to any person obtaining a
52f18b292ff155af7df35930474857b507dbf18feTony Barbour * copy of this software and associated documentation files (the "Software"),
62f18b292ff155af7df35930474857b507dbf18feTony Barbour * to deal in the Software without restriction, including without limitation
72f18b292ff155af7df35930474857b507dbf18feTony Barbour * the rights to use, copy, modify, merge, publish, distribute, sublicense,
82f18b292ff155af7df35930474857b507dbf18feTony Barbour * and/or sell copies of the Software, and to permit persons to whom the
92f18b292ff155af7df35930474857b507dbf18feTony Barbour * Software is furnished to do so, subject to the following conditions:
102f18b292ff155af7df35930474857b507dbf18feTony Barbour *
112f18b292ff155af7df35930474857b507dbf18feTony Barbour * The above copyright notice and this permission notice shall be included
122f18b292ff155af7df35930474857b507dbf18feTony Barbour * in all copies or substantial portions of the Software.
132f18b292ff155af7df35930474857b507dbf18feTony Barbour *
142f18b292ff155af7df35930474857b507dbf18feTony Barbour * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152f18b292ff155af7df35930474857b507dbf18feTony Barbour * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
162f18b292ff155af7df35930474857b507dbf18feTony Barbour * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
172f18b292ff155af7df35930474857b507dbf18feTony Barbour * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
182f18b292ff155af7df35930474857b507dbf18feTony Barbour * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
192f18b292ff155af7df35930474857b507dbf18feTony Barbour * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
202f18b292ff155af7df35930474857b507dbf18feTony Barbour * DEALINGS IN THE SOFTWARE.
212f18b292ff155af7df35930474857b507dbf18feTony Barbour */
222f18b292ff155af7df35930474857b507dbf18feTony Barbour
232f18b292ff155af7df35930474857b507dbf18feTony Barbour#ifndef SHELL_WIN32_H
242f18b292ff155af7df35930474857b507dbf18feTony Barbour#define SHELL_WIN32_H
252f18b292ff155af7df35930474857b507dbf18feTony Barbour
262f18b292ff155af7df35930474857b507dbf18feTony Barbour#include <windows.h>
272f18b292ff155af7df35930474857b507dbf18feTony Barbour#include "Shell.h"
282f18b292ff155af7df35930474857b507dbf18feTony Barbour
292f18b292ff155af7df35930474857b507dbf18feTony Barbourclass ShellWin32 : public Shell {
302f18b292ff155af7df35930474857b507dbf18feTony Barbourpublic:
312f18b292ff155af7df35930474857b507dbf18feTony Barbour    ShellWin32(Game &game);
322f18b292ff155af7df35930474857b507dbf18feTony Barbour    ~ShellWin32();
332f18b292ff155af7df35930474857b507dbf18feTony Barbour
342f18b292ff155af7df35930474857b507dbf18feTony Barbour    void run();
352f18b292ff155af7df35930474857b507dbf18feTony Barbour    void quit();
362f18b292ff155af7df35930474857b507dbf18feTony Barbour
372f18b292ff155af7df35930474857b507dbf18feTony Barbourprivate:
382f18b292ff155af7df35930474857b507dbf18feTony Barbour
392f18b292ff155af7df35930474857b507dbf18feTony Barbour    PFN_vkGetInstanceProcAddr load_vk();
402f18b292ff155af7df35930474857b507dbf18feTony Barbour    bool can_present(VkPhysicalDevice phy, uint32_t queue_family);
412f18b292ff155af7df35930474857b507dbf18feTony Barbour
422f18b292ff155af7df35930474857b507dbf18feTony Barbour    void create_window();
432f18b292ff155af7df35930474857b507dbf18feTony Barbour    VkSurfaceKHR create_surface(VkInstance instance);
442f18b292ff155af7df35930474857b507dbf18feTony Barbour
452f18b292ff155af7df35930474857b507dbf18feTony Barbour    static LRESULT CALLBACK window_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
462f18b292ff155af7df35930474857b507dbf18feTony Barbour    {
472f18b292ff155af7df35930474857b507dbf18feTony Barbour        ShellWin32 *shell = reinterpret_cast<ShellWin32 *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
482f18b292ff155af7df35930474857b507dbf18feTony Barbour
492f18b292ff155af7df35930474857b507dbf18feTony Barbour        // called from constructor, CreateWindowEx specifically.  But why?
502f18b292ff155af7df35930474857b507dbf18feTony Barbour        if (!shell)
512f18b292ff155af7df35930474857b507dbf18feTony Barbour            return DefWindowProc(hwnd, uMsg, wParam, lParam);
522f18b292ff155af7df35930474857b507dbf18feTony Barbour
532f18b292ff155af7df35930474857b507dbf18feTony Barbour        return shell->handle_message(uMsg, wParam, lParam);
542f18b292ff155af7df35930474857b507dbf18feTony Barbour    }
552f18b292ff155af7df35930474857b507dbf18feTony Barbour    LRESULT handle_message(UINT msg, WPARAM wparam, LPARAM lparam);
562f18b292ff155af7df35930474857b507dbf18feTony Barbour
572f18b292ff155af7df35930474857b507dbf18feTony Barbour    HINSTANCE hinstance_;
582f18b292ff155af7df35930474857b507dbf18feTony Barbour    HWND hwnd_;
592f18b292ff155af7df35930474857b507dbf18feTony Barbour
602f18b292ff155af7df35930474857b507dbf18feTony Barbour    HMODULE hmodule_;
612f18b292ff155af7df35930474857b507dbf18feTony Barbour};
622f18b292ff155af7df35930474857b507dbf18feTony Barbour
632f18b292ff155af7df35930474857b507dbf18feTony Barbour#endif // SHELL_WIN32_H
64