]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/window.cpp
Committing in .
[wxWidgets.git] / src / gtk1 / window.cpp
index a55d32a3ad1cecaf558d0d4a0b14b472088ba483..c6f04210f91a27f9773d486dffa54e4a05669f89 100644 (file)
@@ -229,7 +229,7 @@ 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 bool g_captureWindowHasMouse = FALSE;
+static bool g_captureWindowHasMouse = false;
 
 wxWindowGTK  *g_focusWindow = (wxWindowGTK*) NULL;
 
@@ -244,7 +244,7 @@ wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
 
 // hack: we need something to pass to gtk_menu_popup, so we store the time of
 // the last click here
-static guint32 gs_timeLastClick = 0; 
+static guint32 gs_timeLastClick = 0;
 
 extern bool g_mainThreadLocked;
 
@@ -379,7 +379,7 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
             dh += hscroll_req.height;
             dh += scroll_class->scrollbar_spacing;
         }
-}
+    }
 
     int dx = 0;
     int dy = 0;
@@ -429,7 +429,8 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
 // "expose_event" of m_widget
 //-----------------------------------------------------------------------------
 
-gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindowGTK *win )
+extern "C" {
+static gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindowGTK *win )
 {
     if (gdk_event->count > 0) return FALSE;
 
@@ -442,6 +443,7 @@ gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_even
 #endif
     return TRUE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "draw" of m_widget
@@ -449,10 +451,12 @@ gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_even
 
 #ifndef __WXGTK20__
 
+extern "C" {
 static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxWindowGTK *win )
 {
     draw_frame( widget, win );
 }
+}
 
 #endif // GTK+ < 2.0
 
@@ -460,8 +464,8 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
 // "size_request" of m_widget
 //-----------------------------------------------------------------------------
 
-// make it extern because wxStatitText needs to disconnect this one
-extern "C"
+// make it extern because wxStaticText needs to disconnect this one
+extern "C" {
 void wxgtk_window_size_request_callback(GtkWidget *widget,
                                         GtkRequisition *requisition,
                                         wxWindow *win)
@@ -476,16 +480,17 @@ void wxgtk_window_size_request_callback(GtkWidget *widget,
     requisition->height = h;
     requisition->width = w;
 }
+}
 
-
-extern "C"
+extern "C" {
+static
 void wxgtk_combo_size_request_callback(GtkWidget *widget,
                                        GtkRequisition *requisition,
                                        wxComboBox *win)
 {
     // This callback is actually hooked into the text entry
     // of the combo box, not the GtkHBox.
-    
+
     int w, h;
     win->GetSize( &w, &h );
     if (w < 2)
@@ -494,21 +499,23 @@ void wxgtk_combo_size_request_callback(GtkWidget *widget,
         h = 2;
 
     GtkCombo *gcombo = GTK_COMBO(win->m_widget);
-    
+
     GtkRequisition entry_req;
     entry_req.width = 2;
     entry_req.height = 2;
     (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(gcombo->button) )->size_request )
         (gcombo->button, &entry_req );
-    
+
     requisition->width = w - entry_req.width;
-    requisition->height = entry_req.height+4;  // TODO: why +4?
+    requisition->height = entry_req.height;
+}
 }
 
 //-----------------------------------------------------------------------------
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static int gtk_window_expose_callback( GtkWidget *widget,
                                        GdkEventExpose *gdk_event,
                                        wxWindow *win )
@@ -537,7 +544,7 @@ static int gtk_window_expose_callback( GtkWidget *widget,
                                          (int)gdk_event->area.width,
                                          (int)gdk_event->area.height );
     }
-    
+
     gtk_paint_box
     (
         win->m_wxwindow->style,
@@ -578,17 +585,22 @@ static int gtk_window_expose_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
+#ifndef __WXGTK20__
+
 // 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.
 // There, we look for expose events ourselves whereas all other events are
 // handled normally.
 
+extern "C" {
+static
 gint gtk_window_event_event_callback( GtkWidget *widget,
                                       GdkEventExpose *event,
                                       wxWindow *win )
@@ -601,6 +613,9 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
+
+#endif // !GTK+ 2
 
 //-----------------------------------------------------------------------------
 // "draw" of m_wxwindow
@@ -611,6 +626,7 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
 // This callback is a complete replacement of the gtk_pizza_draw() function,
 // which is disabled.
 
+extern "C" {
 static void gtk_window_draw_callback( GtkWidget *widget,
                                       GdkRectangle *rect,
                                       wxWindow *win )
@@ -686,6 +702,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
     }
 #endif
 }
+}
 
 #endif
 
@@ -1000,6 +1017,8 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event,
 #if wxUSE_UNICODE
     event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval);
 #endif
+    wxGetMousePosition( &x, &y );
+    win->ScreenToClient( &x, &y );
     event.m_x = x;
     event.m_y = y;
     event.SetEventObject( win );
@@ -1029,7 +1048,7 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
                                                     : _T("press"),
                keysym);
 
-    long key_code = wxTranslateKeySymToWXKey(keysym, FALSE /* !isChar */);
+    long key_code = wxTranslateKeySymToWXKey(keysym, false /* !isChar */);
 
     if ( !key_code )
     {
@@ -1098,14 +1117,14 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
 
     // sending unknown key events doesn't really make sense
     if ( !key_code )
-        return FALSE;
+        return false;
 
     // now fill all the other fields
     wxFillOtherKeyEventFields(event, win, gdk_event);
-    
+
     event.m_keyCode = key_code;
 
-    return TRUE;
+    return true;
 }
 
 
