]> git.saurik.com Git - wxWidgets.git/commitdiff
Some make corrections for HP and related,
authorRobert Roebling <robert@roebling.de>
Thu, 9 Mar 2000 13:24:34 +0000 (13:24 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 9 Mar 2000 13:24:34 +0000 (13:24 +0000)
  Changed refresh order so that window-less widgets
    don't get overdrawn anymore,
  Prevent GTK from filtering our supposedly unneeded
    expose events,
  Block all expose calls if a resize is requested and
    do a full redraw then, thus removing flicker and
    behaving like wxMSW,
  Moved some doubled expose and draw code from GtkPizza
    to the respective callbacks in window.cpp,
  Set idle priority to a higher value (which should
    indicate a lower priority if I interpret glib.h
    correctly) but the desired side-effect didn't
    really show up.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6533 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

21 files changed:
Makefile.in
configure.in
include/wx/gtk/win_gtk.h
include/wx/gtk/window.h
include/wx/gtk1/win_gtk.h
include/wx/gtk1/window.h
samples/caret/caret.cpp
samples/help/demo.cpp
samples/html/about/about.cpp
samples/html/test/test.cpp
src/generic/filedlgg.cpp
src/gtk/app.cpp
src/gtk/dcclient.cpp
src/gtk/frame.cpp
src/gtk/win_gtk.c
src/gtk/window.cpp
src/gtk1/app.cpp
src/gtk1/dcclient.cpp
src/gtk1/frame.cpp
src/gtk1/win_gtk.c
src/gtk1/window.cpp

index 338b740dd5af91d04ae367d2e1c72df4087ccb52..c3e5994dec01eb6153ab1b50a1cfe1c86be76dcf 100644 (file)
@@ -751,6 +751,7 @@ SAMPLES_DIST: ALL_GUI_DIST
        cp $(SAMPDIR)/drawing/makefile.unx $(DISTDIR)/samples/drawing
        cp $(SAMPDIR)/drawing/*.cpp $(DISTDIR)/samples/drawing
        cp $(SAMPDIR)/drawing/*.xpm $(DISTDIR)/samples/drawing
        cp $(SAMPDIR)/drawing/makefile.unx $(DISTDIR)/samples/drawing
        cp $(SAMPDIR)/drawing/*.cpp $(DISTDIR)/samples/drawing
        cp $(SAMPDIR)/drawing/*.xpm $(DISTDIR)/samples/drawing
+       cp $(SAMPDIR)/drawing/*.bmp $(DISTDIR)/samples/drawing
 
        mkdir $(DISTDIR)/samples/dynamic
        cp $(SAMPDIR)/dynamic/Makefile.in $(DISTDIR)/samples/dynamic
 
        mkdir $(DISTDIR)/samples/dynamic
        cp $(SAMPDIR)/dynamic/Makefile.in $(DISTDIR)/samples/dynamic
@@ -806,6 +807,7 @@ SAMPLES_DIST: ALL_GUI_DIST
        cp $(SAMPDIR)/html/test/*.cpp $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.bmp $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.png $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.cpp $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.bmp $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.png $(DISTDIR)/samples/html/test
+       cp $(SAMPDIR)/html/test/*.gif $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.htm $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.html $(DISTDIR)/samples/html/test
        mkdir $(DISTDIR)/samples/html/virtual
        cp $(SAMPDIR)/html/test/*.htm $(DISTDIR)/samples/html/test
        cp $(SAMPDIR)/html/test/*.html $(DISTDIR)/samples/html/test
        mkdir $(DISTDIR)/samples/html/virtual
@@ -839,10 +841,10 @@ SAMPLES_DIST: ALL_GUI_DIST
        cp $(SAMPDIR)/internat/*.xpm $(DISTDIR)/samples/internat
        cp $(SAMPDIR)/internat/*.txt $(DISTDIR)/samples/internat
        cp $(SAMPDIR)/internat/*.po $(DISTDIR)/samples/internat
        cp $(SAMPDIR)/internat/*.xpm $(DISTDIR)/samples/internat
        cp $(SAMPDIR)/internat/*.txt $(DISTDIR)/samples/internat
        cp $(SAMPDIR)/internat/*.po $(DISTDIR)/samples/internat
-       cp $(SAMPDIR)/internat/fr/*.po $(DISTDIR)/samples/internat/fr
+       cp $(SAMPDIR)/internat/fr/*.mo $(DISTDIR)/samples/internat/fr
        cp $(SAMPDIR)/internat/de/*.mo $(DISTDIR)/samples/internat/de
        cp $(SAMPDIR)/internat/fr/*.po $(DISTDIR)/samples/internat/fr
        cp $(SAMPDIR)/internat/de/*.mo $(DISTDIR)/samples/internat/de
        cp $(SAMPDIR)/internat/fr/*.po $(DISTDIR)/samples/internat/fr
-       cp $(SAMPDIR)/internat/de/*.mo $(DISTDIR)/samples/internat/de
+       cp $(SAMPDIR)/internat/de/*.po $(DISTDIR)/samples/internat/de
 
        mkdir $(DISTDIR)/samples/ipc
        cp $(SAMPDIR)/ipc/Makefile.in $(DISTDIR)/samples/ipc
 
        mkdir $(DISTDIR)/samples/ipc
        cp $(SAMPDIR)/ipc/Makefile.in $(DISTDIR)/samples/ipc
index 9e995e02e491953f25870ac152745e1b53ac06f0..4aa404df89049805bbed15e28b827bd3640f2e81 100644 (file)
@@ -51,6 +51,7 @@ dnl
 #include <gtk/gtk.h>
 #include <gtk/gtkfeatures.h>
 #include <stdio.h>
 #include <gtk/gtk.h>
 #include <gtk/gtkfeatures.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 int
 main ()
 
 int
 main ()
index b4bd331726536463cf773a4604ba21e2bbebaf8d..afede32a492d034ab2a054c08089836ce6cc092c 100644 (file)
@@ -33,9 +33,19 @@ typedef enum
     GTK_MYSHADOW_OUT
 } GtkMyShadowType;
 
     GTK_MYSHADOW_OUT
 } GtkMyShadowType;
 
+typedef struct _GtkPizzaChild    GtkPizzaChild;
 typedef struct _GtkPizza        GtkPizza;
 typedef struct _GtkPizzaClass   GtkPizzaClass;
 
 typedef struct _GtkPizza        GtkPizza;
 typedef struct _GtkPizzaClass   GtkPizzaClass;
 
+struct _GtkPizzaChild
+{
+    GtkWidget *widget;
+    gint x;
+    gint y;
+    gint width;
+    gint height;
+};
+
 struct _GtkPizza
 {
     GtkContainer container;
 struct _GtkPizza
 {
     GtkContainer container;
index 302d12e95fca18f157241a75afd2004a92f431f6..914a9a045a667bcd578af88e35be517993c15754 100644 (file)
@@ -186,6 +186,8 @@ public:
     bool                 m_isFrame:1;        /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;   /* not wxStaticBox, not wxStaticBitmap etc.  */
     bool                 m_isScrolling;
     bool                 m_isFrame:1;        /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;   /* not wxStaticBox, not wxStaticBitmap etc.  */
     bool                 m_isScrolling;
+    bool                 m_clipPaintRegion;  /* TRUE after ScrollWindow() */
+    bool                 m_queuedFullRedraw; /* TRUE after DoMoveWindow */
 
     // 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
 
     // 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
index b4bd331726536463cf773a4604ba21e2bbebaf8d..afede32a492d034ab2a054c08089836ce6cc092c 100644 (file)
@@ -33,9 +33,19 @@ typedef enum
     GTK_MYSHADOW_OUT
 } GtkMyShadowType;
 
     GTK_MYSHADOW_OUT
 } GtkMyShadowType;
 
+typedef struct _GtkPizzaChild    GtkPizzaChild;
 typedef struct _GtkPizza        GtkPizza;
 typedef struct _GtkPizzaClass   GtkPizzaClass;
 
 typedef struct _GtkPizza        GtkPizza;
 typedef struct _GtkPizzaClass   GtkPizzaClass;
 
