Compare commits
7 Commits
1.1.1291
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
|
b51d57b642 | ||
|
54c16f4052 | ||
|
65c035cdf8 | ||
|
56c5dbe557 | ||
|
5976a5161b | ||
|
3d4dea624d | ||
|
89a274c6a6 |
18
.github/workflows/build.yml
vendored
18
.github/workflows/build.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
- { name: win-x64, os: windows-latest, zip_os_name: win_x64 }
|
- { name: win-x64, os: windows-latest, zip_os_name: win_x64 }
|
||||||
- { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 }
|
- { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 }
|
||||||
- { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 }
|
- { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 }
|
||||||
- { name: osx-x64, os: macOS-latest, zip_os_name: osx_x64 }
|
- { name: osx-x64, os: macos-13, zip_os_name: osx_x64 }
|
||||||
|
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
@@ -41,12 +41,12 @@ jobs:
|
|||||||
- name: Change config filename
|
- name: Change config filename
|
||||||
run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
run: sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
shell: bash
|
shell: bash
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Change config filename for macOS
|
- name: Change config filename for macOS
|
||||||
run: sed -r -i '' 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
run: sed -r -i '' 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/PRConfig\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
|
||||||
shell: bash
|
shell: bash
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os == 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os == 'macos-13'
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dotnet build -c "${{ matrix.configuration }}" -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER
|
run: dotnet build -c "${{ matrix.configuration }}" -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER
|
||||||
@@ -61,15 +61,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Publish Ryujinx
|
- name: Publish Ryujinx
|
||||||
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained true
|
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained true
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Publish Ryujinx.Headless.SDL2
|
- name: Publish Ryujinx.Headless.SDL2
|
||||||
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained true
|
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained true
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Publish Ryujinx.Gtk3
|
- name: Publish Ryujinx.Gtk3
|
||||||
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_gtk -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Gtk3 --self-contained true
|
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_gtk -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Gtk3 --self-contained true
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Set executable bit
|
- name: Set executable bit
|
||||||
run: |
|
run: |
|
||||||
@@ -83,21 +83,21 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
||||||
path: publish
|
path: publish
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Upload Ryujinx.Headless.SDL2 artifact
|
- name: Upload Ryujinx.Headless.SDL2 artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: sdl2-ryujinx-headless-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
name: sdl2-ryujinx-headless-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
||||||
path: publish_sdl2_headless
|
path: publish_sdl2_headless
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
- name: Upload Ryujinx.Gtk3 artifact
|
- name: Upload Ryujinx.Gtk3 artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: gtk-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
name: gtk-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
|
||||||
path: publish_gtk
|
path: publish_gtk
|
||||||
if: github.event_name == 'pull_request' && matrix.platform.os != 'macOS-latest'
|
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
|
||||||
|
|
||||||
build_macos:
|
build_macos:
|
||||||
name: macOS Universal (${{ matrix.configuration }})
|
name: macOS Universal (${{ matrix.configuration }})
|
||||||
|
6
.github/workflows/nightly_pr_comment.yml
vendored
6
.github/workflows/nightly_pr_comment.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
|
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/github-script@v6
|
- uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const {owner, repo} = context.repo;
|
const {owner, repo} = context.repo;
|
||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
const pull_head_sha = '${{github.event.workflow_run.head_sha}}';
|
const pull_head_sha = '${{github.event.workflow_run.head_sha}}';
|
||||||
|
|
||||||
const issue_number = await (async () => {
|
const issue_number = await (async () => {
|
||||||
const pulls = await github.rest.pulls.list({owner, repo});
|
const pulls = await github.rest.pulls.list.endpoint.merge({owner, repo});
|
||||||
for await (const {data} of github.paginate.iterator(pulls)) {
|
for await (const {data} of github.paginate.iterator(pulls)) {
|
||||||
for (const pull of data) {
|
for (const pull of data) {
|
||||||
if (pull.head.sha === pull_head_sha) {
|
if (pull.head.sha === pull_head_sha) {
|
||||||
@@ -68,4 +68,4 @@ jobs:
|
|||||||
} else {
|
} else {
|
||||||
core.info(`Creating a comment`);
|
core.info(`Creating a comment`);
|
||||||
await github.rest.issues.createComment({repo, owner, issue_number, body});
|
await github.rest.issues.createComment({repo, owner, issue_number, body});
|
||||||
}
|
}
|
||||||
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Create tag
|
- name: Create tag
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
github.rest.git.createRef({
|
github.rest.git.createRef({
|
||||||
|
@@ -23,8 +23,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
|||||||
newState.Buttons = (MouseButton)buttons;
|
newState.Buttons = (MouseButton)buttons;
|
||||||
newState.X = mouseX;
|
newState.X = mouseX;
|
||||||
newState.Y = mouseY;
|
newState.Y = mouseY;
|
||||||
newState.DeltaX = mouseX - previousEntry.DeltaX;
|
newState.DeltaX = mouseX - previousEntry.X;
|
||||||
newState.DeltaY = mouseY - previousEntry.DeltaY;
|
newState.DeltaY = mouseY - previousEntry.Y;
|
||||||
newState.WheelDeltaX = scrollX;
|
newState.WheelDeltaX = scrollX;
|
||||||
newState.WheelDeltaY = scrollY;
|
newState.WheelDeltaY = scrollY;
|
||||||
newState.Attributes = connected ? MouseAttribute.IsConnected : MouseAttribute.None;
|
newState.Attributes = connected ? MouseAttribute.IsConnected : MouseAttribute.None;
|
||||||
|
@@ -487,38 +487,35 @@ namespace Ryujinx.Input.HLE
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeyboardInput? GetHLEKeyboardInput()
|
public static KeyboardInput GetHLEKeyboardInput(IGamepadDriver KeyboardDriver)
|
||||||
{
|
{
|
||||||
if (_gamepad is IKeyboard keyboard)
|
var keyboard = KeyboardDriver.GetGamepad("0") as IKeyboard;
|
||||||
|
|
||||||
|
KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot();
|
||||||
|
|
||||||
|
KeyboardInput hidKeyboard = new()
|
||||||
{
|
{
|
||||||
KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot();
|
Modifier = 0,
|
||||||
|
Keys = new ulong[0x4],
|
||||||
|
};
|
||||||
|
|
||||||
KeyboardInput hidKeyboard = new()
|
foreach (HLEKeyboardMappingEntry entry in _keyMapping)
|
||||||
{
|
{
|
||||||
Modifier = 0,
|
ulong value = keyboardState.IsPressed(entry.TargetKey) ? 1UL : 0UL;
|
||||||
Keys = new ulong[0x4],
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (HLEKeyboardMappingEntry entry in _keyMapping)
|
hidKeyboard.Keys[entry.Target / 0x40] |= (value << (entry.Target % 0x40));
|
||||||
{
|
|
||||||
ulong value = keyboardState.IsPressed(entry.TargetKey) ? 1UL : 0UL;
|
|
||||||
|
|
||||||
hidKeyboard.Keys[entry.Target / 0x40] |= (value << (entry.Target % 0x40));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (HLEKeyboardMappingEntry entry in _keyModifierMapping)
|
|
||||||
{
|
|
||||||
int value = keyboardState.IsPressed(entry.TargetKey) ? 1 : 0;
|
|
||||||
|
|
||||||
hidKeyboard.Modifier |= value << entry.Target;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hidKeyboard;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
foreach (HLEKeyboardMappingEntry entry in _keyModifierMapping)
|
||||||
}
|
{
|
||||||
|
int value = keyboardState.IsPressed(entry.TargetKey) ? 1 : 0;
|
||||||
|
|
||||||
|
hidKeyboard.Modifier |= value << entry.Target;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hidKeyboard;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual void Dispose(bool disposing)
|
protected virtual void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
|
@@ -231,11 +231,6 @@ namespace Ryujinx.Input.HLE
|
|||||||
var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default;
|
var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default;
|
||||||
|
|
||||||
motionState = (controller.GetHLEMotionState(), altMotionState);
|
motionState = (controller.GetHLEMotionState(), altMotionState);
|
||||||
|
|
||||||
if (_enableKeyboard)
|
|
||||||
{
|
|
||||||
hleKeyboardInput = controller.GetHLEKeyboardInput();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -257,6 +252,11 @@ namespace Ryujinx.Input.HLE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_blockInputUpdates && _enableKeyboard)
|
||||||
|
{
|
||||||
|
hleKeyboardInput = NpadController.GetHLEKeyboardInput(_keyboardDriver);
|
||||||
|
}
|
||||||
|
|
||||||
_device.Hid.Npads.Update(hleInputStates);
|
_device.Hid.Npads.Update(hleInputStates);
|
||||||
_device.Hid.Npads.UpdateSixAxis(hleMotionStates);
|
_device.Hid.Npads.UpdateSixAxis(hleMotionStates);
|
||||||
|
|
||||||
|
@@ -94,6 +94,17 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
private long _lastCursorMoveTime;
|
private long _lastCursorMoveTime;
|
||||||
private bool _isCursorInRenderer = true;
|
private bool _isCursorInRenderer = true;
|
||||||
|
private bool _ignoreCursorState = false;
|
||||||
|
|
||||||
|
private enum CursorStates
|
||||||
|
{
|
||||||
|
CursorIsHidden,
|
||||||
|
CursorIsVisible,
|
||||||
|
ForceChangeCursor
|
||||||
|
};
|
||||||
|
|
||||||
|
private CursorStates _cursorState = !ConfigurationState.Instance.Hid.EnableMouse.Value ?
|
||||||
|
CursorStates.CursorIsVisible : CursorStates.CursorIsHidden;
|
||||||
|
|
||||||
private bool _isStopped;
|
private bool _isStopped;
|
||||||
private bool _isActive;
|
private bool _isActive;
|
||||||
@@ -201,23 +212,65 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
private void TopLevel_PointerEnteredOrMoved(object sender, PointerEventArgs e)
|
private void TopLevel_PointerEnteredOrMoved(object sender, PointerEventArgs e)
|
||||||
{
|
{
|
||||||
|
if (!_viewModel.IsActive)
|
||||||
|
{
|
||||||
|
_isCursorInRenderer = false;
|
||||||
|
_ignoreCursorState = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sender is MainWindow window)
|
if (sender is MainWindow window)
|
||||||
{
|
{
|
||||||
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
if (ConfigurationState.Instance.HideCursor.Value == HideCursorMode.OnIdle)
|
||||||
|
{
|
||||||
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
var point = e.GetCurrentPoint(window).Position;
|
var point = e.GetCurrentPoint(window).Position;
|
||||||
var bounds = RendererHost.EmbeddedWindow.Bounds;
|
var bounds = RendererHost.EmbeddedWindow.Bounds;
|
||||||
|
var windowYOffset = bounds.Y + window.MenuBarHeight;
|
||||||
|
var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1;
|
||||||
|
|
||||||
|
if (!_viewModel.ShowMenuAndStatusBar)
|
||||||
|
{
|
||||||
|
windowYOffset -= window.MenuBarHeight;
|
||||||
|
windowYLimit += window.StatusBarHeight + 1;
|
||||||
|
}
|
||||||
|
|
||||||
_isCursorInRenderer = point.X >= bounds.X &&
|
_isCursorInRenderer = point.X >= bounds.X &&
|
||||||
point.X <= bounds.Width + bounds.X &&
|
Math.Ceiling(point.X) <= (int)window.Bounds.Width &&
|
||||||
point.Y >= bounds.Y &&
|
point.Y >= windowYOffset &&
|
||||||
point.Y <= bounds.Height + bounds.Y;
|
point.Y <= windowYLimit &&
|
||||||
|
!_viewModel.IsSubMenuOpen;
|
||||||
|
|
||||||
|
_ignoreCursorState = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TopLevel_PointerExited(object sender, PointerEventArgs e)
|
private void TopLevel_PointerExited(object sender, PointerEventArgs e)
|
||||||
{
|
{
|
||||||
_isCursorInRenderer = false;
|
_isCursorInRenderer = false;
|
||||||
|
|
||||||
|
if (sender is MainWindow window)
|
||||||
|
{
|
||||||
|
var point = e.GetCurrentPoint(window).Position;
|
||||||
|
var bounds = RendererHost.EmbeddedWindow.Bounds;
|
||||||
|
var windowYOffset = bounds.Y + window.MenuBarHeight;
|
||||||
|
var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1;
|
||||||
|
|
||||||
|
if (!_viewModel.ShowMenuAndStatusBar)
|
||||||
|
{
|
||||||
|
windowYOffset -= window.MenuBarHeight;
|
||||||
|
windowYLimit += window.StatusBarHeight + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ignoreCursorState = (point.X == bounds.X ||
|
||||||
|
Math.Ceiling(point.X) == (int)window.Bounds.Width) &&
|
||||||
|
point.Y >= windowYOffset &&
|
||||||
|
point.Y <= windowYLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cursorState = CursorStates.ForceChangeCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs<int> e)
|
private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs<int> e)
|
||||||
@@ -245,9 +298,14 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
if (OperatingSystem.IsWindows())
|
if (OperatingSystem.IsWindows())
|
||||||
{
|
{
|
||||||
SetCursor(_defaultCursorWin);
|
if (_cursorState != CursorStates.CursorIsHidden && !_ignoreCursorState)
|
||||||
|
{
|
||||||
|
SetCursor(_defaultCursorWin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_cursorState = CursorStates.CursorIsVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HideCursor()
|
private void HideCursor()
|
||||||
@@ -261,6 +319,8 @@ namespace Ryujinx.Ava
|
|||||||
SetCursor(_invisibleCursorWin);
|
SetCursor(_invisibleCursorWin);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_cursorState = CursorStates.CursorIsHidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetRendererWindowSize(Size size)
|
private void SetRendererWindowSize(Size size)
|
||||||
@@ -523,6 +583,8 @@ namespace Ryujinx.Ava
|
|||||||
{
|
{
|
||||||
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cursorState = CursorStates.ForceChangeCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> LoadGuestApplication()
|
public async Task<bool> LoadGuestApplication()
|
||||||
@@ -1037,38 +1099,32 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
if (_viewModel.IsActive)
|
if (_viewModel.IsActive)
|
||||||
{
|
{
|
||||||
if (_isCursorInRenderer)
|
bool isCursorVisible = true;
|
||||||
|
|
||||||
|
if (_isCursorInRenderer && !_viewModel.ShowLoadProgress)
|
||||||
{
|
{
|
||||||
if (ConfigurationState.Instance.Hid.EnableMouse)
|
if (ConfigurationState.Instance.Hid.EnableMouse.Value)
|
||||||
{
|
{
|
||||||
HideCursor();
|
isCursorVisible = ConfigurationState.Instance.HideCursor.Value == HideCursorMode.Never;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (ConfigurationState.Instance.HideCursor.Value)
|
isCursorVisible = ConfigurationState.Instance.HideCursor.Value == HideCursorMode.Never ||
|
||||||
{
|
(ConfigurationState.Instance.HideCursor.Value == HideCursorMode.OnIdle &&
|
||||||
case HideCursorMode.Never:
|
Stopwatch.GetTimestamp() - _lastCursorMoveTime < CursorHideIdleTime * Stopwatch.Frequency);
|
||||||
ShowCursor();
|
|
||||||
break;
|
|
||||||
case HideCursorMode.OnIdle:
|
|
||||||
if (Stopwatch.GetTimestamp() - _lastCursorMoveTime >= CursorHideIdleTime * Stopwatch.Frequency)
|
|
||||||
{
|
|
||||||
HideCursor();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ShowCursor();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case HideCursorMode.Always:
|
|
||||||
HideCursor();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (_cursorState != (isCursorVisible ? CursorStates.CursorIsVisible : CursorStates.CursorIsHidden))
|
||||||
{
|
{
|
||||||
ShowCursor();
|
if (isCursorVisible)
|
||||||
|
{
|
||||||
|
ShowCursor();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HideCursor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dispatcher.UIThread.Post(() =>
|
Dispatcher.UIThread.Post(() =>
|
||||||
@@ -1154,7 +1210,7 @@ namespace Ryujinx.Ava
|
|||||||
// Touchscreen.
|
// Touchscreen.
|
||||||
bool hasTouch = false;
|
bool hasTouch = false;
|
||||||
|
|
||||||
if (_viewModel.IsActive && !ConfigurationState.Instance.Hid.EnableMouse)
|
if (_viewModel.IsActive && !ConfigurationState.Instance.Hid.EnableMouse.Value)
|
||||||
{
|
{
|
||||||
hasTouch = TouchScreenManager.Update(true, (_inputManager.MouseDriver as AvaloniaMouseDriver).IsButtonPressed(MouseButton.Button1), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
|
hasTouch = TouchScreenManager.Update(true, (_inputManager.MouseDriver as AvaloniaMouseDriver).IsButtonPressed(MouseButton.Button1), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
|
||||||
}
|
}
|
||||||
|
@@ -19,8 +19,8 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
{ Key.ShiftRight, LocaleKeys.KeyShiftRight },
|
{ Key.ShiftRight, LocaleKeys.KeyShiftRight },
|
||||||
{ Key.ControlLeft, LocaleKeys.KeyControlLeft },
|
{ Key.ControlLeft, LocaleKeys.KeyControlLeft },
|
||||||
{ Key.ControlRight, LocaleKeys.KeyControlRight },
|
{ Key.ControlRight, LocaleKeys.KeyControlRight },
|
||||||
{ Key.AltLeft, LocaleKeys.KeyControlLeft },
|
{ Key.AltLeft, LocaleKeys.KeyAltLeft },
|
||||||
{ Key.AltRight, LocaleKeys.KeyControlRight },
|
{ Key.AltRight, LocaleKeys.KeyAltRight },
|
||||||
{ Key.WinLeft, LocaleKeys.KeyWinLeft },
|
{ Key.WinLeft, LocaleKeys.KeyWinLeft },
|
||||||
{ Key.WinRight, LocaleKeys.KeyWinRight },
|
{ Key.WinRight, LocaleKeys.KeyWinRight },
|
||||||
{ Key.Up, LocaleKeys.KeyUp },
|
{ Key.Up, LocaleKeys.KeyUp },
|
||||||
|
@@ -111,8 +111,5 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
|
|
||||||
[LibraryImport("user32.dll", SetLastError = true)]
|
[LibraryImport("user32.dll", SetLastError = true)]
|
||||||
public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value);
|
public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value);
|
||||||
|
|
||||||
[LibraryImport("user32.dll", SetLastError = true)]
|
|
||||||
public static partial IntPtr SetWindowLongW(IntPtr hWnd, int nIndex, int value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -157,7 +157,7 @@ namespace Ryujinx.Ava.UI.Renderer
|
|||||||
lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate),
|
lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate),
|
||||||
style = ClassStyles.CsOwndc,
|
style = ClassStyles.CsOwndc,
|
||||||
lpszClassName = Marshal.StringToHGlobalUni(_className),
|
lpszClassName = Marshal.StringToHGlobalUni(_className),
|
||||||
hCursor = CreateArrowCursor(),
|
hCursor = CreateArrowCursor()
|
||||||
};
|
};
|
||||||
|
|
||||||
RegisterClassEx(ref wndClassEx);
|
RegisterClassEx(ref wndClassEx);
|
||||||
|
@@ -104,6 +104,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
private double _windowHeight;
|
private double _windowHeight;
|
||||||
|
|
||||||
private bool _isActive;
|
private bool _isActive;
|
||||||
|
private bool _isSubMenuOpen;
|
||||||
|
|
||||||
public ApplicationData ListSelectedApplication;
|
public ApplicationData ListSelectedApplication;
|
||||||
public ApplicationData GridSelectedApplication;
|
public ApplicationData GridSelectedApplication;
|
||||||
@@ -317,6 +318,17 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsSubMenuOpen
|
||||||
|
{
|
||||||
|
get => _isSubMenuOpen;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isSubMenuOpen = value;
|
||||||
|
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool ShowAll
|
public bool ShowAll
|
||||||
{
|
{
|
||||||
get => _showAll;
|
get => _showAll;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@@ -16,7 +16,8 @@
|
|||||||
Name="Menu"
|
Name="Menu"
|
||||||
Height="35"
|
Height="35"
|
||||||
Margin="0"
|
Margin="0"
|
||||||
HorizontalAlignment="Left">
|
HorizontalAlignment="Left"
|
||||||
|
IsOpen="{Binding IsSubMenuOpen, Mode=OneWayToSource}">
|
||||||
<Menu.ItemsPanel>
|
<Menu.ItemsPanel>
|
||||||
<ItemsPanelTemplate>
|
<ItemsPanelTemplate>
|
||||||
<DockPanel Margin="0" HorizontalAlignment="Stretch" />
|
<DockPanel Margin="0" HorizontalAlignment="Stretch" />
|
||||||
|
@@ -56,6 +56,9 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
public static bool ShowKeyErrorOnLoad { get; set; }
|
public static bool ShowKeyErrorOnLoad { get; set; }
|
||||||
public ApplicationLibrary ApplicationLibrary { get; set; }
|
public ApplicationLibrary ApplicationLibrary { get; set; }
|
||||||
|
|
||||||
|
public readonly double StatusBarHeight;
|
||||||
|
public readonly double MenuBarHeight;
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
ViewModel = new MainWindowViewModel();
|
ViewModel = new MainWindowViewModel();
|
||||||
@@ -74,7 +77,9 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
ViewModel.Title = $"Ryujinx {Program.Version}";
|
ViewModel.Title = $"Ryujinx {Program.Version}";
|
||||||
|
|
||||||
// NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
|
// NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
|
||||||
double barHeight = MenuBar.MinHeight + StatusBarView.StatusBar.MinHeight;
|
StatusBarHeight = StatusBarView.StatusBar.MinHeight;
|
||||||
|
MenuBarHeight = MenuBar.MinHeight;
|
||||||
|
double barHeight = MenuBarHeight + StatusBarHeight;
|
||||||
Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight;
|
Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight;
|
||||||
Width /= Program.WindowScaleFactor;
|
Width /= Program.WindowScaleFactor;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user