@@ -1127,6 +1146,7 @@ struct wxGtkIMData
 };
 #endif
 
+extern "C" {
 static gint gtk_window_key_press_callback( GtkWidget *widget,
                                            GdkEventKey *gdk_event,
                                            wxWindow *win )
@@ -1151,7 +1171,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
         // Emit KEY_DOWN event
         ret = win->GetEventHandler()->ProcessEvent( event );
     }
-    else 
+    else
     {
         // Return after IM processing as we cannot do
         // anything with it anyhow.
@@ -1162,19 +1182,19 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
     // 2005.01.26 modified by Hong Jen Yee (hzysoft@sina.com.tw):
     // When we get a key_press event here, it could be originate
     // from the current widget or its child widgets.  However, only the widget
-    // with the INPUT FOCUS can generate the INITIAL key_press event.  That is, 
+    // with the INPUT FOCUS can generate the INITIAL key_press event.  That is,
     // if the CURRENT widget doesn't have the FOCUS at all, this event definitely
     // originated from its child widgets and shouldn't be passed to IM context.
     // In fact, what a GTK+ IM should do is filtering keyEvents and convert them
     // into text input ONLY WHEN THE WIDGET HAS INPUT FOCUS.  Besides, when current
-    // widgets has both IM context and input focus, the event should be filtered 
+    // widgets has both IM context and input focus, the event should be filtered
     // by gtk_im_context_filter_keypress().
     // Then, we should, according to GTK+ 2.0 API doc, return whatever it returns.
     if ((!ret) && (win->m_imData != NULL) && ( wxWindow::FindFocus() == win ))
     {
         // We should let GTK+ IM filter key event first. According to GTK+ 2.0 API
         // docs, if IM filter returns true, no further processing should be done.
-        // we should send the key_down event anyway. 
+        // we should send the key_down event anyway.
         bool intercepted_by_IM = gtk_im_context_filter_keypress(win->m_imData->context, gdk_event);
         win->m_imData->lastKeyEvent = NULL;
         if (intercepted_by_IM)
@@ -1185,18 +1205,18 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
     }
 #endif
     if (return_after_IM)
-        return true;
+        return false;
 
-#ifndef __WXGTK20__     
+#ifndef __WXGTK20__
     // This is for GTK+ 1.2 only. The char event generatation for GTK+ 2.0 is done
     // in the "commit" handler.
-    
+
     // 2005.02.02 modified by Hong Jen Yee (hzysoft@sina.com.tw).
-    // In GTK+ 1.2, strings sent by IMs are also regarded as key_press events whose 
-    // keyCodes cannot be recognized by wxWidgets. These MBCS strings, however, are 
-    // composed of more than one character, which means gdk_event->length will always 
+    // In GTK+ 1.2, strings sent by IMs are also regarded as key_press events whose
+    // keyCodes cannot be recognized by wxWidgets. These MBCS strings, however, are
+    // composed of more than one character, which means gdk_event->length will always
     // greater than one. When gtk_event->length == 1, this may be an ASCII character
-    // and can be translated by wx.  However, when MBCS characters are sent by IM, 
+    // and can be translated by wx.  However, when MBCS characters are sent by IM,
     // gdk_event->length will >= 2. So neither should we pass it to accelerator table,
     // nor should we pass it to controls. The following explanation was excerpted
     // from GDK documentation.
@@ -1245,7 +1265,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
         }
         return true;
     }
-    
+
 #endif  // #ifndef  __WXGTK20__
 
 #if wxUSE_ACCEL
@@ -1275,7 +1295,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
         long key_code;
         KeySym keysym = gdk_event->keyval;
         // Find key code for EVT_CHAR and EVT_CHAR_HOOK events
-        key_code = wxTranslateKeySymToWXKey(keysym, TRUE /* isChar */);
+        key_code = wxTranslateKeySymToWXKey(keysym, true /* isChar */);
         if ( !key_code )
         {
             if ( wxIsAsciiKeysym(keysym) )
@@ -1387,8 +1407,10 @@ static gint gtk_window_key_press_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 #ifdef __WXGTK20__
+extern "C" {
 static void gtk_wxwindow_commit_cb (GtkIMContext *context,
                            const gchar  *str,
                            wxWindow     *window)
@@ -1442,6 +1464,7 @@ static void gtk_wxwindow_commit_cb (GtkIMContext *context,
         }
     }
 }
+}
 #endif
 
 
@@ -1449,6 +1472,7 @@ static void gtk_wxwindow_commit_cb (GtkIMContext *context,
 // "key_release_event" from any window
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_key_release_callback( GtkWidget *widget,
                                              GdkEventKey *gdk_event,
                                              wxWindowGTK *win )
@@ -1477,6 +1501,7 @@ static gint gtk_window_key_release_callback( GtkWidget *widget,
     gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_release_event" );
     return TRUE;
 }
+}
 
 // ============================================================================
 // the mouse events
@@ -1620,6 +1645,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y)
 // "button_press_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_button_press_callback( GtkWidget *widget,
                                               GdkEventButton *gdk_event,
                                               wxWindowGTK *win )
@@ -1678,6 +1704,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
     // GdkDisplay is a GTK+ 2.2.0 thing
 #if defined(__WXGTK20__) && GTK_CHECK_VERSION(2, 2, 0)
     if ( gdk_event->type == GDK_2BUTTON_PRESS &&
+            !gtk_check_version(2,2,0) &&
             gdk_event->button >= 1 && gdk_event->button <= 3 )
     {
         // Reset GDK internal timestamp variables in order to disable GDK
@@ -1818,11 +1845,13 @@ static gint gtk_window_button_press_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "button_release_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_button_release_callback( GtkWidget *widget,
                                                 GdkEventButton *gdk_event,
                                                 wxWindowGTK *win )
