Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/kmcaster.git

Track physical mouse button states

Author DaveJarvis <email>
Date 2020-08-02 00:01:58 GMT-0700
Commit 1b102acfb1c5ffae1898158a6c276c0fcb70bb46
Parent d3ccdda
src/main/com/whitemagicsoftware/kmcaster/EventHandler.java
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.util.Deque;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.Map;
import static com.whitemagicsoftware.kmcaster.HardwareState.SWITCH_PRESSED;
import static com.whitemagicsoftware.kmcaster.HardwareState.SWITCH_RELEASED;
-import static com.whitemagicsoftware.kmcaster.HardwareSwitch.*;
+import static com.whitemagicsoftware.kmcaster.HardwareSwitch.KEY_REGULAR;
+import static com.whitemagicsoftware.kmcaster.HardwareSwitch.MOUSE_UNDEFINED;
import static com.whitemagicsoftware.kmcaster.LabelConfig.*;
import static com.whitemagicsoftware.kmcaster.ui.Constants.*;
import static java.awt.Toolkit.getDefaultToolkit;
+import static javax.swing.RepaintManager.currentManager;
import static javax.swing.SwingUtilities.invokeLater;
SWITCH_RELEASED, COLOUR_KEY_UP
);
+
+ /**
+ * This is used to temporarily set the mouse to the released state.
+ */
+ private static final HardwareSwitchState MOUSE_RELEASED =
+ new HardwareSwitchState( MOUSE_UNDEFINED, SWITCH_RELEASED );
private final HardwareImages mHardwareImages;
);
}
+
+ private final Deque<HardwareSwitch> mMousePressed = new LinkedList<>();
/**
else {
if( hwState == SWITCH_RELEASED ) {
+ mMousePressed.remove( hwSwitch );
timer.addActionListener(
- ( event ) -> updateMouseLabel( switchState )
+ ( event ) -> updateMouseStatus( switchState )
);
}
else {
timer.stop();
- updateMouseLabel( switchState );
+ mMousePressed.add( hwSwitch );
+ updateMouseStatus( switchState );
}
}
}
}
-
- private void updateMouseLabel( final HardwareSwitchState state ) {
- updateSwitchState( state );
+ private void updateMouseStatus( final HardwareSwitchState switchState ) {
+ final var container = getHardwareComponent( MOUSE_RELEASED );
+ final var rm = currentManager( container );
final var button = getLabel( LABEL_MOUSE_UNDEFINED );
- button.setVisible( false );
+ final var hwSwitch = switchState.getHardwareSwitch();
+ final var hwState = switchState.getHardwareState();
- if( state.getHardwareSwitch() == MOUSE_UNDEFINED &&
- state.getHardwareState() == SWITCH_PRESSED ) {
- button.setText( state.getValue() );
- button.transform();
- button.setVisible( true );
+ if( hwSwitch == MOUSE_UNDEFINED ) {
+ if( hwState == SWITCH_PRESSED ) {
+ button.setText( switchState.getValue() );
+ button.transform();
+ button.setVisible( true );
+ }
+ else {
+ button.setVisible( false );
+ }
+ }
+
+ container.setState( new HardwareSwitchState( hwSwitch, SWITCH_RELEASED ) );
+ rm.paintDirtyRegions();
+
+ for( final var mouseSwitch : mMousePressed ) {
+ final var buttonState = new HardwareSwitchState(
+ mouseSwitch, SWITCH_PRESSED );
+
+ container.setState( buttonState );
+ rm.paintDirtyRegions();
}
}
src/main/com/whitemagicsoftware/kmcaster/HardwareComponent.java
import java.util.Map;
-import static com.whitemagicsoftware.kmcaster.ui.Constants.INSETS_EMPTY;
-
/**
* Responsible for drawing an image based on a state; the state can be
private Dimension mPreferredSize;
-
- /**
- * Constructs a new {@link HardwareComponent} without an initial state. The
- * initial state must be set by calling {@link #setState(Object)}
- * or {@link #put(Object, Image)} before drawing the image.
- * <p>
- * The default insets will be empty.
- * </p>
- */
- public HardwareComponent() {
- this( INSETS_EMPTY );
- }
/**
src/main/com/whitemagicsoftware/kmcaster/HardwareImages.java
private final Dimension mAppDimensions;
- private final Map<
- HardwareSwitch,
- HardwareComponent<HardwareSwitchState, Image>
- > mSwitches = new HashMap<>();
+ private final Map
+ <HardwareSwitch, HardwareComponent<HardwareSwitchState, Image>>
+ mSwitches = new HashMap<>();
public HardwareImages( final UserSettings userSettings ) {
src/main/com/whitemagicsoftware/kmcaster/HardwareSwitchState.java
return 31 * mHardwareSwitch.hashCode() + mHardwareState.hashCode();
}
+
+ @Override
+ public String toString() {
+ return "HardwareSwitchState{" +
+ "mHardwareSwitch=" + mHardwareSwitch +
+ ", mHardwareState=" + mHardwareState +
+ ", mValue='" + mValue + '\'' +
+ '}';
+ }
}
src/main/com/whitemagicsoftware/kmcaster/listeners/MouseListener.java
/**
+ * Most recently pressed non-mapped button value, empty signifies release.
+ */
+ private String mUndefined = "";
+
+ /**
* Called to send a mouse event to all listeners.
*
final var button = Integer.toString( e.getButton() );
final var n = pressed ? button : "";
- final var o = pressed ? "" : button;
+ final var o = pressed ? mUndefined : button;
fire( hwSwitch, o, n );
+ mUndefined = n;
}
else {
src/main/com/whitemagicsoftware/kmcaster/ui/AutofitLabel.java
final var dstHeightPx = getHeight();
- // Derived using a binary search algorithm to minimize text width lookups.
+ // Derived using a binary search to minimize text width lookups.
var scaledFont = getFont();
src/main/com/whitemagicsoftware/kmcaster/ui/TranslucentPanel.java
@Override
public void paintComponent( final Graphics g ) {
- super.paintComponent( g );
-
final var graphics = (Graphics2D) g;
+ final var r = graphics.getClipBounds();
// https://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html
graphics.setComposite( AlphaComposite.Src );
graphics.setBackground( TRANSLUCENT );
graphics.setColor( TRANSPARENT );
-
- final var r = graphics.getClipBounds();
graphics.fillRect( r.x, r.y, r.width, r.height );
}
Delta 63 lines added, 36 lines removed, 27-line increase