+struct _GtkPizzaChild
+{
+    GtkWidget *widget;
+    gint x;
+    gint y;
+    gint width;
+    gint height;
+};
+
 struct _GtkPizza
 {
     GtkContainer container;
 struct _GtkPizza
 {
     GtkContainer container;
index 302d12e95fca18f157241a75afd2004a92f431f6..914a9a045a667bcd578af88e35be517993c15754 100644 (file)
@@ -186,6 +186,8 @@ public:
     bool                 m_isFrame:1;        /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;   /* not wxStaticBox, not wxStaticBitmap etc.  */
     bool                 m_isScrolling;
     bool                 m_isFrame:1;        /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;   /* not wxStaticBox, not wxStaticBitmap etc.  */
     bool                 m_isScrolling;
+    bool                 m_clipPaintRegion;  /* TRUE after ScrollWindow() */
+    bool                 m_queuedFullRedraw; /* TRUE after DoMoveWindow */
 
     // 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
 
     // 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
index 5e41c55f79f487e1f6363b487371cf8ffbad0ddc..a1c9367a74404a62403ee0e45d1135b650531f08 100644 (file)
@@ -128,7 +128,7 @@ enum
     Minimal_Test2,
 
     // controls start here (the numbers are, of course, arbitrary)
     Minimal_Test2,
 
     // controls start here (the numbers are, of course, arbitrary)
-    Minimal_Text = 1000,
+    Minimal_Text = 1000
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
index a27dfef41a0de068d52f9e8b7198718d62b9d6b2..35778a46949399045fc404e18e8780fa2d3c30e1 100644 (file)
@@ -127,7 +127,7 @@ enum
     HelpDemo_Help_GNOME,
     HelpDemo_Help_Netscape,
     // controls start here (the numbers are, of course, arbitrary)
     HelpDemo_Help_GNOME,
     HelpDemo_Help_Netscape,
     // controls start here (the numbers are, of course, arbitrary)
-    HelpDemo_Text = 1000,
+    HelpDemo_Text = 1000
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
index f4c03cfeb67d5104afc79a01a614da8b34f27d00..a97c5e58c3854750d850715dc6c4d5762302a761 100644 (file)
@@ -74,7 +74,7 @@
    Minimal_Forward,
 
     // controls start here (the numbers are, of course, arbitrary)
    Minimal_Forward,
 
     // controls start here (the numbers are, of course, arbitrary)
-   Minimal_Text = 1000,
+   Minimal_Text = 1000
    };
 
 // ----------------------------------------------------------------------------
    };
 
 // ----------------------------------------------------------------------------
index cfb493b4edf4f770e6ed0e9d4968b662feaf240e..a7130fcb7965383f688580cb1773a57e3e8a57f0 100644 (file)
@@ -75,7 +75,7 @@
    Minimal_Forward,
    
     // controls start here (the numbers are, of course, arbitrary)
    Minimal_Forward,
    
     // controls start here (the numbers are, of course, arbitrary)
-   Minimal_Text = 1000,
+   Minimal_Text = 1000
    };
 
 // ----------------------------------------------------------------------------
    };
 
 // ----------------------------------------------------------------------------
index 60b582dcfb475e9c4a96e89a6dca7bc1718bb74d..002683596536031d2ba4521b084a4fde503459c7 100644 (file)
@@ -928,9 +928,11 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
 
     Centre( wxBOTH );
 
 
     Centre( wxBOTH );
 
+/*
     if (m_fileName.IsEmpty())
         m_list->SetFocus();
     else
     if (m_fileName.IsEmpty())
         m_list->SetFocus();
     else
+*/
         m_text->SetFocus();
 
     wxEndBusyCursor();
         m_text->SetFocus();
 
     wxEndBusyCursor();
index b89d77cd5c779f47bfdfa004fb4b4eecaafcc484..ddeb9691a0d4387f8125e64a7feec6ac68d7a325 100644 (file)
@@ -95,8 +95,8 @@ bool wxYield()
 
     if (has_idle)
     {
 
     if (has_idle)
     {
-        /* re-add idle handler */
-        wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+        /* re-add idle handler (very low priority) */
+        wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL );
     }
 
     // disable log flushing from here because a call to wxYield() shouldn't
     }
 
     // disable log flushing from here because a call to wxYield() shouldn't
@@ -177,9 +177,9 @@ void wxapp_install_idle_handler()
        indicating that the idle is over. It may also
        get called from other thread for sending events
        to the main thread (and processing these in
        indicating that the idle is over. It may also
        get called from other thread for sending events
        to the main thread (and processing these in
-       idle time). */
+       idle time). Very low priority. */
 
 
-    wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+    wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL );
 
     g_isIdle = FALSE;
 }
 
     g_isIdle = FALSE;
 }
index 1dbaf55b39bcf3d0fe50e7709f878a9d90378b23..0e930e4cfff2c67194acc850d5ab548f57dce455 100644 (file)
@@ -2019,7 +2019,10 @@ wxPaintDC::wxPaintDC()
 wxPaintDC::wxPaintDC( wxWindow *win )
   : wxWindowDC( win )
 {
 wxPaintDC::wxPaintDC( wxWindow *win )
   : wxWindowDC( win )
 {
-#if USE_PAINT_REGION    
+#if USE_PAINT_REGION
+    if (!win->m_clipPaintRegion)
+        return;
+        
     m_paintClippingRegion = win->GetUpdateRegion();
     m_currentClippingRegion.Union( m_paintClippingRegion );
         
     m_paintClippingRegion = win->GetUpdateRegion();
     m_currentClippingRegion.Union( m_paintClippingRegion );
         
index 301a3b309da675ca8a07f0a69f6e1c6bc80cc00f..2bc208bcb46f880e68410c4b03a0175d312881e5 100644 (file)
@@ -834,6 +834,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
         gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
                             m_frameStatusBar->m_widget,
                             xx, yy, ww, hh );
         gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
                             m_frameStatusBar->m_widget,
                             xx, yy, ww, hh );
+        gtk_widget_draw( m_frameStatusBar->m_widget, (GdkRectangle*) NULL );
     }
 #endif
 
     }
 #endif
 
index f97158acf9f60c12a47a49c31db0a41ed6db6aee..7d5f7a92ad3deac7430eae83d4d4fc468712190b 100644 (file)
@@ -30,7 +30,6 @@ extern "C" {
                           (y >= G_MINSHORT) && (y <= G_MAXSHORT))
 
 typedef struct _GtkPizzaAdjData  GtkPizzaAdjData;
                           (y >= G_MINSHORT) && (y <= G_MAXSHORT))
 
 typedef struct _GtkPizzaAdjData  GtkPizzaAdjData;
-typedef struct _GtkPizzaChild    GtkPizzaChild;
 
 struct _GtkPizzaAdjData
 {
 
 struct _GtkPizzaAdjData
 {
@@ -38,22 +37,13 @@ struct _GtkPizzaAdjData
     gint dy;
 };
 
     gint dy;
 };
 
-struct _GtkPizzaChild
-{
-    GtkWidget *widget;
-    gint x;
-    gint y;
-    gint width;
-    gint height;
-};
-
-static void gtk_pizza_class_init      (GtkPizzaClass  *klass);
-static void gtk_pizza_init            (GtkPizza       *pizza);
+static void gtk_pizza_class_init    (GtkPizzaClass    *klass);
+static void gtk_pizza_init          (GtkPizza         *pizza);
 
 
-static void gtk_pizza_realize         (GtkWidget        *widget);
-static void gtk_pizza_unrealize       (GtkWidget        *widget);
+static void gtk_pizza_realize       (GtkWidget        *widget);
+static void gtk_pizza_unrealize     (GtkWidget        *widget);
 
 
-static void gtk_pizza_map             (GtkWidget        *widget);
+static void gtk_pizza_map           (GtkWidget        *widget);
 
 static void gtk_pizza_size_request  (GtkWidget        *widget,
                                      GtkRequisition   *requisition);
 
 static void gtk_pizza_size_request  (GtkWidget        *widget,
                                      GtkRequisition   *requisition);
@@ -67,42 +57,42 @@ static void gtk_pizza_add           (GtkContainer     *container,
                                      GtkWidget        *widget);
 static void gtk_pizza_remove        (GtkContainer     *container,
                                      GtkWidget        *widget);
                                      GtkWidget        *widget);
 static void gtk_pizza_remove        (GtkContainer     *container,
                                      GtkWidget        *widget);
-static void gtk_pizza_forall       (GtkContainer     *container,
-                                     gboolean              include_internals,
-                                     GtkCallback      callback,
-                                     gpointer         callback_data);
+static void gtk_pizza_forall        (GtkContainer     *container,
+                                     gboolean          include_internals,
+                                     GtkCallback       callback,
+                                     gpointer          callback_data);
 
 static void     gtk_pizza_position_child     (GtkPizza      *pizza,
 
 static void     gtk_pizza_position_child     (GtkPizza      *pizza,
-                                               GtkPizzaChild *child);
+                                              GtkPizzaChild *child);
 static void     gtk_pizza_allocate_child     (GtkPizza      *pizza,
 static void     gtk_pizza_allocate_child     (GtkPizza      *pizza,
-                                               GtkPizzaChild *child);
+                                              GtkPizzaChild *child);
 static void     gtk_pizza_position_children  (GtkPizza      *pizza);
 
 static void     gtk_pizza_adjust_allocations_recurse (GtkWidget *widget,
 static void     gtk_pizza_position_children  (GtkPizza      *pizza);
 
 static void     gtk_pizza_adjust_allocations_recurse (GtkWidget *widget,
-                                                       gpointer   cb_data);
-static void     gtk_pizza_adjust_allocations         (GtkPizza *pizza,
-                                                       gint       dx,
-                                                       gint       dy);
+                                                      gpointer   cb_data);
+static void     gtk_pizza_adjust_allocations         (GtkPizza  *pizza,
+                                                      gint       dx,
+                                                      gint       dy);
 
 
 
 
-static void     gtk_pizza_expose_area        (GtkPizza      *pizza,
-                                               gint            x,
-                                               gint            y,
-                                               gint            width,
-                                               gint            height);
+static void     gtk_pizza_expose_area        (GtkPizza       *pizza,
+                                              gint            x,
+                                              gint            y,
+                                              gint            width,
+                                              gint            height);
 static void     gtk_pizza_adjustment_changed (GtkAdjustment  *adjustment,
 static void     gtk_pizza_adjustment_changed (GtkAdjustment  *adjustment,
-                                               GtkPizza      *pizza);
+                                              GtkPizza       *pizza);
 static GdkFilterReturn gtk_pizza_filter      (GdkXEvent      *gdk_xevent,
 static GdkFilterReturn gtk_pizza_filter      (GdkXEvent      *gdk_xevent,
-                                               GdkEvent       *event,
-                                               gpointer        data);
+                                              GdkEvent       *event,
+                                              gpointer        data);
 static GdkFilterReturn gtk_pizza_main_filter (GdkXEvent      *gdk_xevent,
 static GdkFilterReturn gtk_pizza_main_filter (GdkXEvent      *gdk_xevent,
-                                               GdkEvent       *event,
-                                               gpointer        data);
+                                              GdkEvent       *event,
+                                              gpointer        data);
 
 
 static GtkType gtk_pizza_child_type (GtkContainer     *container);
 
 
 
 static GtkType gtk_pizza_child_type (GtkContainer     *container);
 