@@ -1878,11 +1907,13 @@ static gint gtk_window_button_release_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "motion_notify_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_motion_notify_callback( GtkWidget *widget,
                                                GdkEventMotion *gdk_event,
                                                wxWindowGTK *win )
@@ -1952,15 +1983,17 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 #ifdef __WXGTK20__
 //-----------------------------------------------------------------------------
 // "mouse_wheel_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_wheel_callback (GtkWidget * widget,
-                                       GdkEventScroll * gdk_event,
-                                       wxWindowGTK * win)
+                                       GdkEventScroll * gdk_event,
+                                       wxWindowGTK * win)
 {
     DEBUG_MAIN_THREAD
 
@@ -1974,7 +2007,7 @@ static gint gtk_window_wheel_callback (GtkWidget * widget,
         event_type = wxEVT_MOUSEWHEEL;
     else
         return FALSE;
-    
+
     wxMouseEvent event( event_type );
     // Can't use InitMouse macro because scroll events don't have button
     event.SetTimestamp( gdk_event->time );
@@ -1999,7 +2032,7 @@ static gint gtk_window_wheel_callback (GtkWidget * widget,
     event.SetEventObject( win );
     event.SetId( win->GetId() );
     event.SetTimestamp( gdk_event->time );
-    
+
     if (win->GetEventHandler()->ProcessEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "scroll_event" );
@@ -2008,10 +2041,12 @@ static gint gtk_window_wheel_callback (GtkWidget * widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "popup-menu"
 //-----------------------------------------------------------------------------
+extern "C" {
 static gboolean wxgtk_window_popup_menu_callback(GtkWidget*, wxWindowGTK* win)
 {
     wxContextMenuEvent event(
@@ -2021,6 +2056,7 @@ static gboolean wxgtk_window_popup_menu_callback(GtkWidget*, wxWindowGTK* win)
     event.SetEventObject(win);
     return win->GetEventHandler()->ProcessEvent(event);
 }
+}
 #endif // __WXGTK20__
 
 //-----------------------------------------------------------------------------
@@ -2042,12 +2078,13 @@ static bool DoSendFocusEvents(wxWindow *win)
     return win->GetEventHandler()->ProcessEvent(eventFocus);
 }
 
+extern "C" {
 static gint gtk_window_focus_in_callback( GtkWidget *widget,
                                           GdkEvent *WXUNUSED(event),
                                           wxWindow *win )
 {
     DEBUG_MAIN_THREAD
-    
+
     if (g_isIdle)
         wxapp_install_idle_handler();
 
@@ -2080,8 +2117,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
     if ( !win->m_hasFocus )
     {
         // not yet, notify it
-        win->m_hasFocus = TRUE;
-        
+        win->m_hasFocus = true;
+
         if ( DoSendFocusEvents(win) )
         {
            gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
@@ -2091,11 +2128,13 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "focus_out_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win )
 {
     DEBUG_MAIN_THREAD
@@ -2136,7 +2175,7 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
     // have focus already
     if ( win->m_hasFocus )
     {
-        win->m_hasFocus = FALSE;
+        win->m_hasFocus = false;
 
         wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
         event.SetEventObject( win );
@@ -2150,11 +2189,13 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "enter_notify_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static
 gint gtk_window_enter_callback( GtkWidget *widget,
                                 GdkEventCrossing *gdk_event,
@@ -2193,11 +2234,13 @@ gint gtk_window_enter_callback( GtkWidget *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "leave_notify_event"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindowGTK *win )
 {
     DEBUG_MAIN_THREAD
@@ -2243,11 +2286,13 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "value_changed" from m_vAdjust
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static void gtk_window_vscroll_callback( GtkAdjustment *adjust,
                                          SCROLLBAR_CBACK_ARG
                                          wxWindowGTK *win )
@@ -2277,11 +2322,13 @@ static void gtk_window_vscroll_callback( GtkAdjustment *adjust,
     event.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent( event );
 }
+}
 
 //-----------------------------------------------------------------------------
 // "value_changed" from m_hAdjust
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static void gtk_window_hscroll_callback( GtkAdjustment *adjust,
                                          SCROLLBAR_CBACK_ARG
                                          wxWindowGTK *win )
@@ -2310,11 +2357,13 @@ static void gtk_window_hscroll_callback( GtkAdjustment *adjust,
     event.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent( event );
 }
+}
 
 //-----------------------------------------------------------------------------
 // "button_press_event" from scrollbar
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_scrollbar_button_press_callback( GtkRange *widget,
                                                  GdkEventButton *gdk_event,
                                                  wxWindowGTK *win)
@@ -2325,7 +2374,7 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget,
         wxapp_install_idle_handler();
 
 
-    g_blockEventsOnScroll = TRUE;
+    g_blockEventsOnScroll = true;
 
     // FIXME: there is no 'slider' field in GTK+ 2.0 any more
 #ifndef __WXGTK20__
@@ -2334,11 +2383,13 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget,
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "button_release_event" from scrollbar
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
                                                    GdkEventButton *WXUNUSED(gdk_event),
                                                    wxWindowGTK *win)
@@ -2350,7 +2401,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
 //
 //    if (gdk_event->window != widget->slider) return FALSE;
 
-    g_blockEventsOnScroll = FALSE;
+    g_blockEventsOnScroll = false;
 
     if (win->m_isScrolling)
     {
@@ -2375,10 +2426,11 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
         win->GetEventHandler()->ProcessEvent( event );
     }
 
-    win->m_isScrolling = FALSE;
+    win->m_isScrolling = false;
 
     return FALSE;
 }
+}
 
 // ----------------------------------------------------------------------------
 // this wxWindowBase function is implemented here (in platform-specific file)
@@ -2391,7 +2443,6 @@ wxWindow *wxWindowBase::DoFindFocus()
     return (wxWindow *)g_focusWindow;
 }
 
-
 //-----------------------------------------------------------------------------
 // "realize" from m_widget
 //-----------------------------------------------------------------------------
@@ -2399,6 +2450,7 @@ wxWindow *wxWindowBase::DoFindFocus()
 /* We cannot set colours and fonts before the widget has
    been realized, so we do this directly after realization. */
 
+extern "C" {
 static gint
 gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
 {
@@ -2406,7 +2458,7 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
 
     if (g_isIdle)
         wxapp_install_idle_handler();
-        
+
 #ifdef __WXGTK20__
     if (win->m_imData)
     {
@@ -2422,11 +2474,13 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // "size_allocate"
 //-----------------------------------------------------------------------------
 
+extern "C" {
 static
 void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
                                GtkAllocation *WXUNUSED(alloc),
@@ -2453,6 +2507,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
         win->GetEventHandler()->ProcessEvent( event );
     }
 }
+}
 
 
 #ifdef HAVE_XIM
@@ -2463,6 +2518,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
 
 /* Resize XIM window */
 
+extern "C" {
 static
 void gtk_wxwindow_size_callback( GtkWidget* WXUNUSED_UNLESS_XIM(widget),
                                  GtkAllocation* WXUNUSED_UNLESS_XIM(alloc),
@@ -2486,6 +2542,7 @@ void gtk_wxwindow_size_callback( GtkWidget* WXUNUSED_UNLESS_XIM(widget),
     }
 #endif // HAVE_XIM
 }
+}
 
 //-----------------------------------------------------------------------------
 // "realize" from m_wxwindow
@@ -2493,6 +2550,7 @@ void gtk_wxwindow_size_callback( GtkWidget* WXUNUSED_UNLESS_XIM(widget),
 
 /* Initialize XIM support */
 
+extern "C" {
 static gint
 gtk_wxwindow_realized_callback( GtkWidget * WXUNUSED_UNLESS_XIM(widget),
                                 wxWindowGTK * WXUNUSED_UNLESS_XIM(win) )
@@ -2579,6 +2637,7 @@ gtk_wxwindow_realized_callback( GtkWidget * WXUNUSED_UNLESS_XIM(widget),
 
     return FALSE;
 }
+}
 
 //-----------------------------------------------------------------------------
 // InsertChild for wxWindowGTK.
@@ -2641,16 +2700,16 @@ void wxWindowGTK::Init()
     m_width = 0;
     m_height = 0;
 
-    m_sizeSet = FALSE;
-    m_hasVMT = FALSE;
-    m_needParent = TRUE;
-    m_isBeingDeleted = FALSE;
+    m_sizeSet = false;
+    m_hasVMT = false;
+    m_needParent = true;
+    m_isBeingDeleted = false;
 
-    m_noExpose = FALSE;
-    m_nativeSizeEvent = FALSE;
+    m_noExpose = false;
+    m_nativeSizeEvent = false;
 
-    m_hasScrolling = FALSE;
-    m_isScrolling = FALSE;
+    m_hasScrolling = false;
+    m_isScrolling = false;
 
     m_hAdjust = (GtkAdjustment*) NULL;
     m_vAdjust = (GtkAdjustment*) NULL;
@@ -2659,14 +2718,14 @@ void wxWindowGTK::Init()
     m_oldClientWidth =
     m_oldClientHeight = 0;
 
-    m_resizing = FALSE;
+    m_resizing = false;
 
     m_insertCallback = (wxInsertChildFunction) NULL;
 
-    m_acceptsFocus = FALSE;
-    m_hasFocus = FALSE;
+    m_acceptsFocus = false;
+    m_hasFocus = false;
 
-    m_clipPaintRegion = FALSE;
+    m_clipPaintRegion = false;
 
     m_needsStyleChange = false;
 
@@ -2712,7 +2771,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
         !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
     {
         wxFAIL_MSG( wxT("wxWindowGTK creation failed") );
-        return FALSE;
+        return false;
     }
 
     m_insertCallback = wxInsertChildInWindow;
@@ -2756,7 +2815,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
     gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
 
     GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
-    m_acceptsFocus = TRUE;
+    m_acceptsFocus = true;
 
     // I _really_ don't want scrollbars in the beginning
     m_vAdjust->lower = 0.0;
@@ -2808,7 +2867,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
 
     PostCreation();
 
-    return TRUE;
+    return true;
 }
 
 wxWindowGTK::~wxWindowGTK()
@@ -2821,11 +2880,11 @@ wxWindowGTK::~wxWindowGTK()
     if ( g_delayedFocus == this )
         g_delayedFocus = NULL;
 
-    m_isBeingDeleted = TRUE;
-    m_hasVMT = FALSE;
+    m_isBeingDeleted = true;
+    m_hasVMT = false;
 
     if (m_widget)
-        Show( FALSE );
+        Show( false );
 
     DestroyChildren();
 
@@ -2855,7 +2914,7 @@ wxWindowGTK::~wxWindowGTK()
 
 bool wxWindowGTK::PreCreation( wxWindowGTK *parent, const wxPoint &pos,  const wxSize &size )
 {
-    wxCHECK_MSG( !m_needParent || parent, FALSE, wxT("Need complete parent.") );
+    wxCHECK_MSG( !m_needParent || parent, false, wxT("Need complete parent.") );
 
     // Use either the given size, or the default if -1 is given.
     // See wxWindowBase for these functions.
@@ -2865,7 +2924,7 @@ bool wxWindowGTK::PreCreation( wxWindowGTK *parent, const wxPoint &pos,  const w
     m_x = (int)pos.x;
     m_y = (int)pos.y;
 
-    return TRUE;
+    return true;
 }
 
 void wxWindowGTK::PostCreation()
@@ -2924,7 +2983,7 @@ void wxWindowGTK::PostCreation()
     {
         if (m_focusWidget == NULL)
             m_focusWidget = m_widget;
-            
+
         gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
             GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
 
@@ -2961,7 +3020,7 @@ void wxWindowGTK::PostCreation()
     if (GTK_IS_COMBO(m_widget))
     {
         GtkCombo *gcombo = GTK_COMBO(m_widget);
-    
+
         gtk_signal_connect( GTK_OBJECT(gcombo->entry), "size_request",
                             GTK_SIGNAL_FUNC(wxgtk_combo_size_request_callback),
                             (gpointer) this );
@@ -2979,7 +3038,7 @@ void wxWindowGTK::PostCreation()
 
     InheritAttributes();
 
-    m_hasVMT = TRUE;
+    m_hasVMT = true;
 
     // unless the window was created initially hidden (i.e. Hide() had been
     // called before Create()), we should show it at GTK+ level as well
@@ -3022,7 +3081,7 @@ bool wxWindowGTK::Destroy()
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
 
-    m_hasVMT = FALSE;
+    m_hasVMT = false;
 
     return wxWindowBase::Destroy();
 }
@@ -3042,7 +3101,7 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
 */
 
     if (m_resizing) return; /* I don't like recursions */
-    m_resizing = TRUE;
+    m_resizing = true;
 
     int currentX, currentY;
     GetPosition(&currentX, &currentY);
@@ -3100,22 +3159,37 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
         if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth;
         if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight;
 
-        int border = 0;
+        int left_border = 0;
+        int right_border = 0;
+        int top_border = 0;
         int bottom_border = 0;
 
-#ifndef __WXGTK20__
+        /* the default button has a border around it */
         if (GTK_WIDGET_CAN_DEFAULT(m_widget))
         {
-            /* the default button has a border around it */
-            border = 6;
+#ifdef __WXGTK20__
+            GtkBorder *default_border = NULL;
+            gtk_widget_style_get( m_widget, "default_border", &default_border, NULL );
+            if (default_border)
+            {
+                left_border += default_border->left;
+                right_border += default_border->right;
+                top_border += default_border->top;
+                bottom_border += default_border->bottom;
+                g_free( default_border );
+            }
+#else
+            left_border = 6;
+            right_border = 6;
+            top_border = 6;
             bottom_border = 5;
-        }
 #endif
+        }
 
-        DoMoveWindow( m_x-border,
-                      m_y-border,
-                      m_width+2*border,
-                      m_height+border+bottom_border );
+        DoMoveWindow( m_x-top_border,
+                      m_y-left_border,
+                      m_width+left_border+right_border,
+                      m_height+top_border+bottom_border );
     }
 
     if (m_hasScrolling)
@@ -3143,7 +3217,7 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
         GetEventHandler()->ProcessEvent( event );
     }
 
-    m_resizing = FALSE;
+    m_resizing = false;
 }
 
 void wxWindowGTK::OnInternalIdle()
@@ -3421,12 +3495,12 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const
 
 bool wxWindowGTK::Show( bool show )
 {
-    wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+    wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
 
     if (!wxWindowBase::Show(show))
     {
         // nothing to do
-        return FALSE;
+        return false;
     }
 
     if (show)
@@ -3439,7 +3513,7 @@ bool wxWindowGTK::Show( bool show )
 
     GetEventHandler()->ProcessEvent(eventShow);
 
-    return TRUE;
+    return true;
 }
 
 static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable)
@@ -3461,12 +3535,12 @@ static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable)
 
 bool wxWindowGTK::Enable( bool enable )
 {
-    wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+    wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
 
     if (!wxWindowBase::Enable(enable))
     {
         // nothing to do
-        return FALSE;
+        return false;
     }
 
     gtk_widget_set_sensitive( m_widget, enable );
@@ -3475,7 +3549,7 @@ bool wxWindowGTK::Enable( bool enable )
 
     wxWindowNotifyEnable(this, enable);
 
-    return TRUE;
+    return true;
 }
 
 int wxWindowGTK::GetCharHeight() const
@@ -3547,17 +3621,17 @@ int wxWindowGTK::GetCharWidth() const
 }
 
 void wxWindowGTK::GetTextExtent( const wxString& string,
-                              int *x,
-                              int *y,
-                              int *descent,
-                              int *externalLeading,
-                              const wxFont *theFont ) const
+                                 int *x,
+                                 int *y,
+                                 int *descent,
+                                 int *externalLeading,
+                                 const wxFont *theFont ) const
 {
     wxFont fontToUse = theFont ? *theFont : GetFont();
 
     wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") );
 
-    if (string.IsEmpty())
+    if (string.empty())
     {
         if (x) (*x) = 0;
         if (y) (*y) = 0;
@@ -3641,7 +3715,7 @@ void wxWindowGTK::SetFocus()
 #endif
         if (GTK_WIDGET_CAN_FOCUS(m_widget) && !GTK_WIDGET_HAS_FOCUS (m_widget) )
         {
-        
+
             if (!GTK_WIDGET_REALIZED(m_widget))
             {
                 // we can't set the focus to the widget now so we remember that
@@ -3662,7 +3736,7 @@ void wxWindowGTK::SetFocus()
                 gtk_widget_grab_focus (m_widget);
             }
         }
-        else 
+        else
 #ifndef __WXGTK20__
         if (GTK_IS_CONTAINER(m_widget))
         {
@@ -3685,7 +3759,7 @@ bool wxWindowGTK::AcceptsFocus() const
 
 bool wxWindowGTK::Reparent( wxWindowBase *newParentBase )
 {
-    wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+    wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
 
     wxWindowGTK *oldParent = m_parent,
              *newParent = (wxWindowGTK *)newParentBase;
@@ -3693,7 +3767,7 @@ bool wxWindowGTK::Reparent( wxWindowBase *newParentBase )
     wxASSERT( GTK_IS_WIDGET(m_widget) );
 
     if ( !wxWindowBase::Reparent(newParent) )
-        return FALSE;
+        return false;
 
     wxASSERT( GTK_IS_WIDGET(m_widget) );
 
@@ -3716,7 +3790,7 @@ bool wxWindowGTK::Reparent( wxWindowBase *newParentBase )
     /* reverse: prevent GTK from deleting the widget arbitrarily */
     gtk_widget_unref( m_widget );
 
-    return TRUE;
+    return true;
 }
 
 void wxWindowGTK::DoAddChild(wxWindowGTK *child)
@@ -3751,7 +3825,7 @@ void wxWindowGTK::RemoveChild(wxWindowBase *child)
     if (g_isIdle)
         wxapp_install_idle_handler();
 }
-    
+
 void wxWindowGTK::DoMoveInTabOrder(wxWindow *win, MoveKind move)
 {
     wxWindowBase::DoMoveInTabOrder(win, move);
@@ -3767,15 +3841,15 @@ void wxWindowGTK::RealizeTabOrder()
         if (m_children.size() > 0)
         {
             GList *chain = NULL;
-            
+
             for (wxWindowList::const_iterator i = m_children.begin();
                     i != m_children.end(); ++i)
             {
                 chain = g_list_prepend(chain, (*i)->m_widget);
             }
-            
+
             chain = g_list_reverse(chain);
-            
+
             gtk_container_set_focus_chain(GTK_CONTAINER(m_wxwindow), chain);
             g_list_free(chain);
         }
@@ -3784,7 +3858,7 @@ void wxWindowGTK::RealizeTabOrder()
             gtk_container_unset_focus_chain(GTK_CONTAINER(m_wxwindow));
         }
     }
-    
+
     m_dirtyTabOrder = false;
 }
 
@@ -3798,7 +3872,7 @@ void wxWindowGTK::Raise()
     {
         gdk_window_raise( m_wxwindow->window );
     }
-     else if (m_widget->window)
+    else if (m_widget->window)
     {
         gdk_window_raise( m_widget->window );
     }
@@ -3812,7 +3886,7 @@ void wxWindowGTK::Lower()
     {
         gdk_window_lower( m_wxwindow->window );
     }
-     else if (m_widget->window)
+    else if (m_widget->window)
     {
         gdk_window_lower( m_widget->window );
     }
@@ -3820,10 +3894,10 @@ void wxWindowGTK::Lower()
 
 bool wxWindowGTK::SetCursor( const wxCursor &cursor )
 {
-    wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+    wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") );
 
     if (cursor == m_cursor)
-       return FALSE;
+       return false;
 
     if (g_isIdle)
         wxapp_install_idle_handler();
@@ -3854,35 +3928,38 @@ void wxWindowGTK::WarpPointer( int x, int y )
 
 void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
 {
-    if (!m_widget) return;
-    if (!m_widget->window) return;
+    if (!m_widget)
+        return;
+    if (!m_widget->window)
+        return;
 
 #ifndef __WXGTK20__
     if (g_isIdle)
         wxapp_install_idle_handler();
 
-    wxRect myRect(0,0,0,0);
+    wxRect myRect;
     if (m_wxwindow && rect)
     {
         myRect.SetSize(wxSize( m_wxwindow->allocation.width,
                                m_wxwindow->allocation.height));
-        myRect.Intersect(*rect);
-        if (!myRect.width || !myRect.height)
+        if ( myRect.Intersect(*rect).IsEmpty() )
+        {
             // nothing to do, rectangle is empty
             return;
+        }
+
         rect = &myRect;
     }
 
+    // schedule the area for later updating in GtkUpdate()
     if (eraseBackground && m_wxwindow && m_wxwindow->window)
     {
         if (rect)
         {
-            // Schedule for later Updating in ::Update() or ::OnInternalIdle().
             m_clearRegion.Union( rect->x, rect->y, rect->width, rect->height );
         }
         else
         {
-            // Schedule for later Updating in ::Update() or ::OnInternalIdle().
             m_clearRegion.Clear();
             m_clearRegion.Union( 0, 0, m_wxwindow->allocation.width, m_wxwindow->allocation.height );
         }
@@ -3892,7 +3969,6 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
     {
         if (m_wxwindow)
         {
-            // Schedule for later Updating in ::Update() or ::OnInternalIdle().
             m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
         }
         else
@@ -3909,7 +3985,6 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
     {
         if (m_wxwindow)
         {
-            // Schedule for later Updating in ::Update() or ::OnInternalIdle().
             m_updateRegion.Clear();
             m_updateRegion.Union( 0, 0, m_wxwindow->allocation.width, m_wxwindow->allocation.height );
         }
@@ -3918,24 +3993,27 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
         }
     }
-#else
+#else // GTK+ 2
     if (m_wxwindow)
     {
+        GdkRectangle gdk_rect,
+                    *p;
         if (rect)
         {
-            GdkRectangle gdk_rect;
             gdk_rect.x = rect->x;
             gdk_rect.y = rect->y;
             gdk_rect.width = rect->width;
             gdk_rect.height = rect->height;
-            gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, &gdk_rect, TRUE );
+            p = &gdk_rect;
         }
-        else
+        else // invalidate everything
         {
-            gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, NULL, TRUE );
+            p = NULL;
         }
+
+        gdk_window_invalidate_rect( GTK_PIZZA(m_wxwindow)->bin_window, p, TRUE );
     }
-#endif
+#endif // GTK+ 1/2
 }
 
 void wxWindowGTK::Update()
@@ -3958,6 +4036,16 @@ void wxWindowGTK::GtkUpdate()
     if (!m_updateRegion.IsEmpty())
         GtkSendPaintEvents();
 #endif
+
+    // for consistency with other platforms (and also because it's convenient
+    // to be able to update an entire TLW by calling Update() only once), we
+    // should also update all our children here
+    for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+          node;
+          node = node->GetNext() )
+    {
+        node->GetData()->GtkUpdate();
+    }
 }
 
 void wxWindowGTK::GtkSendPaintEvents()
