From ac0b338b3e026d0d05a447894de9a6a994da82dc Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Mon, 3 Jun 2024 17:24:53 +0200 Subject: Enable resizing windows from all sides Previously, the top edge of windows could not be dragged. Now you can also resize windows by their top edge, as well as the top-left and top-right corners. --- src/gui/chatwindow.cpp | 13 ++++++++++--- src/gui/widgets/window.cpp | 16 ++++++++++++---- src/gui/widgets/window.h | 4 +++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/gui/chatwindow.cpp b/src/gui/chatwindow.cpp index a3d9a1f4..0229bf76 100644 --- a/src/gui/chatwindow.cpp +++ b/src/gui/chatwindow.cpp @@ -343,10 +343,17 @@ void ChatWindow::mousePressed(gcn::MouseEvent &event) if (event.isConsumed()) return; - mMoved = event.getY() <= getFocused()->getHeight(); - mDragOffsetX = event.getX(); - mDragOffsetY = event.getY(); + // Enable dragging the chat window also in the tab area, since it doesn't + // have much of a title bar. + if (!mouseResize) + { + const int dragHeight = getFocused()->getHeight() + + static_cast(getTitleBarHeight()); + mMoved = event.getY() < dragHeight; + mDragOffsetX = event.getX(); + mDragOffsetY = event.getY(); + } } void ChatWindow::mouseDragged(gcn::MouseEvent &event) diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index e09986d2..25ca7684 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -371,6 +371,8 @@ void Window::mousePressed(gcn::MouseEvent &event) // Handle window resizing mouseResize = getResizeHandles(event); + if (mouseResize) + mMoved = false; } } @@ -405,12 +407,15 @@ void Window::mouseMoved(gcn::MouseEvent &event) switch (resizeHandles) { case BOTTOM | RIGHT: + case TOP | LEFT: gui->setCursorType(Cursor::RESIZE_DOWN_RIGHT); break; case BOTTOM | LEFT: + case TOP | RIGHT: gui->setCursorType(Cursor::RESIZE_DOWN_LEFT); break; case BOTTOM: + case TOP: gui->setCursorType(Cursor::RESIZE_DOWN); break; case RIGHT: @@ -676,14 +681,17 @@ void Window::adjustPositionAfterResize(int oldScreenWidth, int oldScreenHeight) int Window::getResizeHandles(gcn::MouseEvent &event) { int resizeHandles = 0; - const int y = event.getY(); - if (mGrip && y > (int) mTitleBarHeight) + if (mGrip) { const int x = event.getX(); + const int y = event.getY(); + const int p = getPadding(); + + const bool inPadding = (x < p || x > getWidth() - p) || + (y < p || y > getHeight() - p); - if (!getChildrenArea().isPointInRect(x, y) && - event.getSource() == this) + if (inPadding && event.getSource() == this) { resizeHandles |= (x > getWidth() - resizeBorderWidth) ? RIGHT : (x < resizeBorderWidth) ? LEFT : 0; diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h index ef529a9f..975de335 100644 --- a/src/gui/widgets/window.h +++ b/src/gui/widgets/window.h @@ -349,6 +349,9 @@ class Window : public gcn::Window, gcn::WidgetListener */ static int getGuiAlpha(); + protected: + static int mouseResize; /**< Active resize handles */ + private: enum ResizeHandles { @@ -394,7 +397,6 @@ class Window : public gcn::Window, gcn::WidgetListener int mDefaultWidth; /**< Default window width */ int mDefaultHeight; /**< Default window height */ - static int mouseResize; /**< Active resize handles */ static int instances; /**< Number of Window instances */ Skin *mSkin; /**< Skin in use by this window */ -- cgit v1.2.3-70-g09d2