/*
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.glass.ui.monocle;
import com.sun.glass.events.MouseEvent;
class LinuxMouseProcessor implements LinuxInputProcessor {
private MouseInput mouse = MouseInput.getInstance();
private MouseState previousState = new MouseState();
private MouseState state = new MouseState();
does previousState hold an update that has not yet been sent to
MouseInput?
/**
* does previousState hold an update that has not yet been sent to
* MouseInput?
*/
private boolean hasPendingState;
@Override
public void processEvents(LinuxInputDevice device) {
LinuxEventBuffer buffer = device.getBuffer();
mouse.getState(previousState);
mouse.getState(state);
hasPendingState = false;
while (buffer.hasNextEvent()) {
switch (buffer.getEventType()) {
case LinuxInput.EV_REL:
switch (buffer.getEventCode()) {
case LinuxInput.REL_X:
int x = previousState.getX();
x += buffer.getEventValue();
state.setX(x);
break;
case LinuxInput.REL_Y:
int y = previousState.getY();
y += buffer.getEventValue();
state.setY(y);
break;
case LinuxInput.REL_WHEEL: {
int value = buffer.getEventValue();
if (value < 0) {
state.setWheel(MouseState.WHEEL_DOWN);
} else if (value > 0) {
state.setWheel(MouseState.WHEEL_UP);
} else {
state.setWheel(MouseState.WHEEL_NONE);
}
break;
}
default:
// Ignore other axes
}
break;
case LinuxInput.EV_SYN:
switch (buffer.getEventCode()) {
case LinuxInput.SYN_REPORT:
sendEvent();
break;
default: // ignore
}
break;
case LinuxInput.EV_KEY: {
int button = mouseButtonForKeyCode(buffer.getEventCode());
if (button >= 0) {
if (buffer.getEventValue() == 0) {
state.releaseButton(button);
} else {
state.pressButton(button);
}
}
break;
}
default:
// Ignore other events
}
buffer.nextEvent();
}
if (hasPendingState) {
mouse.setState(previousState, false);
}
}
private void sendEvent() {
if (state.canBeFoldedWith(previousState)) {
// fold together MouseStates that differ only in their coordinates
hasPendingState = true;
} else {
// the events are different.
if (hasPendingState) {
// send and clear the pending state
mouse.setState(previousState, false);
hasPendingState = false;
}
// send this event
mouse.setState(state, false);
}
state.copyTo(previousState);
}
private static int mouseButtonForKeyCode(int keyCode) {
switch (keyCode) {
case LinuxInput.BTN_MOUSE:
return MouseEvent.BUTTON_LEFT;
case LinuxInput.BTN_MIDDLE:
return MouseEvent.BUTTON_OTHER;
case LinuxInput.BTN_RIGHT:
return MouseEvent.BUTTON_RIGHT;
case LinuxInput.BTN_BACK:
return MouseEvent.BUTTON_BACK;
case LinuxInput.BTN_FORWARD:
return MouseEvent.BUTTON_FORWARD;
default:
return -1;
}
}
}