| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| package rdpclient.adapter; | |
| import java.awt.event.InputEvent; | |
| import streamer.BaseElement; | |
| import streamer.ByteBuffer; | |
| import streamer.Link; | |
| import common.MouseOrder; | |
| /** | |
| * @see http://msdn.microsoft.com/en-us/library/cc240594.aspx | |
| */ | |
| public class AwtRdpMouseAdapter extends BaseElement { | |
| public final static int FASTPATH_INPUT_EVENT_MOUSE = 0x01; | |
| /** | |
| * Event is a mouse wheel rotation. The only valid flags in a wheel rotation | |
| * event are PTRFLAGS_WHEEL_NEGATIVE and the WheelRotationMask; all other | |
| * pointer flags are ignored. | |
| */ | |
| public final static int PTRFLAGS_WHEEL = 0x0200; | |
| /** | |
| * Wheel rotation value (contained in the WheelRotationMask bit field) is | |
| * negative and MUST be sign-extended before injection at the server. | |
| */ | |
| public final static int PTRFLAGS_WHEEL_NEGATIVE = 0x0100; | |
| /** | |
| * Bit field describing the number of rotation units the mouse wheel was | |
| * rotated. The value is negative if the PTRFLAGS_WHEEL_NEGATIVE flag is set. | |
| */ | |
| public final static int WHEEL_ROTATION_MASK = 0x01FF; | |
| /** | |
| * Indicates that the mouse position MUST be updated to the location specified | |
| * by the xPos and yPos fields. | |
| */ | |
| public final static int PTRFLAGS_MOVE = 0x0800; | |
| /** | |
| * Indicates that a click event has occurred at the position specified by the | |
| * xPos and yPos fields. The button flags indicate which button has been | |
| * clicked and at least one of these flags MUST be set. | |
| */ | |
| public final static int PTRFLAGS_DOWN = 0x8000; | |
| /** | |
| * Mouse button 1 (left button) was clicked or released. If the PTRFLAGS_DOWN | |
| * flag is set, then the button was clicked, otherwise it was released. | |
| */ | |
| public final static int PTRFLAGS_BUTTON1 = 0x1000; | |
| /** | |
| * Mouse button 2 (right button) was clicked or released. If the PTRFLAGS_DOWN | |
| * flag is set, then the button was clicked, otherwise it was released. | |
| */ | |
| public final static int PTRFLAGS_BUTTON2 = 0x2000; | |
| /** | |
| * Mouse button 3 (middle button or wheel) was clicked or released. If the | |
| * PTRFLAGS_DOWN flag is set, then the button was clicked, otherwise it was | |
| * released. | |
| */ | |
| public final static int PTRFLAGS_BUTTON3 = 0x4000; | |
| public AwtRdpMouseAdapter(String id) { | |
| super(id); | |
| } | |
| @Override | |
| public void handleData(ByteBuffer buf, Link link) { | |
| if (verbose) | |
| System.out.println("[" + this + "] INFO: Data received: " + buf + "."); | |
| // Get mouse event | |
| MouseOrder order = (MouseOrder)buf.getOrder(); | |
| ByteBuffer outBuf = new ByteBuffer(7, true); | |
| // eventHeader (1 byte): An 8-bit, unsigned integer. EventCode bitfield (top | |
| // 3 bits) MUST be set to FASTPATH_INPUT_EVENT_MOUSE (1). The | |
| // eventFlags bitfield (low 5 bits) MUST be zeroed out. | |
| outBuf.writeByte(FASTPATH_INPUT_EVENT_MOUSE << 5); | |
| // pointerFlags (2 bytes): A 16-bit, unsigned integer. | |
| outBuf.writeShortLE(getPointerFlags(order)); | |
| // xPos (2 bytes): A 16-bit, unsigned integer. The x-coordinate of the | |
| // pointer. | |
| outBuf.writeShortLE(order.event.getX()); | |
| // yPos (2 bytes): A 16-bit, unsigned integer. The y-coordinate of the | |
| // pointer. | |
| outBuf.writeShortLE(order.event.getY()); | |
| // Push buffer to one pad only, so it can be modified without copying of | |
| // data | |
| pushDataToPad(STDOUT, outBuf); | |
| } | |
| // Remember mouse buttons | |
| protected boolean button1, button2, button3; | |
| protected int getPointerFlags(MouseOrder order) { | |
| int flags = 0; | |
| int modifiers = order.event.getModifiersEx(); | |
| if (order.pressed) { | |
| // Mouse pressed | |
| flags |= PTRFLAGS_DOWN; | |
| // Check, which one of buttons is released | |
| boolean b1 = ((modifiers & InputEvent.BUTTON1_DOWN_MASK) > 0) && !button1; | |
| boolean b2 = ((modifiers & InputEvent.BUTTON2_DOWN_MASK) > 0) && !button2; | |
| boolean b3 = ((modifiers & InputEvent.BUTTON3_DOWN_MASK) > 0) && !button3; | |
| if (b1) { | |
| flags |= PTRFLAGS_BUTTON1; | |
| button1 = true; | |
| } | |
| if (b2) { | |
| flags |= PTRFLAGS_BUTTON3; | |
| button2 = true; | |
| } | |
| if (b3) { | |
| flags |= PTRFLAGS_BUTTON2; | |
| button3 = true; | |
| } | |
| } else if (order.released) { | |
| // Mouse released | |
| // Check, which one of buttons is released | |
| boolean b1 = !((modifiers & InputEvent.BUTTON1_DOWN_MASK) > 0) && button1; | |
| boolean b2 = !((modifiers & InputEvent.BUTTON2_DOWN_MASK) > 0) && button2; | |
| boolean b3 = !((modifiers & InputEvent.BUTTON3_DOWN_MASK) > 0) && button3; | |
| if (b1) { | |
| flags |= PTRFLAGS_BUTTON1; | |
| button1 = false; | |
| } | |
| if (b2) { | |
| flags |= PTRFLAGS_BUTTON3; | |
| button2 = false; | |
| } | |
| if (b3) { | |
| flags |= PTRFLAGS_BUTTON2; | |
| button3 = false; | |
| } | |
| } else { | |
| // Mouse moved | |
| flags |= PTRFLAGS_MOVE; | |
| } | |
| return flags; | |
| } | |
| } |