summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/inc/unx/gtk/gtkframe.hxx11
-rw-r--r--vcl/unx/gtk3/gtkframe.cxx44
2 files changed, 35 insertions, 20 deletions
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