+        "paned",
+        dc.LogicalToDeviceX(rect.x) - x_diff,
+        dc.LogicalToDeviceY(rect.y),
+        rect.width,
+        rect.height,
+        isVert ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL
+    );
+}
+
+void
+wxRendererGTK::DrawDropArrow(wxWindow *WXUNUSED(win),
+                             wxDC& dc,
+                             const wxRect& rect,
+                             int flags)
+{
+    GtkWidget *button = GetButtonWidget();
+
+    // If we give GTK_PIZZA(win->m_wxwindow)->bin_window as
+    // a window for gtk_paint_xxx function, then it won't
+    // work for wxMemoryDC. So that is why we assume wxDC
+    // is wxWindowDC (wxClientDC, wxMemoryDC and wxPaintDC
+    // are derived from it) and use its m_window.
+    GdkWindow* gdk_window = dc.GetGDKWindow();
+    wxASSERT_MSG( gdk_window,
+                  wxT("cannot use wxRendererNative on wxDC of this type") );
+
+    // draw arrow so that there is even space horizontally
+    // on both sides
+    int arrowX = rect.width/4 + 1;
+    int arrowWidth = rect.width - (arrowX*2);
+
+    // scale arrow's height accoording to the width
+    int arrowHeight = rect.width/3;
+    int arrowY = (rect.height-arrowHeight)/2 +
+                 ((rect.height-arrowHeight) & 1);
+
+    GtkStateType state;
+
+    if ( flags & wxCONTROL_PRESSED )
+        state = GTK_STATE_ACTIVE;
+    else if ( flags & wxCONTROL_DISABLED )
+        state = GTK_STATE_INSENSITIVE;
+    else if ( flags & wxCONTROL_CURRENT )
+        state = GTK_STATE_PRELIGHT;
+    else
+        state = GTK_STATE_NORMAL;
+
+    // draw arrow on button
+    gtk_paint_arrow
+    (
+        button->style,
+        gdk_window,
+        state,
+        flags & wxCONTROL_PRESSED ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
+        NULL,
+        button,
+        "arrow",
+        GTK_ARROW_DOWN,
+        FALSE,
+        rect.x + arrowX,
+        rect.y + arrowY,
+        arrowWidth,
+        arrowHeight
+    );
+}
+
+void
+wxRendererGTK::DrawComboBoxDropButton(wxWindow *win,
+                                      wxDC& dc,
+                                      const wxRect& rect,
+                                      int flags)
+{
+    DrawPushButton(win,dc,rect,flags);
+    DrawDropArrow(win,dc,rect);
+}
+
+void
+wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win),
+                            wxDC& dc,
+                            const wxRect& rect,
+                            int flags )
+{
+    GtkWidget *button = GetCheckButtonWidget();
+
+    // for reason why we do this, see DrawDropArrow
+    GdkWindow* gdk_window = dc.GetGDKWindow();
+    wxASSERT_MSG( gdk_window,
+                  wxT("cannot use wxRendererNative on wxDC of this type") );
+
+    GtkStateType state;
+
+    if ( flags & wxCONTROL_PRESSED )
+        state = GTK_STATE_ACTIVE;
+    else if ( flags & wxCONTROL_DISABLED )
+        state = GTK_STATE_INSENSITIVE;
+    else if ( flags & wxCONTROL_CURRENT )
+        state = GTK_STATE_PRELIGHT;
+    else
+        state = GTK_STATE_NORMAL;
+
+    gtk_paint_check
+    (
+        button->style,
+        gdk_window,
+        state,
+        flags & wxCONTROL_CHECKED ? GTK_SHADOW_IN : GTK_SHADOW_OUT,
+        NULL,
+        button,
+        "cellcheck",
+        dc.LogicalToDeviceX(rect.x)+2,
+        dc.LogicalToDeviceY(rect.y)+3,
+        13, 13