diff options
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 11 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtkframe.cxx | 44 |
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 |