Skip to content

Commit

Permalink
Attempt to fix the lag that happens to some people when using the phy…
Browse files Browse the repository at this point in the history
…sical mouse while mousemaster is running (#13) by pumping Windows messages more frequently
  • Loading branch information
petoncle committed Dec 27, 2024
1 parent bcc32a4 commit dc6b8c5
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
7 changes: 7 additions & 0 deletions src/main/java/mousemaster/Mousemaster.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,37 @@ public void run() throws InterruptedException {
updateConfiguration();
long timeAfterOp = System.nanoTime();
long updateConfigurationDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
platform.update(delta);
timeAfterOp = System.nanoTime();
long platformDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
modeController.update(delta);
timeAfterOp = System.nanoTime();
long modeControllerDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
mouseController.update(delta);
timeAfterOp = System.nanoTime();
long mouseControllerDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
hintManager.update(delta);
timeAfterOp = System.nanoTime();
long hintManagerDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
keyboardManager.update(delta);
timeAfterOp = System.nanoTime();
long keyboardManagerDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
indicatorManager.update(delta);
timeAfterOp = System.nanoTime();
long indicatorManagerDuration = (long) ((timeAfterOp - timeBeforeOp) / 1e6);
platform.windowsMessagePump();
timeBeforeOp = timeAfterOp;
remapper.update(delta);
timeAfterOp = System.nanoTime();
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/mousemaster/Platform.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ public interface Platform {

void update(double delta);

void windowsMessagePump();

void sleep() throws InterruptedException;

void reset(MouseController mouseController, KeyboardManager keyboardManager,
Expand Down
31 changes: 20 additions & 11 deletions src/main/java/mousemaster/WindowsPlatform.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,6 @@ public WindowsPlatform(boolean keyRegurgitationEnabled) {

@Override
public void update(double delta) {
while (User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1)) {
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
}
WindowsKeyboard.update(delta);
sanityCheckCurrentlyPressedKeys(delta);
enforceWindowsTopmostTimer -= delta;
Expand All @@ -73,21 +69,34 @@ public void update(double delta) {
}
}

@Override
public void windowsMessagePump() {
while (User32.INSTANCE.PeekMessage(msg, null, 0, 0, 1)) {
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
}
}

@Override
public void sleep() throws InterruptedException {
// At most one sleep of 10ms.
boolean first = true;
windowsMessagePump();
while (true) {
WinDef.POINT mousePosition =
first ? mousePositionQueue.poll(10, TimeUnit.MILLISECONDS) :
mousePositionQueue.poll();
WinDef.POINT mousePosition = mousePositionQueue.poll();
if (mousePosition == null)
return;
first = false;
break;
WindowsOverlay.mouseMoved(mousePosition);
mousePositionListeners.forEach(
listener -> listener.mouseMoved(mousePosition.x, mousePosition.y));
}
windowsMessagePump();
long beforeTime = System.nanoTime();
while (true) {
long currentTime = System.nanoTime();
if ((currentTime - beforeTime) / 1e6 >= 10)
break;
Thread.sleep(1);
windowsMessagePump();
}
}

@Override
Expand Down

0 comments on commit dc6b8c5

Please sign in to comment.