// Copyright (c) 2015 The Chromium Embedded Framework Authors. All rights // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. #include "tests/shared/browser/util_win.h" #include "include/base/cef_logging.h" namespace client { void SetUserDataPtr(HWND hWnd, void* ptr) { SetLastError(ERROR_SUCCESS); LONG_PTR result = ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(ptr)); CHECK(result != 0 || GetLastError() == ERROR_SUCCESS); } WNDPROC SetWndProcPtr(HWND hWnd, WNDPROC wndProc) { WNDPROC old = reinterpret_cast(::GetWindowLongPtr(hWnd, GWLP_WNDPROC)); CHECK(old != NULL); LONG_PTR result = ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast(wndProc)); CHECK(result != 0 || GetLastError() == ERROR_SUCCESS); return old; } std::wstring GetResourceString(UINT id) { #define MAX_LOADSTRING 100 TCHAR buff[MAX_LOADSTRING] = {0}; LoadString(::GetModuleHandle(NULL), id, buff, MAX_LOADSTRING); return buff; } int GetCefMouseModifiers(WPARAM wparam) { int modifiers = 0; if (wparam & MK_CONTROL) modifiers |= EVENTFLAG_CONTROL_DOWN; if (wparam & MK_SHIFT) modifiers |= EVENTFLAG_SHIFT_DOWN; if (IsKeyDown(VK_MENU)) modifiers |= EVENTFLAG_ALT_DOWN; if (wparam & MK_LBUTTON) modifiers |= EVENTFLAG_LEFT_MOUSE_BUTTON; if (wparam & MK_MBUTTON) modifiers |= EVENTFLAG_MIDDLE_MOUSE_BUTTON; if (wparam & MK_RBUTTON) modifiers |= EVENTFLAG_RIGHT_MOUSE_BUTTON; // Low bit set from GetKeyState indicates "toggled". if (::GetKeyState(VK_NUMLOCK) & 1) modifiers |= EVENTFLAG_NUM_LOCK_ON; if (::GetKeyState(VK_CAPITAL) & 1) modifiers |= EVENTFLAG_CAPS_LOCK_ON; return modifiers; } int GetCefKeyboardModifiers(WPARAM wparam, LPARAM lparam) { int modifiers = 0; if (IsKeyDown(VK_SHIFT)) modifiers |= EVENTFLAG_SHIFT_DOWN; if (IsKeyDown(VK_CONTROL)) modifiers |= EVENTFLAG_CONTROL_DOWN; if (IsKeyDown(VK_MENU)) modifiers |= EVENTFLAG_ALT_DOWN; // Low bit set from GetKeyState indicates "toggled". if (::GetKeyState(VK_NUMLOCK) & 1) modifiers |= EVENTFLAG_NUM_LOCK_ON; if (::GetKeyState(VK_CAPITAL) & 1) modifiers |= EVENTFLAG_CAPS_LOCK_ON; switch (wparam) { case VK_RETURN: if ((lparam >> 16) & KF_EXTENDED) modifiers |= EVENTFLAG_IS_KEY_PAD; break; case VK_INSERT: case VK_DELETE: case VK_HOME: case VK_END: case VK_PRIOR: case VK_NEXT: case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT: if (!((lparam >> 16) & KF_EXTENDED)) modifiers |= EVENTFLAG_IS_KEY_PAD; break; case VK_NUMLOCK: case VK_NUMPAD0: case VK_NUMPAD1: case VK_NUMPAD2: case VK_NUMPAD3: case VK_NUMPAD4: case VK_NUMPAD5: case VK_NUMPAD6: case VK_NUMPAD7: case VK_NUMPAD8: case VK_NUMPAD9: case VK_DIVIDE: case VK_MULTIPLY: case VK_SUBTRACT: case VK_ADD: case VK_DECIMAL: case VK_CLEAR: modifiers |= EVENTFLAG_IS_KEY_PAD; break; case VK_SHIFT: if (IsKeyDown(VK_LSHIFT)) modifiers |= EVENTFLAG_IS_LEFT; else if (IsKeyDown(VK_RSHIFT)) modifiers |= EVENTFLAG_IS_RIGHT; break; case VK_CONTROL: if (IsKeyDown(VK_LCONTROL)) modifiers |= EVENTFLAG_IS_LEFT; else if (IsKeyDown(VK_RCONTROL)) modifiers |= EVENTFLAG_IS_RIGHT; break; case VK_MENU: if (IsKeyDown(VK_LMENU)) modifiers |= EVENTFLAG_IS_LEFT; else if (IsKeyDown(VK_RMENU)) modifiers |= EVENTFLAG_IS_RIGHT; break; case VK_LWIN: modifiers |= EVENTFLAG_IS_LEFT; break; case VK_RWIN: modifiers |= EVENTFLAG_IS_RIGHT; break; } return modifiers; } bool IsKeyDown(WPARAM wparam) { return (GetKeyState(wparam) & 0x8000) != 0; } float GetDeviceScaleFactor() { static float scale_factor = 1.0; static bool initialized = false; if (!initialized) { // This value is safe to cache for the life time of the app since the user // must logout to change the DPI setting. This value also applies to all // screens. HDC screen_dc = ::GetDC(NULL); int dpi_x = GetDeviceCaps(screen_dc, LOGPIXELSX); scale_factor = static_cast(dpi_x) / 96.0f; ::ReleaseDC(NULL, screen_dc); initialized = true; } return scale_factor; } } // namespace client