summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugingui/eventhandler.cc11
-rw-r--r--plugingui/guievent.h11
-rw-r--r--plugingui/nativewindow_win32.cc26
-rw-r--r--plugingui/nativewindow_x11.cc26
-rw-r--r--plugingui/widget.cc2
-rw-r--r--plugingui/window.cc34
-rw-r--r--plugingui/window.h1
7 files changed, 69 insertions, 42 deletions
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<Event> 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<MoveEvent*>(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 <cstring>
+#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>();
- resizeEvent->width = LOWORD(lp);
- resizeEvent->height = HIWORD(lp);
- native->event_queue.push(resizeEvent);
- first = false;
- }
+ auto resizeEvent = std::make_shared<ResizeEvent>();
+ 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>();
-// moveEvent->x = (short)LOWORD(lp);
-// moveEvent->y = (short)HIWORD(lp);
-// native->event_queue.push(moveEvent);
+ auto moveEvent = std::make_shared<MoveEvent>();
+ 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<Event> NativeWindowX11::translateXMessage(XEvent& xevent,
case ConfigureNotify:
{
- auto resizeEvent = std::make_shared<ResizeEvent>();
- 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>();
+ 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>();
+ 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 <hugin.hpp>
#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