+
+#ifndef WX_PRECOMP
+    #include "wx/dcscreen.h"
+#endif
+
+#include "gtk/gtk.h"
+#include "wx/gtk1/win_gtk.h"
+#include "wx/gtk1/private.h"
+
+#include <gdk/gdk.h>
+#include <gdk/gdkprivate.h>
+#include <gdk/gdkx.h>
+
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
+//-----------------------------------------------------------------------------
+// data
+//-----------------------------------------------------------------------------
+
+extern bool        g_blockEventsOnDrag;
+extern bool        g_blockEventsOnScroll;
+extern GtkWidget  *wxGetRootWindow();
+
+//-----------------------------------------------------------------------------
+// local functions
+//-----------------------------------------------------------------------------
+
+/* draw XOR rectangle when moving mine frame around */
+
+static void DrawFrame( GtkWidget *widget, int x, int y, int w, int h )
+{
+    int org_x = 0;
+    int org_y = 0;
+    gdk_window_get_origin( widget->window, &org_x, &org_y );
+    x += org_x;
+    y += org_y;
+
+    GdkGC *gc = gdk_gc_new( GDK_ROOT_PARENT() );
+    gdk_gc_set_subwindow( gc, GDK_INCLUDE_INFERIORS );
+    gdk_gc_set_function( gc, GDK_INVERT );
+
+    gdk_draw_rectangle( GDK_ROOT_PARENT(), gc, FALSE, x, y, w, h );
+    gdk_gc_unref( gc );
+}
+
+//-----------------------------------------------------------------------------
+// "expose_event" of m_mainWidget
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxFrame *win )
+{
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!win->m_hasVMT) return;
+    if (gdk_event->count > 0) return;
+
+    GtkPizza *pizza = GTK_PIZZA(widget);
+
+    gtk_draw_shadow( widget->style,
+                     pizza->bin_window,
+                     GTK_STATE_NORMAL,
+                     GTK_SHADOW_OUT,
+                     0, 0,
+                     win->m_width, win->m_height );
+
+    if (!win->GetTitle().empty() &&
+        ((win->GetWindowStyle() & wxCAPTION) ||
+         (win->GetWindowStyle() & wxTINY_CAPTION_HORIZ) ||
+         (win->GetWindowStyle() & wxTINY_CAPTION_VERT)))
+    {
+        wxClientDC dc(win);
+        dc.SetFont( *wxSMALL_FONT );
+        int height = dc.GetCharHeight();
+
+        GdkGC *gc = gdk_gc_new( pizza->bin_window );
+        gdk_gc_set_foreground( gc, &widget->style->bg[GTK_STATE_SELECTED] );
+        gdk_draw_rectangle( pizza->bin_window, gc, TRUE,
+                            3,
+                            3,
+                            win->m_width - 7,
+                            height+1 );
+        gdk_gc_unref( gc );
+
+        // Hack alert
+        dc.m_window = pizza->bin_window;
+        dc.SetTextForeground( *wxWHITE );
+        dc.DrawText( win->GetTitle(), 6, 3 );
+    }
+}
+}
+
+//-----------------------------------------------------------------------------
+// "draw" of m_mainWidget
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxFrame *win )
+{
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!win->m_hasVMT) return;
+
+    GtkPizza *pizza = GTK_PIZZA(widget);
+
+    gtk_draw_shadow( widget->style,
+                     pizza->bin_window,
+                     GTK_STATE_NORMAL,
+                     GTK_SHADOW_OUT,
+                     0, 0,
+                     win->m_width, win->m_height );
+
+    if (!win->GetTitle().empty() &&
+        ((win->GetWindowStyle() & wxCAPTION) ||
+         (win->GetWindowStyle() & wxTINY_CAPTION_HORIZ) ||
+         (win->GetWindowStyle() & wxTINY_CAPTION_VERT)))
+    {
+        wxClientDC dc(win);
+        dc.SetFont( *wxSMALL_FONT );
+        int height = dc.GetCharHeight();
+
+        GdkGC *gc = gdk_gc_new( pizza->bin_window );
+        gdk_gc_set_foreground( gc, &widget->style->bg[GTK_STATE_SELECTED] );
+        gdk_draw_rectangle( pizza->bin_window, gc, TRUE,
+                            3,
+                            3,
+                            win->m_width - 7,
+                            height+1 );
+        gdk_gc_unref( gc );
+
+        // Hack alert
+        dc.m_window = pizza->bin_window;
+        dc.SetTextForeground( *wxWHITE );
+        dc.DrawText( win->GetTitle(), 6, 3 );
+    }
+}
+}
+
+//-----------------------------------------------------------------------------
+// "button_press_event" of m_mainWidget
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxMiniFrame *win )
+{
+    if (g_isIdle) wxapp_install_idle_handler();
+
+    if (!win->m_hasVMT) return FALSE;
+    if (g_blockEventsOnDrag) return TRUE;
+    if (g_blockEventsOnScroll) return TRUE;
+
+    if (win->m_isDragging) return TRUE;
+
+    GtkPizza *pizza = GTK_PIZZA(widget);
+    if (gdk_event->window != pizza->bin_window) return TRUE;
+
+    wxClientDC dc(win);
+    dc.SetFont( *wxSMALL_FONT );
+    int height = dc.GetCharHeight() + 1;
+
+    if (gdk_event->y > height) return TRUE;
+
+    gdk_window_raise( win->m_widget->window );
+
+    gdk_pointer_grab( widget->window, FALSE,
+                      (GdkEventMask)
+                         (GDK_BUTTON_PRESS_MASK |
+                          GDK_BUTTON_RELEASE_MASK |
+                          GDK_POINTER_MOTION_MASK        |
+                          GDK_POINTER_MOTION_HINT_MASK  |
+                          GDK_BUTTON_MOTION_MASK        |
+                          GDK_BUTTON1_MOTION_MASK),
+                      (GdkWindow *) NULL,
+                      (GdkCursor *) NULL,
+                      (unsigned int) GDK_CURRENT_TIME );
+
+    win->m_diffX = (int)gdk_event->x;
+    win->m_diffY = (int)gdk_event->y;
+    DrawFrame( widget, 0, 0, win->m_width, win->m_height );
+    win->m_oldX = 0;
+    win->m_oldY = 0;
+
+    win->m_isDragging = true;
+
+    return TRUE;
+}
+}