Bug 712483 Implement mozilla::widget::WinUtils r=jimm

This commit is contained in:
Masayuki Nakano 2012-01-04 19:21:44 +09:00
Родитель 8ee6724715
Коммит 2d16edec45
14 изменённых файлов: 691 добавлений и 432 удалений

Просмотреть файл

@ -78,6 +78,7 @@ CPPSRCS = \
WidgetTraceEvent.cpp \ WidgetTraceEvent.cpp \
AudioSession.cpp \ AudioSession.cpp \
nsWidgetFactory.cpp \ nsWidgetFactory.cpp \
WinUtils.cpp \
$(NULL) $(NULL)
ifdef MOZ_CRASHREPORTER ifdef MOZ_CRASHREPORTER

Просмотреть файл

@ -56,6 +56,7 @@
#include "nsWindow.h" #include "nsWindow.h"
#include "nsAppShell.h" #include "nsAppShell.h"
#include "TaskbarPreviewButton.h" #include "TaskbarPreviewButton.h"
#include "WinUtils.h"
#include <nsIBaseWindow.h> #include <nsIBaseWindow.h>
#include <nsICanvasRenderingContextInternal.h> #include <nsICanvasRenderingContextInternal.h>
@ -285,7 +286,7 @@ TaskbarPreview::Disable() {
bool bool
TaskbarPreview::IsWindowAvailable() const { TaskbarPreview::IsWindowAvailable() const {
if (mWnd) { if (mWnd) {
nsWindow* win = nsWindow::GetNSWindowPtr(mWnd); nsWindow* win = WinUtils::GetNSWindowPtr(mWnd);
if(win && !win->HasDestroyStarted()) { if(win && !win->HasDestroyStarted()) {
return true; return true;
} }
@ -356,7 +357,7 @@ TaskbarPreview::CanMakeTaskbarCalls() {
if (!::IsWindowVisible(mWnd)) if (!::IsWindowVisible(mWnd))
return false; return false;
if (mVisible) { if (mVisible) {
nsWindow *window = nsWindow::GetNSWindowPtr(mWnd); nsWindow *window = WinUtils::GetNSWindowPtr(mWnd);
NS_ASSERTION(window, "Could not get nsWindow from HWND"); NS_ASSERTION(window, "Could not get nsWindow from HWND");
return window->HasTaskbarIconBeenCreated(); return window->HasTaskbarIconBeenCreated();
} }
@ -365,7 +366,7 @@ TaskbarPreview::CanMakeTaskbarCalls() {
WindowHook& WindowHook&
TaskbarPreview::GetWindowHook() { TaskbarPreview::GetWindowHook() {
nsWindow *window = nsWindow::GetNSWindowPtr(mWnd); nsWindow *window = WinUtils::GetNSWindowPtr(mWnd);
NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!"); NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!");
return window->GetWindowHook(); return window->GetWindowHook();
@ -449,7 +450,7 @@ TaskbarPreview::MainWindowHook(void *aContext,
// We can't really do anything at this point including removing hooks // We can't really do anything at this point including removing hooks
preview->mWnd = NULL; preview->mWnd = NULL;
} else { } else {
nsWindow *window = nsWindow::GetNSWindowPtr(preview->mWnd); nsWindow *window = WinUtils::GetNSWindowPtr(preview->mWnd);
NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!"); NS_ASSERTION(window, "Cannot use taskbar previews in an embedded context!");
window->SetHasTaskbarIconBeenCreated(); window->SetHasTaskbarIconBeenCreated();

Просмотреть файл

@ -43,6 +43,7 @@
#include "TaskbarTabPreview.h" #include "TaskbarTabPreview.h"
#include "nsWindowGfx.h" #include "nsWindowGfx.h"
#include "nsUXThemeData.h" #include "nsUXThemeData.h"
#include "WinUtils.h"
#include <nsITaskbarPreviewController.h> #include <nsITaskbarPreviewController.h>
#define TASKBARPREVIEW_HWNDID L"TaskbarTabPreviewHwnd" #define TASKBARPREVIEW_HWNDID L"TaskbarTabPreviewHwnd"
@ -184,7 +185,7 @@ TaskbarTabPreview::WndProc(UINT nMsg, WPARAM wParam, LPARAM lParam) {
bool activateWindow; bool activateWindow;
nsresult rv = mController->OnActivate(&activateWindow); nsresult rv = mController->OnActivate(&activateWindow);
if (NS_SUCCEEDED(rv) && activateWindow) { if (NS_SUCCEEDED(rv) && activateWindow) {
nsWindow* win = nsWindow::GetNSWindowPtr(mWnd); nsWindow* win = WinUtils::GetNSWindowPtr(mWnd);
if (win) { if (win) {
nsWindow * parent = win->GetTopLevelWindow(true); nsWindow * parent = win->GetTopLevelWindow(true);
if (parent) { if (parent) {

Просмотреть файл

@ -56,6 +56,7 @@
#include "nsIJumpListBuilder.h" #include "nsIJumpListBuilder.h"
#include "nsUXThemeData.h" #include "nsUXThemeData.h"
#include "nsWindow.h" #include "nsWindow.h"
#include "WinUtils.h"
#include "TaskbarTabPreview.h" #include "TaskbarTabPreview.h"
#include "TaskbarWindowPreview.h" #include "TaskbarWindowPreview.h"
#include "JumpListBuilder.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 // The hash is short, but users may customize this, so use a respectable
// string buffer. // string buffer.
PRUnichar buf[256]; PRUnichar buf[256];
if (nsWindow::GetRegistryKey(HKEY_LOCAL_MACHINE, if (WinUtils::GetRegistryKey(HKEY_LOCAL_MACHINE,
regKey.get(), regKey.get(),
path, path,
buf, buf,
sizeof buf)) { sizeof buf)) {
aDefaultGroupId.Assign(buf); aDefaultGroupId.Assign(buf);
} else if (nsWindow::GetRegistryKey(HKEY_CURRENT_USER, } else if (WinUtils::GetRegistryKey(HKEY_CURRENT_USER,
regKey.get(), regKey.get(),
path, path,
buf, buf,
@ -360,7 +361,7 @@ WinTaskbar::GetDefaultGroupId(nsAString & aDefaultGroupId) {
// (static) Called from AppShell // (static) Called from AppShell
bool bool
WinTaskbar::RegisterAppUserModelID() { WinTaskbar::RegisterAppUserModelID() {
if (nsWindow::GetWindowsVersion() < WIN7_VERSION) if (WinUtils::GetWindowsVersion() < WinUtils::WIN7_VERSION)
return false; return false;
SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nsnull; SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nsnull;
@ -392,7 +393,7 @@ WinTaskbar::RegisterAppUserModelID() {
NS_IMETHODIMP NS_IMETHODIMP
WinTaskbar::GetAvailable(bool *aAvailable) { WinTaskbar::GetAvailable(bool *aAvailable) {
*aAvailable = *aAvailable =
nsWindow::GetWindowsVersion() < WIN7_VERSION ? WinUtils::GetWindowsVersion() < WinUtils::WIN7_VERSION ?
false : true; false : true;
return NS_OK; return NS_OK;
@ -432,7 +433,7 @@ WinTaskbar::GetTaskbarWindowPreview(nsIDocShell *shell, nsITaskbarWindowPreview
if (!toplevelHWND) if (!toplevelHWND)
return NS_ERROR_INVALID_ARG; return NS_ERROR_INVALID_ARG;
nsWindow *window = nsWindow::GetNSWindowPtr(toplevelHWND); nsWindow *window = WinUtils::GetNSWindowPtr(toplevelHWND);
if (!window) if (!window)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;

367
widget/windows/WinUtils.cpp Normal file
Просмотреть файл

@ -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 <masayuki@d-toybox.com>
*
* Original nsWindow.cpp Contributor(s):
* Dean Tessman <dean_tessman@hotmail.com>
* Ere Maijala <emaijala@kolumbus.fi>
* Mark Hammond <markh@activestate.com>
* Michael Lowe <michael.lowe@bigfoot.com>
* Peter Bajusz <hyp-x@inf.bme.hu>
* Pierre Phaneuf <pp@ludusdesign.com>
* Robert O'Callahan <roc+moz@cs.cmu.edu>
* Roy Yokoyama <yokoyama@netscape.com>
* Makoto Kato <m_kato@ga2.so-net.ne.jp>
* Masayuki Nakano <masayuki@d-toybox.com>
* Dainis Jonitis <Dainis_Jonitis@swh-t.lv>
* Christian Biesinger <cbiesinger@web.de>
* Mats Palmgren <matspal@gmail.com>
* Ningjie Chen <chenn@email.uc.edu>
* Jim Mathies <jmathies@mozilla.com>
* Kyle Huey <me@kylehuey.com>
*
* 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<WinVersion>(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<WinVersion>(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<nsWindow*>(::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<FindOurWindowAtPointInfo*>(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<LPARAM>(&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<PRUint16>(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

206
widget/windows/WinUtils.h Normal file
Просмотреть файл

@ -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 <masayuki@d-toybox.com>
*
* Original nsWindow.cpp Contributor(s):
* Robert O'Callahan <roc+moz@cs.cmu.edu>
* Dean Tessman <dean_tessman@hotmail.com>
* Makoto Kato <m_kato@ga2.so-net.ne.jp>
* Dainis Jonitis <Dainis_Jonitis@swh-t.lv>
* Masayuki Nakano <masayuki@d-toybox.com>
* Ningjie Chen <chenn@email.uc.edu>
* Jim Mathies <jmathies@mozilla.com>.
* Mats Palmgren <matspal@gmail.com>
*
* 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 <windows.h>
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__

Просмотреть файл

@ -59,6 +59,9 @@
#include "nsCRT.h" #include "nsCRT.h"
#include "nsString.h" #include "nsString.h"
#include "nsToolkit.h" #include "nsToolkit.h"
#include "WinUtils.h"
using namespace mozilla::widget;
PRUnichar *nsFilePicker::mLastUsedUnicodeDirectory; PRUnichar *nsFilePicker::mLastUsedUnicodeDirectory;
char nsFilePicker::mLastUsedDirectory[MAX_PATH+1] = { 0 }; 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 // a hook procedure. The hook procedure fixes a problem on XP dialogs for
// file picker visibility. Vista and up automatically ensures the file // file picker visibility. Vista and up automatically ensures the file
// picker is always visible. // picker is always visible.
if (nsWindow::GetWindowsVersion() < VISTA_VERSION) { if (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION) {
ofn.lpfnHook = FilePickerHook; ofn.lpfnHook = FilePickerHook;
ofn.Flags |= OFN_ENABLEHOOK; 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 // 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 // allowed in the new file picker UI. We need to eventually move to
// the new Common File Dialogs for Vista and up. // the new Common File Dialogs for Vista and up.
if (nsWindow::GetWindowsVersion() < VISTA_VERSION) { if (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION) {
ofn.lpfnHook = MultiFilePickerHook; ofn.lpfnHook = MultiFilePickerHook;
fileBuffer.forget(); fileBuffer.forget();
result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN); result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN);
@ -1053,7 +1056,7 @@ nsFilePicker::ShowW(PRInt16 *aReturnVal)
bool result = false; bool result = false;
if (mMode == modeGetFolder) { if (mMode == modeGetFolder) {
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION)
result = ShowFolderPicker(initialDir); result = ShowFolderPicker(initialDir);
else else
result = ShowXPFolderPicker(initialDir); result = ShowXPFolderPicker(initialDir);
@ -1062,7 +1065,7 @@ nsFilePicker::ShowW(PRInt16 *aReturnVal)
#endif #endif
} else { } else {
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION)
result = ShowFilePicker(initialDir); result = ShowFilePicker(initialDir);
else else
result = ShowXPFilePicker(initialDir); result = ShowXPFilePicker(initialDir);
@ -1259,7 +1262,7 @@ NS_IMETHODIMP
nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter)
{ {
#if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN #if MOZ_WINSDK_TARGETVER >= MOZ_NTDDI_LONGHORN
if (nsWindow::GetWindowsVersion() >= VISTA_VERSION) { if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) {
mComFilterList.Append(aTitle, aFilter); mComFilterList.Append(aTitle, aFilter);
} else { } else {
AppendXPFilter(aTitle, aFilter); AppendXPFilter(aTitle, aFilter);

Просмотреть файл

@ -60,6 +60,9 @@
#include "nsIMM32Handler.h" #include "nsIMM32Handler.h"
#include "nsWindow.h" #include "nsWindow.h"
#include "WinUtils.h"
using namespace mozilla::widget;
static nsIMM32Handler* gIMM32Handler = nsnull; static nsIMM32Handler* gIMM32Handler = nsnull;
@ -148,7 +151,7 @@ nsIMM32Handler::IsTopLevelWindowOfComposition(nsWindow* aWindow)
return false; return false;
} }
HWND wnd = gIMM32Handler->mComposingWindow->GetWindowHandle(); HWND wnd = gIMM32Handler->mComposingWindow->GetWindowHandle();
return nsWindow::GetTopLevelHWND(wnd, true) == aWindow->GetWindowHandle(); return WinUtils::GetTopLevelHWND(wnd, true) == aWindow->GetWindowHandle();
} }
/* static */ bool /* static */ bool

Просмотреть файл

@ -60,6 +60,7 @@
#include "nsWindow.h" #include "nsWindow.h"
#include "nsIComboboxControlFrame.h" #include "nsIComboboxControlFrame.h"
#include "prinrval.h" #include "prinrval.h"
#include "WinUtils.h"
#include "gfxPlatform.h" #include "gfxPlatform.h"
#include "gfxContext.h" #include "gfxContext.h"
@ -71,6 +72,8 @@
#include "nsUXThemeData.h" #include "nsUXThemeData.h"
#include "nsUXThemeConstants.h" #include "nsUXThemeConstants.h"
using namespace mozilla::widget;
#ifdef PR_LOGGING #ifdef PR_LOGGING
extern PRLogModuleInfo* gWindowsLog; extern PRLogModuleInfo* gWindowsLog;
#endif #endif
@ -382,7 +385,7 @@ static void AddPaddingRect(nsIntSize* aSize, CaptionButton button) {
RECT offset; RECT offset;
if (!nsUXThemeData::IsAppThemed()) if (!nsUXThemeData::IsAppThemed())
offset = buttonData[CAPTION_CLASSIC].hotPadding[button]; 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]; offset = buttonData[CAPTION_XPTHEME].hotPadding[button];
else else
offset = buttonData[CAPTION_BASIC].hotPadding[button]; offset = buttonData[CAPTION_BASIC].hotPadding[button];
@ -396,7 +399,7 @@ static void OffsetBackgroundRect(RECT& rect, CaptionButton button) {
RECT offset; RECT offset;
if (!nsUXThemeData::IsAppThemed()) if (!nsUXThemeData::IsAppThemed())
offset = buttonData[CAPTION_CLASSIC].hotPadding[button]; 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]; offset = buttonData[CAPTION_XPTHEME].hotPadding[button];
else else
offset = buttonData[CAPTION_BASIC].hotPadding[button]; offset = buttonData[CAPTION_BASIC].hotPadding[button];
@ -2077,7 +2080,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a
aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cx; aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cx;
aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cy; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cy;
// For XP, subtract 4 from system metrics dimensions. // For XP, subtract 4 from system metrics dimensions.
if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) {
aResult->width -= 4; aResult->width -= 4;
aResult->height -= 4; aResult->height -= 4;
} }
@ -2089,7 +2092,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a
QueryForButtonData(aFrame); QueryForButtonData(aFrame);
aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cx; aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cx;
aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cy; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cy;
if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) {
aResult->width -= 4; aResult->width -= 4;
aResult->height -= 4; aResult->height -= 4;
} }
@ -2101,7 +2104,7 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsRenderingContext* aContext, nsIFrame* a
QueryForButtonData(aFrame); QueryForButtonData(aFrame);
aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cx; aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cx;
aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cy; aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cy;
if (nsWindow::GetWindowsVersion() == WINXP_VERSION) { if (WinUtils::GetWindowsVersion() == WinUtils::WINXP_VERSION) {
aResult->width -= 4; aResult->width -= 4;
aResult->height -= 4; aResult->height -= 4;
} }

Просмотреть файл

@ -43,11 +43,12 @@
#include "nsUXThemeData.h" #include "nsUXThemeData.h"
#include "nsDebug.h" #include "nsDebug.h"
// For GetWindowsVersion #include "nsToolkit.h"
#include "nsWindow.h" #include "WinUtils.h"
#include "nsUXThemeConstants.h" #include "nsUXThemeConstants.h"
using namespace mozilla; using namespace mozilla;
using namespace mozilla::widget;
const PRUnichar const PRUnichar
nsUXThemeData::kThemeLibraryName[] = L"uxtheme.dll"; nsUXThemeData::kThemeLibraryName[] = L"uxtheme.dll";
@ -120,9 +121,9 @@ nsUXThemeData::Initialize()
::ZeroMemory(sThemes, sizeof(sThemes)); ::ZeroMemory(sThemes, sizeof(sThemes));
NS_ASSERTION(!sThemeDLL, "nsUXThemeData being initialized twice!"); NS_ASSERTION(!sThemeDLL, "nsUXThemeData being initialized twice!");
PRInt32 version = nsWindow::GetWindowsVersion(); WinUtils::WinVersion version = WinUtils::GetWindowsVersion();
sIsXPOrLater = version >= WINXP_VERSION; sIsXPOrLater = version >= WinUtils::WINXP_VERSION;
sIsVistaOrLater = version >= VISTA_VERSION; sIsVistaOrLater = version >= WinUtils::VISTA_VERSION;
if (GetThemeDLL()) { if (GetThemeDLL()) {
openTheme = (OpenThemeDataPtr)GetProcAddress(sThemeDLL, "OpenThemeData"); openTheme = (OpenThemeDataPtr)GetProcAddress(sThemeDLL, "OpenThemeData");
@ -272,7 +273,7 @@ nsUXThemeData::InitTitlebarInfo()
// Use system metrics for pre-vista, otherwise trigger a // Use system metrics for pre-vista, otherwise trigger a
// refresh on the next layout. // refresh on the next layout.
sTitlebarInfoPopulatedAero = sTitlebarInfoPopulatedThemed = sTitlebarInfoPopulatedAero = sTitlebarInfoPopulatedThemed =
(nsWindow::GetWindowsVersion() < VISTA_VERSION); (WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION);
} }
// static // static
@ -400,7 +401,8 @@ void
nsUXThemeData::UpdateNativeThemeInfo() nsUXThemeData::UpdateNativeThemeInfo()
{ {
// Trigger a refresh of themed button metrics if needed // Trigger a refresh of themed button metrics if needed
sTitlebarInfoPopulatedThemed = (nsWindow::GetWindowsVersion() < VISTA_VERSION); sTitlebarInfoPopulatedThemed =
(WinUtils::GetWindowsVersion() < WinUtils::VISTA_VERSION);
sIsDefaultWindowsTheme = false; sIsDefaultWindowsTheme = false;
sThemeId = LookAndFeel::eWindowsTheme_Generic; sThemeId = LookAndFeel::eWindowsTheme_Generic;

Просмотреть файл

@ -161,6 +161,7 @@
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
#include "nsISound.h" #include "nsISound.h"
#include "WinTaskbar.h" #include "WinTaskbar.h"
#include "WinUtils.h"
#ifdef MOZ_ENABLE_D3D9_LAYER #ifdef MOZ_ENABLE_D3D9_LAYER
#include "LayerManagerD3D9.h" #include "LayerManagerD3D9.h"
@ -543,7 +544,8 @@ nsWindow::Create(nsIWidget *aParent,
mParent = aParent; mParent = aParent;
} else { // has a nsNative parent } else { // has a nsNative parent
parent = (HWND)aNativeParent; parent = (HWND)aNativeParent;
mParent = aNativeParent ? GetNSWindowPtr((HWND)aNativeParent) : nsnull; mParent = aNativeParent ?
WinUtils::GetNSWindowPtr((HWND)aNativeParent) : nsnull;
} }
mPopupType = aInitData->mPopupHint; mPopupType = aInitData->mPopupHint;
@ -677,7 +679,7 @@ nsWindow::Create(nsIWidget *aParent,
// bugs over the years, disable it (sTrimOnMinimize=1) on Vista and up. // bugs over the years, disable it (sTrimOnMinimize=1) on Vista and up.
sTrimOnMinimize = sTrimOnMinimize =
Preferences::GetBool("config.trim_on_minimize", Preferences::GetBool("config.trim_on_minimize",
(GetWindowsVersion() >= VISTA_VERSION)) ? 1 : 0; (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION)) ? 1 : 0;
sSwitchKeyboardLayout = sSwitchKeyboardLayout =
Preferences::GetBool("intl.keyboard.per_window_layout", false); Preferences::GetBool("intl.keyboard.per_window_layout", false);
gDisableNativeTheme = gDisableNativeTheme =
@ -949,66 +951,19 @@ void nsWindow::SubclassWindow(BOOL bState)
(LONG_PTR)nsWindow::WindowProc); (LONG_PTR)nsWindow::WindowProc);
NS_ASSERTION(mPrevWndProc, "Null standard window procedure"); NS_ASSERTION(mPrevWndProc, "Null standard window procedure");
// connect the this pointer to the nsWindow handle // connect the this pointer to the nsWindow handle
SetNSWindowPtr(mWnd, this); WinUtils::SetNSWindowPtr(mWnd, this);
} }
else { else {
if (mUnicodeWidget) if (mUnicodeWidget)
::SetWindowLongPtrW(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc); ::SetWindowLongPtrW(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc);
else else
::SetWindowLongPtrA(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc); ::SetWindowLongPtrA(mWnd, GWLP_WNDPROC, (LONG_PTR)mPrevWndProc);
SetNSWindowPtr(mWnd, NULL); WinUtils::SetNSWindowPtr(mWnd, NULL);
mPrevWndProc = 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 * SECTION: nsIWidget::SetParent, nsIWidget::GetParent
@ -1106,7 +1061,7 @@ nsWindow* nsWindow::GetParentWindow(bool aIncludeOwner)
parent = ::GetAncestor(mWnd, GA_PARENT); parent = ::GetAncestor(mWnd, GA_PARENT);
if (parent) { if (parent) {
widget = GetNSWindowPtr(parent); widget = WinUtils::GetNSWindowPtr(parent);
if (widget) { if (widget) {
// If the widget is in the process of being destroyed then // If the widget is in the process of being destroyed then
// do NOT return it // do NOT return it
@ -1123,7 +1078,7 @@ nsWindow* nsWindow::GetParentWindow(bool aIncludeOwner)
BOOL CALLBACK BOOL CALLBACK
nsWindow::EnumAllChildWindProc(HWND aWnd, LPARAM aParam) nsWindow::EnumAllChildWindProc(HWND aWnd, LPARAM aParam)
{ {
nsWindow *wnd = nsWindow::GetNSWindowPtr(aWnd); nsWindow *wnd = WinUtils::GetNSWindowPtr(aWnd);
if (wnd) { if (wnd) {
((nsWindow::WindowEnumCallback*)aParam)(wnd); ((nsWindow::WindowEnumCallback*)aParam)(wnd);
} }
@ -1133,7 +1088,7 @@ nsWindow::EnumAllChildWindProc(HWND aWnd, LPARAM aParam)
BOOL CALLBACK BOOL CALLBACK
nsWindow::EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam) nsWindow::EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam)
{ {
nsWindow *wnd = nsWindow::GetNSWindowPtr(aWnd); nsWindow *wnd = WinUtils::GetNSWindowPtr(aWnd);
if (wnd) { if (wnd) {
((nsWindow::WindowEnumCallback*)aParam)(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 // pop-up windows when the DWM is disabled and two monitors are
// connected. // connected.
if (HasBogusPopupsDropShadowOnMultiMonitor() && if (HasBogusPopupsDropShadowOnMultiMonitor() &&
GetMonitorCount() > 1 && WinUtils::GetMonitorCount() > 1 &&
!nsUXThemeData::CheckForCompositor()) !nsUXThemeData::CheckForCompositor())
{ {
if (sDropShadowEnabled) { if (sDropShadowEnabled) {
@ -1369,14 +1324,14 @@ NS_METHOD nsWindow::UnregisterTouchWindow() {
} }
BOOL CALLBACK nsWindow::RegisterTouchForDescendants(HWND aWnd, LPARAM aMsg) { BOOL CALLBACK nsWindow::RegisterTouchForDescendants(HWND aWnd, LPARAM aMsg) {
nsWindow* win = GetNSWindowPtr(aWnd); nsWindow* win = WinUtils::GetNSWindowPtr(aWnd);
if (win) if (win)
win->mGesture.RegisterTouchWindow(aWnd); win->mGesture.RegisterTouchWindow(aWnd);
return TRUE; return TRUE;
} }
BOOL CALLBACK nsWindow::UnregisterTouchForDescendants(HWND aWnd, LPARAM aMsg) { BOOL CALLBACK nsWindow::UnregisterTouchForDescendants(HWND aWnd, LPARAM aMsg) {
nsWindow* win = GetNSWindowPtr(aWnd); nsWindow* win = WinUtils::GetNSWindowPtr(aWnd);
if (win) if (win)
win->mGesture.UnregisterTouchWindow(aWnd); win->mGesture.UnregisterTouchWindow(aWnd);
return TRUE; return TRUE;
@ -1579,7 +1534,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert
CaptureMouse(false); CaptureMouse(false);
// find the top-level window // find the top-level window
HWND toplevelWnd = GetTopLevelHWND(mWnd, true); HWND toplevelWnd = WinUtils::GetTopLevelHWND(mWnd, true);
// tell Windows to start the resize // tell Windows to start the resize
::PostMessage(toplevelWnd, WM_SYSCOMMAND, syscommand, ::PostMessage(toplevelWnd, WM_SYSCOMMAND, syscommand,
@ -1806,7 +1761,7 @@ NS_METHOD nsWindow::SetFocus(bool aRaise)
{ {
if (mWnd) { if (mWnd) {
#ifdef WINSTATE_DEBUG_OUTPUT #ifdef WINSTATE_DEBUG_OUTPUT
if (mWnd == GetTopLevelHWND(mWnd)) { if (mWnd == WinUtils::GetTopLevelHWND(mWnd)) {
PR_LOG(gWindowsLog, PR_LOG_ALWAYS, PR_LOG(gWindowsLog, PR_LOG_ALWAYS,
("*** SetFocus: [ top] raise=%d\n", aRaise)); ("*** SetFocus: [ top] raise=%d\n", aRaise));
} else { } else {
@ -1815,7 +1770,7 @@ NS_METHOD nsWindow::SetFocus(bool aRaise)
} }
#endif #endif
// Uniconify, if necessary // Uniconify, if necessary
HWND toplevelWnd = GetTopLevelHWND(mWnd); HWND toplevelWnd = WinUtils::GetTopLevelHWND(mWnd);
if (aRaise && ::IsIconic(toplevelWnd)) { if (aRaise && ::IsIconic(toplevelWnd)) {
::ShowWindow(toplevelWnd, SW_RESTORE); ::ShowWindow(toplevelWnd, SW_RESTORE);
} }
@ -2604,8 +2559,8 @@ void nsWindow::UpdateGlass()
NS_IMETHODIMP nsWindow::HideWindowChrome(bool aShouldHide) NS_IMETHODIMP nsWindow::HideWindowChrome(bool aShouldHide)
{ {
HWND hwnd = GetTopLevelHWND(mWnd, true); HWND hwnd = WinUtils::GetTopLevelHWND(mWnd, true);
if (!GetNSWindowPtr(hwnd)) if (!WinUtils::GetNSWindowPtr(hwnd))
{ {
NS_WARNING("Trying to hide window decorations in an embedded context"); NS_WARNING("Trying to hide window decorations in an embedded context");
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
@ -3106,13 +3061,13 @@ nsWindow::GetAttention(PRInt32 aCycleCount)
if (!mWnd) if (!mWnd)
return NS_ERROR_NOT_INITIALIZED; return NS_ERROR_NOT_INITIALIZED;
HWND flashWnd = GetTopLevelHWND(mWnd, false, false); HWND flashWnd = WinUtils::GetTopLevelHWND(mWnd, false, false);
HWND fgWnd = ::GetForegroundWindow(); HWND fgWnd = ::GetForegroundWindow();
// Don't flash if the flash count is 0 or if the foreground window is our // 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. // window handle or that of our owned-most window.
if (aCycleCount == 0 || if (aCycleCount == 0 ||
flashWnd == fgWnd || flashWnd == fgWnd ||
flashWnd == GetTopLevelHWND(fgWnd, false, false)) { flashWnd == WinUtils::GetTopLevelHWND(fgWnd, false, false)) {
return NS_OK; return NS_OK;
} }
@ -3374,7 +3329,8 @@ nsWindow::OnDefaultButtonLoaded(const nsIntRect &aButtonRect)
// Don't snap when we are not active. // Don't snap when we are not active.
HWND activeWnd = ::GetActiveWindow(); HWND activeWnd = ::GetActiveWindow();
if (activeWnd != ::GetForegroundWindow() || if (activeWnd != ::GetForegroundWindow() ||
GetTopLevelHWND(mWnd, true) != GetTopLevelHWND(activeWnd, true)) { WinUtils::GetTopLevelHWND(mWnd, true) !=
WinUtils::GetTopLevelHWND(activeWnd, true)) {
return NS_OK; return NS_OK;
} }
@ -3447,7 +3403,7 @@ nsWindow::OverrideSystemMouseScrollSpeed(PRInt32 aOriginalDelta,
// Only Vista and later, Windows has the system setting of horizontal // Only Vista and later, Windows has the system setting of horizontal
// scrolling by the mouse wheel. // scrolling by the mouse wheel.
if (GetWindowsVersion() >= VISTA_VERSION) { if (WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION) {
if (!::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &systemSpeed, 0)) { if (!::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &systemSpeed, 0)) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -3501,15 +3457,6 @@ nsWindow::OverrideSystemMouseScrollSpeed(PRInt32 aOriginalDelta,
**************************************************************/ **************************************************************/
// Event intialization // 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) void nsWindow::InitEvent(nsGUIEvent& event, nsIntPoint* aPoint)
{ {
if (nsnull == aPoint) { // use the point from the event if (nsnull == aPoint) { // use the point from the event
@ -3766,7 +3713,7 @@ void nsWindow::DispatchPendingEvents()
// paint events pending. // paint events pending.
if (::GetQueueStatus(QS_PAINT)) { if (::GetQueueStatus(QS_PAINT)) {
// Find the top level window. // Find the top level window.
HWND topWnd = GetTopLevelHWND(mWnd); HWND topWnd = WinUtils::GetTopLevelHWND(mWnd);
// Dispatch pending paints for topWnd and all its descendant windows. // Dispatch pending paints for topWnd and all its descendant windows.
// Note: EnumChildWindows enumerates all descendant windows not just // Note: EnumChildWindows enumerates all descendant windows not just
@ -3799,7 +3746,7 @@ bool nsWindow::DispatchPluginEvent(UINT aMessage,
LPARAM aLParam, LPARAM aLParam,
bool aDispatchPendingEvents) bool aDispatchPendingEvents)
{ {
bool ret = DispatchPluginEvent(InitMSG(aMessage, aWParam, aLParam)); bool ret = DispatchPluginEvent(WinUtils::InitMSG(aMessage, aWParam, aLParam));
if (aDispatchPendingEvents) { if (aDispatchPendingEvents) {
DispatchPendingEvents(); DispatchPendingEvents();
} }
@ -4097,7 +4044,7 @@ bool nsWindow::DispatchFocusToTopLevelWindow(PRUint32 aEventType)
while (curWnd) { while (curWnd) {
toplevelWnd = curWnd; toplevelWnd = curWnd;
nsWindow *win = GetNSWindowPtr(curWnd); nsWindow *win = WinUtils::GetNSWindowPtr(curWnd);
if (win) { if (win) {
nsWindowType wintype; nsWindowType wintype;
win->GetWindowType(wintype); win->GetWindowType(wintype);
@ -4109,7 +4056,7 @@ bool nsWindow::DispatchFocusToTopLevelWindow(PRUint32 aEventType)
} }
if (toplevelWnd) { if (toplevelWnd) {
nsWindow *win = GetNSWindowPtr(toplevelWnd); nsWindow *win = WinUtils::GetNSWindowPtr(toplevelWnd);
if (win) if (win)
return win->DispatchFocus(aEventType); return win->DispatchFocus(aEventType);
} }
@ -4161,14 +4108,14 @@ bool nsWindow::IsTopLevelMouseExit(HWND aWnd)
mp.y = GET_Y_LPARAM(pos); mp.y = GET_Y_LPARAM(pos);
HWND mouseWnd = ::WindowFromPoint(mp); HWND mouseWnd = ::WindowFromPoint(mp);
// GetTopLevelHWND will return a HWND for the window frame (which includes // WinUtils::GetTopLevelHWND() will return a HWND for the window frame
// the non-client area). If the mouse has moved into the non-client area, // (which includes the non-client area). If the mouse has moved into
// we should treat it as a top-level exit. // the non-client area, we should treat it as a top-level exit.
HWND mouseTopLevel = nsWindow::GetTopLevelHWND(mouseWnd); HWND mouseTopLevel = WinUtils::GetTopLevelHWND(mouseWnd);
if (mouseWnd == mouseTopLevel) if (mouseWnd == mouseTopLevel)
return true; return true;
return nsWindow::GetTopLevelHWND(aWnd) != mouseTopLevel; return WinUtils::GetTopLevelHWND(aWnd) != mouseTopLevel;
} }
bool nsWindow::BlurEventsSuppressed() bool nsWindow::BlurEventsSuppressed()
@ -4180,7 +4127,7 @@ bool nsWindow::BlurEventsSuppressed()
// are they suppressed by any container widget? // are they suppressed by any container widget?
HWND parentWnd = ::GetParent(mWnd); HWND parentWnd = ::GetParent(mWnd);
if (parentWnd) { if (parentWnd) {
nsWindow *parent = GetNSWindowPtr(parentWnd); nsWindow *parent = WinUtils::GetNSWindowPtr(parentWnd);
if (parent) if (parent)
return parent->BlurEventsSuppressed(); return parent->BlurEventsSuppressed();
} }
@ -4290,7 +4237,7 @@ nsWindow::IPCWindowProcHandler(UINT& msg, WPARAM& wParam, LPARAM& lParam)
GetClassNameW(focusWnd, szClass, GetClassNameW(focusWnd, szClass,
sizeof(szClass)/sizeof(PRUnichar)) && sizeof(szClass)/sizeof(PRUnichar)) &&
!wcscmp(szClass, L"Edit") && !wcscmp(szClass, L"Edit") &&
!IsOurProcessWindow(focusWnd)) { !WinUtils::IsOurProcessWindow(focusWnd)) {
break; 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 // 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) if (someWindow)
someWindow->IPCWindowProcHandler(msg, wParam, lParam); someWindow->IPCWindowProcHandler(msg, wParam, lParam);
@ -4579,7 +4526,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
if (PluginHasFocus()) { if (PluginHasFocus()) {
bool callDefaultWndProc; bool callDefaultWndProc;
MSG nativeMsg = InitMSG(msg, wParam, lParam); MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam);
if (ProcessMessageForPlugin(nativeMsg, aRetValue, callDefaultWndProc)) { if (ProcessMessageForPlugin(nativeMsg, aRetValue, callDefaultWndProc)) {
return mWnd ? !callDefaultWndProc : true; return mWnd ? !callDefaultWndProc : true;
} }
@ -4897,7 +4844,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case WM_SYSCHAR: case WM_SYSCHAR:
case WM_CHAR: case WM_CHAR:
{ {
MSG nativeMsg = InitMSG(msg, wParam, lParam); MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam);
result = ProcessCharMessage(nativeMsg, nsnull); result = ProcessCharMessage(nativeMsg, nsnull);
DispatchPendingEvents(); DispatchPendingEvents();
} }
@ -4906,7 +4853,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case WM_SYSKEYUP: case WM_SYSKEYUP:
case WM_KEYUP: case WM_KEYUP:
{ {
MSG nativeMsg = InitMSG(msg, wParam, lParam); MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam);
nativeMsg.time = ::GetMessageTime(); nativeMsg.time = ::GetMessageTime();
result = ProcessKeyUpMessage(nativeMsg, nsnull); result = ProcessKeyUpMessage(nativeMsg, nsnull);
DispatchPendingEvents(); DispatchPendingEvents();
@ -4916,7 +4863,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYDOWN: case WM_KEYDOWN:
{ {
MSG nativeMsg = InitMSG(msg, wParam, lParam); MSG nativeMsg = WinUtils::InitMSG(msg, wParam, lParam);
result = ProcessKeyDownMessage(nativeMsg, nsnull); result = ProcessKeyDownMessage(nativeMsg, nsnull);
DispatchPendingEvents(); DispatchPendingEvents();
} }
@ -5158,7 +5105,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case MOZ_WM_HSCROLL: case MOZ_WM_HSCROLL:
case MOZ_WM_VSCROLL: case MOZ_WM_VSCROLL:
*aRetValue = 0; *aRetValue = 0;
OnScrollInternal(GetNativeMessage(msg), wParam, lParam); OnScrollInternal(WinUtils::GetNativeMessage(msg), wParam, lParam);
// Doesn't need to call next wndproc for internal message. // Doesn't need to call next wndproc for internal message.
return true; return true;
@ -5222,7 +5169,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case WM_SETFOCUS: case WM_SETFOCUS:
// If previous focused window isn't ours, it must have received the // If previous focused window isn't ours, it must have received the
// redirected message. So, we should forget it. // redirected message. So, we should forget it.
if (!IsOurProcessWindow(HWND(wParam))) { if (!WinUtils::IsOurProcessWindow(HWND(wParam))) {
ForgetRedirectedKeyDownMessage(); ForgetRedirectedKeyDownMessage();
} }
if (sJustGotActivate) { if (sJustGotActivate) {
@ -5337,7 +5284,7 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
case MOZ_WM_MOUSEVWHEEL: case MOZ_WM_MOUSEVWHEEL:
case MOZ_WM_MOUSEHWHEEL: case MOZ_WM_MOUSEHWHEEL:
{ {
UINT nativeMessage = GetNativeMessage(msg); UINT nativeMessage = WinUtils::GetNativeMessage(msg);
// If OnMouseWheel returns true, the event was forwarded directly to another // If OnMouseWheel returns true, the event was forwarded directly to another
// mozilla window message handler (ProcessMessage). In this case the return // mozilla window message handler (ProcessMessage). In this case the return
// value of the forwarded event is in 'result' which we should return immediately. // value of the forwarded event is in 'result' which we should return immediately.
@ -5880,7 +5827,7 @@ nsWindow::SynthesizeNativeKeyEvent(PRInt32 aNativeKeyboardLayout,
} }
::SetKeyboardState(kbdState); ::SetKeyboardState(kbdState);
nsModifierKeyState modKeyState; 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) { if (i == keySequence.Length() - 1 && aCharacters.Length() > 0) {
UINT scanCode = ::MapVirtualKeyEx(aNativeKeyCode, MAPVK_VK_TO_VSC, UINT scanCode = ::MapVirtualKeyEx(aNativeKeyCode, MAPVK_VK_TO_VSC,
gKbdLayout.GetLayout()); gKbdLayout.GetLayout());
@ -5899,7 +5846,7 @@ nsWindow::SynthesizeNativeKeyEvent(PRInt32 aNativeKeyboardLayout,
} }
::SetKeyboardState(kbdState); ::SetKeyboardState(kbdState);
nsModifierKeyState modKeyState; nsModifierKeyState modKeyState;
MSG msg = InitMSG(WM_KEYUP, key, 0); MSG msg = WinUtils::InitMSG(WM_KEYUP, key, 0);
OnKeyUp(msg, modKeyState, nsnull); OnKeyUp(msg, modKeyState, nsnull);
} }
@ -5954,7 +5901,7 @@ void nsWindow::OnWindowPosChanged(WINDOWPOS *wp, bool& result)
return; return;
#ifdef WINSTATE_DEBUG_OUTPUT #ifdef WINSTATE_DEBUG_OUTPUT
if (mWnd == GetTopLevelHWND(mWnd)) { if (mWnd == WinUtils::GetTopLevelHWND(mWnd)) {
PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [ top] ")); PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [ top] "));
} else { } else {
PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [child] ")); PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("*** OnWindowPosChanged: [child] "));
@ -6206,7 +6153,7 @@ void nsWindow::OnWindowPosChanging(LPWINDOWPOS& info)
event.mPlacement = nsWindowZTop; event.mPlacement = nsWindowZTop;
else { else {
event.mPlacement = nsWindowZRelative; event.mPlacement = nsWindowZRelative;
aboveWindow = GetNSWindowPtr(hwndAfter); aboveWindow = WinUtils::GetNSWindowPtr(hwndAfter);
} }
event.mReqBelow = aboveWindow; event.mReqBelow = aboveWindow;
event.mActualBelow = nsnull; event.mActualBelow = nsnull;
@ -6356,17 +6303,6 @@ bool nsWindow::OnGesture(WPARAM wParam, LPARAM lParam)
return true; // Handled 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 /* static */ void
nsWindow::InitMouseWheelScrollData() nsWindow::InitMouseWheelScrollData()
{ {
@ -6664,7 +6600,8 @@ bool nsWindow::IsRedirectedKeyDownMessage(const MSG &aMsg)
{ {
return (aMsg.message == WM_KEYDOWN || aMsg.message == WM_SYSKEYDOWN) && return (aMsg.message == WM_KEYDOWN || aMsg.message == WM_SYSKEYDOWN) &&
(sRedirectedKeyDown.message == aMsg.message && (sRedirectedKeyDown.message == aMsg.message &&
GetScanCode(sRedirectedKeyDown.lParam) == GetScanCode(aMsg.lParam)); WinUtils::GetScanCode(sRedirectedKeyDown.lParam) ==
WinUtils::GetScanCode(aMsg.lParam));
} }
void void
@ -6755,9 +6692,9 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg,
INPUT keyinput; INPUT keyinput;
keyinput.type = INPUT_KEYBOARD; keyinput.type = INPUT_KEYBOARD;
keyinput.ki.wVk = aMsg.wParam; keyinput.ki.wVk = aMsg.wParam;
keyinput.ki.wScan = GetScanCode(aMsg.lParam); keyinput.ki.wScan = WinUtils::GetScanCode(aMsg.lParam);
keyinput.ki.dwFlags = KEYEVENTF_SCANCODE; keyinput.ki.dwFlags = KEYEVENTF_SCANCODE;
if (IsExtendedScanCode(aMsg.lParam)) { if (WinUtils::IsExtendedScanCode(aMsg.lParam)) {
keyinput.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; keyinput.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
} }
keyinput.ki.time = 0; keyinput.ki.time = 0;
@ -7492,105 +7429,6 @@ bool nsWindow::OnHotKey(WPARAM wParam, LPARAM lParam)
return true; 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<FindOurWindowAtPointInfo*>(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<LPARAM>(&info));
return info.mOutHWND;
}
typedef DWORD (WINAPI *GetProcessImageFileNameProc)(HANDLE, LPWSTR, DWORD); typedef DWORD (WINAPI *GetProcessImageFileNameProc)(HANDLE, LPWSTR, DWORD);
// Determine whether the given HWND is the handle for the Elantech helper // Determine whether the given HWND is the handle for the Elantech helper
@ -7632,42 +7470,6 @@ static bool IsElantechHelperWindow(HWND aHWND)
return result; 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, * OnMouseWheel() is called when ProcessMessage() handles WM_MOUSEWHEEL,
* WM_MOUSEHWHEEL and also OnScroll() tries to emulate mouse wheel action for * 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 // 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 // gesture. We detect that here, and search for our window that would
// be beneath the cursor if that window wasn't there. // be beneath the cursor if that window wasn't there.
underCursorWnd = FindOurWindowAtPoint(point); underCursorWnd = WinUtils::FindOurWindowAtPoint(point);
if (!underCursorWnd) { if (!underCursorWnd) {
return; 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 // Handle most cases first. If the window under mouse cursor is our window
// except plugin window (MozillaWindowClass), we should handle the message // except plugin window (MozillaWindowClass), we should handle the message
// on the window. // on the window.
if (IsOurProcessWindow(underCursorWnd)) { if (WinUtils::IsOurProcessWindow(underCursorWnd)) {
nsWindow* destWindow = GetNSWindowPtr(underCursorWnd); nsWindow* destWindow = WinUtils::GetNSWindowPtr(underCursorWnd);
if (!destWindow) { if (!destWindow) {
NS_WARNING("We're not sure what cause this is."); NS_WARNING("We're not sure what cause this is.");
HWND wnd = ::GetParent(underCursorWnd); HWND wnd = ::GetParent(underCursorWnd);
for (; wnd; wnd = ::GetParent(wnd)) { for (; wnd; wnd = ::GetParent(wnd)) {
destWindow = GetNSWindowPtr(wnd); destWindow = WinUtils::GetNSWindowPtr(wnd);
if (destWindow) { if (destWindow) {
break; break;
} }
@ -7756,7 +7558,7 @@ nsWindow::OnMouseWheel(UINT aMsg, WPARAM aWParam, LPARAM aLParam,
destWindow = destWindow->GetParentWindow(false); destWindow = destWindow->GetParentWindow(false);
NS_ENSURE_TRUE(destWindow, ); NS_ENSURE_TRUE(destWindow, );
} }
UINT internalMessage = GetInternalMessage(aMsg); UINT internalMessage = WinUtils::GetInternalMessage(aMsg);
::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam); ::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam);
return; 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: // If the window under cursor is not in our process, it means:
// 1. The window may be a plugin window (GeckoPluginWindow or its descendant). // 1. The window may be a plugin window (GeckoPluginWindow or its descendant).
// 2. The window may be another application's window. // 2. The window may be another application's window.
HWND pluginWnd = FindOurProcessWindow(underCursorWnd); HWND pluginWnd = WinUtils::FindOurProcessWindow(underCursorWnd);
if (!pluginWnd) { if (!pluginWnd) {
// If there is no plugin window in ancestors of the window under cursor, // If there is no plugin window in ancestors of the window under cursor,
// the window is for another applications (case 2). // 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) { if (mWindowType == eWindowType_plugin && pluginWnd == mWnd) {
nsWindow* destWindow = GetParentWindow(false); nsWindow* destWindow = GetParentWindow(false);
NS_ENSURE_TRUE(destWindow, ); NS_ENSURE_TRUE(destWindow, );
UINT internalMessage = GetInternalMessage(aMsg); UINT internalMessage = WinUtils::GetInternalMessage(aMsg);
::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam); ::PostMessage(destWindow->mWnd, internalMessage, aWParam, aLParam);
return; return;
} }
@ -8185,7 +7987,7 @@ bool nsWindow::AssociateDefaultIMC(bool aAssociate)
#define NS_LOG_WMGETOBJECT_WND(aMsg, aHwnd) \ #define NS_LOG_WMGETOBJECT_WND(aMsg, aHwnd) \
{ \ { \
nsWindow* wnd = GetNSWindowPtr(aHwnd); \ nsWindow* wnd = WinUtils::GetNSWindowPtr(aHwnd); \
PR_LOG(gWindowsLog, PR_LOG_ALWAYS, \ PR_LOG(gWindowsLog, PR_LOG_ALWAYS, \
("Get " aMsg ":\n {\n HWND: %d, parent HWND: %d, wndobj: %p,\n", \ ("Get " aMsg ":\n {\n HWND: %d, parent HWND: %d, wndobj: %p,\n", \
aHwnd, ::GetParent(aHwnd), wnd)); \ aHwnd, ::GetParent(aHwnd), wnd)); \
@ -8293,8 +8095,8 @@ void nsWindow::SetWindowTranslucencyInner(nsTransparencyMode aMode)
return; return;
// stop on dialogs and popups! // stop on dialogs and popups!
HWND hWnd = GetTopLevelHWND(mWnd, true); HWND hWnd = WinUtils::GetTopLevelHWND(mWnd, true);
nsWindow* parent = GetNSWindowPtr(hWnd); nsWindow* parent = WinUtils::GetNSWindowPtr(hWnd);
if (!parent) if (!parent)
{ {
@ -8364,7 +8166,7 @@ nsresult nsWindow::UpdateTranslucentWindow()
BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
SIZE winSize = { mBounds.width, mBounds.height }; SIZE winSize = { mBounds.width, mBounds.height };
POINT srcPos = { 0, 0 }; POINT srcPos = { 0, 0 };
HWND hWnd = GetTopLevelHWND(mWnd, true); HWND hWnd = WinUtils::GetTopLevelHWND(mWnd, true);
RECT winRect; RECT winRect;
::GetWindowRect(hWnd, &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) LRESULT CALLBACK nsWindow::MozSpecialMouseProc(int code, WPARAM wParam, LPARAM lParam)
{ {
if (sProcessHook) { if (sProcessHook) {
switch (GetNativeMessage(wParam)) { switch (WinUtils::GetNativeMessage(wParam)) {
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN: case WM_MBUTTONDOWN:
@ -8479,7 +8281,7 @@ LRESULT CALLBACK nsWindow::MozSpecialMouseProc(int code, WPARAM wParam, LPARAM l
case WM_MOUSEHWHEEL: case WM_MOUSEHWHEEL:
{ {
MOUSEHOOKSTRUCT* ms = (MOUSEHOOKSTRUCT*)lParam; MOUSEHOOKSTRUCT* ms = (MOUSEHOOKSTRUCT*)lParam;
nsIWidget* mozWin = (nsIWidget*)GetNSWindowPtr(ms->hwnd); nsIWidget* mozWin = WinUtils::GetNSWindowPtr(ms->hwnd);
if (mozWin) { if (mozWin) {
// If this window is windowed plugin window, the mouse events are not // If this window is windowed plugin window, the mouse events are not
// sent to us. // 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) BOOL CALLBACK nsWindow::ClearResourcesCallback(HWND aWnd, LPARAM aMsg)
{ {
nsWindow *window = nsWindow::GetNSWindowPtr(aWnd); nsWindow *window = WinUtils::GetNSWindowPtr(aWnd);
if (window) { if (window) {
window->ClearCachedResources(); window->ClearCachedResources();
} }
@ -8673,7 +8475,7 @@ nsWindow::DealWithPopups(HWND inWnd, UINT inMsg, WPARAM inWParam, LPARAM inLPara
{ {
if (sRollupListener && sRollupWidget && ::IsWindowVisible(inWnd)) { if (sRollupListener && sRollupWidget && ::IsWindowVisible(inWnd)) {
inMsg = GetNativeMessage(inMsg); inMsg = WinUtils::GetNativeMessage(inMsg);
if (inMsg == WM_LBUTTONDOWN || inMsg == WM_RBUTTONDOWN || inMsg == WM_MBUTTONDOWN || if (inMsg == WM_LBUTTONDOWN || inMsg == WM_RBUTTONDOWN || inMsg == WM_MBUTTONDOWN ||
inMsg == WM_MOUSEWHEEL || inMsg == WM_MOUSEHWHEEL || inMsg == WM_ACTIVATE || inMsg == WM_MOUSEWHEEL || inMsg == WM_MOUSEHWHEEL || inMsg == WM_ACTIVATE ||
(inMsg == WM_KILLFOCUS && IsDifferentThreadWindow((HWND)inWParam)) || (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 // However, don't activate panels
if (inMsg == WM_MOUSEACTIVATE) { if (inMsg == WM_MOUSEACTIVATE) {
nsWindow* activateWindow = GetNSWindowPtr(inWnd); nsWindow* activateWindow = WinUtils::GetNSWindowPtr(inWnd);
if (activateWindow) { if (activateWindow) {
nsWindowType wintype; nsWindowType wintype;
activateWindow->GetWindowType(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 // Note that the result of GetTopLevelWindow method can be different from the
// result of GetTopLevelHWND method. The result can be non-floating window. // result of WinUtils::GetTopLevelHWND(). The result can be non-floating
// Because our top level window may be contained in another window which is // window. Because our top level window may be contained in another window
// not managed by us. // which is not managed by us.
nsWindow* nsWindow::GetTopLevelWindow(bool aStopOnDialogOrPopup) nsWindow* nsWindow::GetTopLevelWindow(bool aStopOnDialogOrPopup)
{ {
nsWindow* curWindow = this; 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) static BOOL CALLBACK gEnumWindowsProc(HWND hwnd, LPARAM lParam)
{ {
DWORD pid; DWORD pid;
@ -8989,51 +8737,11 @@ HasRegistryKey(HKEY aRoot, PRUnichar* aName)
return true; 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 static bool
IsObsoleteSynapticsDriver() IsObsoleteSynapticsDriver()
{ {
PRUnichar buf[40]; PRUnichar buf[40];
bool foundKey = nsWindow::GetRegistryKey(HKEY_LOCAL_MACHINE, bool foundKey = WinUtils::GetRegistryKey(HKEY_LOCAL_MACHINE,
L"Software\\Synaptics\\SynTP\\Install", L"Software\\Synaptics\\SynTP\\Install",
L"DriverVersion", L"DriverVersion",
buf, buf,
@ -9055,13 +8763,13 @@ GetElantechDriverMajorVersion()
{ {
PRUnichar buf[40]; PRUnichar buf[40];
// The driver version is found in one of these two registry keys. // 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"Software\\Elantech\\MainOption",
L"DriverVersion", L"DriverVersion",
buf, buf,
sizeof buf); sizeof buf);
if (!foundKey) if (!foundKey)
foundKey = nsWindow::GetRegistryKey(HKEY_CURRENT_USER, foundKey = WinUtils::GetRegistryKey(HKEY_CURRENT_USER,
L"Software\\Elantech", L"Software\\Elantech",
L"DriverVersion", L"DriverVersion",
buf, buf,

Просмотреть файл

@ -199,16 +199,6 @@ public:
NS_IMETHOD SetNonClientMargins(nsIntMargin &margins); NS_IMETHOD SetNonClientMargins(nsIntMargin &margins);
void SetDrawsInTitlebar(bool aState); 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 * Event helpers
*/ */
@ -242,12 +232,8 @@ public:
* Window utilities * Window utilities
*/ */
nsWindow* GetTopLevelWindow(bool aStopOnDialogOrPopup); nsWindow* GetTopLevelWindow(bool aStopOnDialogOrPopup);
static HWND GetTopLevelHWND(HWND aWnd,
bool aStopIfNotChild = false,
bool aStopIfNotPopup = true);
HWND GetWindowHandle() { return mWnd; } HWND GetWindowHandle() { return mWnd; }
WNDPROC GetPrevWindowProc() { return mPrevWndProc; } WNDPROC GetPrevWindowProc() { return mPrevWndProc; }
static nsWindow* GetNSWindowPtr(HWND aWnd);
WindowHook& GetWindowHook() { return mWindowHook; } WindowHook& GetWindowHook() { return mWindowHook; }
nsWindow* GetParentWindow(bool aIncludeOwner); nsWindow* GetParentWindow(bool aIncludeOwner);
// Get an array of all nsWindow*s on the main thread. // 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 BOOL CALLBACK EnumAllThreadWindowProc(HWND aWnd, LPARAM aParam);
static void AllowD3D9Callback(nsWindow *aWindow); static void AllowD3D9Callback(nsWindow *aWindow);
static void AllowD3D9WithReinitializeCallback(nsWindow *aWindow); static void AllowD3D9WithReinitializeCallback(nsWindow *aWindow);
static BOOL CALLBACK FindOurWindowAtPointCallback(HWND aHWND, LPARAM aLPARAM);
/** /**
* Window utilities * Window utilities
*/ */
static BOOL SetNSWindowPtr(HWND aWnd, nsWindow * ptr);
static PRInt32 GetMonitorCount();
LPARAM lParamToScreen(LPARAM lParam); LPARAM lParamToScreen(LPARAM lParam);
LPARAM lParamToClient(LPARAM lParam); LPARAM lParamToClient(LPARAM lParam);
virtual void SubclassWindow(BOOL bState); virtual void SubclassWindow(BOOL bState);
@ -362,9 +345,6 @@ protected:
return mTransparencyMode == eTransparencyGlass || return mTransparencyMode == eTransparencyGlass ||
mTransparencyMode == eTransparencyBorderlessGlass; mTransparencyMode == eTransparencyBorderlessGlass;
} }
static bool IsOurProcessWindow(HWND aHWND);
static HWND FindOurProcessWindow(HWND aHWND);
static HWND FindOurWindowAtPoint(const POINT& aPoint);
/** /**
* Event processing helpers * Event processing helpers
@ -379,7 +359,6 @@ protected:
void RemoveMessageAndDispatchPluginEvent(UINT aFirstMsg, void RemoveMessageAndDispatchPluginEvent(UINT aFirstMsg,
UINT aLastMsg, UINT aLastMsg,
nsFakeCharMessage* aFakeCharMessage = nsnull); nsFakeCharMessage* aFakeCharMessage = nsnull);
static MSG InitMSG(UINT aMessage, WPARAM wParam, LPARAM lParam);
virtual bool ProcessMessage(UINT msg, WPARAM &wParam, virtual bool ProcessMessage(UINT msg, WPARAM &wParam,
LPARAM &lParam, LRESULT *aRetValue); LPARAM &lParam, LRESULT *aRetValue);
bool ProcessMessageForPlugin(const MSG &aMsg, bool ProcessMessageForPlugin(const MSG &aMsg,
@ -395,14 +374,6 @@ protected:
static bool ConvertStatus(nsEventStatus aStatus); static bool ConvertStatus(nsEventStatus aStatus);
static void PostSleepWakeNotification(const bool aIsSleepMode); static void PostSleepWakeNotification(const bool aIsSleepMode);
PRInt32 ClientMarginHitTestPoint(PRInt32 mx, PRInt32 my); 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 bool IsRedirectedKeyDownMessage(const MSG &aMsg);
static void ForgetRedirectedKeyDownMessage() static void ForgetRedirectedKeyDownMessage()
{ {
@ -442,8 +413,6 @@ protected:
BOOL OnInputLangChange(HKL aHKL); BOOL OnInputLangChange(HKL aHKL);
bool OnPaint(HDC aDC, PRUint32 aNestingLevel); bool OnPaint(HDC aDC, PRUint32 aNestingLevel);
void OnWindowPosChanged(WINDOWPOS *wp, bool& aResult); void OnWindowPosChanged(WINDOWPOS *wp, bool& aResult);
static UINT GetInternalMessage(UINT aNativeMessage);
static UINT GetNativeMessage(UINT aInternalMessage);
void OnMouseWheel(UINT aMsg, WPARAM aWParam, void OnMouseWheel(UINT aMsg, WPARAM aWParam,
LPARAM aLParam, LRESULT *aRetValue); LPARAM aLParam, LRESULT *aRetValue);
void OnMouseWheelInternal(UINT aMessage, WPARAM aWParam, void OnMouseWheelInternal(UINT aMessage, WPARAM aWParam,
@ -511,7 +480,6 @@ protected:
nsIntRegion GetRegionToPaint(bool aForceFullRepaint, nsIntRegion GetRegionToPaint(bool aForceFullRepaint,
PAINTSTRUCT ps, HDC aDC); PAINTSTRUCT ps, HDC aDC);
static void ActivateOtherWindowHelper(HWND aWnd); static void ActivateOtherWindowHelper(HWND aWnd);
static PRUint16 GetMouseInputSource();
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
static STDMETHODIMP_(LRESULT) LresultFromObject(REFIID riid, WPARAM wParam, LPUNKNOWN pAcc); static STDMETHODIMP_(LRESULT) LresultFromObject(REFIID riid, WPARAM wParam, LPUNKNOWN pAcc);
#endif // ACCESSIBILITY #endif // ACCESSIBILITY

Просмотреть файл

@ -68,13 +68,6 @@
// systems, and when the screen resolution changes. // systems, and when the screen resolution changes.
#define MOZ_WM_ENSUREVISIBLE (WM_APP + 14159) #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 #ifndef WM_THEMECHANGED
#define WM_THEMECHANGED 0x031A #define WM_THEMECHANGED 0x031A
#endif #endif
@ -186,7 +179,7 @@
#define TABLET_INK_SIGNATURE 0xFFFFFF00 #define TABLET_INK_SIGNATURE 0xFFFFFF00
#define TABLET_INK_CHECK 0xFF515700 #define TABLET_INK_CHECK 0xFF515700
#define TABLET_INK_TOUCH 0x00000080 #define TABLET_INK_TOUCH 0x00000080
#define MOUSE_INPUT_SOURCE() GetMouseInputSource() #define MOUSE_INPUT_SOURCE() WinUtils::GetMouseInputSource()
/************************************************************** /**************************************************************
* *

Просмотреть файл

@ -65,6 +65,7 @@ using mozilla::plugins::PluginInstanceParent;
#include "gfxContext.h" #include "gfxContext.h"
#include "nsRenderingContext.h" #include "nsRenderingContext.h"
#include "prmem.h" #include "prmem.h"
#include "WinUtils.h"
#include "LayerManagerOGL.h" #include "LayerManagerOGL.h"
#include "BasicLayers.h" #include "BasicLayers.h"
@ -84,6 +85,7 @@ extern "C" {
} }
using namespace mozilla::layers; using namespace mozilla::layers;
using namespace mozilla::widget;
/************************************************************** /**************************************************************
************************************************************** **************************************************************
@ -761,7 +763,7 @@ bool nsWindowGfx::IsCursorTranslucencySupported()
if (!didCheck) { if (!didCheck) {
didCheck = true; didCheck = true;
// Cursor translucency is supported on Windows XP and newer // Cursor translucency is supported on Windows XP and newer
isSupported = nsWindow::GetWindowsVersion() >= 0x501; isSupported = WinUtils::GetWindowsVersion() >= WinUtils::WINXP_VERSION;
} }
return isSupported; return isSupported;