vcl/inc/unx/gtk/gtkframe.hxx | 11 ++++++---- vcl/unx/gtk3/gtkframe.cxx | 44 +++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 20 deletions(-)
New commits: commit ab25ca5f2fddf07a5790fc4a397ef758bbc31c62 Author: Caolán McNamara <[email protected]> AuthorDate: Thu Jun 24 12:39:00 2021 +0100 Commit: Caolán McNamara <[email protected]> CommitDate: Thu Jun 24 21:44:54 2021 +0200 gtk4: track underlying surface state for maximized/minimized Change-Id: Ia62d12f367555b409cb2a6ed491f65dca34baed3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117784 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 7d612f077d3f..57005e89a64e 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -306,10 +306,10 @@ class GtkSalFrame final : public SalFrame bool DrawingAreaKey(SalEvent nEventType, guint keyval, guint keycode, guint32 nTime, guint nState); void DrawingAreaScroll(double delta_x, double delta_y, int nEventX, int nEventY, guint32 nTime, guint nState); #if GTK_CHECK_VERSION(4, 0, 0) - static void signalMap( GtkWidget*, gpointer ); - static void signalUnmap( GtkWidget*, gpointer ); + static void signalMap(GtkWidget*, gpointer); + static void signalUnmap(GtkWidget*, gpointer); - static gboolean signalDelete( GtkWidget*, gpointer ); + static gboolean signalDelete(GtkWidget*, gpointer); static void signalMotion(GtkEventControllerMotion *controller, double x, double y, gpointer); @@ -320,6 +320,8 @@ class GtkSalFrame final : public SalFrame static gboolean signalKeyPressed(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer); static gboolean signalKeyReleased(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer); + + static void signalWindowState(GdkToplevel*, GParamSpec*, gpointer); #else static gboolean signalMap( GtkWidget*, GdkEvent*, gpointer ); static gboolean signalUnmap( GtkWidget*, GdkEvent*, gpointer ); @@ -333,10 +335,11 @@ class GtkSalFrame final : public SalFrame static gboolean signalCrossing( GtkWidget*, GdkEventCrossing*, gpointer ); static gboolean signalKey( GtkWidget*, GdkEventKey*, gpointer ); + + static gboolean signalWindowState( GtkWidget*, GdkEvent*, gpointer ); #endif #if !GTK_CHECK_VERSION(4, 0, 0) static gboolean signalConfigure( GtkWidget*, GdkEventConfigure*, gpointer ); - static gboolean signalWindowState( GtkWidget*, GdkEvent*, gpointer ); #endif static void signalDestroy( GtkWidget*, gpointer ); diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx index 519837c75a4e..02455ed0edb5 100644 --- a/vcl/unx/gtk3/gtkframe.cxx +++ b/vcl/unx/gtk3/gtkframe.cxx @@ -1055,8 +1055,8 @@ void GtkSalFrame::InitCommon() #endif #if !GTK_CHECK_VERSION(4,0,0) g_signal_connect( G_OBJECT(m_pWindow), "configure-event", G_CALLBACK(signalConfigure), this ); - g_signal_connect( G_OBJECT(m_pWindow), "window-state-event", G_CALLBACK(signalWindowState), this ); #endif + #if !GTK_CHECK_VERSION(4,0,0) g_signal_connect( G_OBJECT(m_pWindow), "key-press-event", G_CALLBACK(signalKey), this ); g_signal_connect( G_OBJECT(m_pWindow), "key-release-event", G_CALLBACK(signalKey), this ); @@ -1110,6 +1110,13 @@ void GtkSalFrame::InitCommon() // realize the window, we need an XWindow id gtk_widget_realize( m_pWindow ); +#if !GTK_CHECK_VERSION(4,0,0) + g_signal_connect(G_OBJECT(m_pWindow), "window-state-event", G_CALLBACK(signalWindowState), this); +#else + GdkSurface* gdkWindow = widget_get_surface(m_pWindow); + g_signal_connect(G_OBJECT(gdkWindow), "notify::state", G_CALLBACK(signalWindowState), this); +#endif + //system data m_aSystemData.SetWindowHandle(GetNativeWindowHandle(m_pWindow)); m_aSystemData.aShellWindow = reinterpret_cast<sal_IntPtr>(this); @@ -4144,32 +4151,37 @@ gboolean GtkSalFrame::signalWindowState( GtkWidget*, GdkEvent* pEvent, gpointer pThis->m_aRestorePosSize = GetPosAndSize(GTK_WINDOW(pThis->m_pWindow)); } -#if !GTK_CHECK_VERSION(4,0,0) if ((pEvent->window_state.new_window_state & GDK_WINDOW_STATE_WITHDRAWN) && !(pThis->m_nState & GDK_WINDOW_STATE_WITHDRAWN)) { if (pThis->isFloatGrabWindow()) pThis->closePopup(); } -#endif pThis->m_nState = pEvent->window_state.new_window_state; -#if OSL_DEBUG_LEVEL > 1 - SAL_INFO_IF((pEvent->window_state.changed_mask & - GDK_WINDOW_STATE_FULLSCREEN), - "vcl.gtk3", "window " - << pThis - << " " - << ((pEvent->window_state.new_window_state & - GDK_WINDOW_STATE_FULLSCREEN) ? - "enters" : - "leaves") - << " full screen state."); -#endif - return false; } +#else +void GtkSalFrame::signalWindowState(GdkToplevel* pSurface, GParamSpec*, gpointer frame) +{ + GdkToplevelState eNewWindowState = gdk_toplevel_get_state(pSurface); + + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); + if( (pThis->m_nState & GDK_TOPLEVEL_STATE_MINIMIZED) != (eNewWindowState & GDK_TOPLEVEL_STATE_MINIMIZED) ) + { + GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::Resize ); + pThis->TriggerPaintEvent(); + } + + if ((eNewWindowState & GDK_TOPLEVEL_STATE_MAXIMIZED) && + !(pThis->m_nState & GDK_TOPLEVEL_STATE_MAXIMIZED)) + { + pThis->m_aRestorePosSize = GetPosAndSize(GTK_WINDOW(pThis->m_pWindow)); + } + + pThis->m_nState = eNewWindowState; +} #endif namespace _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
