[Libreoffice-commits] core.git: vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Sat Jan 18 19:22:19 UTC 2020


 vcl/unx/gtk3/gtk3gtkinst.cxx |   41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

New commits:
commit 0b240f9e1487ea13677e93ecaa7099f68ff63a3e
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sat Jan 18 17:21:43 2020 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Sat Jan 18 20:21:42 2020 +0100

    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 at redhat.com>

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));
 


More information about the Libreoffice-commits mailing list