]> git.saurik.com Git - wxWidgets.git/commitdiff
Next try at avoiding too few or too many size events.
authorRobert Roebling <robert@roebling.de>
Sat, 15 Jan 2000 20:06:47 +0000 (20:06 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 15 Jan 2000 20:06:47 +0000 (20:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5424 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
include/wx/gtk/scrolbar.h
include/wx/gtk/window.h
include/wx/gtk1/scrolbar.h
include/wx/gtk1/window.h
src/gtk/dialog.cpp
src/gtk/frame.cpp
src/gtk/scrolbar.cpp
src/gtk/slider.cpp
src/gtk/window.cpp
src/gtk1/dialog.cpp
src/gtk1/frame.cpp
src/gtk1/scrolbar.cpp
src/gtk1/slider.cpp
src/gtk1/window.cpp

index 612c37afae2fda5d46acce2d88aafa80bbaa41a8..0ebb6385e8ea2a2496b96836e633e55f48241560 100644 (file)
@@ -87,6 +87,7 @@ public:
   
     GtkAdjustment  *m_adjust;
     float           m_oldPos;
+    bool            m_isScrolling;
     
 private:
     DECLARE_DYNAMIC_CLASS(wxScrollBar)
index 18f6a1abc0494cffe2aebba0d58d964f6f11b4d8..0d7b776376396f71ce682233dc2d9b52acf8dc23 100644 (file)
@@ -106,12 +106,6 @@ public:
 
     virtual WXWidget GetHandle() const { return m_widget; }
 
-    // also sets the global flag
-    void SetScrolling(bool scroll);
-
-    bool HasScrolling() const { return m_hasScrolling; }
-    bool IsScrolling() const { return m_isScrolling; }
-
     /* I don't want users to override what's done in idle so everything that
        has to be done in idle time in order for wxGTK to work is done in
        OnInternalIdle */
@@ -157,11 +151,12 @@ public:
     // called from GTK signales handlers. it indicates that
     // the layouting functions have to be called later on
     // (i.e. in idle time, implemented in OnInternalIdle() ).
-    void UpdateSize() { m_sizeSet = FALSE; }
+    void GtkUpdateSize() { m_sizeSet = FALSE; }
 
     // position and size of the window
     int                  m_x, m_y;
     int                  m_width, m_height;
+    int                  m_oldClientWidth,m_oldClientHeight;
 
     /* see the docs in src/gtk/window.cpp */
     GtkWidget           *m_widget;
@@ -183,7 +178,6 @@ public:
     bool                 m_noExpose:1;          /* wxGLCanvas has its own redrawing */
     bool                 m_nativeSizeEvent:1;   /* wxGLCanvas sends wxSizeEvent upon "alloc_size" */
     bool                 m_hasScrolling:1;
-    bool                 m_isScrolling:1;
     bool                 m_hasVMT:1;
     bool                 m_sizeSet:1;
     bool                 m_resizing:1;
@@ -195,7 +189,6 @@ public:
     // these are true if the style were set before the widget was realized
     // (typcally in the constructor) but the actual GTK style must not be set
     // before the widget has been "realized"
-    bool                 m_delayedFont:1;
     bool                 m_delayedForegroundColour:1;
     bool                 m_delayedBackgroundColour:1;
     
index 612c37afae2fda5d46acce2d88aafa80bbaa41a8..0ebb6385e8ea2a2496b96836e633e55f48241560 100644 (file)
@@ -87,6 +87,7 @@ public:
   
     GtkAdjustment  *m_adjust;
     float           m_oldPos;
+    bool            m_isScrolling;
     
 private:
     DECLARE_DYNAMIC_CLASS(wxScrollBar)
index 18f6a1abc0494cffe2aebba0d58d964f6f11b4d8..0d7b776376396f71ce682233dc2d9b52acf8dc23 100644 (file)
@@ -106,12 +106,6 @@ public:
 
     virtual WXWidget GetHandle() const { return m_widget; }
 
-    // also sets the global flag
-    void SetScrolling(bool scroll);
-
-    bool HasScrolling() const { return m_hasScrolling; }
-    bool IsScrolling() const { return m_isScrolling; }
-
     /* I don't want users to override what's done in idle so everything that
        has to be done in idle time in order for wxGTK to work is done in
        OnInternalIdle */
@@ -157,11 +151,12 @@ public:
     // called from GTK signales handlers. it indicates that
     // the layouting functions have to be called later on
     // (i.e. in idle time, implemented in OnInternalIdle() ).
-    void UpdateSize() { m_sizeSet = FALSE; }
+    void GtkUpdateSize() { m_sizeSet = FALSE; }
 
     // position and size of the window
     int                  m_x, m_y;
     int                  m_width, m_height;
+    int                  m_oldClientWidth,m_oldClientHeight;
 
     /* see the docs in src/gtk/window.cpp */
     GtkWidget           *m_widget;
@@ -183,7 +178,6 @@ public:
     bool                 m_noExpose:1;          /* wxGLCanvas has its own redrawing */
     bool                 m_nativeSizeEvent:1;   /* wxGLCanvas sends wxSizeEvent upon "alloc_size" */
     bool                 m_hasScrolling:1;
-    bool                 m_isScrolling:1;
     bool                 m_hasVMT:1;
     bool                 m_sizeSet:1;
     bool                 m_resizing:1;
@@ -195,7 +189,6 @@ public:
     // these are true if the style were set before the widget was realized
     // (typcally in the constructor) but the actual GTK style must not be set
     // before the widget has been "realized"
-    bool                 m_delayedFont:1;
     bool                 m_delayedForegroundColour:1;
     bool                 m_delayedBackgroundColour:1;
     
index 6da4337b2e8e3060bc62ded2f4860e4b4605024b..fbc1793ea980c1300ac7bed65564476717d7ff9c 100644 (file)
@@ -79,7 +79,7 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation
     {
         win->m_width = alloc->width;
         win->m_height = alloc->height;
-        win->UpdateSize();
+        win->GtkUpdateSize();
     }
 }
 
index fe6aa5e445aa7f4bfc12bd2e179b83510e0fd848..90a7b955cd71bbe5d36fe6f38604a4302011aa04 100644 (file)
@@ -126,7 +126,7 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 
         win->m_width = alloc->width;
         win->m_height = alloc->height;
-        win->UpdateSize();
+        win->GtkUpdateSize();
     }
 }
 
