13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Generic Win32 window class.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuWin32Window.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic LRESULT CALLBACK win32WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Win32Window* window = reinterpret_cast<Win32Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (window)
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return window->windowProc(uMsg, wParam, lParam);
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return DefWindowProc(hWnd, uMsg, wParam, lParam);
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWin32Window::Win32Window (HINSTANCE instance, int width, int height)
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_window		(DE_NULL)
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
434cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos		static const char	s_className[]	= "dEQP Test Process Class";
444cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos		static const char	s_windowName[]	= "dEQP Test Process";
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			WNDCLASS wndClass;
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			memset(&wndClass, 0, sizeof(wndClass));
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.lpfnWndProc	= win32WindowProc;
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.cbClsExtra		= 0;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.cbWndExtra		= 0;
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.hInstance		= instance;
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.hCursor		= LoadCursor(NULL, IDC_ARROW);
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.hbrBackground	= CreateSolidBrush(RGB(0, 0, 0));
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.lpszMenuName	= NULL;
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			wndClass.lpszClassName	= s_className;
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			RegisterClass(&wndClass);
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_window = CreateWindow(s_className, s_windowName,
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW,
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								CW_USEDEFAULT, CW_USEDEFAULT,
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								width, height,
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								NULL, NULL, instance, NULL);
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!m_window)
704cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos			TCU_THROW(ResourceError, "Failed to create Win32 window");
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Store this as userdata
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SetWindowLongPtr(m_window, GWLP_USERDATA, (LONG_PTR)this);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		setSize(width, height);
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (...)
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_window)
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DestroyWindow(m_window);
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWin32Window::~Win32Window (void)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_window)
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Clear this pointer from windowproc
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SetWindowLongPtr(m_window, GWLP_USERDATA, 0);
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DestroyWindow(m_window);
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Win32Window::setVisible (bool visible)
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShowWindow(m_window, visible ? SW_SHOW : SW_HIDE);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Win32Window::setSize (int width, int height)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RECT rc;
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rc.left		= 0;
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rc.top		= 0;
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rc.right	= width;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rc.bottom	= height;
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!AdjustWindowRect(&rc, GetWindowLong(m_window, GWL_STYLE), GetMenu(m_window) != NULL))
1124cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos		TCU_THROW(TestError, "AdjustWindowRect() failed");
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!SetWindowPos(m_window, NULL, 0, 0,
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					  rc.right - rc.left, rc.bottom - rc.top,
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					  SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER))
1174cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos		TCU_THROW(TestError, "SetWindowPos() failed");
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec2 Win32Window::getSize (void) const
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RECT rc;
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!GetClientRect(m_window, &rc))
1244cd5b43c869f126cf67a6879d0eb8d9108b8ada5Pyry Haulos		TCU_THROW(TestError, "GetClientRect() failed");
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return IVec2(rc.right - rc.left,
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				 rc.bottom - rc.top);
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Win32Window::processEvents (void)
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MSG msg;
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	while (PeekMessage(&msg, m_window, 0, 0, PM_REMOVE))
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DispatchMessage(&msg);
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLRESULT Win32Window::windowProc (UINT uMsg, WPARAM wParam, LPARAM lParam)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (uMsg)
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \todo [2014-03-12 pyry] Handle WM_SIZE?
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case WM_DESTROY:
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			PostQuitMessage(0);
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return 0;
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case WM_KEYDOWN:
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (wParam == VK_ESCAPE)
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				PostQuitMessage(0);
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// fall-through
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return DefWindowProc(m_window, uMsg, wParam, lParam);
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
161