gecko-dev/widget/windows/nsWindowBase.h
Masayuki Nakano e78b3f56ea Bug 1409155 - IMEHandler should not associate IMC with any window if active IME is ATOK 2010 or earlier with x64 build on Win8 or later r=m_kato
ATOK started to be TIP of TSF since 2011.  Older than it, i.e., ATOK 2010 and
earlier have a lot of problems even for daily use.  Perhaps, the reason is
Win 8 has a lot of changes around IMM-IME support and TSF, and ATOK 2010 is
released earlier than Win 8.

ATOK 2006 crashes while converting a word with candidate window.
ATOK 2007 doesn't paint and resize suggest window and candidate window
correctly (showing white window or too big window).
ATOK 2008 and ATOK 2009 crash when user just opens their open state.
ATOK 2010 isn't installable newly on Win 7 or later, but we have a lot of
crash reports.

Note that ATOK 2006 is the first version supporting Win XP x64.  So, ATOK 2005
must not support x64 apps.

Unfortunately, we cannot block loading DLLs of them.  Therefore, IMEHandler
should disassociate IMC from active window when user changes active keyboard
layout to the legacy ATOK and not associate IME with any window when
SetInputContext() is called even with "enabled".  Additionally, when user
changes active keyboard layout from the legacy ATOK to one of the other
keyboard layouts, IMEHandler should associate IMC with current window for
new active IME.

MozReview-Commit-ID: RVYwmYxzO7

--HG--
extra : rebase_source : c237a3aca6ceb6a1f7251bd9421e4b905be5bc6c
2017-10-25 23:51:27 +09:00

148 lines
4.5 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsWindowBase_h_
#define nsWindowBase_h_
#include "mozilla/EventForwards.h"
#include "nsBaseWidget.h"
#include "nsClassHashtable.h"
#include <windows.h>
#include "touchinjection_sdk80.h"
/*
* nsWindowBase - Base class of common methods other classes need to access
* in both win32 and winrt window classes.
*/
class nsWindowBase : public nsBaseWidget
{
public:
typedef mozilla::WidgetEventTime WidgetEventTime;
/*
* Return the HWND or null for this widget.
*/
virtual HWND GetWindowHandle() final {
return static_cast<HWND>(GetNativeData(NS_NATIVE_WINDOW));
}
/*
* Return the parent window, if it exists.
*/
virtual nsWindowBase* GetParentWindowBase(bool aIncludeOwner) = 0;
/*
* Return true if this is a top level widget.
*/
virtual bool IsTopLevelWidget() = 0;
/*
* Init a standard gecko event for this widget.
* @param aEvent the event to initialize.
* @param aPoint message position in physical coordinates.
*/
virtual void InitEvent(mozilla::WidgetGUIEvent& aEvent,
LayoutDeviceIntPoint* aPoint = nullptr) = 0;
/*
* Returns WidgetEventTime instance which is initialized with current message
* time.
*/
virtual WidgetEventTime CurrentMessageWidgetEventTime() const = 0;
/*
* Dispatch a gecko event for this widget.
* Returns true if it's consumed. Otherwise, false.
*/
virtual bool DispatchWindowEvent(mozilla::WidgetGUIEvent* aEvent) = 0;
/*
* Dispatch a gecko keyboard event for this widget. This
* is called by KeyboardLayout to dispatch gecko events.
* Returns true if it's consumed. Otherwise, false.
*/
virtual bool DispatchKeyboardEvent(mozilla::WidgetKeyboardEvent* aEvent) = 0;
/*
* Dispatch a gecko wheel event for this widget. This
* is called by ScrollHandler to dispatch gecko events.
* Returns true if it's consumed. Otherwise, false.
*/
virtual bool DispatchWheelEvent(mozilla::WidgetWheelEvent* aEvent) = 0;
/*
* Dispatch a gecko content command event for this widget. This
* is called by ScrollHandler to dispatch gecko events.
* Returns true if it's consumed. Otherwise, false.
*/
virtual bool DispatchContentCommandEvent(mozilla::WidgetContentCommandEvent* aEvent) = 0;
/*
* Default dispatch of a plugin event.
*/
virtual bool DispatchPluginEvent(const MSG& aMsg);
/*
* Returns true if this should dispatch a plugin event.
*/
bool ShouldDispatchPluginEvent();
/*
* Touch input injection apis
*/
virtual nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId,
TouchPointerState aPointerState,
LayoutDeviceIntPoint aPoint,
double aPointerPressure,
uint32_t aPointerOrientation,
nsIObserver* aObserver) override;
virtual nsresult ClearNativeTouchSequence(nsIObserver* aObserver) override;
/*
* WM_APPCOMMAND common handler.
* Sends events via NativeKey::HandleAppCommandMessage().
*/
virtual bool HandleAppCommandMsg(const MSG& aAppCommandMsg,
LRESULT *aRetValue);
const InputContext& InputContextRef() const { return mInputContext; }
protected:
virtual int32_t LogToPhys(double aValue) = 0;
void ChangedDPI();
static bool InitTouchInjection();
bool InjectTouchPoint(uint32_t aId, LayoutDeviceIntPoint& aPoint,
POINTER_FLAGS aFlags, uint32_t aPressure = 1024,
uint32_t aOrientation = 90);
class PointerInfo
{
public:
PointerInfo(int32_t aPointerId, LayoutDeviceIntPoint& aPoint) :
mPointerId(aPointerId),
mPosition(aPoint)
{
}
int32_t mPointerId;
LayoutDeviceIntPoint mPosition;
};
nsClassHashtable<nsUint32HashKey, PointerInfo> mActivePointers;
static bool sTouchInjectInitialized;
static InjectTouchInputPtr sInjectTouchFuncPtr;
// This is used by SynthesizeNativeTouchPoint to maintain state between
// multiple synthesized points, in the case where we can't call InjectTouch
// directly.
mozilla::UniquePtr<mozilla::MultiTouchInput> mSynthesizedTouchInput;
protected:
InputContext mInputContext;
};
#endif // nsWindowBase_h_