diff --git a/libs/gtkutil/window.h b/libs/gtkutil/window.h index ed6c5822..d40f5b7b 100644 --- a/libs/gtkutil/window.h +++ b/libs/gtkutil/window.h @@ -178,5 +178,41 @@ inline void WindowPositionTracker_exportString( const WindowPositionTracker& sel typedef ConstReferenceCaller1 WindowPositionTrackerExportStringCaller; +class WindowMaximizer +{ + GtkWindow* m_window; + int m_state; + Callback m_onMaximized; +public: + void connect( GtkWindow* window, int state, Callback&& onMaximized ){ + if( state & ( GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_FULLSCREEN ) ){ + m_window = window; + m_state = 0; + m_onMaximized = onMaximized; + g_signal_connect( G_OBJECT( window ), "window-state-event", G_CALLBACK( window_state_event ), this ); + if ( state & GDK_WINDOW_STATE_MAXIMIZED || + state & GDK_WINDOW_STATE_ICONIFIED ) { + gtk_window_maximize( window ); + m_state |= GDK_WINDOW_STATE_MAXIMIZED; + } + if ( state & GDK_WINDOW_STATE_FULLSCREEN ) { + gtk_window_fullscreen( window ); + m_state |= GDK_WINDOW_STATE_FULLSCREEN; + } + } + else{ + onMaximized(); + } + } + static gboolean window_state_event( GtkWidget* widget, GdkEvent* event, WindowMaximizer* self ){ + if( ( ( (GdkEventWindowState*)event )->new_window_state & self->m_state ) == self->m_state ){ + g_signal_handlers_disconnect_by_data( G_OBJECT( self->m_window ), self ); + self->m_onMaximized(); + } + return FALSE; + } +}; + + #endif diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 14e733a6..00cd27b5 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -3315,14 +3315,12 @@ void MainFrame::Create(){ EverySecondTimer_enable(); - if ( g_layout_globals.nState & GDK_WINDOW_STATE_MAXIMIZED || - g_layout_globals.nState & GDK_WINDOW_STATE_ICONIFIED ) { - gtk_window_maximize( window ); - } - if ( g_layout_globals.nState & GDK_WINDOW_STATE_FULLSCREEN ) { - gtk_window_fullscreen( window ); - } + m_windowMaximizer.connect( window, g_layout_globals.nState, MemberCaller( *this ) ); + //GlobalShortcuts_reportUnregistered(); +} + +void MainFrame::SetWindowInfo(){ if ( !FloatingGroupDialog() ) { gtk_paned_set_position( GTK_PANED( m_vSplit ), g_layout_globals.nXYHeight ); @@ -3336,7 +3334,6 @@ void MainFrame::Create(){ gtk_paned_set_position( GTK_PANED( m_vSplit2 ), g_layout_globals.nCamHeight ); } - //GlobalShortcuts_reportUnregistered(); } void MainFrame::SaveWindowInfo(){ diff --git a/radiant/mainframe.h b/radiant/mainframe.h index 15238367..7d1e1f70 100644 --- a/radiant/mainframe.h +++ b/radiant/mainframe.h @@ -67,6 +67,7 @@ GtkWindow* m_window; private: void Create(); +void SetWindowInfo(); void SaveWindowInfo(); void Shutdown(); @@ -90,6 +91,7 @@ GtkWidget *m_statusLabel[c_status__count]; EViewStyle m_nCurrentStyle; WindowPositionTracker m_position_tracker; +WindowMaximizer m_windowMaximizer; IdleDraw m_idleRedrawStatusText;