@@ -154,7 +154,7 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
     if (!win->m_hasVMT) return;
 
     win->m_menuBarDetached = FALSE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 //-----------------------------------------------------------------------------
@@ -166,7 +166,7 @@ static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
     if (!win->m_hasVMT) return;
 
     win->m_menuBarDetached = TRUE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 #if wxUSE_TOOLBAR
@@ -180,7 +180,7 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
 
     win->m_toolBarDetached = FALSE;
 
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 //-----------------------------------------------------------------------------
@@ -195,7 +195,7 @@ static void gtk_toolbar_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
     if (!win->m_hasVMT) return;
 
     win->m_toolBarDetached = TRUE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 #endif // wxUSE_TOOLBAR
 
@@ -386,7 +386,7 @@ static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child )
     }
 
     /* resize on OnInternalIdle */
-    parent->UpdateSize();
+    parent->GtkUpdateSize();
 }
 
 // ----------------------------------------------------------------------------
@@ -963,7 +963,7 @@ void wxFrame::SetToolBar(wxToolBar *toolbar)
             GetChildren().DeleteObject( m_frameToolBar );
 
             gtk_widget_reparent( m_frameToolBar->m_widget, m_mainWidget );
-            UpdateSize();
+            GtkUpdateSize();
         }
     }
 }
