Gecko:Notes for mouse driver developers on Windows
This document is informative.
Post/Send WM_MOUSEWHEEL
and WM_MOUSEHWHEEL
messages
Gecko supports both WM_MOUSEWHEEL
and WM_MOUSEHWHEEL
messages, so, all mouse drivers and utilities should post (or send) them to Gecko's window.
Be aware, Gecko 1.9.3 and later (Firefox 3.7 and later) is going to support WM_VSCROLL
and WM_HSCROLL
messages too, however, do not post/send these messages for the wheel action. Gecko handles these messages in different path with WM_MOUSEWHEEL
and WM_MOUSEHWHEEL
because Gecko thinks that the messages are used only for scrolling. To put it concretely, WM_MOUSEWHEEL
and WM_MOUSEHWHEEL
messages cause DOMMouseScroll
event on the web pages, so, web application developers can handle the wheel actions and they can prevent scrolling. However, WM_VSCROLL
and WM_HSCROLL
don't cause the DOM event, it only scrolls a scrollable area. So, the scrolling by these messages are same as the scrolling by scrollbar operation. I.e., web developers cannot know whether the scrolling is caused by scrollbar operation or mouse wheel action.
Post/Send the messages to focused Gecko's window
Please post/send the messages to focused Gecko's window rather than the window under the mouse cursor. Gecko honors the mouse cursor position when Gecko chose a scrolling target (detail of the rule is documented in Gecko:Mouse_Wheel_Scrolling). So, Gecko redirects the messages to a window under the cursor automatically.
Note that Gecko doesn't redirect the messages to a plug-in window even if it's under the mouse cursor (Gecko 1.9.3 and later). The reason is that Gecko manages mouse wheel transaction (documented in Gecko:Mouse_Wheel_Scrolling). The user may want to scroll the parent scrollable area of plug-in. For example, a plug-in window may come under the mouse cursor by scrolling its parent scrollable area, then, Gecko tries to keep scrolling the parent scrollable area rather than the plug-in's content. So, if some mouse drivers/utilities post/send messages to a plug-in window directly, it causes breaking this feature.
Please use wheel messages to unknown window
Gecko 1.9.2 and later (Firefox 3.6 and later) create following class name windows. Note that this could be changed in future version.
-
MozillaHiddenWindowClass
-
MozillaUIWindowClass
-
MozillaContentWindowClass
-
MozillaContentFrameWindowClass
-
MozillaWindowClass
-
MozillaDialogClass
-
MozillaDropShadowWindowClass
You can assume that if focused window class name is one of them, you can post/send WM_MOUSEWHEEL
and WM_MOUSEHWHEEL
messages without any hacks.
Unfortunately, Gecko window structure was changed at Firefox 3.6. Then, we confirmed that some mouse drivers/utilities become that they don't post/send the messages. The messages are standard mouse wheel events on Windows applications. I can understand that some old applications don't support them by historical reasons. The mouse drivers/utilities developers can use hacky way for them, however, it's bad if you assume that all unknown windows are so.