From 48f2996ccc789d740edc4b425a3e00f378a9095a Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 23 Sep 2012 03:33:47 +0300 Subject: Restore mouse cursor if window set visible and have mouse over. --- src/gui/gui.cpp | 32 ++++++++++++++++++++++++++++++++ src/gui/gui.h | 6 ++++++ src/gui/widgets/window.cpp | 28 +++++++++++++++++++++++++++- src/gui/widgets/window.h | 4 ++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index c502ce04a..ce2fcef98 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -27,6 +27,7 @@ #include "gui/sdlfont.h" #include "gui/sdlinput.h" #include "gui/theme.h" +#include "gui/viewport.h" #include "gui/widgets/mouseevent.h" #include "gui/widgets/window.h" @@ -605,3 +606,34 @@ void Gui::resetClickCount() mClickCount = 1; mLastMousePressTimeStamp = 0; } + +MouseEvent *Gui::createMouseEvent(Window *widget) +{ + if (!viewport || !widget) + return nullptr; + + int x = 0; + int y = 0; + int mouseX = 0; + int mouseY = 0; + + getAbsolutePosition(widget, x, y); + SDL_GetMouseState(&mouseX, &mouseY); + + MouseEvent *mouseEvent = new MouseEvent(widget, mShiftPressed, + mControlPressed, mAltPressed, mMetaPressed, 0, 0, + mouseX - x, mouseY - y, mClickCount); + return mouseEvent; +} + +void Gui::getAbsolutePosition(gcn::Widget *widget, int &x, int &y) +{ + x = 0; + y = 0; + while (widget->getParent()) + { + x += widget->getX(); + y += widget->getY(); + widget = widget->getParent(); + } +} diff --git a/src/gui/gui.h b/src/gui/gui.h index ee1cb9092..4766a4bf4 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -28,8 +28,10 @@ class Graphics; class GuiConfigListener; class ImageSet; +class MouseEvent; class SDLFont; class SDLInput; +class Window; /** * \defgroup GUI Core GUI related classes (widgets) @@ -129,6 +131,10 @@ class Gui final : public gcn::Gui void resetClickCount(); + MouseEvent *createMouseEvent(Window *widget); + + void getAbsolutePosition(gcn::Widget *widget, int &x, int &y); + /** * Cursors are in graphic order from left to right. * CURSOR_POINTER should be left untouched. diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 19d0b2fea..879190932 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -490,14 +490,31 @@ void Window::setVisible(bool visible, bool forceSticky) // Check if the window is off screen... if (visible) + { ensureOnScreen(); + } else + { mResizeHandles = 0; + } if (isStickyButtonLock()) gcn::Window::setVisible(visible); else gcn::Window::setVisible((!forceSticky && isSticky()) || visible); + if (visible) + { + if (gui) + { + gcn::MouseEvent *event = reinterpret_cast( + gui->createMouseEvent(this)); + if (event) + { + mouseMoved(*event); + delete event; + } + } + } } void Window::scheduleDelete() @@ -560,13 +577,18 @@ void Window::mouseReleased(gcn::MouseEvent &event A_UNUSED) mMoved = false; } +void Window::mouseEntered(gcn::MouseEvent &event) +{ + updateResizeHandler(event); +} + void Window::mouseExited(gcn::MouseEvent &event A_UNUSED) { if (mGrip && !mouseResize && gui) gui->setCursorType(Gui::CURSOR_POINTER); } -void Window::mouseMoved(gcn::MouseEvent &event) +void Window::updateResizeHandler(gcn::MouseEvent &event) { if (!gui) return; @@ -595,7 +617,11 @@ void Window::mouseMoved(gcn::MouseEvent &event) default: gui->setCursorType(Gui::CURSOR_POINTER); } +} +void Window::mouseMoved(gcn::MouseEvent &event) +{ + updateResizeHandler(event); if (viewport) viewport->hideBeingPopup(); } diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h index 7ffa1eb2d..c8b8fb080 100644 --- a/src/gui/widgets/window.h +++ b/src/gui/widgets/window.h @@ -273,6 +273,10 @@ class Window : public gcn::Window, private gcn::WidgetListener */ void mouseExited(gcn::MouseEvent &event) override; + void mouseEntered(gcn::MouseEvent &event) override; + + void updateResizeHandler(gcn::MouseEvent &event); + /** * Sets the name of the window. This is not the window title. */ -- cgit v1.2.3-70-g09d2