diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-05-10 20:12:30 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-05-11 09:42:39 +0200 |
commit | 18b27b017ea8221b33f7e169f7725d3b9fc13c53 (patch) | |
tree | ead925cd3c8d96d4afdcc255fcb2b9c386fb1d2c | |
parent | 89b1c955c182a14de6a044b4db90b085d5bcddf9 (diff) |
gtk4: get context menus working
Change-Id: I14fe637ce3539196cffba90851f57193afc9b76b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115359
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | vcl/unx/gtk3/gtksalmenu.cxx | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/vcl/unx/gtk3/gtksalmenu.cxx b/vcl/unx/gtk3/gtksalmenu.cxx index b965880cfbcb..5f9b20effbbf 100644 --- a/vcl/unx/gtk3/gtksalmenu.cxx +++ b/vcl/unx/gtk3/gtksalmenu.cxx @@ -456,6 +456,25 @@ bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const tools::Rectangl // don't allow any more to appear until menu is dismissed mpFrame->BlockTooltip(); +#if GTK_CHECK_VERSION(4, 0, 0) + tools::Rectangle aFloatRect = FloatingWindow::ImplConvertToAbsPos(xParent, rRect); + aFloatRect.Move(-mpFrame->maGeometry.nX, -mpFrame->maGeometry.nY); + GdkRectangle rect {static_cast<int>(aFloatRect.Left()), static_cast<int>(aFloatRect.Top()), + static_cast<int>(aFloatRect.GetWidth()), static_cast<int>(aFloatRect.GetHeight())}; + + gtk_popover_set_pointing_to(GTK_POPOVER(pWidget), &rect); + + if (nFlags & FloatWinPopupFlags::Left) + gtk_popover_set_position(GTK_POPOVER(pWidget), GTK_POS_LEFT); + else if (nFlags & FloatWinPopupFlags::Up) + gtk_popover_set_position(GTK_POPOVER(pWidget), GTK_POS_TOP); + else if (nFlags & FloatWinPopupFlags::Right) + gtk_popover_set_position(GTK_POPOVER(pWidget), GTK_POS_RIGHT); + else + gtk_popover_set_position(GTK_POPOVER(pWidget), GTK_POS_BOTTOM); + + gtk_popover_popup(GTK_POPOVER(pWidget)); +#else #if GTK_CHECK_VERSION(3,22,0) if (gtk_check_version(3, 22, 0) == nullptr) { @@ -464,7 +483,6 @@ bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const tools::Rectangl GdkRectangle rect {static_cast<int>(aFloatRect.Left()), static_cast<int>(aFloatRect.Top()), static_cast<int>(aFloatRect.GetWidth()), static_cast<int>(aFloatRect.GetHeight())}; -#if !GTK_CHECK_VERSION(4, 0, 0) GdkGravity rect_anchor = GDK_GRAVITY_SOUTH_WEST, menu_anchor = GDK_GRAVITY_NORTH_WEST; if (nFlags & FloatWinPopupFlags::Left) @@ -484,17 +502,10 @@ bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const tools::Rectangl GdkWindow* gdkWindow = gtk_widget_get_window(mpFrame->getMouseEventWidget()); gtk_menu_popup_at_rect(GTK_MENU(pWidget), gdkWindow, &rect, rect_anchor, menu_anchor, nullptr); -#else - gtk_popover_set_pointing_to(GTK_POPOVER(pWidget), &rect); - (void)nFlags; - //TODO use gtk_popover_set_position - gtk_popover_popup(GTK_POPOVER(pWidget)); -#endif } else #endif { -#if !GTK_CHECK_VERSION(4, 0, 0) guint nButton; guint32 nTime; @@ -521,8 +532,8 @@ bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const tools::Rectangl gtk_menu_popup(GTK_MENU(pWidget), nullptr, nullptr, MenuPositionFunc, &aPos, nButton, nTime); -#endif } +#endif if (g_main_loop_is_running(pLoop)) { |