vcl/unx/gtk3/gtkinst.cxx | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-)
New commits: commit 5da5cb2b5e1adc955b236dfa97fadff09f03490b Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Fri Jun 25 12:56:52 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Jun 25 16:57:10 2021 +0200 gtk4: detect context menu trigger Change-Id: Id86015c3b7f48b97acd0094838f51eade5f7569d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117881 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index ebe2eb7e635c..e0c3047875ff 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -2717,6 +2717,22 @@ private: if (SwapForRTL()) aPos.setX(gtk_widget_get_allocated_width(m_pWidget) - 1 - aPos.X()); + if (n_press == 1) + { + GdkEventSequence* pSequence = gtk_gesture_single_get_current_sequence(GTK_GESTURE_SINGLE(pGesture)); + GdkEvent* pEvent = gtk_gesture_get_last_event(GTK_GESTURE(pGesture), pSequence); + if (gdk_event_triggers_context_menu(pEvent)) + { + //if handled for context menu, stop processing + CommandEvent aCEvt(aPos, CommandEventId::ContextMenu, true); + if (signal_popup_menu(aCEvt)) + { + gtk_gesture_set_state(GTK_GESTURE(pGesture), GTK_EVENT_SEQUENCE_CLAIMED); + return; + } + } + } + GdkModifierType eType = gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(pGesture)); int nButton = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(pGesture)); @@ -10367,18 +10383,29 @@ public: GtkInstanceWidget* pGtkWidget = dynamic_cast<GtkInstanceWidget*>(pParent); assert(pGtkWidget); - -#if !GTK_CHECK_VERSION(4, 0, 0) GtkWidget* pWidget = pGtkWidget->getWidget(); - gtk_menu_attach_to_widget(m_pMenu, pWidget, nullptr); //run in a sub main loop because we need to keep vcl PopupMenu alive to use //it during DispatchCommand, returning now to the outer loop causes the //launching PopupMenu to be destroyed, instead run the subloop here //until the gtk menu is destroyed GMainLoop* pLoop = g_main_loop_new(nullptr, true); + +#if GTK_CHECK_VERSION(4, 0, 0) + gulong nSignalId = g_signal_connect_swapped(G_OBJECT(m_pMenu), "closed", G_CALLBACK(g_main_loop_quit), pLoop); + + GdkRectangle aRect; + pWidget = getPopupRect(pWidget, rRect, aRect); + + GtkWidget* pOrigParent = gtk_widget_get_parent(GTK_WIDGET(m_pMenu)); + gtk_widget_set_parent(GTK_WIDGET(m_pMenu), pWidget); + gtk_popover_set_pointing_to(GTK_POPOVER(m_pMenu), &aRect); + gtk_popover_popup(GTK_POPOVER(m_pMenu)); +#else gulong nSignalId = g_signal_connect_swapped(G_OBJECT(m_pMenu), "deactivate", G_CALLBACK(g_main_loop_quit), pLoop); + gtk_menu_attach_to_widget(m_pMenu, pWidget, nullptr); + #if GTK_CHECK_VERSION(3,22,0) if (gtk_check_version(3, 22, 0) == nullptr) { @@ -10425,12 +10452,17 @@ public: gtk_menu_popup(m_pMenu, nullptr, nullptr, nullptr, nullptr, nButton, nTime); } +#endif if (g_main_loop_is_running(pLoop)) main_loop_run(pLoop); g_main_loop_unref(pLoop); g_signal_handler_disconnect(m_pMenu, nSignalId); + +#if GTK_CHECK_VERSION(4, 0, 0) + gtk_widget_unparent(GTK_WIDGET(m_pMenu)); +#else gtk_menu_detach(m_pMenu); #endif @@ -22292,6 +22324,7 @@ weld::Builder* GtkInstance::CreateBuilder(weld::Widget* pParent, const OUString& rUIFile != "cui/ui/macroassignpage.ui" && rUIFile != "cui/ui/macroselectordialog.ui" && rUIFile != "cui/ui/menuassignpage.ui" && + rUIFile != "cui/ui/movemenu.ui" && rUIFile != "cui/ui/namedialog.ui" && rUIFile != "cui/ui/newlibdialog.ui" && rUIFile != "cui/ui/numberingformatpage.ui" && _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits