blob: 6b347aac8327ef0814f91e3f1c48e6aee0fc135f [file] [log] [blame]
// 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;
}
}