Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,13 @@ fun ControllerTabContent(state: ContainerConfigState, default: Boolean) {
SettingsSwitch(
colors = settingsTileColorsAlt(),
title = { Text(text = stringResource(R.string.disable_mouse_input)) },
subtitle = { Text(text = stringResource(R.string.disable_mouse_input_description)) },
state = config.disableMouseInput,
onCheckedChange = { state.config.value = config.copy(disableMouseInput = it) },
)
SettingsSwitch(
colors = settingsTileColorsAlt(),
enabled = !config.disableMouseInput,
title = { Text(text = stringResource(R.string.touchscreen_mode)) },
subtitle = { Text(text = stringResource(R.string.touchscreen_mode_description)) },
state = config.touchscreenMode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,10 @@ class PhysicalControllerHandler(
val cursorSpeed = profile?.cursorSpeed ?: 1f
val deltaX = (mouseMoveOffset.x * 10 * cursorSpeed).toInt()
val deltaY = (mouseMoveOffset.y * 10 * cursorSpeed).toInt()
xServer?.injectPointerMoveDelta(deltaX, deltaY)
xServer?.let {
if (!it.renderer.isCursorVisible) it.renderer.setCursorVisible(true)
it.injectPointerMoveDelta(deltaX, deltaY)
}
}
}, 0, 1000 / 60)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,7 @@ fun XServerScreen(
}
override fun onUpdateWindowContent(window: Window) {
if (!xServerState.value.winStarted && window.isApplicationWindow()) {
if (!container.isDisableMouseInput && !container.isTouchscreenMode) renderer?.setCursorVisible(true)
if (!container.isDisableMouseInput) renderer?.setCursorVisible(true)
xServerState.value.winStarted = true
}
if (window.id == frameRatingWindowId) {
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/winlator/inputcontrols/TouchMouse.java
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,10 @@ public boolean onExternalMouseEvent(MotionEvent event) {
boolean handled = false;
// if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
if (isMouseDevice(event.getDevice())) {
// show cursor on external mouse event
if (!xServer.getRenderer().isCursorVisible()) {
xServer.getRenderer().setCursorVisible(true);
}
int actionButton = event.getActionButton();
switch (event.getAction()) {
case MotionEvent.ACTION_BUTTON_PRESS:
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/winlator/widget/InputControlsView.java
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,8 @@ private void createMouseMoveTimer() {
mouseMoveTimer.schedule(new TimerTask() {
@Override
public void run() {
// show cursor when on-screen control simulates mouse
if (!xServer.getRenderer().isCursorVisible()) xServer.getRenderer().setCursorVisible(true);
xServer.injectPointerMoveDelta((int)(mouseMoveOffset.x * 10 * cursorSpeed), (int)(mouseMoveOffset.y * 10 * cursorSpeed));
}
}, 0, 1000 / 60);
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/winlator/widget/TouchpadView.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ public boolean onTouchEvent(MotionEvent event) {
&& !event.isFromSource(InputDevice.SOURCE_MOUSE)) {
return true; // consume without generating mouse events
}
// hide cursor on touch in touchscreen mode, it reappears on external mouse event
if (isTouchscreenMode && !event.isFromSource(InputDevice.SOURCE_MOUSE) && xServer.getRenderer().isCursorVisible()) {
xServer.getRenderer().setCursorVisible(false);
}
if (toolType == MotionEvent.TOOL_TYPE_STYLUS) {
return handleStylusEvent(event);
} else if (isTouchscreenMode) {
Expand Down Expand Up @@ -602,6 +606,11 @@ public void setMoveCursorToTouchpoint(boolean moveCursorToTouchpoint) {
}

public boolean onExternalMouseEvent(MotionEvent event) {
// show cursor on external mouse event
if (event.isFromSource(InputDevice.SOURCE_MOUSE)
&& !xServer.getRenderer().isCursorVisible()) {
xServer.getRenderer().setCursorVisible(true);
}
// one-shot: capture external mouse on first event, don't re-capture after user release
if (capturePointerOnExternalMouse && !pointerCaptureRequested) {
pointerCaptureRequested = true;
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,8 @@
<string name="enable_xinput_api">Enable XInput API</string>
<string name="enable_directinput_api">Enable DirectInput API</string>
<string name="directinput_mapper_type">DirectInput Mapper Type</string>
<string name="disable_mouse_input">Disable Mouse Input</string>
<string name="disable_mouse_input">Disable Touchscreen</string>
<string name="disable_mouse_input_description">Prevent touch from generating mouse events. External mouse and controller still work.</string>
<string name="touchscreen_mode">Touchscreen Mode</string>
<string name="touchscreen_mode_description">Direct touch-to-cursor movement (ON) vs touchpad-style relative movement (OFF)</string>
<string name="external_display_input">External Display Input</string>
Expand Down