Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new BrowserWindow時に背景色を設定し、不具合#1425 を修正 #1446

Merged
merged 2 commits into from
Aug 3, 2023

Conversation

thiramisu
Copy link
Contributor

@thiramisu thiramisu commented Aug 1, 2023

内容

起動直後に一瞬真っ白な画面が表示される不具合(#1425)の修正PRです。

原因

mainWindowState.manage(win);内部処理によって自動的にshow状態になるのが原因でした。
(このため、前回最大化状態でウィンドウを閉じた場合にのみ起こる不具合でした)

解決策

new BrowserWindowのオプションに背景色(backgroundColor)を設定しました。

試したがダメそうだったもの

  • mainWindowState.manage(win);の直後にwin.hide();をしてもウィンドウが一瞬表示されました。
    • また、背景色を設定してかつこれを行うと、不具合がなぜか再発しました。
  • onready-to-show以降に最大化すると、変化前のサイズのウィンドウが一瞬表示されました。
  • 初期ウィンドウを小さいサイズで開き、最大化してから裏でウィンドウサイズの変更する、という方法を試みましたが、最大化中はサイズ変更を受け付けないようでした。
  • opacityでの制御はLinuxだと不可、かつ標準のウィンドウアニメーションが効きませんでした。

もっと厳密にするならopacityを併用してOSごとに処理を分けるべきだと思いますが、そもそも最大化状態でしか発生せず、また読み込み中のUIが見えてもそこまで酷い見た目にはならないので、このシンプルな実装が妥当かなと思いました。

関連 Issue

close #1425

スクリーンショット・動画など[

VVissue4.mp4

表示後にフォントが読み込まれているのと一瞬disableでないボタンが表示されるのが若干気になりますが、背景修正前も全画面で起動したときは表示されてたはずですし、真っ白な画面が表示されるよりはマシということで…

@thiramisu thiramisu requested a review from a team as a code owner August 1, 2023 08:48
@thiramisu thiramisu requested review from Hiroshiba and removed request for a team August 1, 2023 08:48
@y-chan
Copy link
Member

y-chan commented Aug 1, 2023

まあ現実的な解決策で良いのかなと思います!
おおよそLGTMなのですが、themesにあるjsonからいい感じにbackground colorを持ってくることってできそうでしょうか...?
多分、以下の処理がbackground.ts内にあると思うので、この仕組みをいい感じに活用しつつ、今の方針を適用すると汎用性も上がっていい感じかなと思いました...!

voicevox/src/background.ts

Lines 898 to 911 in 01729f4

ipcMainHandle("THEME", (_, { newData }) => {
if (newData !== undefined) {
store.set("currentTheme", newData);
return;
}
const dir = path.join(__static, "themes");
const themes: ThemeConf[] = [];
const files = fs.readdirSync(dir);
files.forEach((file) => {
const theme = JSON.parse(fs.readFileSync(path.join(dir, file)).toString());
themes.push(theme);
});
return { currentTheme: store.get("currentTheme"), availableThemes: themes };
});

お願いできそうでしょうか...?:eyes: (難しそうであると判断されれば、その旨お伝えいただければapproveしたいと思います)

@thiramisu
Copy link
Contributor Author

thiramisu commented Aug 2, 2023

image
以前は正確には上の画像の、起動直後に一番占める面積が広いであろう色を指定してました。
ただ、この色というのがテーマ設定でいうところのbackgroundにsurfaceが透過度15%で重なっている色で、わざわざ計算する必要があって少し大げさかなと思ったので、シンプルに以下の色と同じbackgroundの色にしました。
image
あとは、HYDRATE_SETTING_STOREでもファイルを読み込むことになるのを回避するために、起動時に読み込んだテーマ,jsonをキャッシュするようにしたのですが、ブラウザ版と細かい挙動が異なってしまっているので、とりあえずNOTE: を追加しました。

Copy link
Member

@y-chan y-chan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTMです!
これでいいと思います!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

マルチエンジンでエンジンを追加して再読み込みする時に一瞬また背景画像が映るのですが、多分テーマを変えた後にそれを行うと前のテーマの背景色が一瞬表示されるんだろうなと思いました。
まあ、コーナーケースなのでスルーで・・・!!

@Hiroshiba Hiroshiba merged commit cdff4fb into VOICEVOX:main Aug 3, 2023
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ダークテーマだった場合も起動直後に真っ白な画面が表示されるのを直す
3 participants