RustAudio / baseview

low-level window system interface for audio plugin UIs
Apache License 2.0
267 stars 57 forks source link

[Windows] VST using imgui-rs and baseview changes Ableton scaling and doesn't get the right window when Windows scaling isn't set to 100% #107

Open Fredemus opened 2 years ago

Fredemus commented 2 years ago

Hello, I've talked about this issue on the discord before but I thought I'd raise a proper issue with my findings. For some reason, when the Windows scaling isn't 100% (under setttings -> display -> make everything bigger), my baseview/imgui-rs VST changes the scaling in Ableton and is served a too small window.

In FL Studio, the window is also too small but at least the scaling doesn't change. Fl Studio doesn't seem to ever scale up VSTs.

A VST that causes the issue can be found here: https://github.com/Fredemus/svf_filter

Before adding the vst, windows scaling set to 125% before adding baseview vst After adding the vst, windows scaling set to 125%. Note that Serum and the channels in Ableton got smaller. after adding baseview vst

Interestingly, after adding the VST, then changing scaling to 100%, then back to 125% seems to solve the issue.

Edit: Forgot to mention, this problem didn't exist before this commit: https://github.com/RustAudio/baseview/commit/ae2f28c5fdbe2e6ed9069ccc238f1c88ac42af71

y-fujii commented 10 months ago

This problem also occurs on Cubase 10.5 / Windows 11. It was confirmed with nih-plug/gain_gui_egui, which uses baseview.

prokopyl commented 5 months ago

While working on #174 I found this very suspicious piece of code:

https://github.com/RustAudio/baseview/blob/998ced845c83002712cb414f97bdb05566b1ff13/src/win/window.rs#L707-L709

This is called on baseview window creation, but it changes the DPI awareness for the entire process, which might explain why other windows like Ableton and Serum's are affected.

glowcoil commented 5 months ago

I doubt that's the issue, since in the parented case that call is most likely just failing (source):

You must call this API before you call any APIs that depend on the DPI awareness (including before creating any UI in your process). Once API awareness is set for an app, any future calls to this API will fail. This is true regardless of whether you set the DPI awareness in the manifest or by using this API.

Though we definitely shouldn't be calling it in the parented case anyway.