From 706b9a84c6a96f4c05fc240faa635ce8fc7d2eba Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 19 Apr 2017 19:35:26 -0300 Subject: [PATCH] Add a simple processing of the event queue on X11/Skia port --- src/she/CMakeLists.txt | 1 + src/she/skia/she.cpp | 4 +-- src/she/skia/skia_system.h | 5 ++-- src/she/skia/skia_window_x11.cpp | 16 ++++++++--- src/she/skia/skia_window_x11.h | 8 ++++-- src/she/x11/event_queue.cpp | 46 ++++++++++++++++++++++++++++++++ src/she/x11/event_queue.h | 23 +++------------- src/she/x11/window.h | 9 ++++++- 8 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 src/she/x11/event_queue.cpp diff --git a/src/she/CMakeLists.txt b/src/she/CMakeLists.txt index c4d0c2dd8..5c369a80e 100644 --- a/src/she/CMakeLists.txt +++ b/src/she/CMakeLists.txt @@ -210,6 +210,7 @@ if(USE_SKIA_BACKEND) else() list(APPEND SHE_SOURCES skia/skia_window_x11.cpp + x11/event_queue.cpp x11/keys.cpp x11/x11.cpp) endif() diff --git a/src/she/skia/she.cpp b/src/she/skia/she.cpp index 37c5e91e0..a8a7482d8 100644 --- a/src/she/skia/she.cpp +++ b/src/she/skia/she.cpp @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2012-2016 David Capello +// Copyright (C) 2012-2017 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -25,7 +25,7 @@ namespace she { System* create_system_impl() { - return new SkiaSystem(); + return new SkiaSystem; } void error_message(const char* msg) diff --git a/src/she/skia/skia_system.h b/src/she/skia/skia_system.h index cb6e07fd5..5e0007474 100644 --- a/src/she/skia/skia_system.h +++ b/src/she/skia/skia_system.h @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2012-2016 David Capello +// Copyright (C) 2012-2017 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -25,7 +25,8 @@ #define SkiaSystemBase OSXSystem #else #include "she/x11/event_queue.h" - #define SkiaSystemBase CommonSystem + #include "she/x11/system.h" + #define SkiaSystemBase X11System #endif #include "SkGraphics.h" diff --git a/src/she/skia/skia_window_x11.cpp b/src/she/skia/skia_window_x11.cpp index 908e5b144..576241e2e 100644 --- a/src/she/skia/skia_window_x11.cpp +++ b/src/she/skia/skia_window_x11.cpp @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2016 David Capello +// Copyright (C) 2016-2017 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -11,16 +11,18 @@ #include "she/skia/skia_window_x11.h" #include "gfx/size.h" +#include "she/event.h" +#include "she/event_queue.h" +#include "she/skia/skia_display.h" #include "she/x11/x11.h" -#include "SkBitmap.h" - - namespace she { SkiaWindow::SkiaWindow(EventQueue* queue, SkiaDisplay* display, int width, int height, int scale) : X11Window(X11::instance()->display(), width, height) + , m_queue(queue) + , m_display(display) , m_clientSize(width, height) , m_scale(scale) { @@ -30,6 +32,12 @@ SkiaWindow::~SkiaWindow() { } +void SkiaWindow::queueEventImpl(Event& ev) +{ + ev.setDisplay(m_display); + m_queue->queueEvent(ev); +} + int SkiaWindow::scale() const { return m_scale; diff --git a/src/she/skia/skia_window_x11.h b/src/she/skia/skia_window_x11.h index 454b2f12c..c962632ba 100644 --- a/src/she/skia/skia_window_x11.h +++ b/src/she/skia/skia_window_x11.h @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2016 David Capello +// Copyright (C) 2016-2017 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -20,7 +20,7 @@ namespace she { class EventQueue; class SkiaDisplay; -class SkiaWindow : public X11Window { +class SkiaWindow : public X11Window { public: enum class Backend { NONE, GL }; @@ -28,6 +28,8 @@ public: int width, int height, int scale); ~SkiaWindow(); + void queueEventImpl(Event& ev); + int scale() const; void setScale(int scale); void setVisible(bool visible); @@ -51,6 +53,8 @@ public: private: void onExpose() override; + EventQueue* m_queue; + SkiaDisplay* m_display; gfx::Size m_clientSize; int m_scale; diff --git a/src/she/x11/event_queue.cpp b/src/she/x11/event_queue.cpp new file mode 100644 index 000000000..d67e7319b --- /dev/null +++ b/src/she/x11/event_queue.cpp @@ -0,0 +1,46 @@ +// SHE library +// Copyright (C) 2016-2017 David Capello +// +// This file is released under the terms of the MIT license. +// Read LICENSE.txt for more information. + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "she/x11/event_queue.h" + +#include + +namespace she { + +void X11EventQueue::getEvent(Event& ev, bool canWait) +{ + ::Display* display = X11::instance()->display(); + XSync(display, False); + + XEvent event; + int events = XEventsQueued(display, QueuedAlready); + for (int i=0; i -#pragma push_macro("None") -#undef None // Undefine the X11 None macro - namespace she { class X11EventQueue : public EventQueue { public: - void getEvent(Event& ev, bool canWait) override { - XEvent event; - XNextEvent(X11::instance()->display(), &event); - - if (m_events.empty()) { - ev.setType(Event::None); - } - else { - ev = m_events.front(); - m_events.pop(); - } - } - + void getEvent(Event& ev, bool canWait) override; void queueEvent(const Event& ev) override { m_events.push(ev); } private: + void processX11Event(XEvent& event); + std::queue m_events; }; @@ -46,6 +33,4 @@ typedef X11EventQueue EventQueueImpl; } // namespace she -#pragma pop_macro("None") - #endif diff --git a/src/she/x11/window.h b/src/she/x11/window.h index e608fe15c..b5c530bff 100644 --- a/src/she/x11/window.h +++ b/src/she/x11/window.h @@ -1,5 +1,5 @@ // SHE library -// Copyright (C) 2016 David Capello +// Copyright (C) 2016-2017 David Capello // // This file is released under the terms of the MIT license. // Read LICENSE.txt for more information. @@ -16,6 +16,9 @@ namespace she { +class Event; + +template class X11Window { public: X11Window(::Display* display, int width, int height) @@ -48,6 +51,10 @@ public: XDestroyWindow(m_display, m_window); } + void queueEvent(Event& ev) { + static_cast(this)->queueEventImpl(ev); + } + void setTitle(const std::string& title) { XTextProperty prop; prop.value = (unsigned char*)title.c_str();