@@ -3972,7 +4060,7 @@ void wxWindowGTK::GtkSendPaintEvents()
     }
 
     // Clip to paint region in wxClientDC
-    m_clipPaintRegion = TRUE;
+    m_clipPaintRegion = true;
 
     // widget to draw on
     GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
@@ -3980,9 +4068,7 @@ void wxWindowGTK::GtkSendPaintEvents()
     if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM))
     {
         // find ancestor from which to steal background
-        wxWindow *parent = IsTopLevel() ? this : GetParent();
-        while (parent && !parent->IsTopLevel())
-            parent = parent->GetParent();
+        wxWindow *parent = wxGetTopLevelParent((wxWindow *)this);
         if (!parent)
             parent = (wxWindow*)this;
 
@@ -4006,7 +4092,7 @@ void wxWindowGTK::GtkSendPaintEvents()
                             (char *)"base",
                             0, 0, -1, -1 );
 
-                upd ++;
+                ++upd;
             }
         }
     }
@@ -4063,10 +4149,9 @@ void wxWindowGTK::GtkSendPaintEvents()
     paint_event.SetEventObject( this );
     GetEventHandler()->ProcessEvent( paint_event );
 
-    m_clipPaintRegion = FALSE;
+    m_clipPaintRegion = false;
 
-#ifndef __WXUNIVERSAL__
-#ifndef __WXGTK20__
+#if !defined(__WXUNIVERSAL__) && !defined(__WXGTK20__)
     // The following code will result in all window-less widgets
     // being redrawn because the wxWidgets class is allowed to
     // paint over the window-less widgets.
