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