1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
3 * ----------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Generic Win32 window class.
22 *//*--------------------------------------------------------------------*/
23
24 #include "tcuWin32Window.hpp"
25
26 namespace tcu
27 {
28
win32WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)29 static LRESULT CALLBACK win32WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
30 {
31 Win32Window* window = reinterpret_cast<Win32Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
32 if (window)
33 return window->windowProc(uMsg, wParam, lParam);
34 else
35 return DefWindowProc(hWnd, uMsg, wParam, lParam);
36 }
37
Win32Window(HINSTANCE instance,int width,int height)38 Win32Window::Win32Window (HINSTANCE instance, int width, int height)
39 : m_window (DE_NULL)
40 {
41 try
42 {
43 static const char s_className[] = "dEQP Tester Core Class";
44 static const char s_windowName[] = "dEQP Tester Core";
45
46 {
47 WNDCLASS wndClass;
48 memset(&wndClass, 0, sizeof(wndClass));
49 wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
50 wndClass.lpfnWndProc = win32WindowProc;
51 wndClass.cbClsExtra = 0;
52 wndClass.cbWndExtra = 0;
53 wndClass.hInstance = instance;
54 wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
55 wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
56 wndClass.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
57 wndClass.lpszMenuName = NULL;
58 wndClass.lpszClassName = s_className;
59
60 RegisterClass(&wndClass);
61 }
62
63 m_window = CreateWindow(s_className, s_windowName,
64 WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW,
65 CW_USEDEFAULT, CW_USEDEFAULT,
66 width, height,
67 NULL, NULL, instance, NULL);
68
69 if (!m_window)
70 throw ResourceError("Failed to create Win32 window", "", __FILE__, __LINE__);
71
72 // Store this as userdata
73 SetWindowLongPtr(m_window, GWLP_USERDATA, (LONG_PTR)this);
74
75 setSize(width, height);
76 }
77 catch (...)
78 {
79 if (m_window)
80 DestroyWindow(m_window);
81
82 throw;
83 }
84 }
85
~Win32Window(void)86 Win32Window::~Win32Window (void)
87 {
88 if (m_window)
89 {
90 // Clear this pointer from windowproc
91 SetWindowLongPtr(m_window, GWLP_USERDATA, 0);
92 }
93
94 DestroyWindow(m_window);
95 }
96
setVisible(bool visible)97 void Win32Window::setVisible (bool visible)
98 {
99 ShowWindow(m_window, visible ? SW_SHOW : SW_HIDE);
100 }
101
setSize(int width,int height)102 void Win32Window::setSize (int width, int height)
103 {
104 RECT rc;
105
106 rc.left = 0;
107 rc.top = 0;
108 rc.right = width;
109 rc.bottom = height;
110
111 if (!AdjustWindowRect(&rc, GetWindowLong(m_window, GWL_STYLE), GetMenu(m_window) != NULL))
112 throw tcu::TestError("AdjustWindowRect() failed", DE_NULL, __FILE__, __LINE__);
113
114 if (!SetWindowPos(m_window, NULL, 0, 0,
115 rc.right - rc.left, rc.bottom - rc.top,
116 SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER))
117 throw tcu::TestError("SetWindowPos() failed", DE_NULL, __FILE__, __LINE__);
118 }
119
getSize(void) const120 IVec2 Win32Window::getSize (void) const
121 {
122 RECT rc;
123 if (!GetClientRect(m_window, &rc))
124 throw tcu::TestError("GetClientRect() failed", DE_NULL, __FILE__, __LINE__);
125
126 return IVec2(rc.right - rc.left,
127 rc.bottom - rc.top);
128 }
129
processEvents(void)130 void Win32Window::processEvents (void)
131 {
132 MSG msg;
133 while (PeekMessage(&msg, m_window, 0, 0, PM_REMOVE))
134 DispatchMessage(&msg);
135 }
136
windowProc(UINT uMsg,WPARAM wParam,LPARAM lParam)137 LRESULT Win32Window::windowProc (UINT uMsg, WPARAM wParam, LPARAM lParam)
138 {
139 switch (uMsg)
140 {
141 // \todo [2014-03-12 pyry] Handle WM_SIZE?
142
143 case WM_DESTROY:
144 PostQuitMessage(0);
145 return 0;
146
147 case WM_KEYDOWN:
148 if (wParam == VK_ESCAPE)
149 {
150 PostQuitMessage(0);
151 return 0;
152 }
153 // fall-through
154
155 default:
156 return DefWindowProc(m_window, uMsg, wParam, lParam);
157 }
158 }
159
160 } // tcu
161