diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-24 01:22:11 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-24 01:22:11 +0800 |
commit | a3a0fb3488d29dd4743e6d4c22da9f5ded070ebc (patch) | |
tree | bbb9e2f5d52e208d6af1c7513bc66d2db0bf7125 | |
parent | 26252b0f4a24e536074aa034a88868bf8ea07b76 (diff) | |
download | cru-a3a0fb3488d29dd4743e6d4c22da9f5ded070ebc.tar.gz cru-a3a0fb3488d29dd4743e6d4c22da9f5ded070ebc.tar.bz2 cru-a3a0fb3488d29dd4743e6d4c22da9f5ded070ebc.zip |
Flush xcb.
-rw-r--r-- | include/cru/platform/gui/xcb/UiApplication.h | 1 | ||||
-rw-r--r-- | src/platform/gui/xcb/UiApplication.cpp | 2 | ||||
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 11 |
3 files changed, 14 insertions, 0 deletions
diff --git a/include/cru/platform/gui/xcb/UiApplication.h b/include/cru/platform/gui/xcb/UiApplication.h index 86bb2349..b8de86f2 100644 --- a/include/cru/platform/gui/xcb/UiApplication.h +++ b/include/cru/platform/gui/xcb/UiApplication.h @@ -27,6 +27,7 @@ class XcbUiApplication : public XcbResource, public virtual IUiApplication { void CheckXcbConnectionError(); xcb_connection_t* GetXcbConnection(); + void XcbFlush(); // This API is weird, but before we have correct screen API, we still use it. xcb_screen_t* GetFirstXcbScreen(); diff --git a/src/platform/gui/xcb/UiApplication.cpp b/src/platform/gui/xcb/UiApplication.cpp index d79f42a7..1e5613b4 100644 --- a/src/platform/gui/xcb/UiApplication.cpp +++ b/src/platform/gui/xcb/UiApplication.cpp @@ -61,6 +61,8 @@ xcb_connection_t *XcbUiApplication::GetXcbConnection() { return xcb_connection_; } +void XcbUiApplication::XcbFlush() { xcb_flush(xcb_connection_); } + xcb_screen_t *XcbUiApplication::GetFirstXcbScreen() { return screen_; } xcb_atom_t XcbUiApplication::GetOrCreateXcbAtom(std::string name) { diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index f3480fe0..a27663a9 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -72,6 +72,7 @@ XcbWindow::~XcbWindow() { application_->UnregisterWindow(this); } void XcbWindow::Close() { if (xcb_window_) { xcb_destroy_window(application_->GetXcbConnection(), *xcb_window_); + application_->XcbFlush(); } } @@ -82,6 +83,7 @@ void XcbWindow::SetParent(INativeWindow *parent) { if (xcb_window_) { DoSetParent(*xcb_window_); } + application_->XcbFlush(); } WindowStyleFlag XcbWindow::GetStyleFlag() { return style_; } @@ -91,6 +93,7 @@ void XcbWindow::SetStyleFlag(WindowStyleFlag flag) { if (xcb_window_) { DoSetStyleFlags(*xcb_window_); } + application_->XcbFlush(); } String XcbWindow::GetTitle() { return String::FromUtf8(title_); } @@ -100,6 +103,7 @@ void XcbWindow::SetTitle(String title) { if (xcb_window_) { DoSetTitle(*xcb_window_); } + application_->XcbFlush(); } namespace { @@ -177,6 +181,8 @@ void XcbWindow::SetVisibility(WindowVisibilityType visibility) { default: UnreachableCode(); } + + application_->XcbFlush(); } Size XcbWindow::GetClientSize() { return GetClientRect().GetSize(); } @@ -204,6 +210,7 @@ Rect XcbWindow::GetClientRect() { void XcbWindow::SetClientRect(const Rect &rect) { if (!xcb_window_) return; DoSetClientRect(*xcb_window_, rect); + application_->XcbFlush(); } Rect XcbWindow::GetWindowRect() { @@ -236,6 +243,7 @@ bool XcbWindow::RequestFocus() { if (!xcb_window_) return false; xcb_set_input_focus(application_->GetXcbConnection(), XCB_NONE, *xcb_window_, XCB_CURRENT_TIME); + application_->XcbFlush(); return true; } @@ -252,12 +260,14 @@ bool XcbWindow::CaptureMouse() { xcb_grab_pointer(application_->GetXcbConnection(), FALSE, *xcb_window_, 0, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, XCB_CURSOR_NONE, XCB_CURRENT_TIME); + application_->XcbFlush(); return true; } bool XcbWindow::ReleaseMouse() { if (!xcb_window_) return false; xcb_ungrab_pointer(application_->xcb_connection_, XCB_CURRENT_TIME); + application_->XcbFlush(); return true; } @@ -269,6 +279,7 @@ void XcbWindow::SetToForeground() { const static uint32_t values[] = {XCB_STACK_MODE_ABOVE}; xcb_configure_window(application_->GetXcbConnection(), *xcb_window_, XCB_CONFIG_WINDOW_STACK_MODE, values); + application_->XcbFlush(); } void XcbWindow::RequestRepaint() { |