index 09888e60cd577040e983b46beb6a9589a77f0f84..b7d24b34605cea63cf85724c4b05e96b72ba3e6f 100644 (file)
@@ -88,7 +88,7 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-    win->SetScrolling(TRUE);
+    win->m_isScrolling = TRUE;
 //  g_blockEventsOnScroll = TRUE;  doesn't work in DialogEd
   
     return FALSE;
@@ -104,7 +104,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-    win->SetScrolling(FALSE);
+    win->m_isScrolling = FALSE;
 //  g_blockEventsOnScroll = FALSE;
   
     gtk_signal_emit_by_name( GTK_OBJECT(win->m_adjust), "value_changed" );
index bd6f84a6c4c32dd19db5c22e63fdeb667184f991..778407f9ed37f533f95942e48dd643049b4e8dbe 100644 (file)
@@ -94,7 +94,7 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxSlider creation failed") );
-       return FALSE;
+           return FALSE;
     }
 
     m_oldPos = 0.0;
index c1ff0e8e86a4703c668568deff53a50dddef1949..a3774d64d7c3ced8edbbf53cf1ac16747d27538a 100644 (file)
@@ -301,7 +301,7 @@ static void draw_frame( GtkWidget *widget, wxWindow *win )
     int dw = 0;
     int dh = 0;
 
-    if (win->HasScrolling())
+    if (win->m_hasScrolling)
     {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
             
@@ -1639,7 +1639,7 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
 //
 //    if (gdk_event->window != widget->slider) return FALSE;
 
-    win->SetScrolling( TRUE );
+    g_blockEventsOnScroll = TRUE;
 
     return FALSE;
 }
@@ -1660,7 +1660,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
 //
 //    if (gdk_event->window != widget->slider) return FALSE;
 
-    win->SetScrolling( FALSE );
+    g_blockEventsOnScroll = FALSE;
 
     return FALSE;
 }
@@ -1715,10 +1715,23 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
     if (g_isIdle)
         wxapp_install_idle_handler();
     
-#if wxUSE_CONSTRAINTS
-    if (win->GetAutoLayout())
-        win->Layout();
-#endif
+    if (!win->m_hasScrolling) return;
+    
+    int client_width = 0;
+    int client_height = 0;
+    win->GetClientSize( &client_width, &client_height );
+    if ((client_width == win->m_oldClientWidth) && (client_height == win->m_oldClientHeight))
+        return;
+        
+    win->m_oldClientWidth = client_width;
+    win->m_oldClientHeight = client_height;
+    
+    if (!win->m_nativeSizeEvent)
+    {
+        wxSizeEvent event( win->GetSize(), win->GetId() );
+        event.SetEventObject( win );
+        win->GetEventHandler()->ProcessEvent( event );
+    }
 }
 
 
@@ -1913,7 +1926,6 @@ void wxWindow::Init()
     m_nativeSizeEvent = FALSE;
 
     m_hasScrolling = FALSE;
-    m_isScrolling = FALSE;
 
     m_hAdjust = (GtkAdjustment*) NULL;
     m_vAdjust = (GtkAdjustment*) NULL;
@@ -2346,6 +2358,11 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
                       m_height+border+bottom_border );
     }
 
+    if (m_hasScrolling)
+    {
+        GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
+    }
+
 /*
     wxPrintf( "OnSize sent from " );
     if (GetClassInfo() && GetClassInfo()->GetClassName())
@@ -2449,7 +2466,7 @@ void wxWindow::DoSetClientSize( int width, int height )
             dh += 1 * 2;
         }
 
-        if (HasScrolling())
+        if (m_hasScrolling)
         {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             
@@ -2511,7 +2528,7 @@ void wxWindow::DoGetClientSize( int *width, int *height ) const
             dh += 1 * 2;
         }
 
-        if (HasScrolling())
+        if (m_hasScrolling)
         {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             
@@ -3317,20 +3334,13 @@ void wxWindow::SetScrollPos( int orient, int pos, bool WXUNUSED(refresh) )
         m_vAdjust->value = fpos;
     }
 
-/*
-    if (!m_isScrolling)
+    if (m_wxwindow->window)
     {
-*/
-        if (m_wxwindow->window)
-        {
-            if (orient == wxHORIZONTAL)
-                gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" );
-            else
-                gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
-        }
-/*
+        if (orient == wxHORIZONTAL)
+            gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" );
+        else
+            gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
     }
-*/
 }
 
 int wxWindow::GetScrollThumb( int orient ) const