@@ -4087,6 +4172,7 @@ void wxWindowGTK::GtkSendPaintEvents()
             gdk_event.type = GDK_EXPOSE;
             gdk_event.window = pizza->bin_window;
             gdk_event.count = 0;
+            gdk_event.send_event = TRUE;
 
             wxRegionIterator upd( m_updateRegion );
             while (upd)
@@ -4106,8 +4192,7 @@ void wxWindowGTK::GtkSendPaintEvents()
             }
         }
     }
-#endif
-#endif
+#endif // native GTK 1
 
     m_updateRegion.Clear();
 }
@@ -4147,7 +4232,7 @@ void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip )
 
 bool wxWindowGTK::SetBackgroundColour( const wxColour &colour )
 {
-    wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
+    wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
 
     if (!wxWindowBase::SetBackgroundColour(colour))
         return false;
@@ -4168,13 +4253,13 @@ bool wxWindowGTK::SetBackgroundColour( const wxColour &colour )
 
 bool wxWindowGTK::SetForegroundColour( const wxColour &colour )
 {
-    wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
+    wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
 
     if (!wxWindowBase::SetForegroundColour(colour))
     {
         return false;
     }
-    
+
     if (colour.Ok())
     {
         // We need the pixel value e.g. for background clearing.
@@ -4194,15 +4279,13 @@ PangoContext *wxWindowGTK::GtkGetPangoDefaultContext()
     return gtk_widget_get_pango_context( m_widget );
 }
 
+// MR: Returns the same as GtkGetPangoDefaultContext until the symbol can be removed in 2.7.x
 PangoContext *wxWindowGTK::GtkGetPangoX11Context()
 {
-    if (!m_x11Context)
-        m_x11Context = pango_x_get_context( gdk_display );
-
-    return m_x11Context;
+    return gtk_widget_get_pango_context( m_widget );
 }
 #endif
+
 GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
 {
     // do we need to apply any changes at all?
@@ -4218,7 +4301,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
     if ( m_font.Ok() )
     {
 #ifdef __WXGTK20__
-        style->font_desc = 
+        style->font_desc =
             pango_font_description_copy( m_font.GetNativeFontInfo()->description );
 #else
         wxString xfontname = m_font.GetNativeFontInfo()->GetXFontName();
@@ -4229,13 +4312,13 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
     if ( m_foregroundColour.Ok() )
     {
         GdkColor *fg = m_foregroundColour.GetColor();
-        
+
         style->fg[GTK_STATE_NORMAL] = *fg;
         style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG;
-        
+
         style->fg[GTK_STATE_PRELIGHT] = *fg;
         style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG;
-        
+
         style->fg[GTK_STATE_ACTIVE] = *fg;
         style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
     }
@@ -4248,23 +4331,23 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
         style->base[GTK_STATE_NORMAL] = *bg;
         style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags)
             (style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE);
-        
+
         style->bg[GTK_STATE_PRELIGHT] = *bg;
         style->base[GTK_STATE_PRELIGHT] = *bg;
         style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags)
             (style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE);
-        
+
         style->bg[GTK_STATE_ACTIVE] = *bg;
         style->base[GTK_STATE_ACTIVE] = *bg;
         style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags)
             (style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE);
-        
+
         style->bg[GTK_STATE_INSENSITIVE] = *bg;
         style->base[GTK_STATE_INSENSITIVE] = *bg;
         style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags)
             (style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE);
     }
