]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/window.cpp
Updated wxWidgets icons in art to use the new official logo.
[wxWidgets.git] / src / gtk1 / window.cpp
index eb6d484896cade8008974a31eabd9f0f23359a26..d9c45bfa80383ed32da669cd97d6fb23d832773b 100644 (file)
@@ -207,19 +207,19 @@ static GdkGC *g_eraseGC = NULL;
 
 // mouse capture state: the window which has it and if the mouse is currently
 // inside it
-static wxWindowGTK  *g_captureWindow = (wxWindowGTK*) NULL;
+static wxWindowGTK  *g_captureWindow = NULL;
 static bool g_captureWindowHasMouse = false;
 
-wxWindowGTK  *g_focusWindow = (wxWindowGTK*) NULL;
+wxWindowGTK  *g_focusWindow = NULL;
 
 // the last window which had the focus - this is normally never NULL (except
 // if we never had focus at all) as even when g_focusWindow is NULL it still
 // keeps its previous value
-wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
+wxWindowGTK *g_focusWindowLast = NULL;
 
 // If a window get the focus set but has not been realized
 // yet, defer setting the focus to idle time.
-wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
+wxWindowGTK *g_delayedFocus = NULL;
 
 // hack: we need something to pass to gtk_menu_popup, so we store the time of
 // the last click here (extern: used from gtk/menu.cpp)
@@ -227,7 +227,7 @@ guint32 wxGtkTimeLastClick = 0;
 
 // global variables because GTK+ DnD want to have the
 // mouse event that caused it
-GdkEvent *g_lastMouseEvent = (GdkEvent*) NULL;
+GdkEvent *g_lastMouseEvent = NULL;
 int g_lastButtonNumber = 0;
 
 extern bool g_mainThreadLocked;
@@ -294,7 +294,7 @@ wxWindow *wxFindFocusedChild(wxWindowGTK *win)
 {
     wxWindow *winFocus = wxWindowGTK::FindFocus();
     if ( !winFocus )
-        return (wxWindow *)NULL;
+        return NULL;
 
     if ( winFocus == win )
         return (wxWindow *)win;
@@ -308,7 +308,7 @@ wxWindow *wxFindFocusedChild(wxWindowGTK *win)
             return child;
     }
 
-    return (wxWindow *)NULL;
+    return NULL;
 }
 
 static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
@@ -371,7 +371,7 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
         return;
     }
 