@@ -3433,8 +3443,3 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     }
 */
 }
-
-void wxWindow::SetScrolling(bool scroll)
-{
-    m_isScrolling = g_blockEventsOnScroll = scroll;
-}
index 6da4337b2e8e3060bc62ded2f4860e4b4605024b..fbc1793ea980c1300ac7bed65564476717d7ff9c 100644 (file)
@@ -79,7 +79,7 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation
     {
         win->m_width = alloc->width;
         win->m_height = alloc->height;
-        win->UpdateSize();
+        win->GtkUpdateSize();
     }
 }
 
index fe6aa5e445aa7f4bfc12bd2e179b83510e0fd848..90a7b955cd71bbe5d36fe6f38604a4302011aa04 100644 (file)
@@ -126,7 +126,7 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 
         win->m_width = alloc->width;
         win->m_height = alloc->height;
-        win->UpdateSize();
+        win->GtkUpdateSize();
     }
 }
 
@@ -154,7 +154,7 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
     if (!win->m_hasVMT) return;
 
     win->m_menuBarDetached = FALSE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 //-----------------------------------------------------------------------------
@@ -166,7 +166,7 @@ static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
     if (!win->m_hasVMT) return;
 
     win->m_menuBarDetached = TRUE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 #if wxUSE_TOOLBAR
@@ -180,7 +180,7 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
 
     win->m_toolBarDetached = FALSE;
 
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 
 //-----------------------------------------------------------------------------
@@ -195,7 +195,7 @@ static void gtk_toolbar_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
     if (!win->m_hasVMT) return;
 
     win->m_toolBarDetached = TRUE;
-    win->UpdateSize();
+    win->GtkUpdateSize();
 }
 #endif // wxUSE_TOOLBAR
 
@@ -386,7 +386,7 @@ static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child )
     }
 
     /* resize on OnInternalIdle */
-    parent->UpdateSize();
+    parent->GtkUpdateSize();
 }
 
 // ----------------------------------------------------------------------------
@@ -963,7 +963,7 @@ void wxFrame::SetToolBar(wxToolBar *toolbar)
             GetChildren().DeleteObject( m_frameToolBar );
 
             gtk_widget_reparent( m_frameToolBar->m_widget, m_mainWidget );
-            UpdateSize();
+            GtkUpdateSize();
         }
     }
 }
index 09888e60cd577040e983b46beb6a9589a77f0f84..b7d24b34605cea63cf85724c4b05e96b72ba3e6f 100644 (file)
@@ -88,7 +88,7 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-    win->SetScrolling(TRUE);
+    win->m_isScrolling = TRUE;
 //  g_blockEventsOnScroll = TRUE;  doesn't work in DialogEd
   
     return FALSE;
@@ -104,7 +104,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-    win->SetScrolling(FALSE);
+    win->m_isScrolling = FALSE;
 //  g_blockEventsOnScroll = FALSE;
   
     gtk_signal_emit_by_name( GTK_OBJECT(win->m_adjust), "value_changed" );
index bd6f84a6c4c32dd19db5c22e63fdeb667184f991..778407f9ed37f533f95942e48dd643049b4e8dbe 100644 (file)
@@ -94,7 +94,7 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
         !CreateBase( parent, id, pos, size, style, validator, name ))
     {
         wxFAIL_MSG( wxT("wxSlider creation failed") );
-       return FALSE;
+           return FALSE;
     }
 
     m_oldPos = 0.0;
