aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/gui/xcb/Window.h6
-rw-r--r--src/platform/gui/xcb/Window.cpp22
2 files changed, 26 insertions, 2 deletions
diff --git a/include/cru/platform/gui/xcb/Window.h b/include/cru/platform/gui/xcb/Window.h
index 4c9e3f4d..62351645 100644
--- a/include/cru/platform/gui/xcb/Window.h
+++ b/include/cru/platform/gui/xcb/Window.h
@@ -64,9 +64,9 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
IEvent<std::nullptr_t>* CreateEvent() override;
IEvent<std::nullptr_t>* DestroyEvent() override;
- virtual IEvent<std::nullptr_t>* PaintEvent() = 0;
+ IEvent<std::nullptr_t>* PaintEvent() override;
- virtual IEvent<WindowVisibilityType>* VisibilityChangeEvent() = 0;
+ IEvent<WindowVisibilityType>* VisibilityChangeEvent() override;
IEvent<Size>* ResizeEvent() override;
IEvent<FocusChangeType>* FocusEvent() override;
@@ -95,7 +95,9 @@ class XcbWindow : public XcbResource, public virtual INativeWindow {
Event<std::nullptr_t> create_event_;
Event<std::nullptr_t> destroy_event_;
+ Event<std::nullptr_t> paint_event_;
+ Event<WindowVisibilityType> visibility_change_event_;
Event<Size> resize_event_;
Event<FocusChangeType> focus_event_;
Event<MouseEnterLeaveType> mouse_enter_leave_event_;
diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp
index 67568dce..3f22e6b0 100644
--- a/src/platform/gui/xcb/Window.cpp
+++ b/src/platform/gui/xcb/Window.cpp
@@ -59,6 +59,12 @@ IEvent<std::nullptr_t> *XcbWindow::CreateEvent() { return &create_event_; }
IEvent<std::nullptr_t> *XcbWindow::DestroyEvent() { return &destroy_event_; }
+IEvent<std::nullptr_t> *XcbWindow::PaintEvent() { return &paint_event_; }
+
+IEvent<WindowVisibilityType> *XcbWindow::VisibilityChangeEvent() {
+ return &visibility_change_event_;
+}
+
IEvent<Size> *XcbWindow::ResizeEvent() { return &resize_event_; }
IEvent<FocusChangeType> *XcbWindow::FocusEvent() { return &focus_event_; }
@@ -140,6 +146,14 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) {
}
break;
}
+ case XCB_MAP_NOTIFY: {
+ visibility_change_event_.Raise(WindowVisibilityType::Show);
+ break;
+ }
+ case XCB_UNMAP_NOTIFY: {
+ visibility_change_event_.Raise(WindowVisibilityType::Hide);
+ break;
+ }
case XCB_FOCUS_IN: {
focus_event_.Raise(FocusChangeType::Gain);
break;
@@ -236,6 +250,14 @@ std::optional<xcb_window_t> XcbWindow::GetEventWindow(
(xcb_configure_notify_event_t *)event;
return configure->event;
}
+ case XCB_MAP_NOTIFY: {
+ xcb_map_notify_event_t *map = (xcb_map_notify_event_t *)event;
+ return map->event;
+ }
+ case XCB_UNMAP_NOTIFY: {
+ xcb_unmap_notify_event_t *unmap = (xcb_unmap_notify_event_t *)event;
+ return unmap->event;
+ }
case XCB_FOCUS_IN: {
xcb_focus_in_event_t *fi = (xcb_focus_in_event_t *)event;
return fi->event;