mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-09 20:29:10 +02:00
Disable blitting on window position changes
This slightly reduces flickering because redraws are now a bit faster.
This commit is contained in:
@@ -36,6 +36,9 @@ TODO: Add an updates screenshot with some fancy VST3-only plugins to the readme
|
|||||||
- `libyabridge.so` is now called `libyabridge-vst2.so`. If you're using
|
- `libyabridge.so` is now called `libyabridge-vst2.so`. If you're using
|
||||||
yabridgectl then nothing changes here. **To avoid any confusion in the future,
|
yabridgectl then nothing changes here. **To avoid any confusion in the future,
|
||||||
please remove the old `libyabridge.so` file before upgrading.**
|
please remove the old `libyabridge.so` file before upgrading.**
|
||||||
|
- Slightly increased resposniveness when resizing plugin GUIs by preventing
|
||||||
|
unnecessary blitting. This also reduces flickering with plugins that don't do
|
||||||
|
double buffering.
|
||||||
- VST2 editor idle events are now handled slightly differently. This should
|
- VST2 editor idle events are now handled slightly differently. This should
|
||||||
result in even more responsive GUIs and I have not come across any plugins
|
result in even more responsive GUIs and I have not come across any plugins
|
||||||
where this caused issues, but please let me know if it does break anything for
|
where this caused issues, but please let me know if it does break anything for
|
||||||
|
|||||||
@@ -97,8 +97,8 @@ WindowClass::~WindowClass() {
|
|||||||
Editor::Editor(const Configuration& config,
|
Editor::Editor(const Configuration& config,
|
||||||
const std::string& window_class_name,
|
const std::string& window_class_name,
|
||||||
const size_t parent_window_handle)
|
const size_t parent_window_handle)
|
||||||
: x11_connection(xcb_connect(nullptr, nullptr), xcb_disconnect),
|
: use_xembed(config.editor_xembed),
|
||||||
use_xembed(config.editor_xembed),
|
x11_connection(xcb_connect(nullptr, nullptr), xcb_disconnect),
|
||||||
client_area(get_maximum_screen_dimensions(*x11_connection)),
|
client_area(get_maximum_screen_dimensions(*x11_connection)),
|
||||||
window_class(window_class_name),
|
window_class(window_class_name),
|
||||||
// Create a window without any decoratiosn for easy embedding. The
|
// Create a window without any decoratiosn for easy embedding. The
|
||||||
@@ -540,6 +540,19 @@ LRESULT CALLBACK window_proc(HWND handle,
|
|||||||
SetWindowLongPtr(handle, GWLP_USERDATA,
|
SetWindowLongPtr(handle, GWLP_USERDATA,
|
||||||
reinterpret_cast<size_t>(editor));
|
reinterpret_cast<size_t>(editor));
|
||||||
} break;
|
} break;
|
||||||
|
// Setting `SWP_NOCOPYBITS` somewhat reduces flickering on
|
||||||
|
// `fix_local_coordinates()` calls with plugins that don't do double
|
||||||
|
// buffering since it speeds up the redrawing process.
|
||||||
|
case WM_WINDOWPOSCHANGING: {
|
||||||
|
auto editor = reinterpret_cast<Editor*>(
|
||||||
|
GetWindowLongPtr(handle, GWLP_USERDATA));
|
||||||
|
if (!editor || editor->use_xembed) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
WINDOWPOS* info = reinterpret_cast<WINDOWPOS*>(lParam);
|
||||||
|
info->flags |= SWP_NOCOPYBITS | SWP_DEFERERASE;
|
||||||
|
} break;
|
||||||
// In case the WM does not support the EWMH active window property,
|
// In case the WM does not support the EWMH active window property,
|
||||||
// we'll fall back to grabbing focus when the user clicks on the window
|
// we'll fall back to grabbing focus when the user clicks on the window
|
||||||
// by listening to the generated `WM_PARENTNOTIFY` messages. Otherwise
|
// by listening to the generated `WM_PARENTNOTIFY` messages. Otherwise
|
||||||
|
|||||||
@@ -151,6 +151,12 @@ class Editor {
|
|||||||
*/
|
*/
|
||||||
void set_input_focus(bool grab) const;
|
void set_input_focus(bool grab) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use XEmbed instead of yabridge's normal window embedded. Wine
|
||||||
|
* with XEmbed tends to cause rendering issues, so it's disabled by default.
|
||||||
|
*/
|
||||||
|
const bool use_xembed;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Returns `true` if the currently active window (as per
|
* Returns `true` if the currently active window (as per
|
||||||
@@ -185,12 +191,6 @@ class Editor {
|
|||||||
*/
|
*/
|
||||||
std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> x11_connection;
|
std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> x11_connection;
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether to use XEmbed instead of yabridge's normal window embedded. Wine
|
|
||||||
* with XEmbed tends to cause rendering issues, so it's disabled by default.
|
|
||||||
*/
|
|
||||||
const bool use_xembed;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Wine window's client area, or the maximum size of that window. This
|
* The Wine window's client area, or the maximum size of that window. This
|
||||||
* will be set to a size that's large enough to be able to enter full screen
|
* will be set to a size that's large enough to be able to enter full screen
|
||||||
|
|||||||
Reference in New Issue
Block a user