summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-01-18 17:21:43 +0000
committerCaolán McNamara <caolanm@redhat.com>2020-01-18 20:21:42 +0100
commit0b240f9e1487ea13677e93ecaa7099f68ff63a3e (patch)
tree76dab2605910fb3e8f562268986bb8d6a66d4a03 /vcl
parentc5196ec5d163ecb6086bc6f1a3f6d7bd5fb7915a (diff)
Resolves: tdf#130070 keep dropdown menu fully on screen
if possible Change-Id: I2ec3b54516ec713421288a4a30a9a7296c8d3e75 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87026 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx41
1 files changed, 35 insertions, 6 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index f4424ac18e5c..fdc09fa45581 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3536,6 +3536,16 @@ namespace
gtk_container_forall(GTK_CONTAINER(pItem), do_collect_screenshot_data, data);
}
+ tools::Rectangle get_monitor_workarea(GtkWidget* pWindow)
+ {
+ GdkScreen* pScreen = gtk_widget_get_screen(pWindow);
+ gint nMonitor = gdk_screen_get_monitor_at_window(pScreen, gtk_widget_get_window(pWindow));
+ GdkRectangle aRect;
+ gdk_screen_get_monitor_workarea(pScreen, nMonitor, &aRect);
+ return tools::Rectangle(aRect.x, aRect.y, aRect.x + aRect.width, aRect.y + aRect.height);
+ }
+
+
class GtkInstanceWindow : public GtkInstanceContainer, public virtual weld::Window
{
private:
@@ -3634,11 +3644,7 @@ public:
virtual tools::Rectangle get_monitor_workarea() const override
{
- GdkScreen* pScreen = gtk_widget_get_screen(GTK_WIDGET(m_pWindow));
- gint nMonitor = gdk_screen_get_monitor_at_window(pScreen, gtk_widget_get_window(GTK_WIDGET(m_pWindow)));
- GdkRectangle aRect;
- gdk_screen_get_monitor_workarea(pScreen, nMonitor, &aRect);
- return tools::Rectangle(aRect.x, aRect.y, aRect.x + aRect.width, aRect.y + aRect.height);
+ return ::get_monitor_workarea(GTK_WIDGET(m_pWindow));
}
virtual void set_centered_on_parent(bool bTrackGeometryRequests) override
@@ -6521,12 +6527,35 @@ private:
gtk_widget_translate_coordinates(GTK_WIDGET(m_pMenuButton), pToplevel, 0, 0, &x, &y);
GdkWindow *pWindow = gtk_widget_get_window(pToplevel);
gdk_window_get_position(pWindow, &absx, &absy);
+ x += absx;
+ y += absy;
+
+ gint nButtonHeight = gtk_widget_get_allocated_height(GTK_WIDGET(m_pMenuButton));
+ y += nButtonHeight;
gtk_window_group_add_window(gtk_window_get_group(GTK_WINDOW(pToplevel)), m_pMenuHack);
gtk_window_set_transient_for(m_pMenuHack, GTK_WINDOW(pToplevel));
gtk_widget_show_all(GTK_WIDGET(m_pMenuHack));
- gtk_window_move(m_pMenuHack, x + absx, y + absy + gtk_widget_get_allocated_height(GTK_WIDGET(m_pMenuButton)));
+
+ tools::Rectangle aWorkArea(::get_monitor_workarea(GTK_WIDGET(m_pMenuHack)));
+ gint endx = x + gtk_widget_get_allocated_width(GTK_WIDGET(m_pMenuHack));
+ if (endx > aWorkArea.Right())
+ {
+ x -= endx - aWorkArea.Right();
+ if (x < 0)
+ x = 0;
+ }
+ gint nMenuHeight = gtk_widget_get_allocated_height(GTK_WIDGET(m_pMenuHack));
+ gint endy = y + nMenuHeight;
+ if (endy > aWorkArea.Bottom())
+ {
+ y -= nButtonHeight + nMenuHeight;
+ if (y < 0)
+ y = 0;
+ }
+
+ gtk_window_move(m_pMenuHack, x, y);
gtk_widget_grab_focus(GTK_WIDGET(m_pMenuHack));