From 2d16edec45f6ddb99a73b663bf82b54fc4d28490 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Wed, 4 Jan 2012 19:21:44 +0900 Subject: [PATCH] Bug 712483 Implement mozilla::widget::WinUtils r=jimm --- widget/windows/Makefile.in | 1 + widget/windows/TaskbarPreview.cpp | 9 +- widget/windows/TaskbarTabPreview.cpp | 3 +- widget/windows/WinTaskbar.cpp | 11 +- widget/windows/WinUtils.cpp | 367 ++++++++++++++++++++++ widget/windows/WinUtils.h | 206 +++++++++++++ widget/windows/nsFilePicker.cpp | 13 +- widget/windows/nsIMM32Handler.cpp | 5 +- widget/windows/nsNativeThemeWin.cpp | 13 +- widget/windows/nsUXThemeData.cpp | 16 +- widget/windows/nsWindow.cpp | 434 +++++---------------------- widget/windows/nsWindow.h | 32 -- widget/windows/nsWindowDefs.h | 9 +- widget/windows/nsWindowGfx.cpp | 4 +- 14 files changed, 691 insertions(+), 432 deletions(-) create mode 100644 widget/windows/WinUtils.cpp create mode 100644 widget/windows/WinUtils.h diff --git a/widget/windows/Makefile.in b/widget/windows/Makefile.in index 04e732e97ac..c9327f88168 100644 --- a/widget/windows/Makefile.in +++ b/widget/windows/Makefile.in @@ -78,6 +78,7 @@ CPPSRCS = \ WidgetTraceEvent.cpp \ AudioSession.cpp \ nsWidgetFactory.cpp \ + WinUtils.cpp \ $(NULL) ifdef MOZ_CRASHREPORTER diff --git a/widget/windows/TaskbarPreview.cpp b/widget/windows/TaskbarPreview.cpp index b59f0109057..7fbbded456a 100644 --- a/widget/windows/TaskbarPreview.cpp +++ b/widget/windows/TaskbarPreview.cpp @@ -56,6 +56,7 @@ #include "nsWindow.h" #include "nsAppShell.h" #include "TaskbarPreviewButton.h" +#include "WinUtils.h" #include #include @@ -285,7 +286,7 @@ TaskbarPreview::Disable() { bool TaskbarPreview::IsWindowAvailable() const { if (mWnd) { - nsWindow* win = nsWindow::GetNSWindowPtr(mWnd); + nsWindow* win = WinUtils::GetNSWindowPtr(mWnd); if(win && !win->HasDestroyStarted()) { return true; } @@ -356,7 +357,7 @@ TaskbarPreview::CanMakeTaskbarCalls() { if (!::IsWindowVisible(mWnd)) return false; if (mVisible) { - nsWindow *window = nsWindow::GetNSWindowPtr(mWnd); + nsWindow *window = WinUtils::GetNSWindowPtr(mWnd); NS_ASSERTION(window, "Could not get nsWindow from HWND"); return window->HasTaskbarIconBeenCreated(); } @@ -365,7 +366,7 @@ TaskbarPreview::CanMakeTaskbarCalls() { WindowHook& TaskbarPreview::GetWindowHook() { - nsWindow *window = nsWindow::GetNSWindowPtr(mWnd); + nsWindow *window = WinUtils::GetNSWindowPtr(mWnd); NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!"); return window->GetWindowHook(); @@ -449,7 +450,7 @@ TaskbarPreview::MainWindowHook(void *aContext, // We can't really do anything at this point including removing hooks preview->mWnd = NULL; } else { - nsWindow *window = nsWindow::GetNSWindowPtr(preview->mWnd); + nsWindow *window = WinUtils::GetNSWindowPtr(preview->mWnd); NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!"); window->SetHasTaskbarIconBeenCreated(); diff --git a/widget/windows/TaskbarTabPreview.cpp b/widget/windows/TaskbarTabPreview.cpp index 85ae2af938f..8d3ce9c99b3 100644 --- a/widget/windows/TaskbarTabPreview.cpp +++ b/widget/windows/TaskbarTabPreview.cpp @@ -43,6 +43,7 @@ #include "TaskbarTabPreview.h" #include "nsWindowGfx.h" #include "nsUXThemeData.h" +#include "WinUtils.h" #include #define TASKBARPREVIEW_HWNDID L"TaskbarTabPreviewHwnd" @@ -184,7 +185,7 @@ TaskbarTabPreview::WndProc(UINT nMsg, WPARAM wParam, LPARAM lParam) { bool activateWindow; nsresult rv = mController->OnActivate(&activateWindow); if (NS_SUCCEEDED(rv) && activateWindow) { - nsWindow* win = nsWindow::GetNSWindowPtr(mWnd); + nsWindow* win = WinUtils::GetNSWindowPtr(mWnd); if (win) { nsWindow * parent = win->GetTopLevelWindow(true); if (parent) { diff --git a/widget/windows/WinTaskbar.cpp b/widget/windows/WinTaskbar.cpp index 55e7618775f..2a558c89306 100644 --- a/widget/windows/WinTaskbar.cpp +++ b/widget/windows/WinTaskbar.cpp @@ -56,6 +56,7 @@ #include "nsIJumpListBuilder.h" #include "nsUXThemeData.h" #include "nsWindow.h" +#include "WinUtils.h" #include "TaskbarTabPreview.h" #include "TaskbarWindowPreview.h" #include "JumpListBuilder.h" @@ -328,13 +329,13 @@ WinTaskbar::GetAppUserModelID(nsAString & aDefaultGroupId) { // The hash is short, but users may customize this, so use a respectable // string buffer. PRUnichar buf[256]; - if (nsWindow::GetRegistryKey(HKEY_LOCAL_MACHINE, + if (WinUtils::GetRegistryKey(HKEY_LOCAL_MACHINE, regKey.get(), path, buf, sizeof buf)) { aDefaultGroupId.Assign(buf); - } else if (nsWindow::GetRegistryKey(HKEY_CURRENT_USER, + } else if (WinUtils::GetRegistryKey(HKEY_CURRENT_USER, regKey.get(), path, buf, @@ -360,7 +361,7 @@ WinTaskbar::GetDefaultGroupId(nsAString & aDefaultGroupId) { // (static) Called from AppShell bool WinTaskbar::RegisterAppUserModelID() { - if (nsWindow::GetWindowsVersion() < WIN7_VERSION) + if (WinUtils::GetWindowsVersion() < WinUtils::WIN7_VERSION) return false; SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nsnull; @@ -392,7 +393,7 @@ WinTaskbar::RegisterAppUserModelID() { NS_IMETHODIMP WinTaskbar::GetAvailable(bool *aAvailable) { *aAvailable = - nsWindow::GetWindowsVersion() < WIN7_VERSION ? + WinUtils::GetWindowsVersion() < WinUtils::WIN7_VERSION ? false : true; return NS_OK; @@ -432,7 +433,7 @@ WinTaskbar::GetTaskbarWindowPreview(nsIDocShell *shell, nsITaskbarWindowPreview if (!toplevelHWND) return NS_ERROR_INVALID_ARG; - nsWindow *window = nsWindow::GetNSWindowPtr(toplevelHWND); + nsWindow *window = WinUtils::GetNSWindowPtr(toplevelHWND); if (!window) return NS_ERROR_FAILURE; diff --git a/widget/windows/WinUtils.cpp b/widget/windows/WinUtils.cpp new file mode 100644 index 00000000000..c8d73fa9263 --- /dev/null +++ b/widget/windows/WinUtils.cpp @@ -0,0 +1,367 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sts=2 sw=2 et cin: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Masayuki Nakano + * + * Original nsWindow.cpp Contributor(s): + * Dean Tessman + * Ere Maijala + * Mark Hammond + * Michael Lowe + * Peter Bajusz + * Pierre Phaneuf + * Robert O'Callahan + * Roy Yokoyama + * Makoto Kato + * Masayuki Nakano + * Dainis Jonitis + * Christian Biesinger + * Mats Palmgren + * Ningjie Chen + * Jim Mathies + * Kyle Huey + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "WinUtils.h" +#include "nsWindow.h" +#include "nsWindowDefs.h" +#include "nsGUIEvent.h" +#include "nsIDOMMouseEvent.h" +#include "mozilla/Preferences.h" + +namespace mozilla { +namespace widget { + +/* static */ +WinUtils::WinVersion +WinUtils::GetWindowsVersion() +{ + static PRInt32 version = 0; + + if (version) { + return static_cast(version); + } + + OSVERSIONINFOEX osInfo; + osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + // This cast is safe and supposed to be here, don't worry + ::GetVersionEx((OSVERSIONINFO*)&osInfo); + version = + (osInfo.dwMajorVersion & 0xff) << 8 | (osInfo.dwMinorVersion & 0xff); + return static_cast(version); +} + +/* static */ +bool +WinUtils::GetRegistryKey(HKEY aRoot, + const PRUnichar* aKeyName, + const PRUnichar* aValueName, + PRUnichar* aBuffer, + DWORD aBufferLength) +{ + NS_PRECONDITION(aKeyName, "The key name is NULL"); + + HKEY key; + LONG result = + ::RegOpenKeyExW(aRoot, aKeyName, NULL, KEY_READ | KEY_WOW64_32KEY, &key); + if (result != ERROR_SUCCESS) { + result = + ::RegOpenKeyExW(aRoot, aKeyName, NULL, KEY_READ | KEY_WOW64_64KEY, &key); + if (result != ERROR_SUCCESS) { + return false; + } + } + + DWORD type; + result = + ::RegQueryValueExW(key, aValueName, NULL, &type, (BYTE*) aBuffer, + &aBufferLength); + ::RegCloseKey(key); + if (result != ERROR_SUCCESS || type != REG_SZ) { + return false; + } + if (aBuffer) { + aBuffer[aBufferLength / sizeof(*aBuffer) - 1] = 0; + } + return true; +} + +/* static */ +HWND +WinUtils::GetTopLevelHWND(HWND aWnd, + bool aStopIfNotChild, + bool aStopIfNotPopup) +{ + HWND curWnd = aWnd; + HWND topWnd = NULL; + + while (curWnd) { + topWnd = curWnd; + + if (aStopIfNotChild) { + DWORD_PTR style = ::GetWindowLongPtrW(curWnd, GWL_STYLE); + + VERIFY_WINDOW_STYLE(style); + + if (!(style & WS_CHILD)) // first top-level window + break; + } + + HWND upWnd = ::GetParent(curWnd); // Parent or owner (if has no parent) + + // GetParent will only return the owner if the passed in window + // has the WS_POPUP style. + if (!upWnd && !aStopIfNotPopup) { + upWnd = ::GetWindow(curWnd, GW_OWNER); + } + curWnd = upWnd; + } + + return topWnd; +} + +static PRUnichar* +GetNSWindowPropName() +{ + static PRUnichar sPropName[40] = L""; + if (!*sPropName) { + _snwprintf(sPropName, 39, L"MozillansIWidgetPtr%p", + ::GetCurrentProcessId()); + sPropName[39] = '\0'; + } + return sPropName; +} + +/* static */ +bool +WinUtils::SetNSWindowPtr(HWND aWnd, nsWindow* aWindow) +{ + if (!aWindow) { + ::RemovePropW(aWnd, GetNSWindowPropName()); + return true; + } + return ::SetPropW(aWnd, GetNSWindowPropName(), (HANDLE)aWindow); +} + +/* static */ +nsWindow* +WinUtils::GetNSWindowPtr(HWND aWnd) +{ + return static_cast(::GetPropW(aWnd, GetNSWindowPropName())); +} + +static BOOL CALLBACK +AddMonitor(HMONITOR, HDC, LPRECT, LPARAM aParam) +{ + (*(PRInt32*)aParam)++; + return TRUE; +} + +/* static */ +PRInt32 +WinUtils::GetMonitorCount() +{ + PRInt32 monitorCount = 0; + EnumDisplayMonitors(NULL, NULL, AddMonitor, (LPARAM)&monitorCount); + return monitorCount; +} + +/* static */ +bool +WinUtils::IsOurProcessWindow(HWND aWnd) +{ + if (!aWnd) { + return false; + } + DWORD processId = 0; + ::GetWindowThreadProcessId(aWnd, &processId); + return (processId == ::GetCurrentProcessId()); +} + +/* static */ +HWND +WinUtils::FindOurProcessWindow(HWND aWnd) +{ + for (HWND wnd = ::GetParent(aWnd); wnd; wnd = ::GetParent(wnd)) { + if (IsOurProcessWindow(wnd)) { + return wnd; + } + } + return NULL; +} + +static bool +IsPointInWindow(HWND aWnd, const POINT& aPointInScreen) +{ + RECT bounds; + if (!::GetWindowRect(aWnd, &bounds)) { + return false; + } + + return (aPointInScreen.x >= bounds.left && aPointInScreen.x < bounds.right && + aPointInScreen.y >= bounds.top && aPointInScreen.y < bounds.bottom); +} + +/** + * FindTopmostWindowAtPoint() returns the topmost child window (topmost means + * forground in this context) of aWnd. + */ + +static HWND +FindTopmostWindowAtPoint(HWND aWnd, const POINT& aPointInScreen) +{ + if (!::IsWindowVisible(aWnd) || !IsPointInWindow(aWnd, aPointInScreen)) { + return NULL; + } + + HWND childWnd = ::GetTopWindow(aWnd); + while (childWnd) { + HWND topmostWnd = FindTopmostWindowAtPoint(childWnd, aPointInScreen); + if (topmostWnd) { + return topmostWnd; + } + childWnd = ::GetNextWindow(childWnd, GW_HWNDNEXT); + } + + return aWnd; +} + +struct FindOurWindowAtPointInfo +{ + POINT mInPointInScreen; + HWND mOutWnd; +}; + +static BOOL CALLBACK +FindOurWindowAtPointCallback(HWND aWnd, LPARAM aLPARAM) +{ + if (!WinUtils::IsOurProcessWindow(aWnd)) { + // This isn't one of our top-level windows; continue enumerating. + return TRUE; + } + + // Get the top-most child window under the point. If there's no child + // window, and the point is within the top-level window, then the top-level + // window will be returned. (This is the usual case. A child window + // would be returned for plugins.) + FindOurWindowAtPointInfo* info = + reinterpret_cast(aLPARAM); + HWND childWnd = FindTopmostWindowAtPoint(aWnd, info->mInPointInScreen); + if (!childWnd) { + // This window doesn't contain the point; continue enumerating. + return TRUE; + } + + // Return the HWND and stop enumerating. + info->mOutWnd = childWnd; + return FALSE; +} + +/* static */ +HWND +WinUtils::FindOurWindowAtPoint(const POINT& aPointInScreen) +{ + FindOurWindowAtPointInfo info; + info.mInPointInScreen = aPointInScreen; + info.mOutWnd = NULL; + + // This will enumerate all top-level windows in order from top to bottom. + EnumWindows(FindOurWindowAtPointCallback, reinterpret_cast(&info)); + return info.mOutWnd; +} + +/* static */ +UINT +WinUtils::GetInternalMessage(UINT aNativeMessage) +{ + switch (aNativeMessage) { + case WM_MOUSEWHEEL: + return MOZ_WM_MOUSEVWHEEL; + case WM_MOUSEHWHEEL: + return MOZ_WM_MOUSEHWHEEL; + case WM_VSCROLL: + return MOZ_WM_VSCROLL; + case WM_HSCROLL: + return MOZ_WM_HSCROLL; + default: + return aNativeMessage; + } +} + +/* static */ +UINT +WinUtils::GetNativeMessage(UINT aInternalMessage) +{ + switch (aInternalMessage) { + case MOZ_WM_MOUSEVWHEEL: + return WM_MOUSEWHEEL; + case MOZ_WM_MOUSEHWHEEL: + return WM_MOUSEHWHEEL; + case MOZ_WM_VSCROLL: + return WM_VSCROLL; + case MOZ_WM_HSCROLL: + return WM_HSCROLL; + default: + return aInternalMessage; + } +} + +/* static */ +PRUint16 +WinUtils::GetMouseInputSource() +{ + PRInt32 inputSource = nsIDOMMouseEvent::MOZ_SOURCE_MOUSE; + LPARAM lParamExtraInfo = ::GetMessageExtraInfo(); + if ((lParamExtraInfo & TABLET_INK_SIGNATURE) == TABLET_INK_CHECK) { + inputSource = (lParamExtraInfo & TABLET_INK_TOUCH) ? + nsIDOMMouseEvent::MOZ_SOURCE_TOUCH : nsIDOMMouseEvent::MOZ_SOURCE_PEN; + } + return static_cast(inputSource); +} + +/* static */ +MSG +WinUtils::InitMSG(UINT aMessage, WPARAM wParam, LPARAM lParam) +{ + MSG msg; + msg.message = aMessage; + msg.wParam = wParam; + msg.lParam = lParam; + return msg; +} + +} // namespace widget +} // namespace mozilla diff --git a/widget/windows/WinUtils.h b/widget/windows/WinUtils.h new file mode 100644 index 00000000000..95d4b1eb017 --- /dev/null +++ b/widget/windows/WinUtils.h @@ -0,0 +1,206 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Masayuki Nakano + * + * Original nsWindow.cpp Contributor(s): + * Robert O'Callahan + * Dean Tessman + * Makoto Kato + * Dainis Jonitis + * Masayuki Nakano + * Ningjie Chen + * Jim Mathies . + * Mats Palmgren + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef mozilla_widget_WinUtils_h__ +#define mozilla_widget_WinUtils_h__ + +#include "nscore.h" +#include + +class nsWindow; + +namespace mozilla { +namespace widget { + +class WinUtils { +public: + enum WinVersion { + WIN2K_VERSION = 0x500, + WINXP_VERSION = 0x501, + WIN2K3_VERSION = 0x502, + VISTA_VERSION = 0x600, + // WIN2K8_VERSION = VISTA_VERSION, + WIN7_VERSION = 0x601 + // WIN2K8R2_VERSION = WIN7_VERSION + // WIN8_VERSION = 0x602 + }; + static WinVersion GetWindowsVersion(); + + /** + * Gets the value of a string-typed registry value. + * + * @param aRoot The registry root to search in. + * @param aKeyName The name of the registry key to open. + * @param aValueName The name of the registry value in the specified key whose + * value is to be retrieved. Can be null, to retrieve the key's unnamed/ + * default value. + * @param aBuffer The buffer into which to store the string value. Can be + * null, in which case the return value indicates just whether the value + * exists. + * @param aBufferLength The size of aBuffer, in bytes. + * @return Whether the value exists and is a string. + */ + static bool GetRegistryKey(HKEY aRoot, + const PRUnichar* aKeyName, + const PRUnichar* aValueName, + PRUnichar* aBuffer, + DWORD aBufferLength); + + /** + * GetTopLevelHWND() returns a window handle of the top level window which + * aWnd belongs to. Note that the result may not be our window, i.e., it + * may not be managed by nsWindow. + * + * See follwing table for the detail of the result window type. + * + * +-------------------------+-----------------------------------------------+ + * | | aStopIfNotPopup | + * +-------------------------+-----------------------+-----------------------+ + * | | TRUE | FALSE | + + +-----------------+-------+-----------------------+-----------------------+ + * | | | * an independent top level window | + * | | TRUE | * a pupup window (WS_POPUP) | + * | | | * an owned top level window (like dialog) | + * | aStopIfNotChild +-------+-----------------------+-----------------------+ + * | | | * independent window | * only an independent | + * | | FALSE | * non-popup-owned- | top level window | + * | | | window like dialog | | + * +-----------------+-------+-----------------------+-----------------------+ + */ + static HWND GetTopLevelHWND(HWND aWnd, + bool aStopIfNotChild = false, + bool aStopIfNotPopup = true); + + /** + * SetNSWindowPtr() associates an nsWindow to aWnd. If aWindow is NULL, + * it dissociate any nsWindow pointer from aWnd. + * GetNSWindowPtr() returns an nsWindow pointer which was associated by + * SetNSWindowPtr(). + */ + static bool SetNSWindowPtr(HWND aWnd, nsWindow* aWindow); + static nsWindow* GetNSWindowPtr(HWND aWnd); + + /** + * GetMonitorCount() returns count of monitors on the environment. + */ + static PRInt32 GetMonitorCount(); + + /** + * IsOurProcessWindow() returns TRUE if aWnd belongs our process. + * Otherwise, FALSE. + */ + static bool IsOurProcessWindow(HWND aWnd); + + /** + * FindOurProcessWindow() returns the nearest ancestor window which + * belongs to our process. If it fails to find our process's window by the + * top level window, returns NULL. And note that this is using ::GetParent() + * for climbing the window hierarchy, therefore, it gives up at an owned top + * level window except popup window (e.g., dialog). + */ + static HWND FindOurProcessWindow(HWND aWnd); + + /** + * FindOurWindowAtPoint() returns the topmost child window which belongs to + * our process's top level window. + * + * NOTE: the topmost child window may NOT be our process's window like a + * plugin's window. + */ + static HWND FindOurWindowAtPoint(const POINT& aPointInScreen); + + /** + * InitMSG() returns an MSG struct which was initialized by the params. + * Don't trust the other members in the result. + */ + static MSG InitMSG(UINT aMessage, WPARAM wParam, LPARAM lParam); + + /** + * GetScanCode() returns a scan code for the LPARAM of WM_KEYDOWN, WM_KEYUP, + * WM_CHAR and WM_UNICHAR. + * + */ + static WORD GetScanCode(LPARAM aLParam) + { + return (aLParam >> 16) & 0xFF; + } + + /** + * IsExtendedScanCode() returns TRUE if the LPARAM indicates the key message + * is an extended key event. + */ + static bool IsExtendedScanCode(LPARAM aLParam) + { + return (aLParam & 0x1000000) != 0; + } + + /** + * GetInternalMessage() converts a native message to an internal message. + * If there is no internal message for the given native message, returns + * the native message itself. + */ + static UINT GetInternalMessage(UINT aNativeMessage); + + /** + * GetNativeMessage() converts an internal message to a native message. + * If aInternalMessage is a native message, returns the native message itself. + */ + static UINT GetNativeMessage(UINT aInternalMessage); + + /** + * GetMouseInputSource() returns a pointing device information. The value is + * one of nsIDOMMouseEvent::MOZ_SOURCE_*. This method MUST be called during + * mouse message handling. + */ + static PRUint16 GetMouseInputSource(); +}; + +} // namespace widget +} // namespace mozilla + +#endif // mozilla_widget_WinUtils_h__ diff --git a/widget/windows/nsFilePicker.cpp b/widget/windows/nsFilePicker.cpp index adea45603c2..bc7d953cea1 100644 --- a/widget/windows/nsFilePicker.cpp +++ b/widget/windows/nsFilePicker.cpp @@ -59,6 +59,9 @@ #include "nsCRT.h" #include "nsString.h" #include "nsToolkit.h" +#include "WinUtils.h" + +using namespace mozilla::widget; PRUnichar *nsFilePicker::mLastUsedUnicodeDirectory; char nsFilePicker::mLastUsedDirectory[MAX_PATH+1] = { 0 }; @@ -706,7 +709,7 @@ nsFilePicker::ShowXPFilePicker(const nsString& aInitialDir) // a hook procedure. The hook procedure fixes a problem on XP dialogs for // file picker visibility. Vista and up automatically ensures the file // picker is always visible. - if (nsWindow::GetWindowsVersion() < VISTA_VERSION) { + if (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION) { ofn.lpfnHook = FilePickerHook; ofn.Flags |= OFN_ENABLEHOOK; } @@ -765,7 +768,7 @@ nsFilePicker::ShowXPFilePicker(const nsString& aInitialDir) // the file picker to use the old style dialogs because hooks are not // allowed in the new file picker UI. We need to eventually move to // the new Common File Dialogs for Vista and up. - if (nsWindow::GetWindowsVersion() < VISTA_VERSION) { + if (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION) { ofn.lpfnHook = MultiFilePickerHook; fileBuffer.forget(); result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN); @@ -1053,7 +1056,7 @@ nsFilePicker::ShowW(PRInt16 *aReturnVal) bool result = false; if (mMode == modeGetFolder) { #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN - if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) + if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) result = ShowFolderPicker(initialDir); else result = ShowXPFolderPicker(initialDir); @@ -1062,7 +1065,7 @@ nsFilePicker::ShowW(PRInt16 *aReturnVal) #endif } else { #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN - if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) + if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) result = ShowFilePicker(initialDir); else result = ShowXPFilePicker(initialDir); @@ -1259,7 +1262,7 @@ NS_IMETHODIMP nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) { #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN - if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) { + if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) { mComFilterList.Append(aTitle, aFilter); } else { AppendXPFilter(aTitle, aFilter); diff --git a/widget/windows/nsIMM32Handler.cpp b/widget/windows/nsIMM32Handler.cpp index b978286dfa3..8696bbad1a3 100644 --- a/widget/windows/nsIMM32Handler.cpp +++ b/widget/windows/nsIMM32Handler.cpp @@ -60,6 +60,9 @@ #include "nsIMM32Handler.h" #include "nsWindow.h" +#include "WinUtils.h" + +using namespace mozilla::widget; static nsIMM32Handler* gIMM32Handler = nsnull; @@ -148,7 +151,7 @@ nsIMM32Handler::IsTopLevelWindowOfComposition(nsWindow* aWindow) return false; } HWND wnd = gIMM32Handler->mComposingWindow->GetWindowHandle(); - return nsWindow::GetTopLevelHWND(wnd, true) == aWindow->GetWindowHandle(); + return WinUtils::GetTopLevelHWND(wnd, true) == aWindow->GetWindowHandle(); } /* static */ bool diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index 75e66bac457..8307b7e4910 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -60,6 +60,7 @@ #include "nsWindow.h" #include "nsIComboboxControlFrame.h" #include "prinrval.h" +#include "WinUtils.h" #include "gfxPlatform.h" #include "gfxContext.h" @@ -71,6 +72,8 @@ #include "nsUXThemeData.h" #include "nsUXThemeConstants.h" +using namespace mozilla::widget; + #ifdef PR_LOGGING extern PRLogModuleInfo* gWindowsLog; #endif @@ -382,7 +385,7 @@ static void AddPaddingRect(nsIntSize* aSize, CaptionButton button) { RECT offset; if (!nsUXThemeData::IsAppThemed()) offset = buttonData[CAPTION_CLASSIC].hotPadding[button]; - else if (nsWindow::GetWindowsVersion() == WINXP_VERSION) + else if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) offset = buttonData[CAPTION_XPTHEME].hotPadding[button]; else offset = buttonData[CAPTION_BASIC].hotPadding[button]; @@ -396,7 +399,7 @@ static void OffsetBackgroundRect(RECT& rect, CaptionButton button) { RECT offset; if (!nsUXThemeData::IsAppThemed()) offset = buttonData[CAPTION_CLASSIC].hotPadding[button]; - else if (nsWindow::GetWindowsVersion() == WINXP_VERSION) + else if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) offset = buttonData[CAPTION_XPTHEME].hotPadding[button]; else offset = buttonData[CAPTION_BASIC].hotPadding[button]; @@ -2077,7 +2080,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cx; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cy; // For XP, subtract 4 from system metrics dimensions. - if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { + if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) { aResult->width -= 4; aResult->height -= 4; } @@ -2089,7 +2092,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a QueryForButtonData(aFrame); aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cx; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cy; - if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { + if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) { aResult->width -= 4; aResult->height -= 4; } @@ -2101,7 +2104,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a QueryForButtonData(aFrame); aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cx; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cy; - if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { + if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) { aResult->width -= 4; aResult->height -= 4; } diff --git a/widget/windows/nsUXThemeData.cpp b/widget/windows/nsUXThemeData.cpp index fa25c615ca9..f526a507a13 100644 --- a/widget/windows/nsUXThemeData.cpp +++ b/widget/windows/nsUXThemeData.cpp @@ -43,11 +43,12 @@ #include "nsUXThemeData.h" #include "nsDebug.h" -// For GetWindowsVersion -#include "nsWindow.h" +#include "nsToolkit.h" +#include "WinUtils.h" #include "nsUXThemeConstants.h" using namespace mozilla; +using namespace mozilla::widget; const PRUnichar nsUXThemeData::kThemeLibraryName[] = L"uxtheme.dll"; @@ -120,9 +121,9 @@ nsUXThemeData::Initialize() ::ZeroMemory(sThemes, sizeof(sThemes)); NS_ASSERTION(!sThemeDLL, "nsUXThemeData being initialized twice!"); - PRInt32 version = nsWindow::GetWindowsVersion(); - sIsXPOrLater = version >= WINXP_VERSION; - sIsVistaOrLater = version >= VISTA_VERSION; + WinUtils::WinVersion version = WinUtils::GetWindowsVersion(); + sIsXPOrLater = version >= WinUtils::WINXP_VERSION; + sIsVistaOrLater = version >= WinUtils::VISTA_VERSION; if (GetThemeDLL()) { openTheme = (OpenThemeDataPtr)GetProcAddress(sThemeDLL, "OpenThemeData"); @@ -272,7 +273,7 @@ nsUXThemeData::InitTitlebarInfo() // Use system metrics for pre-vista, otherwise trigger a // refresh on the next layout. sTitlebarInfoPopulatedAero = sTitlebarInfoPopulatedThemed = - (nsWindow::GetWindowsVersion() < VISTA_VERSION); + (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION); } // static @@ -400,7 +401,8 @@ void nsUXThemeData::UpdateNativeThemeInfo() { // Trigger a refresh of themed button metrics if needed - sTitlebarInfoPopulatedThemed = (nsWindow::GetWindowsVersion() < VISTA_VERSION); + sTitlebarInfoPopulatedThemed = + (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION); sIsDefaultWindowsTheme = false; sThemeId = LookAndFeel::eWindowsTheme_Generic; diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index f8939e91d88..c8d5f91a446 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -161,6 +161,7 @@ #include "mozilla/Preferences.h" #include "nsISound.h" #include "WinTaskbar.h" +#include "WinUtils.h" #ifdef MOZ_ENABLE_D3D9_LAYER #include "LayerManagerD3D9.h" @@ -543,7 +544,8 @@ nsWindow::Create(nsIWidget *aParent, mParent = aParent; } else { // has a nsNative parent parent = (HWND)aNativeParent; - mParent = aNativeParent ? GetNSWindowPtr((HWND)aNativeParent) : nsnull; + mParent = aNativeParent ? + WinUtils::GetNSWindowPtr((HWND)aNativeParent) : nsnull; } mPopupType = aInitData->mPopupHint; @@ -677,7 +679,7 @@ nsWindow::Create(nsIWidget *aParent, // bugs over the years, disable it (sTrimOnMinimize=1) on Vista and up. sTrimOnMinimize = Preferences::GetBool("config.trim_on_minimize", - (GetWindowsVersion() >= VISTA_VERSION)) ? 1 : 0; + (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION)) ? 1 : 0; sSwitchKeyboardLayout = Preferences::GetBool("intl.keyboard.per_window_layout", false); gDisableNativeTheme = @@ -949,66 +951,19 @@ void nsWindow::SubclassWindow(BOOL bState) (LONG_PTR)nsWindow::WindowProc); NS_ASSERTION(mPrevWndProc, "Null standard window procedure"); // connect the this pointer to the nsWindow handle - SetNSWindowPtr(mWnd, this); + WinUtils::SetNSWindowPtr(mWnd, this); } else { if (mUnicodeWidget) ::SetWindowLongPtrW(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc); else ::SetWindowLongPtrA(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc); - SetNSWindowPtr(mWnd, NULL); + WinUtils::SetNSWindowPtr(mWnd, NULL); mPrevWndProc = NULL; } } } -/************************************************************** - * - * SECTION: Window properties - * - * Set and clear native window properties. - * - **************************************************************/ - -static PRUnichar sPropName[40] = L""; -static PRUnichar* GetNSWindowPropName() -{ - if (!*sPropName) - { - _snwprintf(sPropName, 39, L"MozillansIWidgetPtr%p", GetCurrentProcessId()); - sPropName[39] = '\0'; - } - return sPropName; -} - -nsWindow * nsWindow::GetNSWindowPtr(HWND aWnd) -{ - return (nsWindow *) ::GetPropW(aWnd, GetNSWindowPropName()); -} - -BOOL nsWindow::SetNSWindowPtr(HWND aWnd, nsWindow * ptr) -{ - if (ptr == NULL) { - ::RemovePropW(aWnd, GetNSWindowPropName()); - return TRUE; - } else { - return ::SetPropW(aWnd, GetNSWindowPropName(), (HANDLE)ptr); - } -} - -static BOOL CALLBACK AddMonitor(HMONITOR, HDC, LPRECT, LPARAM aParam) -{ - (*(PRInt32*)aParam)++; - return TRUE; -} - -PRInt32 nsWindow::GetMonitorCount() -{ - PRInt32 monitorCount = 0; - EnumDisplayMonitors(NULL, NULL, AddMonitor, (LPARAM)&monitorCount); - return monitorCount; -} - /************************************************************** * * SECTION: nsIWidget::SetParent, nsIWidget::GetParent @@ -1106,7 +1061,7 @@ nsWindow* nsWindow::GetParentWindow(bool aIncludeOwner) parent = ::GetAncestor(mWnd, GA_PARENT); if (parent) { - widget = GetNSWindowPtr(parent); + widget = WinUtils::GetNSWindowPtr(parent); if (widget) { // If the widget is in the process of being destroyed then // do NOT return it @@ -1123,7 +1078,7 @@ nsWindow* nsWindow::GetParentWindow(bool aIncludeOwner) BOOL CALLBACK nsWindow::EnumAllChildWindProc(HWND aWnd, LPARAM aParam) { - nsWindow *wnd = nsWindow::GetNSWindowPtr(aWnd); + nsWindow *wnd = WinUtils::GetNSWindowPtr(aWnd); if (wnd) { ((nsWindow::WindowEnumCallback*)aParam)(wnd); } @@ -1133,7 +1088,7 @@ nsWindow::EnumAllChildWindProc(HWND aWnd, LPARAM aParam) BOOL CALLBACK nsWindow::EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam) { - nsWindow *wnd = nsWindow::GetNSWindowPtr(aWnd); + nsWindow *wnd = WinUtils::GetNSWindowPtr(aWnd); if (wnd) { ((nsWindow::WindowEnumCallback*)aParam)(wnd); } @@ -1166,7 +1121,7 @@ NS_METHOD nsWindow::Show(bool bState) // pop-up windows when the DWM is disabled and two monitors are // connected. if (HasBogusPopupsDropShadowOnMultiMonitor() && - GetMonitorCount() > 1 && + WinUtils::GetMonitorCount() > 1 && !nsUXThemeData::CheckForCompositor()) { if (sDropShadowEnabled) { @@ -1369,14 +1324,14 @@ NS_METHOD nsWindow::UnregisterTouchWindow() { } BOOL CALLBACK nsWindow::RegisterTouchForDescendants(HWND aWnd, LPARAM aMsg) { - nsWindow* win = GetNSWindowPtr(aWnd); + nsWindow* win = WinUtils::GetNSWindowPtr(aWnd); if (win) win->mGesture.RegisterTouchWindow(aWnd); return TRUE; } BOOL CALLBACK nsWindow::UnregisterTouchForDescendants(HWND aWnd, LPARAM aMsg) { - nsWindow* win = GetNSWindowPtr(aWnd); + nsWindow* win = WinUtils::GetNSWindowPtr(aWnd); if (win) win->mGesture.UnregisterTouchWindow(aWnd); return TRUE; @@ -1579,7 +1534,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert CaptureMouse(false); // find the top-level window - HWND toplevelWnd = GetTopLevelHWND(mWnd, true); + HWND toplevelWnd = WinUtils::GetTopLevelHWND(mWnd, true); // tell Windows to start the resize ::PostMessage(toplevelWnd, WM_SYSCOMMAND, syscommand, @@ -1806,7 +1761,7 @@ NS_METHOD nsWindow::SetFocus(bool aRaise) { if (mWnd) { #ifdef WINSTATE_DEBUG_OUTPUT - if (mWnd == GetTopLevelHWND(mWnd)) { + if (mWnd == WinUtils::GetTopLevelHWND(mWnd)) { PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** SetFocus: [ top] raise=%d\n", aRaise)); } else { @@ -1815,7 +1770,7 @@ NS_METHOD nsWindow::SetFocus(bool aRaise) } #endif // Uniconify, if necessary - HWND toplevelWnd = GetTopLevelHWND(mWnd); + HWND toplevelWnd = WinUtils::GetTopLevelHWND(mWnd); if (aRaise && ::IsIconic(toplevelWnd)) { ::ShowWindow(toplevelWnd, SW_RESTORE); } @@ -2604,8 +2559,8 @@ void nsWindow::UpdateGlass() NS_IMETHODIMP nsWindow::HideWindowChrome(bool aShouldHide) { - HWND hwnd = GetTopLevelHWND(mWnd, true); - if (!GetNSWindowPtr(hwnd)) + HWND hwnd = WinUtils::GetTopLevelHWND(mWnd, true); + if (!WinUtils::GetNSWindowPtr(hwnd)) { NS_WARNING("Trying to hide window decorations in an embedded context"); return NS_ERROR_FAILURE; @@ -3106,13 +3061,13 @@ nsWindow::GetAttention(PRInt32 aCycleCount) if (!mWnd) return NS_ERROR_NOT_INITIALIZED; - HWND flashWnd = GetTopLevelHWND(mWnd, false, false); + HWND flashWnd = WinUtils::GetTopLevelHWND(mWnd, false, false); HWND fgWnd = ::GetForegroundWindow(); // Don't flash if the flash count is 0 or if the foreground window is our // window handle or that of our owned-most window. if (aCycleCount == 0 || flashWnd == fgWnd || - flashWnd == GetTopLevelHWND(fgWnd, false, false)) { + flashWnd == WinUtils::GetTopLevelHWND(fgWnd, false, false)) { return NS_OK; } @@ -3374,7 +3329,8 @@ nsWindow::OnDefaultButtonLoaded(const nsIntRect &aButtonRect) // Don't snap when we are not active. HWND activeWnd = ::GetActiveWindow(); if (activeWnd != ::GetForegroundWindow() || - GetTopLevelHWND(mWnd, true) != GetTopLevelHWND(activeWnd, true)) { + WinUtils::GetTopLevelHWND(mWnd, true) != + WinUtils::GetTopLevelHWND(activeWnd, true)) { return NS_OK; } @@ -3447,7 +3403,7 @@ nsWindow::OverrideSystemMouseScrollSpeed(PRInt32 aOriginalDelta, // Only Vista and later, Windows has the system setting of horizontal // scrolling by the mouse wheel. - if (GetWindowsVersion() >= VISTA_VERSION) { + if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) { if (!::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &systemSpeed, 0)) { return NS_ERROR_FAILURE; } @@ -3501,15 +3457,6 @@ nsWindow::OverrideSystemMouseScrollSpeed(PRInt32 aOriginalDelta, **************************************************************/ // Event intialization -MSG nsWindow::InitMSG(UINT aMessage, WPARAM wParam, LPARAM lParam) -{ - MSG msg; - msg.message = aMessage; - msg.wParam = wParam; - msg.lParam = lParam; - return msg; -} - void nsWindow::InitEvent(nsGUIEvent& event, nsIntPoint* aPoint) { if (nsnull == aPoint) { // use the point from the event @@ -3766,7 +3713,7 @@ void nsWindow::DispatchPendingEvents() // paint events pending. if (::GetQueueStatus(QS_PAINT)) { // Find the top level window. - HWND topWnd = GetTopLevelHWND(mWnd); + HWND topWnd = WinUtils::GetTopLevelHWND(mWnd); // Dispatch pending paints for topWnd and all its descendant windows. // Note: EnumChildWindows enumerates all descendant windows not just @@ -3799,7 +3746,7 @@ bool nsWindow::DispatchPluginEvent(UINT aMessage, LPARAM aLParam, bool aDispatchPendingEvents) { - bool ret = DispatchPluginEvent(InitMSG(aMessage, aWParam, aLParam)); + bool ret = DispatchPluginEvent(WinUtils::InitMSG(aMessage, aWParam, aLParam)); if (aDispatchPendingEvents) { DispatchPendingEvents(); } @@ -4097,7 +4044,7 @@ bool nsWindow::DispatchFocusToTopLevelWindow(PRUint32 aEventType) while (curWnd) { toplevelWnd = curWnd; - nsWindow *win = GetNSWindowPtr(curWnd); + nsWindow *win = WinUtils::GetNSWindowPtr(curWnd); if (win) { nsWindowType wintype; win->GetWindowType(wintype); @@ -4109,7 +4056,7 @@ bool nsWindow::DispatchFocusToTopLevelWindow(PRUint32 aEventType) } if (toplevelWnd) { - nsWindow *win = GetNSWindowPtr(toplevelWnd); + nsWindow *win = WinUtils::GetNSWindowPtr(toplevelWnd); if (win) return win->DispatchFocus(aEventType); } @@ -4161,14 +4108,14 @@ bool nsWindow::IsTopLevelMouseExit(HWND aWnd) mp.y = GET_Y_LPARAM(pos); HWND mouseWnd = ::WindowFromPoint(mp); - // GetTopLevelHWND will return a HWND for the window frame (which includes - // the non-client area). If the mouse has moved into the non-client area, - // we should treat it as a top-level exit. - HWND mouseTopLevel = nsWindow::GetTopLevelHWND(mouseWnd); + // WinUtils::GetTopLevelHWND() will return a HWND for the window frame + // (which includes the non-client area). If the mouse has moved into + // the non-client area, we should treat it as a top-level exit. + HWND mouseTopLevel = WinUtils::GetTopLevelHWND(mouseWnd); if (mouseWnd == mouseTopLevel) return true; - return nsWindow::GetTopLevelHWND(aWnd) != mouseTopLevel; + return WinUtils::GetTopLevelHWND(aWnd) != mouseTopLevel; } bool nsWindow::BlurEventsSuppressed() @@ -4180,7 +4127,7 @@ bool nsWindow::BlurEventsSuppressed() // are they suppressed by any container widget? HWND parentWnd = ::GetParent(mWnd); if (parentWnd) { - nsWindow *parent = GetNSWindowPtr(parentWnd); + nsWindow *parent = WinUtils::GetNSWindowPtr(parentWnd); if (parent) return parent->BlurEventsSuppressed(); } @@ -4290,7 +4237,7 @@ nsWindow::IPCWindowProcHandler(UINT& msg, WPARAM& wParam, LPARAM& lParam) GetClassNameW(focusWnd, szClass, sizeof(szClass)/sizeof(PRUnichar)) && !wcscmp(szClass, L"Edit") && - !IsOurProcessWindow(focusWnd)) { + !WinUtils::IsOurProcessWindow(focusWnd)) { break; } } @@ -4421,7 +4368,7 @@ LRESULT CALLBACK nsWindow::WindowProcInternal(HWND hWnd, UINT msg, WPARAM wParam } // Get the window which caused the event and ask it to process the message - nsWindow *someWindow = GetNSWindowPtr(hWnd); + nsWindow *someWindow = WinUtils::GetNSWindowPtr(hWnd); if (someWindow) someWindow->IPCWindowProcHandler(msg, wParam, lParam); @@ -4579,7 +4526,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, if (PluginHasFocus()) { bool callDefaultWndProc; - MSG nativeMsg = InitMSG(msg, wParam, lParam); + MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam); if (ProcessMessageForPlugin(nativeMsg, aRetValue, callDefaultWndProc)) { return mWnd ? !callDefaultWndProc : true; } @@ -4897,7 +4844,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case WM_SYSCHAR: case WM_CHAR: { - MSG nativeMsg = InitMSG(msg, wParam, lParam); + MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam); result = ProcessCharMessage(nativeMsg, nsnull); DispatchPendingEvents(); } @@ -4906,7 +4853,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case WM_SYSKEYUP: case WM_KEYUP: { - MSG nativeMsg = InitMSG(msg, wParam, lParam); + MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam); nativeMsg.time = ::GetMessageTime(); result = ProcessKeyUpMessage(nativeMsg, nsnull); DispatchPendingEvents(); @@ -4916,7 +4863,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case WM_SYSKEYDOWN: case WM_KEYDOWN: { - MSG nativeMsg = InitMSG(msg, wParam, lParam); + MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam); result = ProcessKeyDownMessage(nativeMsg, nsnull); DispatchPendingEvents(); } @@ -5158,7 +5105,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case MOZ_WM_HSCROLL: case MOZ_WM_VSCROLL: *aRetValue = 0; - OnScrollInternal(GetNativeMessage(msg), wParam, lParam); + OnScrollInternal(WinUtils::GetNativeMessage(msg), wParam, lParam); // Doesn't need to call next wndproc for internal message. return true; @@ -5222,7 +5169,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case WM_SETFOCUS: // If previous focused window isn't ours, it must have received the // redirected message. So, we should forget it. - if (!IsOurProcessWindow(HWND(wParam))) { + if (!WinUtils::IsOurProcessWindow(HWND(wParam))) { ForgetRedirectedKeyDownMessage(); } if (sJustGotActivate) { @@ -5337,7 +5284,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, case MOZ_WM_MOUSEVWHEEL: case MOZ_WM_MOUSEHWHEEL: { - UINT nativeMessage = GetNativeMessage(msg); + UINT nativeMessage = WinUtils::GetNativeMessage(msg); // If OnMouseWheel returns true, the event was forwarded directly to another // mozilla window message handler (ProcessMessage). In this case the return // value of the forwarded event is in 'result' which we should return immediately. @@ -5880,7 +5827,7 @@ nsWindow::SynthesizeNativeKeyEvent(PRInt32 aNativeKeyboardLayout, } ::SetKeyboardState(kbdState); nsModifierKeyState modKeyState; - MSG msg = InitMSG(WM_KEYDOWN, key, 0); + MSG msg = WinUtils::InitMSG(WM_KEYDOWN, key, 0); if (i == keySequence.Length() - 1 && aCharacters.Length() > 0) { UINT scanCode = ::MapVirtualKeyEx(aNativeKeyCode, MAPVK_VK_TO_VSC, gKbdLayout.GetLayout()); @@ -5899,7 +5846,7 @@ nsWindow::SynthesizeNativeKeyEvent(PRInt32 aNativeKeyboardLayout, } ::SetKeyboardState(kbdState); nsModifierKeyState modKeyState; - MSG msg = InitMSG(WM_KEYUP, key, 0); + MSG msg = WinUtils::InitMSG(WM_KEYUP, key, 0); OnKeyUp(msg, modKeyState, nsnull); } @@ -5954,7 +5901,7 @@ void nsWindow::OnWindowPosChanged(WINDOWPOS *wp, bool& result) return; #ifdef WINSTATE_DEBUG_OUTPUT - if (mWnd == GetTopLevelHWND(mWnd)) { + if (mWnd == WinUtils::GetTopLevelHWND(mWnd)) { PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [ top] ")); } else { PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [child] ")); @@ -6206,7 +6153,7 @@ void nsWindow::OnWindowPosChanging(LPWINDOWPOS& info) event.mPlacement = nsWindowZTop; else { event.mPlacement = nsWindowZRelative; - aboveWindow = GetNSWindowPtr(hwndAfter); + aboveWindow = WinUtils::GetNSWindowPtr(hwndAfter); } event.mReqBelow = aboveWindow; event.mActualBelow = nsnull; @@ -6356,17 +6303,6 @@ bool nsWindow::OnGesture(WPARAM wParam, LPARAM lParam) return true; // Handled } -PRUint16 nsWindow::GetMouseInputSource() -{ - PRUint16 inputSource = nsIDOMMouseEvent::MOZ_SOURCE_MOUSE; - LPARAM lParamExtraInfo = ::GetMessageExtraInfo(); - if ((lParamExtraInfo & TABLET_INK_SIGNATURE) == TABLET_INK_CHECK) { - inputSource = (lParamExtraInfo & TABLET_INK_TOUCH) ? - PRUint16(nsIDOMMouseEvent::MOZ_SOURCE_TOUCH) : nsIDOMMouseEvent::MOZ_SOURCE_PEN; - } - return inputSource; -} - /* static */ void nsWindow::InitMouseWheelScrollData() { @@ -6664,7 +6600,8 @@ bool nsWindow::IsRedirectedKeyDownMessage(const MSG &aMsg) { return (aMsg.message == WM_KEYDOWN || aMsg.message == WM_SYSKEYDOWN) && (sRedirectedKeyDown.message == aMsg.message && - GetScanCode(sRedirectedKeyDown.lParam) == GetScanCode(aMsg.lParam)); + WinUtils::GetScanCode(sRedirectedKeyDown.lParam) == + WinUtils::GetScanCode(aMsg.lParam)); } void @@ -6755,9 +6692,9 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, INPUT keyinput; keyinput.type = INPUT_KEYBOARD; keyinput.ki.wVk = aMsg.wParam; - keyinput.ki.wScan = GetScanCode(aMsg.lParam); + keyinput.ki.wScan = WinUtils::GetScanCode(aMsg.lParam); keyinput.ki.dwFlags = KEYEVENTF_SCANCODE; - if (IsExtendedScanCode(aMsg.lParam)) { + if (WinUtils::IsExtendedScanCode(aMsg.lParam)) { keyinput.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; } keyinput.ki.time = 0; @@ -7492,105 +7429,6 @@ bool nsWindow::OnHotKey(WPARAM wParam, LPARAM lParam) return true; } -/* static */ -bool nsWindow::IsOurProcessWindow(HWND aHWND) -{ - if (!aHWND) { - return false; - } - DWORD processId = 0; - ::GetWindowThreadProcessId(aHWND, &processId); - return processId == ::GetCurrentProcessId(); -} - -/* static */ -HWND nsWindow::FindOurProcessWindow(HWND aHWND) -{ - for (HWND wnd = ::GetParent(aHWND); wnd; wnd = ::GetParent(wnd)) { - if (IsOurProcessWindow(wnd)) { - return wnd; - } - } - return nsnull; -} - -static bool PointInWindow(HWND aHWND, const POINT& aPoint) -{ - RECT bounds; - if (!::GetWindowRect(aHWND, &bounds)) { - return false; - } - - if (aPoint.x < bounds.left - || aPoint.x >= bounds.right - || aPoint.y < bounds.top - || aPoint.y >= bounds.bottom) { - return false; - } - - return true; -} - -static HWND FindTopmostWindowAtPoint(HWND aHWND, const POINT& aPoint) -{ - if (!::IsWindowVisible(aHWND) || !PointInWindow(aHWND, aPoint)) { - return 0; - } - - HWND childWnd = ::GetTopWindow(aHWND); - while (childWnd) { - HWND topmostWnd = FindTopmostWindowAtPoint(childWnd, aPoint); - if (topmostWnd) { - return topmostWnd; - } - childWnd = ::GetNextWindow(childWnd, GW_HWNDNEXT); - } - - return aHWND; -} - -struct FindOurWindowAtPointInfo -{ - POINT mInPoint; - HWND mOutHWND; -}; - -/* static */ -BOOL CALLBACK nsWindow::FindOurWindowAtPointCallback(HWND aHWND, LPARAM aLPARAM) -{ - if (!nsWindow::IsOurProcessWindow(aHWND)) { - // This isn't one of our top-level windows; continue enumerating. - return TRUE; - } - - // Get the top-most child window under the point. If there's no child - // window, and the point is within the top-level window, then the top-level - // window will be returned. (This is the usual case. A child window - // would be returned for plugins.) - FindOurWindowAtPointInfo* info = reinterpret_cast(aLPARAM); - HWND childWnd = FindTopmostWindowAtPoint(aHWND, info->mInPoint); - if (!childWnd) { - // This window doesn't contain the point; continue enumerating. - return TRUE; - } - - // Return the HWND and stop enumerating. - info->mOutHWND = childWnd; - return FALSE; -} - -/* static */ -HWND nsWindow::FindOurWindowAtPoint(const POINT& aPoint) -{ - FindOurWindowAtPointInfo info; - info.mInPoint = aPoint; - info.mOutHWND = 0; - - // This will enumerate all top-level windows in order from top to bottom. - EnumWindows(FindOurWindowAtPointCallback, reinterpret_cast(&info)); - return info.mOutHWND; -} - typedef DWORD (WINAPI *GetProcessImageFileNameProc)(HANDLE, LPWSTR, DWORD); // Determine whether the given HWND is the handle for the Elantech helper @@ -7632,42 +7470,6 @@ static bool IsElantechHelperWindow(HWND aHWND) return result; } -// static -UINT -nsWindow::GetInternalMessage(UINT aNativeMessage) -{ - switch (aNativeMessage) { - case WM_MOUSEWHEEL: - return MOZ_WM_MOUSEVWHEEL; - case WM_MOUSEHWHEEL: - return MOZ_WM_MOUSEHWHEEL; - case WM_VSCROLL: - return MOZ_WM_VSCROLL; - case WM_HSCROLL: - return MOZ_WM_HSCROLL; - default: - return aNativeMessage; - } -} - -// static -UINT -nsWindow::GetNativeMessage(UINT aInternalMessage) -{ - switch (aInternalMessage) { - case MOZ_WM_MOUSEVWHEEL: - return WM_MOUSEWHEEL; - case MOZ_WM_MOUSEHWHEEL: - return WM_MOUSEHWHEEL; - case MOZ_WM_VSCROLL: - return WM_VSCROLL; - case MOZ_WM_HSCROLL: - return WM_HSCROLL; - default: - return aInternalMessage; - } -} - /** * OnMouseWheel() is called when ProcessMessage() handles WM_MOUSEWHEEL, * WM_MOUSEHWHEEL and also OnScroll() tries to emulate mouse wheel action for @@ -7721,7 +7523,7 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, // when sending a WM_MOUSEWHEEL event to us as part of a pinch-to-zoom // gesture. We detect that here, and search for our window that would // be beneath the cursor if that window wasn't there. - underCursorWnd = FindOurWindowAtPoint(point); + underCursorWnd = WinUtils::FindOurWindowAtPoint(point); if (!underCursorWnd) { return; } @@ -7730,13 +7532,13 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, // Handle most cases first. If the window under mouse cursor is our window // except plugin window (MozillaWindowClass), we should handle the message // on the window. - if (IsOurProcessWindow(underCursorWnd)) { - nsWindow* destWindow = GetNSWindowPtr(underCursorWnd); + if (WinUtils::IsOurProcessWindow(underCursorWnd)) { + nsWindow* destWindow = WinUtils::GetNSWindowPtr(underCursorWnd); if (!destWindow) { NS_WARNING("We're not sure what cause this is."); HWND wnd = ::GetParent(underCursorWnd); for (; wnd; wnd = ::GetParent(wnd)) { - destWindow = GetNSWindowPtr(wnd); + destWindow = WinUtils::GetNSWindowPtr(wnd); if (destWindow) { break; } @@ -7756,7 +7558,7 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, destWindow = destWindow->GetParentWindow(false); NS_ENSURE_TRUE(destWindow, ); } - UINT internalMessage = GetInternalMessage(aMsg); + UINT internalMessage = WinUtils::GetInternalMessage(aMsg); ::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam); return; } @@ -7764,7 +7566,7 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, // If the window under cursor is not in our process, it means: // 1. The window may be a plugin window (GeckoPluginWindow or its descendant). // 2. The window may be another application's window. - HWND pluginWnd = FindOurProcessWindow(underCursorWnd); + HWND pluginWnd = WinUtils::FindOurProcessWindow(underCursorWnd); if (!pluginWnd) { // If there is no plugin window in ancestors of the window under cursor, // the window is for another applications (case 2). @@ -7780,7 +7582,7 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, if (mWindowType == eWindowType_plugin && pluginWnd == mWnd) { nsWindow* destWindow = GetParentWindow(false); NS_ENSURE_TRUE(destWindow, ); - UINT internalMessage = GetInternalMessage(aMsg); + UINT internalMessage = WinUtils::GetInternalMessage(aMsg); ::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam); return; } @@ -8185,7 +7987,7 @@ bool nsWindow::AssociateDefaultIMC(bool aAssociate) #define NS_LOG_WMGETOBJECT_WND(aMsg, aHwnd) \ { \ - nsWindow* wnd = GetNSWindowPtr(aHwnd); \ + nsWindow* wnd = WinUtils::GetNSWindowPtr(aHwnd); \ PR_LOG(gWindowsLog, PR_LOG_ALWAYS, \ ("Get " aMsg ":\n {\n HWND: %d, parent HWND: %d, wndobj: %p,\n", \ aHwnd, ::GetParent(aHwnd), wnd)); \ @@ -8293,8 +8095,8 @@ void nsWindow::SetWindowTranslucencyInner(nsTransparencyMode aMode) return; // stop on dialogs and popups! - HWND hWnd = GetTopLevelHWND(mWnd, true); - nsWindow* parent = GetNSWindowPtr(hWnd); + HWND hWnd = WinUtils::GetTopLevelHWND(mWnd, true); + nsWindow* parent = WinUtils::GetNSWindowPtr(hWnd); if (!parent) { @@ -8364,7 +8166,7 @@ nsresult nsWindow::UpdateTranslucentWindow() BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; SIZE winSize = { mBounds.width, mBounds.height }; POINT srcPos = { 0, 0 }; - HWND hWnd = GetTopLevelHWND(mWnd, true); + HWND hWnd = WinUtils::GetTopLevelHWND(mWnd, true); RECT winRect; ::GetWindowRect(hWnd, &winRect); @@ -8471,7 +8273,7 @@ LRESULT CALLBACK nsWindow::MozSpecialMsgFilter(int code, WPARAM wParam, LPARAM l LRESULT CALLBACK nsWindow::MozSpecialMouseProc(int code, WPARAM wParam, LPARAM lParam) { if (sProcessHook) { - switch (GetNativeMessage(wParam)) { + switch (WinUtils::GetNativeMessage(wParam)) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: @@ -8479,7 +8281,7 @@ LRESULT CALLBACK nsWindow::MozSpecialMouseProc(int code, WPARAM wParam, LPARAM l case WM_MOUSEHWHEEL: { MOUSEHOOKSTRUCT* ms = (MOUSEHOOKSTRUCT*)lParam; - nsIWidget* mozWin = (nsIWidget*)GetNSWindowPtr(ms->hwnd); + nsIWidget* mozWin = WinUtils::GetNSWindowPtr(ms->hwnd); if (mozWin) { // If this window is windowed plugin window, the mouse events are not // sent to us. @@ -8622,7 +8424,7 @@ VOID CALLBACK nsWindow::HookTimerForPopups(HWND hwnd, UINT uMsg, UINT idEvent, D BOOL CALLBACK nsWindow::ClearResourcesCallback(HWND aWnd, LPARAM aMsg) { - nsWindow *window = nsWindow::GetNSWindowPtr(aWnd); + nsWindow *window = WinUtils::GetNSWindowPtr(aWnd); if (window) { window->ClearCachedResources(); } @@ -8673,7 +8475,7 @@ nsWindow::DealWithPopups(HWND inWnd, UINT inMsg, WPARAM inWParam, LPARAM inLPara { if (sRollupListener && sRollupWidget && ::IsWindowVisible(inWnd)) { - inMsg = GetNativeMessage(inMsg); + inMsg = WinUtils::GetNativeMessage(inMsg); if (inMsg == WM_LBUTTONDOWN || inMsg == WM_RBUTTONDOWN || inMsg == WM_MBUTTONDOWN || inMsg == WM_MOUSEWHEEL || inMsg == WM_MOUSEHWHEEL || inMsg == WM_ACTIVATE || (inMsg == WM_KILLFOCUS && IsDifferentThreadWindow((HWND)inWParam)) || @@ -8770,7 +8572,7 @@ nsWindow::DealWithPopups(HWND inWnd, UINT inMsg, WPARAM inWParam, LPARAM inLPara // However, don't activate panels if (inMsg == WM_MOUSEACTIVATE) { - nsWindow* activateWindow = GetNSWindowPtr(inWnd); + nsWindow* activateWindow = WinUtils::GetNSWindowPtr(inWnd); if (activateWindow) { nsWindowType wintype; activateWindow->GetWindowType(wintype); @@ -8814,27 +8616,10 @@ nsModifierKeyState::nsModifierKeyState() } -PRInt32 nsWindow::GetWindowsVersion() -{ - static PRInt32 version = 0; - static bool didCheck = false; - - if (!didCheck) - { - didCheck = true; - OSVERSIONINFOEX osInfo; - osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - // This cast is safe and supposed to be here, don't worry - ::GetVersionEx((OSVERSIONINFO*)&osInfo); - version = (osInfo.dwMajorVersion & 0xff) << 8 | (osInfo.dwMinorVersion & 0xff); - } - return version; -} - // Note that the result of GetTopLevelWindow method can be different from the -// result of GetTopLevelHWND method. The result can be non-floating window. -// Because our top level window may be contained in another window which is -// not managed by us. +// result of WinUtils::GetTopLevelHWND(). The result can be non-floating +// window. Because our top level window may be contained in another window +// which is not managed by us. nsWindow* nsWindow::GetTopLevelWindow(bool aStopOnDialogOrPopup) { nsWindow* curWindow = this; @@ -8860,43 +8645,6 @@ nsWindow* nsWindow::GetTopLevelWindow(bool aStopOnDialogOrPopup) } } -// Note that the result of GetTopLevelHWND can be different from the result -// of GetTopLevelWindow method. Because this is checking whether the window -// is top level only in Win32 window system. Therefore, the result window -// may not be managed by us. -HWND nsWindow::GetTopLevelHWND(HWND aWnd, - bool aStopIfNotChild, - bool aStopIfNotPopup) -{ - HWND curWnd = aWnd; - HWND topWnd = NULL; - HWND upWnd = NULL; - - while (curWnd) { - topWnd = curWnd; - - if (aStopIfNotChild) { - DWORD_PTR style = ::GetWindowLongPtrW(curWnd, GWL_STYLE); - - VERIFY_WINDOW_STYLE(style); - - if (!(style & WS_CHILD)) // first top-level window - break; - } - - upWnd = ::GetParent(curWnd); // Parent or owner (if has no parent) - - // GetParent will only return the owner if the passed in window - // has the WS_POPUP style. - if (!upWnd && !aStopIfNotPopup) { - upWnd = ::GetWindow(curWnd, GW_OWNER); - } - curWnd = upWnd; - } - - return topWnd; -} - static BOOL CALLBACK gEnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid; @@ -8989,51 +8737,11 @@ HasRegistryKey(HKEY aRoot, PRUnichar* aName) return true; } -/** - * Gets the value of a string-typed registry value. - * - * @param aRoot The registry root to search in. - * @param aKeyName The name of the registry key to open. - * @param aValueName The name of the registry value in the specified key whose - * value is to be retrieved. Can be null, to retrieve the key's unnamed/ - * default value. - * @param aBuffer The buffer into which to store the string value. Can be null, - * in which case the return value indicates just whether the value exists. - * @param aBufferLength The size of aBuffer, in bytes. - * @return Whether the value exists and is a string. - */ -bool -nsWindow::GetRegistryKey(HKEY aRoot, - const PRUnichar* aKeyName, - const PRUnichar* aValueName, - PRUnichar* aBuffer, - DWORD aBufferLength) -{ - if (!aKeyName) - return false; - - HKEY key; - LONG result = ::RegOpenKeyExW(aRoot, aKeyName, NULL, KEY_READ | KEY_WOW64_32KEY, &key); - if (result != ERROR_SUCCESS) { - result = ::RegOpenKeyExW(aRoot, aKeyName, NULL, KEY_READ | KEY_WOW64_64KEY, &key); - if (result != ERROR_SUCCESS) - return false; - } - DWORD type; - result = ::RegQueryValueExW(key, aValueName, NULL, &type, (BYTE*) aBuffer, &aBufferLength); - ::RegCloseKey(key); - if (result != ERROR_SUCCESS || type != REG_SZ) - return false; - if (aBuffer) - aBuffer[aBufferLength / sizeof(*aBuffer) - 1] = 0; - return true; -} - static bool IsObsoleteSynapticsDriver() { PRUnichar buf[40]; - bool foundKey = nsWindow::GetRegistryKey(HKEY_LOCAL_MACHINE, + bool foundKey = WinUtils::GetRegistryKey(HKEY_LOCAL_MACHINE, L"Software\\Synaptics\\SynTP\\Install", L"DriverVersion", buf, @@ -9055,13 +8763,13 @@ GetElantechDriverMajorVersion() { PRUnichar buf[40]; // The driver version is found in one of these two registry keys. - bool foundKey = nsWindow::GetRegistryKey(HKEY_CURRENT_USER, + bool foundKey = WinUtils::GetRegistryKey(HKEY_CURRENT_USER, L"Software\\Elantech\\MainOption", L"DriverVersion", buf, sizeof buf); if (!foundKey) - foundKey = nsWindow::GetRegistryKey(HKEY_CURRENT_USER, + foundKey = WinUtils::GetRegistryKey(HKEY_CURRENT_USER, L"Software\\Elantech", L"DriverVersion", buf, diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h index 04ad3d58b5c..a34f9387c84 100644 --- a/widget/windows/nsWindow.h +++ b/widget/windows/nsWindow.h @@ -199,16 +199,6 @@ public: NS_IMETHOD SetNonClientMargins(nsIntMargin &margins); void SetDrawsInTitlebar(bool aState); - /** - * Statics used in other classes - */ - static PRInt32 GetWindowsVersion(); - static bool GetRegistryKey(HKEY aRoot, - const PRUnichar* aKeyName, - const PRUnichar* aValueName, - PRUnichar* aBuffer, - DWORD aBufferLength); - /** * Event helpers */ @@ -242,12 +232,8 @@ public: * Window utilities */ nsWindow* GetTopLevelWindow(bool aStopOnDialogOrPopup); - static HWND GetTopLevelHWND(HWND aWnd, - bool aStopIfNotChild = false, - bool aStopIfNotPopup = true); HWND GetWindowHandle() { return mWnd; } WNDPROC GetPrevWindowProc() { return mPrevWndProc; } - static nsWindow* GetNSWindowPtr(HWND aWnd); WindowHook& GetWindowHook() { return mWindowHook; } nsWindow* GetParentWindow(bool aIncludeOwner); // Get an array of all nsWindow*s on the main thread. @@ -337,13 +323,10 @@ protected: static BOOL CALLBACK EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam); static void AllowD3D9Callback(nsWindow *aWindow); static void AllowD3D9WithReinitializeCallback(nsWindow *aWindow); - static BOOL CALLBACK FindOurWindowAtPointCallback(HWND aHWND, LPARAM aLPARAM); /** * Window utilities */ - static BOOL SetNSWindowPtr(HWND aWnd, nsWindow * ptr); - static PRInt32 GetMonitorCount(); LPARAM lParamToScreen(LPARAM lParam); LPARAM lParamToClient(LPARAM lParam); virtual void SubclassWindow(BOOL bState); @@ -362,9 +345,6 @@ protected: return mTransparencyMode == eTransparencyGlass || mTransparencyMode == eTransparencyBorderlessGlass; } - static bool IsOurProcessWindow(HWND aHWND); - static HWND FindOurProcessWindow(HWND aHWND); - static HWND FindOurWindowAtPoint(const POINT& aPoint); /** * Event processing helpers @@ -379,7 +359,6 @@ protected: void RemoveMessageAndDispatchPluginEvent(UINT aFirstMsg, UINT aLastMsg, nsFakeCharMessage* aFakeCharMessage = nsnull); - static MSG InitMSG(UINT aMessage, WPARAM wParam, LPARAM lParam); virtual bool ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, LRESULT *aRetValue); bool ProcessMessageForPlugin(const MSG &aMsg, @@ -395,14 +374,6 @@ protected: static bool ConvertStatus(nsEventStatus aStatus); static void PostSleepWakeNotification(const bool aIsSleepMode); PRInt32 ClientMarginHitTestPoint(PRInt32 mx, PRInt32 my); - static WORD GetScanCode(LPARAM aLParam) - { - return (aLParam >> 16) & 0xFF; - } - static bool IsExtendedScanCode(LPARAM aLParam) - { - return (aLParam & 0x1000000) != 0; - } static bool IsRedirectedKeyDownMessage(const MSG &aMsg); static void ForgetRedirectedKeyDownMessage() { @@ -442,8 +413,6 @@ protected: BOOL OnInputLangChange(HKL aHKL); bool OnPaint(HDC aDC, PRUint32 aNestingLevel); void OnWindowPosChanged(WINDOWPOS *wp, bool& aResult); - static UINT GetInternalMessage(UINT aNativeMessage); - static UINT GetNativeMessage(UINT aInternalMessage); void OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam, LRESULT *aRetValue); void OnMouseWheelInternal(UINT aMessage, WPARAM aWParam, @@ -511,7 +480,6 @@ protected: nsIntRegion GetRegionToPaint(bool aForceFullRepaint, PAINTSTRUCT ps, HDC aDC); static void ActivateOtherWindowHelper(HWND aWnd); - static PRUint16 GetMouseInputSource(); #ifdef ACCESSIBILITY static STDMETHODIMP_(LRESULT) LresultFromObject(REFIID riid, WPARAM wParam, LPUNKNOWN pAcc); #endif // ACCESSIBILITY diff --git a/widget/windows/nsWindowDefs.h b/widget/windows/nsWindowDefs.h index 9a820fbe220..40bdf221539 100644 --- a/widget/windows/nsWindowDefs.h +++ b/widget/windows/nsWindowDefs.h @@ -68,13 +68,6 @@ // systems, and when the screen resolution changes. #define MOZ_WM_ENSUREVISIBLE (WM_APP + 14159) -// GetWindowsVersion constants -#define WIN2K_VERSION 0x500 -#define WINXP_VERSION 0x501 -#define WIN2K3_VERSION 0x502 -#define VISTA_VERSION 0x600 -#define WIN7_VERSION 0x601 - #ifndef WM_THEMECHANGED #define WM_THEMECHANGED 0x031A #endif @@ -186,7 +179,7 @@ #define TABLET_INK_SIGNATURE 0xFFFFFF00 #define TABLET_INK_CHECK 0xFF515700 #define TABLET_INK_TOUCH 0x00000080 -#define MOUSE_INPUT_SOURCE() GetMouseInputSource() +#define MOUSE_INPUT_SOURCE() WinUtils::GetMouseInputSource() /************************************************************** * diff --git a/widget/windows/nsWindowGfx.cpp b/widget/windows/nsWindowGfx.cpp index 85314cb50de..76a4757631e 100644 --- a/widget/windows/nsWindowGfx.cpp +++ b/widget/windows/nsWindowGfx.cpp @@ -65,6 +65,7 @@ using mozilla::plugins::PluginInstanceParent; #include "gfxContext.h" #include "nsRenderingContext.h" #include "prmem.h" +#include "WinUtils.h" #include "LayerManagerOGL.h" #include "BasicLayers.h" @@ -84,6 +85,7 @@ extern "C" { } using namespace mozilla::layers; +using namespace mozilla::widget; /************************************************************** ************************************************************** @@ -761,7 +763,7 @@ bool nsWindowGfx::IsCursorTranslucencySupported() if (!didCheck) { didCheck = true; // Cursor translucency is supported on Windows XP and newer - isSupported = nsWindow::GetWindowsVersion() >= 0x501; + isSupported = WinUtils::GetWindowsVersion() >= WinUtils::WINXP_VERSION; } return isSupported;