From ea6883e9ba851db5e6557b1d71d1268f6ab25c64 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 2 Dec 2016 19:24:57 +0100 Subject: Make resize events fdo the right thing. Add move event. --- plugingui/eventhandler.cc | 11 +++++++++-- plugingui/guievent.h | 11 ++++++++++- plugingui/nativewindow_win32.cc | 26 +++++++++++--------------- plugingui/nativewindow_x11.cc | 26 +++++++++++++++++++------- plugingui/widget.cc | 2 +- plugingui/window.cc | 34 ++++++++++++++++++---------------- plugingui/window.h | 1 + 7 files changed, 69 insertions(+), 42 deletions(-) (limited to 'plugingui') diff --git a/plugingui/eventhandler.cc b/plugingui/eventhandler.cc index 083efae..a5249a6 100644 --- a/plugingui/eventhandler.cc +++ b/plugingui/eventhandler.cc @@ -55,10 +55,10 @@ std::shared_ptr EventHandler::peekNextEvent() void EventHandler::processEvents() { + Painter p(window); // Make sure we only redraw buffer one time. + while(hasEvent()) { - Painter p(window); // Make sure we only redraw buffer one time. - auto event = getNextEvent(); if(event == nullptr) @@ -71,6 +71,13 @@ void EventHandler::processEvents() window.redraw(); break; + case EventType::move: + { + auto moveEvent = static_cast(event.get()); + window.moved(moveEvent->x, moveEvent->y); + } + break; + case EventType::resize: { while(true) diff --git a/plugingui/guievent.h b/plugingui/guievent.h index 133b630..78fe0f8 100644 --- a/plugingui/guievent.h +++ b/plugingui/guievent.h @@ -44,7 +44,8 @@ enum class EventType { scroll, key, close, - resize + resize, + move }; class Event { @@ -150,4 +151,12 @@ public: size_t height; }; +class MoveEvent : public Event { +public: + EventType type() { return EventType::move; } + + int x; + int y; +}; + } // GUI:: diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc index 9e80be0..172850d 100644 --- a/plugingui/nativewindow_win32.cc +++ b/plugingui/nativewindow_win32.cc @@ -26,10 +26,10 @@ */ #include "nativewindow_win32.h" -#include "window.h" - #include +#include "window.h" + namespace GUI { LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg, @@ -49,24 +49,20 @@ LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg, switch(msg) { case WM_SIZE: { - static bool first = true; - if(!first) - { - auto resizeEvent = std::make_shared(); - resizeEvent->width = LOWORD(lp); - resizeEvent->height = HIWORD(lp); - native->event_queue.push(resizeEvent); - first = false; - } + auto resizeEvent = std::make_shared(); + resizeEvent->width = LOWORD(lp); + resizeEvent->height = HIWORD(lp); + //native->event_queue.push(resizeEvent); + native->window.resized(resizeEvent->width, resizeEvent->height); } break; case WM_MOVE: { -// auto moveEvent = std::make_shared(); -// moveEvent->x = (short)LOWORD(lp); -// moveEvent->y = (short)HIWORD(lp); -// native->event_queue.push(moveEvent); + auto moveEvent = std::make_shared(); + moveEvent->x = (short)LOWORD(lp); + moveEvent->y = (short)HIWORD(lp); + native->event_queue.push(moveEvent); } break; diff --git a/plugingui/nativewindow_x11.cc b/plugingui/nativewindow_x11.cc index 8a86c80..1ca7d00 100644 --- a/plugingui/nativewindow_x11.cc +++ b/plugingui/nativewindow_x11.cc @@ -414,13 +414,25 @@ std::shared_ptr NativeWindowX11::translateXMessage(XEvent& xevent, case ConfigureNotify: { - auto resizeEvent = std::make_shared(); - resizeEvent->window_id = xevent.xconfigure.window; - //resizeEvent->x = xevent.xconfigure.x; - //resizeEvent->y = xevent.xconfigure.y; - resizeEvent->width = xevent.xconfigure.width; - resizeEvent->height = xevent.xconfigure.height; - event = resizeEvent; + if((window.width() != (std::size_t)xevent.xconfigure.width) || + (window.height() != (std::size_t)xevent.xconfigure.height)) + { + auto resizeEvent = std::make_shared(); + resizeEvent->window_id = xevent.xconfigure.window; + resizeEvent->width = xevent.xconfigure.width; + resizeEvent->height = xevent.xconfigure.height; + event = resizeEvent; + } + + if((window.windowX() != (std::size_t)xevent.xconfigure.x) || + (window.windowY() != (std::size_t)xevent.xconfigure.y)) + { + auto moveEvent = std::make_shared(); + moveEvent->window_id = xevent.xconfigure.window; + moveEvent->x = xevent.xconfigure.x; + moveEvent->y = xevent.xconfigure.y; + event = moveEvent; + } } break; diff --git a/plugingui/widget.cc b/plugingui/widget.cc index 4b1d1f7..476746e 100644 --- a/plugingui/widget.cc +++ b/plugingui/widget.cc @@ -123,7 +123,7 @@ void Widget::resize(int width, int height) _width = width; _height = height; pixbuf.realloc(width, height); - + repaintEvent(nullptr); sizeChangeNotifier(width, height); } diff --git a/plugingui/window.cc b/plugingui/window.cc index 7449607..f8232ad 100644 --- a/plugingui/window.cc +++ b/plugingui/window.cc @@ -26,7 +26,6 @@ */ #include "window.h" -#include #include "painter.h" #ifndef PUGL @@ -73,7 +72,6 @@ Window::~Window() void Window::setFixedSize(int w, int h) { native->setFixedSize(w, h); - resize(w,h); } void Window::setCaption(const std::string& caption) @@ -81,6 +79,9 @@ void Window::setCaption(const std::string& caption) native->setCaption(caption); } +//! This overload the resize method on Widget and simply requests a window resize +//! on the windowmanager/OS. The resized() method is called by the event handler +//! once the window has been resized. void Window::resize(int width, int height) { if((width < 1) || (height < 1)) @@ -88,17 +89,15 @@ void Window::resize(int width, int height) return; } - resized(width, height); - Widget::resize(width, height); native->resize(width, height); } +//! This overload the move method on Widget and simply requests a window move +//! on the windowmanager/OS. The moved() method is called by the event handler +//! once the window has been moved. void Window::move(size_t x, size_t y) { native->move(x, y); - - // Make sure widget corrdinates are updated. - Widget::move(x, y); } size_t Window::windowX() @@ -113,6 +112,7 @@ size_t Window::windowY() void Window::show() { + Widget::show(); repaintChildren(nullptr); native->show(); } @@ -120,6 +120,7 @@ void Window::show() void Window::hide() { native->hide(); + Widget::hide(); } Window* Window::window() @@ -185,6 +186,8 @@ void Window::redraw() native->redraw(); } +//! Called by event handler when an windowmanager/OS window resize event has +//! been received. Do not call this directly. void Window::resized(size_t width, size_t height) { if((_width == width) && (_height == height)) @@ -192,22 +195,21 @@ void Window::resized(size_t width, size_t height) return; } - _width = width; - _height = height; - wpixbuf.realloc(width, height); + Widget::resize(width, height); updateBuffer(); +} - pixbuf.realloc(width, height); - repaintEvent(nullptr); - - // Notify Widget - sizeChangeNotifier(width, height); +//! Called by event handler when an windowmanager/OS window move event has +//! been received. Do not call this directly. +void Window::moved(int x, int y) +{ + // Make sure widget corrdinates are updated. + Widget::move(x, y); } void Window::updateBuffer() { - //DEBUG(window, "Updating buffer\n"); for(auto pixelBuffer : getPixelBuffers()) { size_t updateWidth = pixelBuffer->width; diff --git a/plugingui/window.h b/plugingui/window.h index 1fea9c0..705742f 100644 --- a/plugingui/window.h +++ b/plugingui/window.h @@ -74,6 +74,7 @@ protected: friend class EventHandler; void redraw(); void resized(size_t w, size_t h); + void moved(int x, int y); void updateBuffer(); // For the Painter -- cgit v1.2.3