From 05d5382d41ef4bacad6630bedcd75c29b2fda327 Mon Sep 17 00:00:00 2001
From: atouu <67765922+atouu@users.noreply.github.com>
Date: Fri, 27 Mar 2026 02:14:37 +0800
Subject: [PATCH 1/3] Pianoroll focus fixes
---
OpenUtau/Controls/LyricBox.axaml.cs | 1 -
OpenUtau/Controls/PianoRoll.axaml | 2 +-
OpenUtau/Controls/PianoRoll.axaml.cs | 4 ++++
OpenUtau/Views/MainWindow.axaml.cs | 1 +
4 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/OpenUtau/Controls/LyricBox.axaml.cs b/OpenUtau/Controls/LyricBox.axaml.cs
index 8c60844e2..b39ac6a0e 100644
--- a/OpenUtau/Controls/LyricBox.axaml.cs
+++ b/OpenUtau/Controls/LyricBox.axaml.cs
@@ -181,7 +181,6 @@ public void EndEdit(bool commit = false) {
viewModel.NoteOrPhoneme = null;
viewModel.IsVisible = false;
viewModel.Text = string.Empty;
- this.Focus();
}
}
}
diff --git a/OpenUtau/Controls/PianoRoll.axaml b/OpenUtau/Controls/PianoRoll.axaml
index a89b2bb0c..6cf9b812c 100644
--- a/OpenUtau/Controls/PianoRoll.axaml
+++ b/OpenUtau/Controls/PianoRoll.axaml
@@ -751,7 +751,7 @@
-
+
openPianoRollWindow = true;
} else {
viewModel.ShowPianoRoll = true;
+ pianoRoll.Focus();
}
int tick = viewModel.TracksViewModel.PointToTick(args.GetPosition(canvas));
DocManager.Inst.ExecuteCmd(new LoadPartNotification(partControl.part, DocManager.Inst.Project, tick));
From e919ff424394b36bf673cb5e08f2ccf6676d0fd1 Mon Sep 17 00:00:00 2001
From: atouu <67765922+atouu@users.noreply.github.com>
Date: Fri, 27 Mar 2026 14:55:01 +0800
Subject: [PATCH 2/3] Remove old pianoroll window focus workaround
---
OpenUtau/Views/MainWindow.axaml.cs | 38 +++++++++++-------------------
1 file changed, 14 insertions(+), 24 deletions(-)
diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs
index 60c6d3c26..dfd431c05 100644
--- a/OpenUtau/Views/MainWindow.axaml.cs
+++ b/OpenUtau/Views/MainWindow.axaml.cs
@@ -35,7 +35,6 @@ public partial class MainWindow : Window, ICmdSubscriber {
private PianoRollDetachedWindow? pianoRollWindow;
private PianoRoll? pianoRoll;
- private bool openPianoRollWindow;
private PartEditState? partEditState;
private readonly DispatcherTimer timer;
@@ -1174,26 +1173,19 @@ public void PartsCanvasPointerMoved(object sender, PointerEventArgs args) {
}
public void PartsCanvasPointerReleased(object sender, PointerReleasedEventArgs args) {
- if (partEditState != null) {
- if (partEditState.MouseButton != args.InitialPressMouseButton) {
- return;
- }
- var control = (Control)sender;
- var point = args.GetCurrentPoint(control);
- partEditState.Update(point.Pointer, point.Position);
- partEditState.End(point.Pointer, point.Position);
- partEditState = null;
- Cursor = null;
- }
- if (openPianoRollWindow) {
- pianoRollWindow?.Show();
- pianoRollWindow?.Activate();
- openPianoRollWindow = false;
+ if (partEditState?.MouseButton != args.InitialPressMouseButton) {
+ return;
}
+ var control = (Control)sender;
+ var point = args.GetCurrentPoint(control);
+ partEditState.Update(point.Pointer, point.Position);
+ partEditState.End(point.Pointer, point.Position);
+ partEditState = null;
+ Cursor = null;
}
public async void PartsCanvasDoubleTapped(object sender, TappedEventArgs args) {
- if (!(sender is Canvas canvas)) {
+ if (sender is not Canvas canvas) {
return;
}
var control = canvas.InputHitTest(args.GetPosition(canvas));
@@ -1209,11 +1201,9 @@ public async void PartsCanvasDoubleTapped(object sender, TappedEventArgs args) {
};
if (Preferences.Default.DetachPianoRoll) {
- viewModel!.ShowPianoRoll = false;
+ viewModel.ShowPianoRoll = false;
pianoRollWindow = new(pianoRoll);
- pianoRollWindow.Show();
} else {
- viewModel!.ShowPianoRoll = true;
PianoRollContainer.Content = pianoRoll;
}
@@ -1224,9 +1214,9 @@ await Task.Run(() =>
pianoRoll.ViewModel.PlaybackViewModel = viewModel.PlaybackViewModel;
}
- // Workaround for new window losing focus.
if (pianoRollWindow != null) {
- openPianoRollWindow = true;
+ pianoRollWindow.Show();
+ pianoRollWindow.Activate();
} else {
viewModel.ShowPianoRoll = true;
pianoRoll.Focus();
@@ -1245,11 +1235,11 @@ public void SetPianoRollAttachment() {
pianoRollWindow?.ForceClose();
pianoRollWindow = null;
PianoRollContainer.Content = pianoRoll;
- viewModel!.ShowPianoRoll = true;
+ viewModel.ShowPianoRoll = true;
Preferences.Default.DetachPianoRoll = false;
} else {
PianoRollContainer.Content = null;
- viewModel!.ShowPianoRoll = false;
+ viewModel.ShowPianoRoll = false;
if (pianoRollWindow == null) {
pianoRollWindow = new(pianoRoll);
pianoRollWindow.Show();
From ecf285ee6f387bcca29c7a68bffbe530453b748e Mon Sep 17 00:00:00 2001
From: atouu <67765922+atouu@users.noreply.github.com>
Date: Fri, 27 Mar 2026 15:41:22 +0800
Subject: [PATCH 3/3] Transfer focus to pianoroll in detached window
---
OpenUtau/Views/PianoRollDetachedWindow.axaml | 2 +-
OpenUtau/Views/PianoRollDetachedWindow.axaml.cs | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/OpenUtau/Views/PianoRollDetachedWindow.axaml b/OpenUtau/Views/PianoRollDetachedWindow.axaml
index e662874e9..0a793bddf 100644
--- a/OpenUtau/Views/PianoRollDetachedWindow.axaml
+++ b/OpenUtau/Views/PianoRollDetachedWindow.axaml
@@ -9,7 +9,7 @@
x:Class="OpenUtau.App.Views.PianoRollDetachedWindow"
Icon="/Assets/open-utau.ico"
Title="{Binding NotesViewModel.WindowTitle}" MinWidth="300" MinHeight="200" Width="{Binding Width}" Height="{Binding Height}"
- Focusable="True" TransparencyLevelHint="None"
+ Focusable="True" GotFocus="WindowGotFocus" TransparencyLevelHint="None"
Closing="WindowClosing" Deactivated="WindowDeactivated">
\ No newline at end of file
diff --git a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs
index 52addd00f..48d4e7d06 100644
--- a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs
+++ b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs
@@ -1,6 +1,7 @@
using System;
using Avalonia;
using Avalonia.Controls;
+using Avalonia.Input;
using OpenUtau.App.Controls;
using OpenUtau.Core.Util;
@@ -22,6 +23,10 @@ public PianoRollDetachedWindow(PianoRoll pianoRoll) {
WindowState = (WindowState)Preferences.Default.PianorollWindowSize.State;
}
+ public void WindowGotFocus(object sender, GotFocusEventArgs e) {
+ pianoRoll.Focus();
+ }
+
public void WindowClosing(object? sender, WindowClosingEventArgs e) {
Preferences.Default.PianorollWindowSize.Set(Width, Height, Position.X, Position.Y, (int)WindowState);
Preferences.Save();