-    if (win->HasFlag(wxSUNKEN_BORDER))
+    if (win->HasFlag(wxSUNKEN_BORDER) || win->HasFlag(wxBORDER_THEME))
     {
         gtk_draw_shadow( widget->style,
                          widget->window,
@@ -428,7 +428,7 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 
 // make it extern because wxStaticText needs to disconnect this one
 extern "C" {
-void wxgtk_window_size_request_callback(GtkWidget *widget,
+void wxgtk_window_size_request_callback(GtkWidget *WXUNUSED(widget),
                                         GtkRequisition *requisition,
                                         wxWindow *win)
 {
@@ -446,7 +446,7 @@ void wxgtk_window_size_request_callback(GtkWidget *widget,
 
 extern "C" {
 static
-void wxgtk_combo_size_request_callback(GtkWidget *widget,
+void wxgtk_combo_size_request_callback(GtkWidget *WXUNUSED(widget),
                                        GtkRequisition *requisition,
                                        wxComboBox *win)
 {
@@ -478,7 +478,7 @@ void wxgtk_combo_size_request_callback(GtkWidget *widget,
 //-----------------------------------------------------------------------------
 
 extern "C" {
-static int gtk_window_expose_callback( GtkWidget *widget,
+static int gtk_window_expose_callback( GtkWidget *WXUNUSED(widget),
                                        GdkEventExpose *gdk_event,
                                        wxWindow *win )
 {
@@ -611,7 +611,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
         GdkRectangle child_area;
         if (gtk_widget_intersect (child->widget, rect, &child_area))
         {
-            gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+            gtk_widget_draw (child->widget, &child_area /* NULL*/ );
         }
     }
 #endif
@@ -923,11 +923,13 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
     event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0;
     event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0;
     event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK) != 0;
-    event.m_scanCode = gdk_event->keyval;
     event.m_rawCode = (wxUint32) gdk_event->keyval;
     event.m_rawFlags = 0;
 #if wxUSE_UNICODE
-    event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval);
+#if 0
+   // this is not gtk1.x
+   event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval);
+#endif
 #endif
     wxGetMousePosition( &x, &y );
     win->ScreenToClient( &x, &y );
@@ -1063,7 +1065,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
     if ( wxTranslateGTKKeyEventToWx(event, win, gdk_event) )
     {
         // Emit KEY_DOWN event
-        ret = win->GetEventHandler()->ProcessEvent( event );
+        ret = win->HandleWindowEvent( event );
     }
     else
     {
@@ -1119,12 +1121,12 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
             if (parent)
             {
                 event.SetEventType( wxEVT_CHAR_HOOK );
-                ret = parent->GetEventHandler()->ProcessEvent( event );
+                ret = parent->HandleWindowEvent( event );
             }
             if (!ret)
             {
                 event.SetEventType(wxEVT_CHAR);
-                win->GetEventHandler()->ProcessEvent( event );
+                win->HandleWindowEvent( event );
             }
         }
         return true;
@@ -1143,7 +1145,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
             if (command != -1)
             {
                 wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command );
-                ret = ancestor->GetEventHandler()->ProcessEvent( command_event );
+                ret = ancestor->HandleWindowEvent( command_event );
                 break;
             }
             if (ancestor->IsTopLevel())
@@ -1188,13 +1190,13 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
             if (parent)
             {
                 event.SetEventType( wxEVT_CHAR_HOOK );
-                ret = parent->GetEventHandler()->ProcessEvent( event );
+                ret = parent->HandleWindowEvent( event );
             }
 
             if (!ret)
             {
                 event.SetEventType(wxEVT_CHAR);
-                ret = win->GetEventHandler()->ProcessEvent( event );
+                ret = win->HandleWindowEvent( event );
             }
         }
     }
@@ -1224,7 +1226,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
         // CTRL-TAB changes the (parent) window, i.e. switch notebook page
         new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
         new_event.SetCurrentFocus( win );
-        ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event );
+        ret = win->GetParent()->HandleWindowEvent( new_event );
     }
 
     // generate wxID_CANCEL if <esc> has been pressed (typically in dialogs)
@@ -1260,7 +1262,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
         {
             wxCommandEvent eventClick(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
             eventClick.SetEventObject(btnCancel);
-            ret = btnCancel->GetEventHandler()->ProcessEvent(eventClick);
+            ret = btnCancel->HandleWindowEvent(eventClick);
         }
     }
 
@@ -1301,7 +1303,7 @@ static gint gtk_window_key_release_callback( GtkWidget *widget,
         return FALSE;
     }
 
-    if ( !win->GetEventHandler()->ProcessEvent( event ) )
+    if ( !win->HandleWindowEvent( event ) )
         return FALSE;
 
     gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_release_event" );
@@ -1430,7 +1432,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y)
         }
         else
         {
-            if ((child->m_wxwindow == (GtkWidget*) NULL) &&
+            if ((child->m_wxwindow == NULL) &&
                 (child->m_x <= xx) &&
                 (child->m_y <= yy) &&
                 (child->m_x+child->m_width  >= xx) &&
@@ -1475,7 +1477,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
 
     g_lastButtonNumber = gdk_event->button;
 
-    if (win->m_wxwindow && (g_focusWindow != win) && win->CanAcceptFocus())
+    if (win->m_wxwindow && (g_focusWindow != win) && win->IsFocusable())
     {
         gtk_widget_grab_focus( win->m_wxwindow );
 /*
@@ -1583,7 +1585,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
     }
 
     g_lastMouseEvent = (GdkEvent*) gdk_event;
-    
+
     wxMouseEvent event( event_type );
     InitMouseEvent( win, event, gdk_event );
 
@@ -1613,7 +1615,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
         }
     }
 
-    if (win->GetEventHandler()->ProcessEvent( event ))
+    if (win->HandleWindowEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" );
         g_lastMouseEvent = NULL;
@@ -1635,7 +1637,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
             win->GetId(),
             win->ClientToScreen(event.GetPosition()));
         evtCtx.SetEventObject(win);
-        return win->GetEventHandler()->ProcessEvent(evtCtx);
+        return win->HandleWindowEvent(evtCtx);
     }
 
     return FALSE;
@@ -1686,7 +1688,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget,
     }
 
     g_lastMouseEvent = (GdkEvent*) gdk_event;
-    
+
     wxMouseEvent event( event_type );
     InitMouseEvent( win, event, gdk_event );
 
@@ -1698,7 +1700,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget,
     if ( !g_captureWindow )
         win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
 
-    if (win->GetEventHandler()->ProcessEvent( event ))
+    if (win->HandleWindowEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_release_event" );
         return TRUE;
@@ -1768,7 +1770,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
                                                         : wxEVT_LEAVE_WINDOW);
             InitMouseEvent(win, eventM, gdk_event);
             eventM.SetEventObject(win);
-            win->GetEventHandler()->ProcessEvent(eventM);
+            win->HandleWindowEvent(eventM);
         }
     }
     else // no capture
@@ -1776,7 +1778,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
         win = FindWindowForMouseEvent(win, event.m_x, event.m_y);
     }
 
-    bool ret = win->GetEventHandler()->ProcessEvent( event );
+    bool ret = win->HandleWindowEvent( event );
     g_lastMouseEvent = NULL;
 
     if ( ret )
@@ -1799,12 +1801,12 @@ static bool DoSendFocusEvents(wxWindow *win)
     // Notify the parent keeping track of focus for the kbd navigation
     // purposes that we got it.
     wxChildFocusEvent eventChildFocus(win);
-    (void)win->GetEventHandler()->ProcessEvent(eventChildFocus);
+    (void)win->HandleWindowEvent(eventChildFocus);
 
     wxFocusEvent eventFocus(wxEVT_SET_FOCUS, win->GetId());
     eventFocus.SetEventObject(win);
 
-    return win->GetEventHandler()->ProcessEvent(eventFocus);
+    return win->HandleWindowEvent(eventFocus);
 }
 
 extern "C" {
@@ -1859,7 +1861,9 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
 //-----------------------------------------------------------------------------
 
 extern "C" {
-static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win )
+static gint gtk_window_focus_out_callback( GtkWidget *WXUNUSED(widget),
+                                           GdkEventFocus *WXUNUSED(gdk_event),
+                                           wxWindowGTK *win )
 {
     DEBUG_MAIN_THREAD
 
@@ -1874,7 +1878,7 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
     if ( winFocus )
         win = winFocus;
 
-    g_focusWindow = (wxWindowGTK *)NULL;
+    g_focusWindow = NULL;
 
 #ifdef HAVE_XIM
     if (win->m_ic)
@@ -1903,7 +1907,7 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
         // process it too as otherwise bad things happen, especially in GTK2
         // where the text control simply aborts the program if it doesn't get
         // the matching focus out event
-        (void)win->GetEventHandler()->ProcessEvent( event );
+        (void)win->HandleWindowEvent( event );
     }
 
     return FALSE;
@@ -1945,7 +1949,7 @@ gint gtk_window_enter_callback( GtkWidget *widget,
     event.m_x = x + pt.x;
     event.m_y = y + pt.y;
 
-    if (win->GetEventHandler()->ProcessEvent( event ))
+    if (win->HandleWindowEvent( event ))
     {
        gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
        return TRUE;
@@ -1997,7 +2001,7 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
     event.m_x = x + pt.x;
     event.m_y = y + pt.y;
 
-    if (win->GetEventHandler()->ProcessEvent( event ))
+    if (win->HandleWindowEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
         return TRUE;
@@ -2037,7 +2041,7 @@ static void gtk_window_vscroll_callback( GtkAdjustment *adjust,
 
     wxScrollWinEvent event( command, value, wxVERTICAL );
     event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( event );
+    win->HandleWindowEvent( event );
 }
 }
 
@@ -2070,7 +2074,7 @@ static void gtk_window_hscroll_callback( GtkAdjustment *adjust,
 
     wxScrollWinEvent event( command, value, wxHORIZONTAL );
     event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( event );
+    win->HandleWindowEvent( event );
 }
 }
 
@@ -2136,7 +2140,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
 
         wxScrollWinEvent event( command, value, dir );
         event.SetEventObject( win );
-        win->GetEventHandler()->ProcessEvent( event );
+        win->HandleWindowEvent( event );
     }
 
     win->m_isScrolling = false;
@@ -2165,7 +2169,7 @@ wxWindow *wxWindowBase::DoFindFocus()
 
 extern "C" {
 static gint
-gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
+gtk_window_realized_callback( GtkWidget *WXUNUSED(widget), wxWindow *win )
 {
     DEBUG_MAIN_THREAD
 
@@ -2174,7 +2178,7 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
 
     wxWindowCreateEvent event( win );
     event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( event );
+    win->HandleWindowEvent( event );
 
     return FALSE;
 }
@@ -2208,7 +2212,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
     {
         wxSizeEvent event( win->GetSize(), win->GetId() );
         event.SetEventObject( win );
-        win->GetEventHandler()->ProcessEvent( event );
+        win->HandleWindowEvent( event );
     }
 }
 }
@@ -2225,7 +2229,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
 extern "C" {
 static
 void gtk_wxwindow_size_callback( GtkWidget* WXUNUSED_UNLESS_XIM(widget),
-                                 GtkAllocation* WXUNUSED_UNLESS_XIM(alloc),
+                                 GtkAllocation* WXUNUSED(alloc),
                                  wxWindowGTK* WXUNUSED_UNLESS_XIM(win) )
 {
     if (g_isIdle)
@@ -2419,9 +2423,9 @@ wxMouseState wxGetMouseState()
 void wxWindowGTK::Init()
 {
     // GTK specific
-    m_widget = (GtkWidget *) NULL;
-    m_wxwindow = (GtkWidget *) NULL;
-    m_focusWidget = (GtkWidget *) NULL;
+    m_widget = NULL;
+    m_wxwindow = NULL;
+    m_focusWidget = NULL;
 
     // position/size
     m_x = 0;
@@ -2432,7 +2436,6 @@ void wxWindowGTK::Init()
     m_sizeSet = false;
     m_hasVMT = false;
     m_needParent = true;
-    m_isBeingDeleted = false;
 
     m_noExpose = false;
     m_nativeSizeEvent = false;
@@ -2440,8 +2443,8 @@ void wxWindowGTK::Init()
     m_hasScrolling = false;
     m_isScrolling = false;
 
-    m_hAdjust = (GtkAdjustment*) NULL;
-    m_vAdjust = (GtkAdjustment*) NULL;
+    m_hAdjust = NULL;
+    m_vAdjust = NULL;
     m_oldHorizontalPos =
     m_oldVerticalPos = 0.0;
     m_oldClientWidth =
@@ -2461,8 +2464,8 @@ void wxWindowGTK::Init()
     m_cursor = *wxSTANDARD_CURSOR;
 
 #ifdef HAVE_XIM
-    m_ic = (GdkIC*) NULL;
-    m_icattr = (GdkICAttr*) NULL;
+    m_ic = NULL;
+    m_icattr = NULL;
 #endif
 }
 
@@ -2490,6 +2493,11 @@ bool wxWindowGTK::Create( wxWindow *parent,
                           long style,
                           const wxString &name  )
 {
+    // Get default border
+    wxBorder border = GetBorder(style);
+    style &= ~wxBORDER_MASK;
+    style |= border;
+
     if (!PreCreation( parent, pos, size ) ||
         !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
     {
@@ -2499,7 +2507,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
 
     m_insertCallback = wxInsertChildInWindow;
 
-    m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
+    m_widget = gtk_scrolled_window_new( NULL, NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
     GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
@@ -2521,7 +2529,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
     {
         gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_OUT );
     }
-    else if (HasFlag(wxSUNKEN_BORDER))
+    else if (HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME))
     {
         gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_IN );
     }
@@ -2603,7 +2611,6 @@ wxWindowGTK::~wxWindowGTK()
     if ( g_delayedFocus == this )
         g_delayedFocus = NULL;
 
-    m_isBeingDeleted = true;
     m_hasVMT = false;
 
     // destroy children before destroying this window itself
@@ -2632,13 +2639,13 @@ wxWindowGTK::~wxWindowGTK()
     if (m_wxwindow)
     {
         gtk_widget_destroy( m_wxwindow );
-        m_wxwindow = (GtkWidget*) NULL;
+        m_wxwindow = NULL;
     }
 
     if (m_widget)
     {
         gtk_widget_destroy( m_widget );
-        m_widget = (GtkWidget*) NULL;
+        m_widget = NULL;
     }
 }
 
@@ -2907,7 +2914,7 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
     {
         wxSizeEvent event( wxSize(m_width,m_height), GetId() );
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent( event );
+        HandleWindowEvent( event );
     }
 
     m_resizing = false;
@@ -2958,7 +2965,7 @@ void wxWindowGTK::OnInternalIdle()
         }
     }
 
-    if (wxUpdateUIEvent::CanUpdate(this))
+    if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen())
         UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
 }
 
@@ -2984,7 +2991,7 @@ void wxWindowGTK::DoSetClientSize( int width, int height )
         int dh = 0;
 
 #ifndef __WXUNIVERSAL__
-        if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER))
+        if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME))
         {
             /* when using GTK 1.2 we set the shadow border size to 2 */
             dw += 2 * 2;
@@ -3048,7 +3055,7 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const
         int dh = 0;
 
 #ifndef __WXUNIVERSAL__
-        if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER))
+        if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME))
         {
             /* when using GTK 1.2 we set the shadow border size to 2 */
             dw += 2 * 2;
@@ -3128,7 +3135,7 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const
 
     if (!m_widget->window) return;
 
-    GdkWindow *source = (GdkWindow *) NULL;
+    GdkWindow *source = NULL;
     if (m_wxwindow)
         source = GTK_PIZZA(m_wxwindow)->bin_window;
     else
@@ -3157,7 +3164,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const
 
     if (!m_widget->window) return;
 
-    GdkWindow *source = (GdkWindow *) NULL;
+    GdkWindow *source = NULL;
     if (m_wxwindow)
         source = GTK_PIZZA(m_wxwindow)->bin_window;
     else
@@ -3198,7 +3205,7 @@ bool wxWindowGTK::Show( bool show )
     wxShowEvent eventShow(GetId(), show);
     eventShow.SetEventObject(this);
 
-    GetEventHandler()->ProcessEvent(eventShow);
+    HandleWindowEvent(eventShow);
 
     return true;
 }
@@ -3421,7 +3428,7 @@ void wxWindowGTK::WarpPointer( int x, int y )
     // We provide this function ourselves as it is
     // missing in GDK (top of this file).
 
-    GdkWindow *window = (GdkWindow*) NULL;
+    GdkWindow *window = NULL;
     if (m_wxwindow)
         window = GTK_PIZZA(m_wxwindow)->bin_window;
     else
@@ -3495,7 +3502,7 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
         }
         else
         {
-            gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
+            gtk_widget_draw( m_widget, NULL );
         }
     }
 }
