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

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Jun 24 19:45:53 UTC 2021


 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 <caolanm at redhat.com>
AuthorDate: Thu Jun 24 12:39:00 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
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 <caolanm at redhat.com>

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


More information about the Libreoffice-commits mailing list