index c1ff0e8e86a4703c668568deff53a50dddef1949..a3774d64d7c3ced8edbbf53cf1ac16747d27538a 100644 (file)
@@ -301,7 +301,7 @@ static void draw_frame( GtkWidget *widget, wxWindow *win )
     int dw = 0;
     int dh = 0;
 
-    if (win->HasScrolling())
+    if (win->m_hasScrolling)
     {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
             
@@ -1639,7 +1639,7 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
 //
 //    if (gdk_event->window != widget->slider) return FALSE;
 
-    win->SetScrolling( TRUE );
+    g_blockEventsOnScroll = TRUE;
 
     return FALSE;
 }
@@ -1660,7 +1660,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
 //
 //    if (gdk_event->window != widget->slider) return FALSE;
 
-    win->SetScrolling( FALSE );
+    g_blockEventsOnScroll = FALSE;
 
     return FALSE;
 }
@@ -1715,10 +1715,23 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
     if (g_isIdle)
         wxapp_install_idle_handler();
     
-#if wxUSE_CONSTRAINTS
-    if (win->GetAutoLayout())
-        win->Layout();
-#endif
+    if (!win->m_hasScrolling) return;
+    
+    int client_width = 0;
+    int client_height = 0;
+    win->GetClientSize( &client_width, &client_height );
+    if ((client_width == win->m_oldClientWidth) && (client_height == win->m_oldClientHeight))
+        return;
+        
+    win->m_oldClientWidth = client_width;
+    win->m_oldClientHeight = client_height;
+    
+    if (!win->m_nativeSizeEvent)
+    {
+        wxSizeEvent event( win->GetSize(), win->GetId() );
+        event.SetEventObject( win );
+        win->GetEventHandler()->ProcessEvent( event );
+    }
 }
 
 
@@ -1913,7 +1926,6 @@ void wxWindow::Init()
     m_nativeSizeEvent = FALSE;
 
     m_hasScrolling = FALSE;
-    m_isScrolling = FALSE;
 
     m_hAdjust = (GtkAdjustment*) NULL;
     m_vAdjust = (GtkAdjustment*) NULL;
@@ -2346,6 +2358,11 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
                       m_height+border+bottom_border );
     }
 
+    if (m_hasScrolling)
+    {
+        GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
+    }
+
 /*
     wxPrintf( "OnSize sent from " );
     if (GetClassInfo() && GetClassInfo()->GetClassName())
@@ -2449,7 +2466,7 @@ void wxWindow::DoSetClientSize( int width, int height )
             dh += 1 * 2;
         }
 
-        if (HasScrolling())
+        if (m_hasScrolling)
         {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             
@@ -2511,7 +2528,7 @@ void wxWindow::DoGetClientSize( int *width, int *height ) const
             dh += 1 * 2;
         }
 
-        if (HasScrolling())
+        if (m_hasScrolling)
         {
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             
@@ -3317,20 +3334,13 @@ void wxWindow::SetScrollPos( int orient, int pos, bool WXUNUSED(refresh) )
         m_vAdjust->value = fpos;
     }
 
-/*
-    if (!m_isScrolling)
+    if (m_wxwindow->window)
     {
-*/
-        if (m_wxwindow->window)
-        {
-            if (orient == wxHORIZONTAL)
-                gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" );
-            else
-                gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
-        }
-/*
+        if (orient == wxHORIZONTAL)
+            gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" );
+        else
+            gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
     }
-*/
 }
 
 int wxWindow::GetScrollThumb( int orient ) const
@@ -3433,8 +3443,3 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     }
 */
 }
-
-void wxWindow::SetScrolling(bool scroll)
-{
-    m_isScrolling = g_blockEventsOnScroll = scroll;
-}