-    
+
     return style;
 }
 
@@ -4285,13 +4368,14 @@ void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style)
 {
     if (m_wxwindow)
         gtk_widget_modify_style(m_wxwindow, style);
-    gtk_widget_modify_style(m_widget, style);
+    else
+        gtk_widget_modify_style(m_widget, style);
 }
 
 bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
 {
     wxWindowBase::SetBackgroundStyle(style);
-    
+
     if (style == wxBG_STYLE_CUSTOM)
     {
         GdkWindow *window = (GdkWindow*) NULL;
@@ -4314,7 +4398,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
         else
             // Do in OnIdle, because the window is not yet available
             m_needsStyleChange = true;
-        
+
         // Don't apply widget style, or we get a grey background
     }
     else
@@ -4332,16 +4416,16 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style)
 
 #if wxUSE_MENUS_NATIVE
 
-extern "C"
+extern "C" WXDLLIMPEXP_CORE
 void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting  )
 {
     *is_waiting = FALSE;
 }
 
-void SetInvokingWindow( wxMenu *menu, wxWindow* win )
+WXDLLIMPEXP_CORE void SetInvokingWindow( wxMenu *menu, wxWindow* win )
 {
     menu->SetInvokingWindow( win );
-    
+
     wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();
     while (node)
     {
@@ -4355,12 +4439,13 @@ void SetInvokingWindow( wxMenu *menu, wxWindow* win )
     }
 }
 