-static void  gtk_pizza_scroll_set_adjustments    (GtkPizza   *pizza,
+static void  gtk_pizza_scroll_set_adjustments (GtkPizza      *pizza,
                                                GtkAdjustment *hadj,
                                                GtkAdjustment *vadj);
 
                                                GtkAdjustment *hadj,
                                                GtkAdjustment *vadj);
 
@@ -200,7 +190,7 @@ gtk_pizza_init (GtkPizza *pizza)
     pizza->visibility = GDK_VISIBILITY_PARTIAL;
 
     pizza->clear_on_draw = TRUE;
     pizza->visibility = GDK_VISIBILITY_PARTIAL;
 
     pizza->clear_on_draw = TRUE;
-    pizza->use_filter = FALSE;
+    pizza->use_filter = TRUE;
 }
 
 GtkWidget*
 }
 
 GtkWidget*
@@ -222,7 +212,7 @@ gtk_pizza_scroll_set_adjustments (GtkPizza     *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_shadow_type (GtkPizza      *pizza,
+gtk_pizza_set_shadow_type (GtkPizza        *pizza,
                            GtkMyShadowType  type)
 {
     g_return_if_fail (pizza != NULL);
                            GtkMyShadowType  type)
 {
     g_return_if_fail (pizza != NULL);
@@ -241,8 +231,8 @@ gtk_pizza_set_shadow_type (GtkPizza      *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_clear (GtkPizza     *pizza,
-                     gboolean        clear)
+gtk_pizza_set_clear (GtkPizza  *pizza,
+                     gboolean   clear)
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
@@ -251,8 +241,8 @@ gtk_pizza_set_clear (GtkPizza     *pizza,
 }
 
 void       
 }
 
 void       
-gtk_pizza_set_filter (GtkPizza          *pizza,
-                      gboolean           use)
+gtk_pizza_set_filter (GtkPizza  *pizza,
+                      gboolean   use)
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
@@ -261,12 +251,12 @@ gtk_pizza_set_filter (GtkPizza          *pizza,
 }      
                                        
 void
 }      
                                        
 void
-gtk_pizza_put (GtkPizza    *pizza,
-                 GtkWidget     *widget,
-                 gint         x,
-                 gint         y,
-                 gint         width,
-                 gint         height)
+gtk_pizza_put (GtkPizza   *pizza,
+               GtkWidget  *widget,
+               gint        x,
+               gint        y,
+               gint        width,
+               gint        height)
 {
     GtkPizzaChild *child_info;
 
 {
     GtkPizzaChild *child_info;
 
@@ -311,10 +301,10 @@ gtk_pizza_put (GtkPizza    *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_move (GtkPizza    *pizza,
-                  GtkWidget     *widget,
-                  gint         x,
-                  gint         y)
+gtk_pizza_move (GtkPizza     *pizza,
+                  GtkWidget  *widget,
+                  gint        x,
+                  gint        y)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -345,10 +335,10 @@ gtk_pizza_move (GtkPizza    *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_resize (GtkPizza     *pizza,
-                    GtkWidget      *widget,
-                    gint         width,
-                    gint         height)
+gtk_pizza_resize (GtkPizza    *pizza,
+                  GtkWidget   *widget,
+                  gint         width,
+                  gint         height)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -381,12 +371,12 @@ gtk_pizza_resize (GtkPizza     *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_size (GtkPizza    *pizza,
-                      GtkWidget     *widget,
-                      gint        x,
-                      gint         y,
-                      gint         width,
-                      gint         height)
+gtk_pizza_set_size (GtkPizza   *pizza,
+                    GtkWidget  *widget,
+                    gint        x,
+                    gint        y,
+                    gint        width,
+                    gint        height)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -539,7 +529,7 @@ gtk_pizza_realize (GtkWidget *widget)
 
     widget->style = gtk_style_attach (widget->style, widget->window);
     gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
 
     widget->style = gtk_style_attach (widget->style, widget->window);
     gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
-    gtk_style_set_background (widget->style, pizza->bin_window, GTK_STATE_NORMAL);
+    gtk_style_set_background (widget->style, pizza->bin_window, GTK_STATE_NORMAL );
 
     /* add filters for intercepting visibility and expose events */
     gdk_window_add_filter (widget->window, gtk_pizza_main_filter, pizza);
 
     /* add filters for intercepting visibility and expose events */
     gdk_window_add_filter (widget->window, gtk_pizza_main_filter, pizza);
@@ -579,7 +569,7 @@ gtk_pizza_unrealize (GtkWidget *widget)
 
 static void
 gtk_pizza_size_request (GtkWidget      *widget,
 
 static void
 gtk_pizza_size_request (GtkWidget      *widget,
-                          GtkRequisition *requisition)
+                        GtkRequisition *requisition)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -612,7 +602,7 @@ gtk_pizza_size_request (GtkWidget      *widget,
 
 static void
 gtk_pizza_size_allocate (GtkWidget     *widget,
 
 static void
 gtk_pizza_size_allocate (GtkWidget     *widget,
-                           GtkAllocation *allocation)
+                         GtkAllocation *allocation)
 {
     GtkPizza *pizza;
     gint border;
 {
     GtkPizza *pizza;
     gint border;
@@ -660,70 +650,17 @@ gtk_pizza_size_allocate (GtkWidget     *widget,
 
 static void
 gtk_pizza_draw (GtkWidget    *widget,
 
 static void
 gtk_pizza_draw (GtkWidget    *widget,
-                  GdkRectangle *area)
+                GdkRectangle *area)
 {
 {
-    GtkPizza *pizza;
-    GtkPizzaChild *child;
-    GdkRectangle child_area;
-    GList *children;
-
-    g_return_if_fail (widget != NULL);
-    g_return_if_fail (GTK_IS_PIZZA (widget));
-
-    pizza = GTK_PIZZA (widget);
-
-    children = pizza->children;
-    if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
-         (pizza->clear_on_draw))
-    {
-        gdk_window_clear_area( pizza->bin_window,
-                                area->x, area->y, area->width, area->height);
-    }
-
-    while (children)
-    {
-        child = children->data;
-        children = children->next;
-
-        if (gtk_widget_intersect (child->widget, area, &child_area))
-            gtk_widget_draw (child->widget, &child_area);
-    }
+    /* We handle all draws events in window.cpp now. */
+    return;
 }
 
 static gint
 gtk_pizza_expose (GtkWidget      *widget,
 }
 
 static gint
 gtk_pizza_expose (GtkWidget      *widget,
-                    GdkEventExpose *event)
+                  GdkEventExpose *event)
 {
 {
-    GtkPizza *pizza;
-    GtkPizzaChild *child;
-    GdkEventExpose child_event;
-    GList *children;
-
-    g_return_val_if_fail (widget != NULL, FALSE);
-    g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE);
-    g_return_val_if_fail (event != NULL, FALSE);
-
-    pizza = GTK_PIZZA (widget);
-
-    if (event->window != pizza->bin_window)
-        return FALSE;
-
-    children = pizza->children;
-    while (children)
-    {
-        child = children->data;
-        children = children->next;
-
-        child_event = *event;
-
-        if (GTK_WIDGET_NO_WINDOW (child->widget) &&
-            GTK_WIDGET_DRAWABLE (child->widget) &&
-            gtk_widget_intersect (child->widget, &event->area, &child_event.area))
-        {
-            gtk_widget_event (child->widget, (GdkEvent*) &child_event);
-        }
-    }
-
+    /* We handle all expose events in window.cpp now. */
     return FALSE;
 }
 
     return FALSE;
 }
 
@@ -740,7 +677,7 @@ gtk_pizza_add (GtkContainer *container,
 
 static void
 gtk_pizza_remove (GtkContainer *container,
 
 static void
 gtk_pizza_remove (GtkContainer *container,
-                    GtkWidget    *widget)
+                  GtkWidget    *widget)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -782,9 +719,9 @@ gtk_pizza_remove (GtkContainer *container,
 
 static void
 gtk_pizza_forall (GtkContainer *container,
 
 static void
 gtk_pizza_forall (GtkContainer *container,
-                   gboolean         include_internals,
-                   GtkCallback   callback,
-                   gpointer      callback_data)
+                  gboolean      include_internals,
+                  GtkCallback   callback,
+                  gpointer      callback_data)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -812,7 +749,7 @@ gtk_pizza_forall (GtkContainer *container,
 
 static void
 gtk_pizza_position_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_position_child (GtkPizza      *pizza,
-                           GtkPizzaChild *child)
+                          GtkPizzaChild *child)
 {
     gint x;
     gint y;
 {
     gint x;
     gint y;
@@ -844,7 +781,7 @@ gtk_pizza_position_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_allocate_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_allocate_child (GtkPizza      *pizza,
-                           GtkPizzaChild *child)
+                          GtkPizzaChild *child)
 {
     GtkAllocation allocation;
     GtkRequisition requisition;
 {
     GtkAllocation allocation;
     GtkRequisition requisition;
@@ -1166,6 +1103,9 @@ gtk_pizza_filter (GdkXEvent *gdk_xevent,
     
     pizza = GTK_PIZZA (data);
     
     
     pizza = GTK_PIZZA (data);
     
+    if (!pizza->use_filter)
+        return GDK_FILTER_CONTINUE;
+
   switch (xevent->type)
     {
     case Expose:
   switch (xevent->type)
     {
     case Expose:
@@ -1210,6 +1150,9 @@ gtk_pizza_main_filter (GdkXEvent *gdk_xevent,
 
     xevent = (XEvent *)gdk_xevent;
     pizza = GTK_PIZZA (data);
 
     xevent = (XEvent *)gdk_xevent;
     pizza = GTK_PIZZA (data);
+    
+    if (!pizza->use_filter)
+        return GDK_FILTER_CONTINUE;
 
     if (xevent->type == VisibilityNotify)
     {
 
     if (xevent->type == VisibilityNotify)
     {
index 7525485937a69e5d7fd184398383c2502f399b04..06e479719239c4228b56d6d17617357ba7d043d7 100644 (file)
@@ -381,10 +381,13 @@ static void draw_frame( GtkWidget *widget, wxWindow *win )
 // "expose_event" of m_widget
 //-----------------------------------------------------------------------------
 
 // "expose_event" of m_widget
 //-----------------------------------------------------------------------------
 
-static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
+gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
 {
 {
-    if (gdk_event->count > 0) return;
+    if (gdk_event->count > 0) return FALSE;
+    
     draw_frame( widget, win );
     draw_frame( widget, win );
+    
+    return TRUE;
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -610,12 +613,18 @@ static long map_to_wx_keysym( KeySym keysym )
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
-static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
+static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
 {
     DEBUG_MAIN_THREAD
 
 {
     DEBUG_MAIN_THREAD
 
+    if (g_isIdle)
+        wxapp_install_idle_handler();
+        
+    if (win->m_queuedFullRedraw)
+        return TRUE;
+
 /*
 /*
-    if (win->GetName() == wxT("grid window"))
+    if (win->GetName() == wxT("htmlWindow"))
     {
         wxPrintf( wxT("OnExpose from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     {
         wxPrintf( wxT("OnExpose from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -634,10 +643,7 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
 
 
     if (gdk_event->count > 0)
 
 
     if (gdk_event->count > 0)
-        return;
-
-    if (!win->m_hasVMT)
-        return;
+        return TRUE;
 
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
 
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
@@ -648,25 +654,85 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
+    
+    /* The following code will result in all window-less widgets
+       being redrawn if the wxWindows class is given a chance to
+       paint *anything* because it will then be allowed to paint
+       over the window-less widgets */
+       
+    GtkPizza *pizza = GTK_PIZZA (widget);
+        
+    GList *children = pizza->children;
+    while (children)
+    {
+        GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+        children = children->next;
+
+        GdkEventExpose child_event = *gdk_event;
+
+        if (GTK_WIDGET_NO_WINDOW (child->widget) &&
+            GTK_WIDGET_DRAWABLE (child->widget))
+        {
+            child_event.area.x = child->widget->allocation.x;
+            child_event.area.y = child->widget->allocation.y;
+            child_event.area.width = child->widget->allocation.width;
+            child_event.area.height = child->widget->allocation.height;
+            gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+        }
+    }
+        
+    return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "event" of m_wxwindow
+//-----------------------------------------------------------------------------
+
+/* GTK thinks it is clever and filters out a certain amount of "unneeded"
+   expose events. We need them, of course, so we override the main event
+   procedure in GtkWidget by giving our own handler for all system events,
+   looking for the expose events and then we can always send them. */
+
+gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event, wxWindow *win )
+{
+    if (event->type == GDK_EXPOSE)
+    {
+        gint ret = gtk_window_expose_callback( widget, event, win );
+        return ret;
+    }
+
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
 // "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 }
 
 //-----------------------------------------------------------------------------
 // "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
-static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
-                                      GdkRectangle *rect, wxWindow *win )
+/* This callback is a complete replacement of the gtk_pizza_draw() function,
+   which disabled. */
+
+static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
 {
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
         wxapp_install_idle_handler();
         
 {
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
         wxapp_install_idle_handler();
         
-    if ((rect->x == 0) && (rect->y == 0) && (rect->width <= 1) && (rect->height <= 1))
+    if (win->m_queuedFullRedraw)
         return;
 
         return;
 
+    GtkPizza *pizza = GTK_PIZZA (widget);
+        
+    if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
+         (pizza->clear_on_draw))
+    {
+        gdk_window_clear_area( pizza->bin_window,
+                               rect->x, rect->y, rect->width, rect->height);
+    }
+    
 /*
 /*
-    if (win->GetName() == wxT("grid window"))
+    if (win->GetName() == wxT("htmlWindow"))
     {
         wxPrintf( wxT("OnDraw from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     {
         wxPrintf( wxT("OnDraw from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -677,13 +743,10 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
                                          (int)rect->height );
     }
 */
                                          (int)rect->height );
     }
 */
-                                
+   
     win->GetUpdateRegion().Union( rect->x, rect->y,
                                   rect->width, rect->height );
 
     win->GetUpdateRegion().Union( rect->x, rect->y,
                                   rect->width, rect->height );
 
-    if (!win->m_hasVMT)
-        return;
-
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(eevent);
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(eevent);
@@ -693,6 +756,17 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
+    
+    GList *children = pizza->children;
+    while (children)
+    {
+        GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+        children = children->next;
+
+        GdkRectangle child_area;
+        if (gtk_widget_intersect (child->widget, rect, &child_area))
+            gtk_widget_draw (child->widget, (GdkRectangle*) NULL );
+    }
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -1974,6 +2048,9 @@ void wxWindow::Init()
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;
 
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;
 
+    m_clipPaintRegion = FALSE;
+    m_queuedFullRedraw = FALSE;
+
     m_cursor = *wxSTANDARD_CURSOR;
 
 #ifdef HAVE_XIM
     m_cursor = *wxSTANDARD_CURSOR;
 
 #ifdef HAVE_XIM
@@ -2008,21 +2085,12 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
     }
 
     m_insertCallback = wxInsertChildInWindow;
     }
 
     m_insertCallback = wxInsertChildInWindow;
-
+    
     m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
     m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_widget, wxT("wxWindow::m_widget"), name );
-#endif
-
     GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
 
     GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
 
-#ifdef __WXDEBUG__
-    debug_focus_in( scrolledWindow->hscrollbar, wxT("wxWindow::hsrcollbar"), name );
-    debug_focus_in( scrolledWindow->vscrollbar, wxT("wxWindow::vsrcollbar"), name );
-#endif
-
     GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
     scroll_class->scrollbar_spacing = 0;
 
     GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
     scroll_class->scrollbar_spacing = 0;
 
@@ -2033,10 +2101,6 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
     m_wxwindow = gtk_pizza_new();
 
 
     m_wxwindow = gtk_pizza_new();
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_wxwindow, wxT("wxWindow::m_wxwindow"), name );
-#endif
-
     gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
 
 #if (GTK_MINOR_VERSION > 0)
     gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
 
 #if (GTK_MINOR_VERSION > 0)
@@ -2221,6 +2285,9 @@ void wxWindow::PostCreation()
         if (!m_noExpose)
         {
             /* these get reported to wxWindows -> wxPaintEvent */
         if (!m_noExpose)
         {
             /* these get reported to wxWindows -> wxPaintEvent */
+            gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
+                GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
+
             gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
                 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
 
             gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
                 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
 
@@ -2320,6 +2387,24 @@ bool wxWindow::Destroy()
 
 void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 {
 
 void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 {
+    if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
+    {
+        /* Normally, GTK will send expose events only for the regions
+           which actually got exposed. Sadly, wxMSW invalidates
+           the whole window so we have to do that, too. We could
+           simply add a complete refresh, but we would then get
+           the normal GTK expose events in surplus, so we shut
+           off the expose events and schedule a full redraw to
+           be done in OnInternalIdle, where we restore the handling
+           of expose events. */
+    
+        m_queuedFullRedraw = TRUE;
+        
+        GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
+        mask = (GdkEventMask)(mask & ~GDK_EXPOSURE_MASK);
+        gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );
+    }
+
     gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height );
 }
 
     gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height );
 }
 
@@ -2330,7 +2415,7 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 
     if (m_resizing) return; /* I don't like recursions */
     m_resizing = TRUE;
 
     if (m_resizing) return; /* I don't like recursions */
     m_resizing = TRUE;
-
+    
     if (m_parent->m_wxwindow == NULL) /* i.e. wxNotebook */
     {
         /* don't set the size for children of wxNotebook, just take the values. */
     if (m_parent->m_wxwindow == NULL) /* i.e. wxNotebook */
     {
         /* don't set the size for children of wxNotebook, just take the values. */
@@ -2391,6 +2476,12 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 
     if (m_hasScrolling)
     {
 
     if (m_hasScrolling)
     {
+        /* Sometimes the client area changes size without the 
+           whole windows's size changing, but if the whole
+           windows's size doesn't change, no wxSizeEvent will
+           normally be sent. Here we add an extra test if
+           the client test has been changed and this will
+           be used then. */
         GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
     }
 
         GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
     }
 
@@ -2461,6 +2552,27 @@ void wxWindow::OnInternalIdle()
     }
 
     UpdateWindowUI();
     }
 
     UpdateWindowUI();
+    
+    if (m_queuedFullRedraw)
+    {
+        /* See also wxWindow::DoMoveWindow for explanation of this code. What
+           we test here is if the requested size of the window is the same as 
+           the actual size of window, in which case all expose events that resulted
+           from resizing the window have been sent (and discarded) and we can
+           now do our full redraw and switch on expose event handling again. */
+           
+        if ((m_width == m_widget->allocation.width) && (m_height == m_widget->allocation.height))
+        {
+            m_queuedFullRedraw = FALSE;
+            m_updateRegion.Clear();
+            m_updateRegion.Union( 0,0,m_width,m_height );
+            gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
+            
+            GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
+            mask = (GdkEventMask)(mask | GDK_EXPOSURE_MASK);
+            gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );
+        }
+    }
 }
 
 void wxWindow::DoGetSize( int *width, int *height ) const
 }
 
 void wxWindow::DoGetSize( int *width, int *height ) const
@@ -2898,37 +3010,65 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
     {
         if (m_wxwindow)
         {
     {
         if (m_wxwindow)
         {
+
+/*
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
-
             gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
             gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
-
             gtk_pizza_set_clear( pizza, old_clear );
             gtk_pizza_set_clear( pizza, old_clear );
+*/
+            GdkEventExpose gdk_event;
+            gdk_event.count = 0;
+            gdk_event.area.x = 0;
+            gdk_event.area.y = 0;
+            gdk_event.area.width = m_wxwindow->allocation.width;
+            gdk_event.area.height = m_wxwindow->allocation.height;
+            gtk_window_expose_callback( m_wxwindow, &gdk_event, this );
+
         }
         else
         }
         else
+        {
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
+        }
     }
     else
     {
     }
     else
     {
-        GdkRectangle gdk_rect;
-        gdk_rect.x = rect->x;
-        gdk_rect.y = rect->y;
-        gdk_rect.width = rect->width;
-        gdk_rect.height = rect->height;
 
         if (m_wxwindow)
         {
 
         if (m_wxwindow)
         {
+/*
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
 
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
 
+            GdkRectangle gdk_rect;
+            gdk_rect.x = rect->x;
+            gdk_rect.y = rect->y;
+            gdk_rect.width = rect->width;
+            gdk_rect.height = rect->height;
             gtk_widget_draw( m_wxwindow, &gdk_rect );
             gtk_widget_draw( m_wxwindow, &gdk_rect );
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
 
             gtk_pizza_set_clear( pizza, old_clear );
 
             gtk_pizza_set_clear( pizza, old_clear );
+*/
+            GdkEventExpose gdk_event;
+            gdk_event.count = 0;
+            gdk_event.area.x = rect->x;
+            gdk_event.area.y = rect->y;
+            gdk_event.area.width = rect->width;
+            gdk_event.area.height = rect->height;
+            gtk_window_expose_callback( m_wxwindow, &gdk_event, this );
         }
         else
         }
         else
+        {
+            GdkRectangle gdk_rect;
+            gdk_rect.x = rect->x;
+            gdk_rect.y = rect->y;
+            gdk_rect.width = rect->width;
+            gdk_rect.height = rect->height;
             gtk_widget_draw( m_widget, &gdk_rect );
             gtk_widget_draw( m_widget, &gdk_rect );
+        }
     }
 }
 
     }
 }
 
@@ -3452,7 +3592,9 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     
     if ((dx == 0) && (dy == 0)) return;
 
     
     if ((dx == 0) && (dy == 0)) return;
 
+    m_clipPaintRegion = TRUE;
     gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
     gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
+    m_clipPaintRegion = FALSE;
     
 /*    
     if (m_children.GetCount() > 0)
     
 /*    
     if (m_children.GetCount() > 0)
index b89d77cd5c779f47bfdfa004fb4b4eecaafcc484..ddeb9691a0d4387f8125e64a7feec6ac68d7a325 100644 (file)
@@ -95,8 +95,8 @@ bool wxYield()
 
     if (has_idle)
     {
 
     if (has_idle)
     {
-        /* re-add idle handler */
-        wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+        /* re-add idle handler (very low priority) */
+        wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL );
     }
 
     // disable log flushing from here because a call to wxYield() shouldn't
     }
 
     // disable log flushing from here because a call to wxYield() shouldn't
@@ -177,9 +177,9 @@ void wxapp_install_idle_handler()
        indicating that the idle is over. It may also
        get called from other thread for sending events
        to the main thread (and processing these in
        indicating that the idle is over. It may also
        get called from other thread for sending events
        to the main thread (and processing these in
-       idle time). */
+       idle time). Very low priority. */
 
 
-    wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
+    wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL );
 
     g_isIdle = FALSE;
 }
 
     g_isIdle = FALSE;
 }
index 1dbaf55b39bcf3d0fe50e7709f878a9d90378b23..0e930e4cfff2c67194acc850d5ab548f57dce455 100644 (file)
@@ -2019,7 +2019,10 @@ wxPaintDC::wxPaintDC()
 wxPaintDC::wxPaintDC( wxWindow *win )
   : wxWindowDC( win )
 {
 wxPaintDC::wxPaintDC( wxWindow *win )
   : wxWindowDC( win )
 {
-#if USE_PAINT_REGION    
+#if USE_PAINT_REGION
+    if (!win->m_clipPaintRegion)
+        return;
+        
     m_paintClippingRegion = win->GetUpdateRegion();
     m_currentClippingRegion.Union( m_paintClippingRegion );
         
     m_paintClippingRegion = win->GetUpdateRegion();
     m_currentClippingRegion.Union( m_paintClippingRegion );
         
index 301a3b309da675ca8a07f0a69f6e1c6bc80cc00f..2bc208bcb46f880e68410c4b03a0175d312881e5 100644 (file)
@@ -834,6 +834,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
         gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
                             m_frameStatusBar->m_widget,
                             xx, yy, ww, hh );
         gtk_pizza_set_size( GTK_PIZZA(m_wxwindow),
                             m_frameStatusBar->m_widget,
                             xx, yy, ww, hh );
+        gtk_widget_draw( m_frameStatusBar->m_widget, (GdkRectangle*) NULL );
     }
 #endif
 
     }
 #endif
 
index f97158acf9f60c12a47a49c31db0a41ed6db6aee..7d5f7a92ad3deac7430eae83d4d4fc468712190b 100644 (file)
@@ -30,7 +30,6 @@ extern "C" {
                           (y >= G_MINSHORT) && (y <= G_MAXSHORT))
 
 typedef struct _GtkPizzaAdjData  GtkPizzaAdjData;
                           (y >= G_MINSHORT) && (y <= G_MAXSHORT))
 
 typedef struct _GtkPizzaAdjData  GtkPizzaAdjData;
-typedef struct _GtkPizzaChild    GtkPizzaChild;
 
 struct _GtkPizzaAdjData
 {
 
 struct _GtkPizzaAdjData
 {
@@ -38,22 +37,13 @@ struct _GtkPizzaAdjData
     gint dy;
 };
 
     gint dy;
 };
 
-struct _GtkPizzaChild
-{
-    GtkWidget *widget;
-    gint x;
-    gint y;
-    gint width;
-    gint height;
-};
-
-static void gtk_pizza_class_init      (GtkPizzaClass  *klass);
-static void gtk_pizza_init            (GtkPizza       *pizza);
+static void gtk_pizza_class_init    (GtkPizzaClass    *klass);
+static void gtk_pizza_init          (GtkPizza         *pizza);
 
 
-static void gtk_pizza_realize         (GtkWidget        *widget);
-static void gtk_pizza_unrealize       (GtkWidget        *widget);
+static void gtk_pizza_realize       (GtkWidget        *widget);
+static void gtk_pizza_unrealize     (GtkWidget        *widget);
 
 
-static void gtk_pizza_map             (GtkWidget        *widget);
+static void gtk_pizza_map           (GtkWidget        *widget);
 
 static void gtk_pizza_size_request  (GtkWidget        *widget,
                                      GtkRequisition   *requisition);
 
 static void gtk_pizza_size_request  (GtkWidget        *widget,
                                      GtkRequisition   *requisition);
@@ -67,42 +57,42 @@ static void gtk_pizza_add           (GtkContainer     *container,
                                      GtkWidget        *widget);
 static void gtk_pizza_remove        (GtkContainer     *container,
                                      GtkWidget        *widget);
                                      GtkWidget        *widget);
 static void gtk_pizza_remove        (GtkContainer     *container,
                                      GtkWidget        *widget);
-static void gtk_pizza_forall       (GtkContainer     *container,
-                                     gboolean              include_internals,
-                                     GtkCallback      callback,
-                                     gpointer         callback_data);
+static void gtk_pizza_forall        (GtkContainer     *container,
+                                     gboolean          include_internals,
+                                     GtkCallback       callback,
+                                     gpointer          callback_data);
 
 static void     gtk_pizza_position_child     (GtkPizza      *pizza,
 
 static void     gtk_pizza_position_child     (GtkPizza      *pizza,
-                                               GtkPizzaChild *child);
+                                              GtkPizzaChild *child);
 static void     gtk_pizza_allocate_child     (GtkPizza      *pizza,
 static void     gtk_pizza_allocate_child     (GtkPizza      *pizza,
-                                               GtkPizzaChild *child);
+                                              GtkPizzaChild *child);
 static void     gtk_pizza_position_children  (GtkPizza      *pizza);
 
 static void     gtk_pizza_adjust_allocations_recurse (GtkWidget *widget,
 static void     gtk_pizza_position_children  (GtkPizza      *pizza);
 
 static void     gtk_pizza_adjust_allocations_recurse (GtkWidget *widget,
-                                                       gpointer   cb_data);
-static void     gtk_pizza_adjust_allocations         (GtkPizza *pizza,
-                                                       gint       dx,
-                                                       gint       dy);
+                                                      gpointer   cb_data);
+static void     gtk_pizza_adjust_allocations         (GtkPizza  *pizza,
+                                                      gint       dx,
+                                                      gint       dy);
 
 
 
 
-static void     gtk_pizza_expose_area        (GtkPizza      *pizza,
-                                               gint            x,
-                                               gint            y,
-                                               gint            width,
-                                               gint            height);
+static void     gtk_pizza_expose_area        (GtkPizza       *pizza,
+                                              gint            x,
+                                              gint            y,
+                                              gint            width,
+                                              gint            height);
 static void     gtk_pizza_adjustment_changed (GtkAdjustment  *adjustment,
 static void     gtk_pizza_adjustment_changed (GtkAdjustment  *adjustment,
-                                               GtkPizza      *pizza);
+                                              GtkPizza       *pizza);
 static GdkFilterReturn gtk_pizza_filter      (GdkXEvent      *gdk_xevent,
 static GdkFilterReturn gtk_pizza_filter      (GdkXEvent      *gdk_xevent,
-                                               GdkEvent       *event,
-                                               gpointer        data);
+                                              GdkEvent       *event,
+                                              gpointer        data);
 static GdkFilterReturn gtk_pizza_main_filter (GdkXEvent      *gdk_xevent,
 static GdkFilterReturn gtk_pizza_main_filter (GdkXEvent      *gdk_xevent,
-                                               GdkEvent       *event,
-                                               gpointer        data);
+                                              GdkEvent       *event,
+                                              gpointer        data);
 
 
 static GtkType gtk_pizza_child_type (GtkContainer     *container);
 
 
 
 static GtkType gtk_pizza_child_type (GtkContainer     *container);
 
-static void  gtk_pizza_scroll_set_adjustments    (GtkPizza   *pizza,
+static void  gtk_pizza_scroll_set_adjustments (GtkPizza      *pizza,
                                                GtkAdjustment *hadj,
                                                GtkAdjustment *vadj);
 
                                                GtkAdjustment *hadj,
                                                GtkAdjustment *vadj);
 
@@ -200,7 +190,7 @@ gtk_pizza_init (GtkPizza *pizza)
     pizza->visibility = GDK_VISIBILITY_PARTIAL;
 
     pizza->clear_on_draw = TRUE;
     pizza->visibility = GDK_VISIBILITY_PARTIAL;
 
     pizza->clear_on_draw = TRUE;
-    pizza->use_filter = FALSE;
+    pizza->use_filter = TRUE;
 }
 
 GtkWidget*
 }
 
 GtkWidget*
@@ -222,7 +212,7 @@ gtk_pizza_scroll_set_adjustments (GtkPizza     *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_shadow_type (GtkPizza      *pizza,
+gtk_pizza_set_shadow_type (GtkPizza        *pizza,
                            GtkMyShadowType  type)
 {
     g_return_if_fail (pizza != NULL);
                            GtkMyShadowType  type)
 {
     g_return_if_fail (pizza != NULL);
@@ -241,8 +231,8 @@ gtk_pizza_set_shadow_type (GtkPizza      *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_clear (GtkPizza     *pizza,
-                     gboolean        clear)
+gtk_pizza_set_clear (GtkPizza  *pizza,
+                     gboolean   clear)
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
@@ -251,8 +241,8 @@ gtk_pizza_set_clear (GtkPizza     *pizza,
 }
 
 void       
 }
 
 void       
-gtk_pizza_set_filter (GtkPizza          *pizza,
-                      gboolean           use)
+gtk_pizza_set_filter (GtkPizza  *pizza,
+                      gboolean   use)
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
 {
     g_return_if_fail (pizza != NULL);
     g_return_if_fail (GTK_IS_PIZZA (pizza));
@@ -261,12 +251,12 @@ gtk_pizza_set_filter (GtkPizza          *pizza,
 }      
                                        
 void
 }      
                                        
 void
-gtk_pizza_put (GtkPizza    *pizza,
-                 GtkWidget     *widget,
-                 gint         x,
-                 gint         y,
-                 gint         width,
-                 gint         height)
+gtk_pizza_put (GtkPizza   *pizza,
+               GtkWidget  *widget,
+               gint        x,
+               gint        y,
+               gint        width,
+               gint        height)
 {
     GtkPizzaChild *child_info;
 
 {
     GtkPizzaChild *child_info;
 
@@ -311,10 +301,10 @@ gtk_pizza_put (GtkPizza    *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_move (GtkPizza    *pizza,
-                  GtkWidget     *widget,
-                  gint         x,
-                  gint         y)
+gtk_pizza_move (GtkPizza     *pizza,
+                  GtkWidget  *widget,
+                  gint        x,
+                  gint        y)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -345,10 +335,10 @@ gtk_pizza_move (GtkPizza    *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_resize (GtkPizza     *pizza,
-                    GtkWidget      *widget,
-                    gint         width,
-                    gint         height)
+gtk_pizza_resize (GtkPizza    *pizza,
+                  GtkWidget   *widget,
+                  gint         width,
+                  gint         height)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -381,12 +371,12 @@ gtk_pizza_resize (GtkPizza     *pizza,
 }
 
 void
 }
 
 void
-gtk_pizza_set_size (GtkPizza    *pizza,
-                      GtkWidget     *widget,
-                      gint        x,
-                      gint         y,
-                      gint         width,
-                      gint         height)
+gtk_pizza_set_size (GtkPizza   *pizza,
+                    GtkWidget  *widget,
+                    gint        x,
+                    gint        y,
+                    gint        width,
+                    gint        height)
 {
     GtkPizzaChild *child;
     GList *children;
 {
     GtkPizzaChild *child;
     GList *children;
@@ -539,7 +529,7 @@ gtk_pizza_realize (GtkWidget *widget)
 
     widget->style = gtk_style_attach (widget->style, widget->window);
     gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
 
     widget->style = gtk_style_attach (widget->style, widget->window);
     gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
-    gtk_style_set_background (widget->style, pizza->bin_window, GTK_STATE_NORMAL);
+    gtk_style_set_background (widget->style, pizza->bin_window, GTK_STATE_NORMAL );
 
     /* add filters for intercepting visibility and expose events */
     gdk_window_add_filter (widget->window, gtk_pizza_main_filter, pizza);
 
     /* add filters for intercepting visibility and expose events */
     gdk_window_add_filter (widget->window, gtk_pizza_main_filter, pizza);
@@ -579,7 +569,7 @@ gtk_pizza_unrealize (GtkWidget *widget)
 
 static void
 gtk_pizza_size_request (GtkWidget      *widget,
 
 static void
 gtk_pizza_size_request (GtkWidget      *widget,
-                          GtkRequisition *requisition)
+                        GtkRequisition *requisition)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -612,7 +602,7 @@ gtk_pizza_size_request (GtkWidget      *widget,
 
 static void
 gtk_pizza_size_allocate (GtkWidget     *widget,
 
 static void
 gtk_pizza_size_allocate (GtkWidget     *widget,
-                           GtkAllocation *allocation)
+                         GtkAllocation *allocation)
 {
     GtkPizza *pizza;
     gint border;
 {
     GtkPizza *pizza;
     gint border;
@@ -660,70 +650,17 @@ gtk_pizza_size_allocate (GtkWidget     *widget,
 
 static void
 gtk_pizza_draw (GtkWidget    *widget,
 
 static void
 gtk_pizza_draw (GtkWidget    *widget,
-                  GdkRectangle *area)
+                GdkRectangle *area)
 {
 {
-    GtkPizza *pizza;
-    GtkPizzaChild *child;
-    GdkRectangle child_area;
-    GList *children;
-
-    g_return_if_fail (widget != NULL);
-    g_return_if_fail (GTK_IS_PIZZA (widget));
-
-    pizza = GTK_PIZZA (widget);
-
-    children = pizza->children;
-    if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
-         (pizza->clear_on_draw))
-    {
-        gdk_window_clear_area( pizza->bin_window,
-                                area->x, area->y, area->width, area->height);
-    }
-
-    while (children)
-    {
-        child = children->data;
-        children = children->next;
-
-        if (gtk_widget_intersect (child->widget, area, &child_area))
-            gtk_widget_draw (child->widget, &child_area);
-    }
+    /* We handle all draws events in window.cpp now. */
+    return;
 }
 
 static gint
 gtk_pizza_expose (GtkWidget      *widget,
 }
 
 static gint
 gtk_pizza_expose (GtkWidget      *widget,
-                    GdkEventExpose *event)
+                  GdkEventExpose *event)
 {
 {
-    GtkPizza *pizza;
-    GtkPizzaChild *child;
-    GdkEventExpose child_event;
-    GList *children;
-
-    g_return_val_if_fail (widget != NULL, FALSE);
-    g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE);
-    g_return_val_if_fail (event != NULL, FALSE);
-
-    pizza = GTK_PIZZA (widget);
-
-    if (event->window != pizza->bin_window)
-        return FALSE;
-
-    children = pizza->children;
-    while (children)
-    {
-        child = children->data;
-        children = children->next;
-
-        child_event = *event;
-
-        if (GTK_WIDGET_NO_WINDOW (child->widget) &&
-            GTK_WIDGET_DRAWABLE (child->widget) &&
-            gtk_widget_intersect (child->widget, &event->area, &child_event.area))
-        {
-            gtk_widget_event (child->widget, (GdkEvent*) &child_event);
-        }
-    }
-
+    /* We handle all expose events in window.cpp now. */
     return FALSE;
 }
 
     return FALSE;
 }
 
@@ -740,7 +677,7 @@ gtk_pizza_add (GtkContainer *container,
 
 static void
 gtk_pizza_remove (GtkContainer *container,
 
 static void
 gtk_pizza_remove (GtkContainer *container,
-                    GtkWidget    *widget)
+                  GtkWidget    *widget)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -782,9 +719,9 @@ gtk_pizza_remove (GtkContainer *container,
 
 static void
 gtk_pizza_forall (GtkContainer *container,
 
 static void
 gtk_pizza_forall (GtkContainer *container,
-                   gboolean         include_internals,
-                   GtkCallback   callback,
-                   gpointer      callback_data)
+                  gboolean      include_internals,
+                  GtkCallback   callback,
+                  gpointer      callback_data)
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
 {
     GtkPizza *pizza;
     GtkPizzaChild *child;
@@ -812,7 +749,7 @@ gtk_pizza_forall (GtkContainer *container,
 
 static void
 gtk_pizza_position_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_position_child (GtkPizza      *pizza,
-                           GtkPizzaChild *child)
+                          GtkPizzaChild *child)
 {
     gint x;
     gint y;
 {
     gint x;
     gint y;
@@ -844,7 +781,7 @@ gtk_pizza_position_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_allocate_child (GtkPizza      *pizza,
 
 static void
 gtk_pizza_allocate_child (GtkPizza      *pizza,
-                           GtkPizzaChild *child)
+                          GtkPizzaChild *child)
 {
     GtkAllocation allocation;
     GtkRequisition requisition;
 {
     GtkAllocation allocation;
     GtkRequisition requisition;
@@ -1166,6 +1103,9 @@ gtk_pizza_filter (GdkXEvent *gdk_xevent,
     
     pizza = GTK_PIZZA (data);
     
     
     pizza = GTK_PIZZA (data);
     
+    if (!pizza->use_filter)
+        return GDK_FILTER_CONTINUE;
+
   switch (xevent->type)
     {
     case Expose:
   switch (xevent->type)
     {
     case Expose:
@@ -1210,6 +1150,9 @@ gtk_pizza_main_filter (GdkXEvent *gdk_xevent,
 
     xevent = (XEvent *)gdk_xevent;
     pizza = GTK_PIZZA (data);
 
     xevent = (XEvent *)gdk_xevent;
     pizza = GTK_PIZZA (data);
+    
+    if (!pizza->use_filter)
+        return GDK_FILTER_CONTINUE;
 
     if (xevent->type == VisibilityNotify)
     {
 
     if (xevent->type == VisibilityNotify)
     {
index 7525485937a69e5d7fd184398383c2502f399b04..06e479719239c4228b56d6d17617357ba7d043d7 100644 (file)
@@ -381,10 +381,13 @@ static void draw_frame( GtkWidget *widget, wxWindow *win )
 // "expose_event" of m_widget
 //-----------------------------------------------------------------------------
 
 // "expose_event" of m_widget
 //-----------------------------------------------------------------------------
 
-static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
+gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
 {
 {
-    if (gdk_event->count > 0) return;
+    if (gdk_event->count > 0) return FALSE;
+    
     draw_frame( widget, win );
     draw_frame( widget, win );
+    
+    return TRUE;
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -610,12 +613,18 @@ static long map_to_wx_keysym( KeySym keysym )
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
-static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
+static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
 {
     DEBUG_MAIN_THREAD
 
 {
     DEBUG_MAIN_THREAD
 
+    if (g_isIdle)
+        wxapp_install_idle_handler();
+        
+    if (win->m_queuedFullRedraw)
+        return TRUE;
+
 /*
 /*
-    if (win->GetName() == wxT("grid window"))
+    if (win->GetName() == wxT("htmlWindow"))
     {
         wxPrintf( wxT("OnExpose from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     {
         wxPrintf( wxT("OnExpose from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -634,10 +643,7 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
 
 
     if (gdk_event->count > 0)
 
 
     if (gdk_event->count > 0)
-        return;
-
-    if (!win->m_hasVMT)
-        return;
+        return TRUE;
 
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
 
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
@@ -648,25 +654,85 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
+    
+    /* The following code will result in all window-less widgets
+       being redrawn if the wxWindows class is given a chance to
+       paint *anything* because it will then be allowed to paint
+       over the window-less widgets */
+       
+    GtkPizza *pizza = GTK_PIZZA (widget);
+        
+    GList *children = pizza->children;
+    while (children)
+    {
+        GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+        children = children->next;
+
+        GdkEventExpose child_event = *gdk_event;
+
+        if (GTK_WIDGET_NO_WINDOW (child->widget) &&
+            GTK_WIDGET_DRAWABLE (child->widget))
+        {
+            child_event.area.x = child->widget->allocation.x;
+            child_event.area.y = child->widget->allocation.y;
+            child_event.area.width = child->widget->allocation.width;
+            child_event.area.height = child->widget->allocation.height;
+            gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+        }
+    }
+        
+    return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "event" of m_wxwindow
+//-----------------------------------------------------------------------------
+
+/* GTK thinks it is clever and filters out a certain amount of "unneeded"
+   expose events. We need them, of course, so we override the main event
+   procedure in GtkWidget by giving our own handler for all system events,
+   looking for the expose events and then we can always send them. */
+
+gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event, wxWindow *win )
+{
+    if (event->type == GDK_EXPOSE)
+    {
+        gint ret = gtk_window_expose_callback( widget, event, win );
+        return ret;
+    }
+
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
 // "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 }
 
 //-----------------------------------------------------------------------------
 // "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
-static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
-                                      GdkRectangle *rect, wxWindow *win )
+/* This callback is a complete replacement of the gtk_pizza_draw() function,
+   which disabled. */
+
+static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
 {
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
         wxapp_install_idle_handler();
         
 {
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
         wxapp_install_idle_handler();
         
-    if ((rect->x == 0) && (rect->y == 0) && (rect->width <= 1) && (rect->height <= 1))
+    if (win->m_queuedFullRedraw)
         return;
 
         return;
 
+    GtkPizza *pizza = GTK_PIZZA (widget);
+        
+    if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
+         (pizza->clear_on_draw))
+    {
+        gdk_window_clear_area( pizza->bin_window,
+                               rect->x, rect->y, rect->width, rect->height);
+    }
+    
 /*
 /*
-    if (win->GetName() == wxT("grid window"))
+    if (win->GetName() == wxT("htmlWindow"))
     {
         wxPrintf( wxT("OnDraw from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     {
         wxPrintf( wxT("OnDraw from ") );
         if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -677,13 +743,10 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
                                          (int)rect->height );
     }
 */
                                          (int)rect->height );
     }
 */
-                                
+   
     win->GetUpdateRegion().Union( rect->x, rect->y,
                                   rect->width, rect->height );
 
     win->GetUpdateRegion().Union( rect->x, rect->y,
                                   rect->width, rect->height );
 
-    if (!win->m_hasVMT)
-        return;
-
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(eevent);
     wxEraseEvent eevent( win->GetId() );
     eevent.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(eevent);
@@ -693,6 +756,17 @@ static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget),
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
     win->GetEventHandler()->ProcessEvent( event );
 
     win->GetUpdateRegion().Clear();
+    
+    GList *children = pizza->children;
+    while (children)
+    {
+        GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+        children = children->next;
+
+        GdkRectangle child_area;
+        if (gtk_widget_intersect (child->widget, rect, &child_area))
+            gtk_widget_draw (child->widget, (GdkRectangle*) NULL );
+    }
 }
 
 //-----------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
@@ -1974,6 +2048,9 @@ void wxWindow::Init()
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;
 
     m_isFrame = FALSE;
     m_acceptsFocus = FALSE;
 
+    m_clipPaintRegion = FALSE;
+    m_queuedFullRedraw = FALSE;
+
     m_cursor = *wxSTANDARD_CURSOR;
 
 #ifdef HAVE_XIM
     m_cursor = *wxSTANDARD_CURSOR;
 
 #ifdef HAVE_XIM
@@ -2008,21 +2085,12 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
     }
 
     m_insertCallback = wxInsertChildInWindow;
     }
 
     m_insertCallback = wxInsertChildInWindow;
-
+    
     m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
     m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_widget, wxT("wxWindow::m_widget"), name );
-#endif
-
     GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
 
     GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
 
-#ifdef __WXDEBUG__
-    debug_focus_in( scrolledWindow->hscrollbar, wxT("wxWindow::hsrcollbar"), name );
-    debug_focus_in( scrolledWindow->vscrollbar, wxT("wxWindow::vsrcollbar"), name );
-#endif
-
     GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
     scroll_class->scrollbar_spacing = 0;
 
     GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
     scroll_class->scrollbar_spacing = 0;
 
@@ -2033,10 +2101,6 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
     m_wxwindow = gtk_pizza_new();
 
 
     m_wxwindow = gtk_pizza_new();
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_wxwindow, wxT("wxWindow::m_wxwindow"), name );
-#endif
-
     gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
 
 #if (GTK_MINOR_VERSION > 0)
     gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
 
 #if (GTK_MINOR_VERSION > 0)
@@ -2221,6 +2285,9 @@ void wxWindow::PostCreation()
         if (!m_noExpose)
         {
             /* these get reported to wxWindows -> wxPaintEvent */
         if (!m_noExpose)
         {
             /* these get reported to wxWindows -> wxPaintEvent */
+            gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
+                GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );
+
             gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
                 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
 
             gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
                 GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
 
@@ -2320,6 +2387,24 @@ bool wxWindow::Destroy()
 
 void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 {
 
 void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 {
+    if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
+    {
+        /* Normally, GTK will send expose events only for the regions
+           which actually got exposed. Sadly, wxMSW invalidates
+           the whole window so we have to do that, too. We could
+           simply add a complete refresh, but we would then get
+           the normal GTK expose events in surplus, so we shut
+           off the expose events and schedule a full redraw to
+           be done in OnInternalIdle, where we restore the handling
+           of expose events. */
+    
+        m_queuedFullRedraw = TRUE;
+        
+        GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
+        mask = (GdkEventMask)(mask & ~GDK_EXPOSURE_MASK);
+        gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );
+    }
+
     gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height );
 }
 
     gtk_pizza_set_size( GTK_PIZZA(m_parent->m_wxwindow), m_widget, x, y, width, height );
 }
 
@@ -2330,7 +2415,7 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 
     if (m_resizing) return; /* I don't like recursions */
     m_resizing = TRUE;
 
     if (m_resizing) return; /* I don't like recursions */
     m_resizing = TRUE;
-
+    
     if (m_parent->m_wxwindow == NULL) /* i.e. wxNotebook */
     {
         /* don't set the size for children of wxNotebook, just take the values. */
     if (m_parent->m_wxwindow == NULL) /* i.e. wxNotebook */
     {
         /* don't set the size for children of wxNotebook, just take the values. */
@@ -2391,6 +2476,12 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 
     if (m_hasScrolling)
     {
 
     if (m_hasScrolling)
     {
+        /* Sometimes the client area changes size without the 
+           whole windows's size changing, but if the whole
+           windows's size doesn't change, no wxSizeEvent will
+           normally be sent. Here we add an extra test if
+           the client test has been changed and this will
+           be used then. */
         GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
     }
 
         GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
     }
 
@@ -2461,6 +2552,27 @@ void wxWindow::OnInternalIdle()
     }
 
     UpdateWindowUI();
     }
 
     UpdateWindowUI();
+    
+    if (m_queuedFullRedraw)
+    {
+        /* See also wxWindow::DoMoveWindow for explanation of this code. What
+           we test here is if the requested size of the window is the same as 
+           the actual size of window, in which case all expose events that resulted
+           from resizing the window have been sent (and discarded) and we can
+           now do our full redraw and switch on expose event handling again. */
+           
+        if ((m_width == m_widget->allocation.width) && (m_height == m_widget->allocation.height))
+        {
+            m_queuedFullRedraw = FALSE;
+            m_updateRegion.Clear();
+            m_updateRegion.Union( 0,0,m_width,m_height );
+            gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
+            
+            GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
+            mask = (GdkEventMask)(mask | GDK_EXPOSURE_MASK);
+            gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );
+        }
+    }
 }
 
 void wxWindow::DoGetSize( int *width, int *height ) const
 }
 
 void wxWindow::DoGetSize( int *width, int *height ) const
@@ -2898,37 +3010,65 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
     {
         if (m_wxwindow)
         {
     {
         if (m_wxwindow)
         {
+
+/*
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
-
             gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
             gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
-
             gtk_pizza_set_clear( pizza, old_clear );
             gtk_pizza_set_clear( pizza, old_clear );
+*/
+            GdkEventExpose gdk_event;
+            gdk_event.count = 0;
+            gdk_event.area.x = 0;
+            gdk_event.area.y = 0;
+            gdk_event.area.width = m_wxwindow->allocation.width;
+            gdk_event.area.height = m_wxwindow->allocation.height;
+            gtk_window_expose_callback( m_wxwindow, &gdk_event, this );
+
         }
         else
         }
         else
+        {
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
+        }
     }
     else
     {
     }
     else
     {
-        GdkRectangle gdk_rect;
-        gdk_rect.x = rect->x;
-        gdk_rect.y = rect->y;
-        gdk_rect.width = rect->width;
-        gdk_rect.height = rect->height;
 
         if (m_wxwindow)
         {
 
         if (m_wxwindow)
         {
+/*
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
 
             GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
             gboolean old_clear = pizza->clear_on_draw;
             gtk_pizza_set_clear( pizza, FALSE );
 
+            GdkRectangle gdk_rect;
+            gdk_rect.x = rect->x;
+            gdk_rect.y = rect->y;
+            gdk_rect.width = rect->width;
+            gdk_rect.height = rect->height;
             gtk_widget_draw( m_wxwindow, &gdk_rect );
             gtk_widget_draw( m_wxwindow, &gdk_rect );
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
 
             gtk_pizza_set_clear( pizza, old_clear );
 
             gtk_pizza_set_clear( pizza, old_clear );
+*/
+            GdkEventExpose gdk_event;
+            gdk_event.count = 0;
+            gdk_event.area.x = rect->x;
+            gdk_event.area.y = rect->y;
+            gdk_event.area.width = rect->width;
+            gdk_event.area.height = rect->height;
+            gtk_window_expose_callback( m_wxwindow, &gdk_event, this );
         }
         else
         }
         else
+        {
+            GdkRectangle gdk_rect;
+            gdk_rect.x = rect->x;
+            gdk_rect.y = rect->y;
+            gdk_rect.width = rect->width;
+            gdk_rect.height = rect->height;
             gtk_widget_draw( m_widget, &gdk_rect );
             gtk_widget_draw( m_widget, &gdk_rect );
+        }
     }
 }
 
     }
 }
 
@@ -3452,7 +3592,9 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     
     if ((dx == 0) && (dy == 0)) return;
 
     
     if ((dx == 0) && (dy == 0)) return;
 
+    m_clipPaintRegion = TRUE;
     gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
     gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
+    m_clipPaintRegion = FALSE;
     
 /*    
     if (m_children.GetCount() > 0)
     
 /*    
     if (m_children.GetCount() > 0)