summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-07-27 16:26:41 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-07-28 11:43:51 +0200
commitb87ac05be8855275b9c5dd48770a1f52b8e8f966 (patch)
treeccc11a953f0979575cc75da076f163e2cf5a4f9e
parent44a11bb8c99e02ac3ac16b405377ea61ffa8841b (diff)
gtk4: use GtkPopovers to replace popups
still a bit rough, but functional at least Change-Id: I4b5f896a0d895ed20da3534173c20241a7fe7ea1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137510 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--vcl/unx/gtk3/gtkframe.cxx41
1 files changed, 35 insertions, 6 deletions
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index b1a00fe23129..008a8d5dbbdb 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -776,10 +776,21 @@ void GtkSalFrame::moveWindow( tools::Long nX, tools::Long nY )
m_pWindow,
nX - m_pParent->maGeometry.x(), nY - m_pParent->maGeometry.y() );
}
+ return;
}
-#if !GTK_CHECK_VERSION(4,0,0)
- else
- gtk_window_move( GTK_WINDOW(m_pWindow), nX, nY );
+#if GTK_CHECK_VERSION(4,0,0)
+ if (GTK_IS_POPOVER(m_pWindow))
+ {
+ GdkRectangle aRect;
+ aRect.x = nX;
+ aRect.y = nY;
+ aRect.width = 1;
+ aRect.height = 1;
+ gtk_popover_set_pointing_to(GTK_POPOVER(m_pWindow), &aRect);
+ return;
+ }
+#else
+ gtk_window_move( GTK_WINDOW(m_pWindow), nX, nY );
#endif
}
@@ -795,6 +806,13 @@ void GtkSalFrame::window_resize(tools::Long nWidth, tools::Long nHeight)
{
m_nWidthRequest = nWidth;
m_nHeightRequest = nHeight;
+ if (!GTK_IS_WINDOW(m_pWindow))
+ {
+#if GTK_CHECK_VERSION(4,0,0)
+ gtk_widget_set_size_request(GTK_WIDGET(m_pDrawingArea), nWidth, nHeight);
+#endif
+ return;
+ }
gtk_window_set_default_size(GTK_WINDOW(m_pWindow), nWidth, nHeight);
#if !GTK_CHECK_VERSION(4,0,0)
if (gtk_widget_get_visible(m_pWindow))
@@ -1374,7 +1392,13 @@ void GtkSalFrame::Init( SalFrame* pParent, SalFrameStyleFlags nStyle )
#if !GTK_CHECK_VERSION(4,0,0)
m_pWindow = gtk_window_new(bPopup ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL);
#else
- m_pWindow = gtk_window_new();
+ if (!bPopup)
+ m_pWindow = gtk_window_new();
+ else
+ {
+ m_pWindow = gtk_popover_new();
+ gtk_popover_set_has_arrow(GTK_POPOVER(m_pWindow), false);
+ }
#endif
#if !GTK_CHECK_VERSION(4,0,0)
@@ -1418,6 +1442,11 @@ void GtkSalFrame::Init( SalFrame* pParent, SalFrameStyleFlags nStyle )
g_object_unref(gtk_window_get_group(GTK_WINDOW(m_pWindow)));
}
}
+ else if (GTK_IS_POPOVER(m_pWindow))
+ {
+ assert(m_pParent);
+ gtk_widget_set_parent(m_pWindow, m_pParent->getMouseEventWidget());
+ }
// set window type
bool bDecoHandling =
@@ -1581,7 +1610,7 @@ bool GtkSalFrame::PostEvent(std::unique_ptr<ImplSVEvent> pData)
void GtkSalFrame::SetTitle( const OUString& rTitle )
{
- if( m_pWindow && ! isChild() )
+ if (m_pWindow && GTK_IS_WINDOW(m_pWindow) && !isChild())
{
OString sTitle(OUStringToOString(rTitle, RTL_TEXTENCODING_UTF8));
gtk_window_set_title(GTK_WINDOW(m_pWindow), sTitle.getStr());
@@ -1889,7 +1918,7 @@ void GtkSalFrame::SetPosSize( tools::Long nX, tools::Long nY, tools::Long nWidth
maGeometry.setSize({ nWidth, nHeight });
- if( isChild( false ) )
+ if (isChild(false) || GTK_IS_POPOVER(m_pWindow))
widget_set_size_request(nWidth, nHeight);
else if( ! ( m_nState & GDK_TOPLEVEL_STATE_MAXIMIZED ) )
window_resize(nWidth, nHeight);