-extern "C" void wxPopupMenuPositionCallback( GtkMenu *menu,
-                                             gint *x, gint *y,
+extern "C" WXDLLIMPEXP_CORE
+void wxPopupMenuPositionCallback( GtkMenu *menu,
+                                  gint *x, gint *y,
 #ifdef __WXGTK20__
-                                             gboolean * WXUNUSED(whatever),
+                                  gboolean * WXUNUSED(whatever),
 #endif
-                                             gpointer user_data )
+                                  gpointer user_data )
 {
     // ensure that the menu appears entirely on screen
     GtkRequisition req;
@@ -4475,14 +4560,14 @@ bool wxWindowGTK::IsOwnGtkWindow( GdkWindow *window )
 
 bool wxWindowGTK::SetFont( const wxFont &font )
 {
-    wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
+    wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
 
     if (!wxWindowBase::SetFont(font))
         return false;
 
     // apply style change (forceStyle=true so that new style is applied
     // even if the font changed from valid to wxNullFont):
-    ApplyWidgetStyle(true);    
+    ApplyWidgetStyle(true);
 
     return true;
 }
@@ -4513,7 +4598,7 @@ void wxWindowGTK::DoCaptureMouse()
                       cursor->GetCursor(),
                       (guint32)GDK_CURRENT_TIME );
     g_captureWindow = this;
