You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.9 KiB
163 lines
3.9 KiB
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program Tester Core |
|
* ---------------------------------------- |
|
* |
|
* Copyright 2016 The Android Open Source Project |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
*//*! |
|
* \file |
|
* \brief Generic Win32 window class. |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "tcuWin32Window.hpp" |
|
|
|
namespace tcu |
|
{ |
|
namespace win32 |
|
{ |
|
|
|
static LRESULT CALLBACK windowProcCallback (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
Window* window = reinterpret_cast<Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); |
|
if (window) |
|
return window->windowProc(uMsg, wParam, lParam); |
|
else |
|
return DefWindowProc(hWnd, uMsg, wParam, lParam); |
|
} |
|
|
|
Window::Window (HINSTANCE instance, int width, int height) |
|
: m_window (DE_NULL) |
|
{ |
|
try |
|
{ |
|
static const char s_className[] = "dEQP Test Process Class"; |
|
static const char s_windowName[] = "dEQP Test Process"; |
|
|
|
{ |
|
WNDCLASS wndClass; |
|
memset(&wndClass, 0, sizeof(wndClass)); |
|
wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; |
|
wndClass.lpfnWndProc = windowProcCallback; |
|
wndClass.cbClsExtra = 0; |
|
wndClass.cbWndExtra = 0; |
|
wndClass.hInstance = instance; |
|
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); |
|
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
|
wndClass.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); |
|
wndClass.lpszMenuName = NULL; |
|
wndClass.lpszClassName = s_className; |
|
|
|
RegisterClass(&wndClass); |
|
} |
|
|
|
m_window = CreateWindow(s_className, s_windowName, |
|
WS_CLIPCHILDREN | WS_POPUP, |
|
CW_USEDEFAULT, CW_USEDEFAULT, |
|
width, height, |
|
NULL, NULL, instance, NULL); |
|
|
|
if (!m_window) |
|
TCU_THROW(ResourceError, "Failed to create Win32 window"); |
|
|
|
// Store this as userdata |
|
SetWindowLongPtr(m_window, GWLP_USERDATA, (LONG_PTR)this); |
|
|
|
setSize(width, height); |
|
} |
|
catch (...) |
|
{ |
|
if (m_window) |
|
DestroyWindow(m_window); |
|
|
|
throw; |
|
} |
|
} |
|
|
|
Window::~Window (void) |
|
{ |
|
if (m_window) |
|
{ |
|
// Clear this pointer from windowproc |
|
SetWindowLongPtr(m_window, GWLP_USERDATA, 0); |
|
} |
|
|
|
DestroyWindow(m_window); |
|
} |
|
|
|
void Window::setVisible (bool visible) |
|
{ |
|
ShowWindow(m_window, visible ? SW_SHOW : SW_HIDE); |
|
} |
|
|
|
void Window::setSize (int width, int height) |
|
{ |
|
RECT rc; |
|
|
|
rc.left = 0; |
|
rc.top = 0; |
|
rc.right = width; |
|
rc.bottom = height; |
|
|
|
if (!AdjustWindowRect(&rc, GetWindowLong(m_window, GWL_STYLE), GetMenu(m_window) != NULL)) |
|
TCU_THROW(TestError, "AdjustWindowRect() failed"); |
|
|
|
if (!SetWindowPos(m_window, NULL, 0, 0, |
|
rc.right - rc.left, rc.bottom - rc.top, |
|
SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER)) |
|
TCU_THROW(TestError, "SetWindowPos() failed"); |
|
} |
|
|
|
IVec2 Window::getSize (void) const |
|
{ |
|
RECT rc; |
|
if (!GetClientRect(m_window, &rc)) |
|
TCU_THROW(TestError, "GetClientRect() failed"); |
|
|
|
return IVec2(rc.right - rc.left, |
|
rc.bottom - rc.top); |
|
} |
|
|
|
void Window::processEvents (void) |
|
{ |
|
MSG msg; |
|
while (PeekMessage(&msg, m_window, 0, 0, PM_REMOVE)) |
|
DispatchMessage(&msg); |
|
} |
|
|
|
LRESULT Window::windowProc (UINT uMsg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
switch (uMsg) |
|
{ |
|
// \todo [2014-03-12 pyry] Handle WM_SIZE? |
|
|
|
case WM_DESTROY: |
|
PostQuitMessage(0); |
|
return 0; |
|
|
|
case WM_KEYDOWN: |
|
if (wParam == VK_ESCAPE) |
|
{ |
|
PostQuitMessage(0); |
|
return 0; |
|
} |
|
// fall-through |
|
|
|
default: |
|
return DefWindowProc(m_window, uMsg, wParam, lParam); |
|
} |
|
} |
|
|
|
} // win32 |
|
} // tcu
|
|
|