それをサポートすることを選択した VM 実装では、Squeak はマウス ホイールをCtrl Up-ArrowおよびCtrl-Down-Arrowキー イベントにマッピングしているようです。たとえば、sqWin32Window.cの Win32 では:
if( WM_MOUSEWHEEL == message || g_WM_MOUSEWHEEL == message ) {
/* Record mouse wheel msgs as CTRL-Up/Down */
short zDelta = (short) HIWORD(wParam);
if(inputSemaphoreIndex) {
sqKeyboardEvent *evt = (sqKeyboardEvent*) sqNextEventPut();
evt->type = EventTypeKeyboard;
evt->timeStamp = lastMessage->time;
evt->charCode = (zDelta > 0) ? 30 : 31;
evt->pressCode = EventKeyChar;
evt->modifiers = CtrlKeyBit;
evt->utf32Code = 0;
evt->reserved1 = 0;
} else {
buttonState = 64;
if (zDelta < 0) {
recordVirtualKey(message,VK_DOWN,lParam);
} else {
recordVirtualKey(message,VK_UP,lParam);
}
}
return 1;
}
つまり、Squeak 内で作業する必要があるのは、ほとんどの場合です。(Polymorph 拡張機能を使用している場合、特別なmouseWheel
イベントがありますが、Ctrl-Up と Ctrl-Down をフィルタリングして「偽の」MouseWheelEvent
メッセージを生成するだけです。)
handleEvent
inのコードを少し見てみましょうHandMorph
:
evt isMouse ifTrue:[
self sendListenEvent: evt to: self mouseListeners.
lastMouseEvent _ evt].
"Check for pending drag or double click operations."
mouseClickState ifNotNil:[
(mouseClickState handleEvent: evt from: self) ifFalse:[
"Possibly dispatched #click: or something and will not re-establish otherwise"
^self mouseOverHandler processMouseOver: lastMouseEvent]].
evt isMove ifTrue:[
self position: evt position.
self sendMouseEvent: evt.
] ifFalse:[
"Issue a synthetic move event if we're not at the position of the event"
(evt position = self position) ifFalse:[self moveToEvent: evt].
"Drop submorphs on button events"
(self hasSubmorphs)
ifTrue:[self dropMorphs: evt]
ifFalse:[self sendMouseEvent: evt].
].
PolymorphMouseWheelEvent
は、 true を返さない MouseEvent のサブクラスであるisMove
ため、ドロップします。これを機能させたい場合は、ここで何かを変更する必要があります。