-    g_captureWindowHasMouse = TRUE;
+    g_captureWindowHasMouse = true;
 }
 
 void wxWindowGTK::DoReleaseMouse()
@@ -4544,7 +4629,7 @@ wxWindow *wxWindowBase::GetCapture()
 
 bool wxWindowGTK::IsRetained() const
 {
-    return FALSE;
+    return false;
 }
 
 void wxWindowGTK::SetScrollbar( int orient, int pos, int thumbVisible,
@@ -4554,7 +4639,7 @@ void wxWindowGTK::SetScrollbar( int orient, int pos, int thumbVisible,
 
     wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
 
-    m_hasScrolling = TRUE;
+    m_hasScrolling = true;
 
     if (orient == wxHORIZONTAL)
     {
@@ -4730,11 +4815,11 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     }
 #endif
 
-    m_clipPaintRegion = TRUE;
+    m_clipPaintRegion = true;
 
     gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
 
-    m_clipPaintRegion = FALSE;
+    m_clipPaintRegion = false;
 }
 
 
@@ -4798,7 +4883,7 @@ bool wxWinModule::OnInit()
     // g_eraseGC = gdk_gc_new( GDK_ROOT_PARENT() );
     // gdk_gc_set_fill( g_eraseGC, GDK_SOLID );
 
-    return TRUE;
+    return true;
 }
 
 void wxWinModule::OnExit()