@@ -3573,20 +3580,16 @@ void wxWindowGTK::GtkSendPaintEvents()
             }
         }
     }
-    else
-
-    // if (!m_clearRegion.IsEmpty())   // Always send an erase event under GTK 1.2
+    else // Always send an erase event under GTK 1.2
     {
         wxWindowDC dc( (wxWindow*)this );
-        if (m_clearRegion.IsEmpty())
-            dc.SetClippingRegion( m_updateRegion );
-        else
-            dc.SetClippingRegion( m_clearRegion );
+        dc.SetDeviceClippingRegion( m_clearRegion.IsEmpty() ? m_updateRegion
+                                                            : m_clearRegion );
 
         wxEraseEvent erase_event( GetId(), &dc );
         erase_event.SetEventObject( this );
 
-        if (!GetEventHandler()->ProcessEvent(erase_event) && GetBackgroundStyle() != wxBG_STYLE_CUSTOM)
+        if (!HandleWindowEvent(erase_event) && GetBackgroundStyle() != wxBG_STYLE_CUSTOM)
         {
             if (!g_eraseGC)
             {
@@ -3608,11 +3611,11 @@ void wxWindowGTK::GtkSendPaintEvents()
 
     wxNcPaintEvent nc_paint_event( GetId() );
     nc_paint_event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( nc_paint_event );
+    HandleWindowEvent( nc_paint_event );
 
     wxPaintEvent paint_event( GetId() );
     paint_event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( paint_event );
+    HandleWindowEvent( paint_event );
 
     m_clipPaintRegion = false;
 
@@ -3689,7 +3692,7 @@ void wxWindowGTK::DoSetToolTip( wxToolTip *tip )
 void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip )
 {
     wxString tmp( tip );
-    gtk_tooltips_set_tip( tips, GetConnectWidget(), wxGTK_CONV(tmp), (gchar*) NULL );
+    gtk_tooltips_set_tip( tips, GetConnectWidget(), wxGTK_CONV(tmp), NULL );
 }
 #endif // wxUSE_TOOLTIPS
 
@@ -3823,7 +3826,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
 
     if (style == wxBG_STYLE_CUSTOM)
     {
-        GdkWindow *window = (GdkWindow*) NULL;
+        GdkWindow *window = NULL;
         if (m_wxwindow)
             window = GTK_PIZZA(m_wxwindow)->bin_window;
         else
@@ -3907,7 +3910,7 @@ void wxWindowGTK::DoCaptureMouse()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
 
-    GdkWindow *window = (GdkWindow*) NULL;
+    GdkWindow *window = NULL;
     if (m_wxwindow)
         window = GTK_PIZZA(m_wxwindow)->bin_window;
     else
@@ -3925,7 +3928,7 @@ void wxWindowGTK::DoCaptureMouse()
                           GDK_BUTTON_RELEASE_MASK |
                           GDK_POINTER_MOTION_HINT_MASK |
                           GDK_POINTER_MOTION_MASK),
-                      (GdkWindow *) NULL,
+                      NULL,
                       cursor->GetCursor(),
                       (guint32)GDK_CURRENT_TIME );
     g_captureWindow = this;
@@ -3938,9 +3941,9 @@ void wxWindowGTK::DoReleaseMouse()
 
     wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
 
-    g_captureWindow = (wxWindowGTK*) NULL;
+    g_captureWindow = NULL;
 
-    GdkWindow *window = (GdkWindow*) NULL;
+    GdkWindow *window = NULL;
     if (m_wxwindow)
         window = GTK_PIZZA(m_wxwindow)->bin_window;
     else
@@ -4219,3 +4222,11 @@ void wxWinModule::OnExit()
     if (g_eraseGC)
         gdk_gc_unref( g_eraseGC );
 }
+
+GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const
+{
+    GdkWindow* window = NULL;
+    if (m_wxwindow)
+        window = GTK_PIZZA(m_wxwindow)->bin_window;
+    return window;
+}