changeset 27:ffa3c27c4328

Display
author Frank Benoit <benoit@tionex.de>
date Wed, 09 Jan 2008 01:08:22 +0100
parents 09f5459a5014
children 10acbb123580
files dwt/dwthelper/utils.d dwt/internal/gtk/OS.d dwt/internal/gtk/c/gdktypes.d dwt/internal/gtk/c/gtktypes.d dwt/widgets/Caret.d dwt/widgets/Control.d dwt/widgets/Display.d dwt/widgets/EventTable.d dwt/widgets/Menu.d dwt/widgets/Shell.d dwt/widgets/Synchronizer.d dwt/widgets/Tray.d dwt/widgets/Widget.d todo.txt
diffstat 14 files changed, 2809 insertions(+), 2669 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/dwthelper/utils.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/dwthelper/utils.d	Wed Jan 09 01:08:22 2008 +0100
@@ -18,7 +18,10 @@
 }
 
 class ArrayWrapperT(T) : ArrayWrapper {
-    T[] array;
+    public T[] array;
+    public this( T[] data ){
+        array = data;
+    }
 }
 
 alias ArrayWrapperT!(int)    ArrayWrapperInt;
--- a/dwt/internal/gtk/OS.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/internal/gtk/OS.d	Wed Jan 09 01:08:22 2008 +0100
@@ -140,6 +140,9 @@
     extern uint gtk_major_version;
     extern uint gtk_minor_version;
     extern uint gtk_micro_version;
+
+    void * gdk_atom_intern(char *, int);
+    int gdk_property_get(GdkDrawable *, void *, void *, uint, uint, int, void **, int *, int *, char ** );
 }
 
 
@@ -205,7 +208,36 @@
 private GType GTK_TYPE_CELL_RENDERER_PIXBUF();
 private GType GTK_TYPE_CELL_RENDERER_TOGGLE();
 private bool GTK_IS_WINDOW(GtkWidget *);
-
+private bool GTK_IS_CONTAINER(GtkWidget*);
+private GType GTK_TYPE_MENU();
+private GType GTK_TYPE_WIDGET();
+private GType GTK_WIDGET_FLAGS();
+private GType GTK_WIDGET_STATE();
+private GType GTK_WIDGET_HAS_DEFAULT();
+private GType GTK_WIDGET_HAS_FOCUS();
+private GType GTK_WIDGET_IS_SENSITIVE();
+private GType GTK_WIDGET_MAPPED();
+private GType GTK_WIDGET_SENSITIVE();
+private GType GTK_WIDGET_SET_FLAGS();
+private GType GTK_WIDGET_UNSET_FLAGS();
+private GType GTK_WIDGET_VISIBLE();
+private GType G_OBJECT_CLASS ();
+private GType G_OBJECT_GET_CLASS ();
+private GType G_OBJECT_TYPE_NAME ();
+private GType G_TYPE_BOOLEAN();
+private GType G_TYPE_INT();
+private GType G_OBJECT_TYPE( );
+private GType G_TYPE_STRING();
+private char* gdk_x11_screen_get_window_manager_name(GdkScreen*);
+private char XKeysymToKeycode(void *, uint);
+private int XTestFakeKeyEvent(void *, uint, int, uint);
+int XTestFakeMotionEvent(void *, int, int, int, uint);
+int XTestFakeButtonEvent(void *, uint, int, uint);
+uint XDefaultRootWindow(void *);
+int XWarpPointer(void *, uint, uint, int, int, uint, uint, int, int);
+int g_signal_connect( void* instance, char* sig, GCallback handle, void* ptr ){
+    return g_signal_connect_data( instance, sig, handle, ptr, 0, 0 );
+}
 template NameOfFunc(alias f) {
     // Note: highly dependent on the .stringof formatting
     // the value begins with "& " which is why the first two chars are cut off
@@ -871,13 +903,13 @@
 //     mixin ForwardGtkOsCFunc!(.XCheckWindowEvent);
      mixin ForwardGtkOsCFunc!(.XCheckIfEvent);
 //     mixin ForwardGtkOsCFunc!(.XDefaultScreen);
-//     mixin ForwardGtkOsCFunc!(.XDefaultRootWindow);
+    mixin ForwardGtkOsCFunc!(.XDefaultRootWindow);
     mixin ForwardGtkOsCFunc!(.XFlush);
 //     mixin ForwardGtkOsCFunc!(.XFree);
 //     mixin ForwardGtkOsCFunc!(.XGetSelectionOwner);
 //     mixin ForwardGtkOsCFunc!(.XInternAtom);
 //     mixin ForwardGtkOsCFunc!(.XQueryTree);
-//     mixin ForwardGtkOsCFunc!(.XKeysymToKeycode);
+     mixin ForwardGtkOsCFunc!(.XKeysymToKeycode);
 //     mixin ForwardGtkOsCFunc!(.XListProperties);
 //     mixin ForwardGtkOsCFunc!(.XReconfigureWMWindow);
 //     mixin ForwardGtkOsCFunc!(.XSendEvent);
@@ -886,11 +918,11 @@
     mixin ForwardGtkOsCFunc!(.XSetErrorHandler);
     //mixin ForwardGtkOsCFunc!(.XSetInputFocus);
     mixin ForwardGtkOsCFunc!(.XSynchronize);
-    /+
     mixin ForwardGtkOsCFunc!(.XTestFakeButtonEvent);
     mixin ForwardGtkOsCFunc!(.XTestFakeKeyEvent);
     mixin ForwardGtkOsCFunc!(.XTestFakeMotionEvent);
     mixin ForwardGtkOsCFunc!(.XWarpPointer);
+    /+
 
     mixin ForwardGtkOsCFunc!(.gdk_x11_atom_to_xatom);
     mixin ForwardGtkOsCFunc!(.gdk_x11_colormap_get_xcolormap);
@@ -898,7 +930,7 @@
     +/
     mixin ForwardGtkOsCFunc!(.gdk_x11_drawable_get_xid);
     //mixin ForwardGtkOsCFunc!(.gdk_x11_screen_lookup_visual);
-    //mixin ForwardGtkOsCFunc!(.gdk_x11_screen_get_window_manager_name);
+    mixin ForwardGtkOsCFunc!(.gdk_x11_screen_get_window_manager_name);
     mixin ForwardGtkOsCFunc!(.gdk_x11_visual_get_xvisual);
 //     mixin ForwardGtkOsCFunc!(.gdk_pixmap_foreign_new);
     mixin ForwardGtkOsCFunc!(.gdk_window_lookup);
@@ -927,7 +959,7 @@
 //     mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_PIXBUF);
 //     mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_TEXT);
 //     mixin ForwardGtkOsCFunc!(.GTK_IS_CELL_RENDERER_TOGGLE);
-//     mixin ForwardGtkOsCFunc!(.GTK_IS_CONTAINER);
+     mixin ForwardGtkOsCFunc!(.GTK_IS_CONTAINER);
 //     mixin ForwardGtkOsCFunc!(.GTK_IS_IMAGE_MENU_ITEM);
 //     mixin ForwardGtkOsCFunc!(.GTK_IS_PLUG);
 //     mixin ForwardGtkOsCFunc!(.GTK_STOCK_CANCEL);
@@ -936,25 +968,26 @@
      mixin ForwardGtkOsCFunc!(.GTK_TYPE_CELL_RENDERER_PIXBUF);
      mixin ForwardGtkOsCFunc!(.GTK_TYPE_CELL_RENDERER_TOGGLE);
      mixin ForwardGtkOsCFunc!(.GTK_TYPE_FIXED);
-//     mixin ForwardGtkOsCFunc!(.GTK_TYPE_MENU);
-//     mixin ForwardGtkOsCFunc!(.GTK_TYPE_WIDGET);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_FLAGS);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_STATE);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_DEFAULT);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_FOCUS);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_IS_SENSITIVE);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_MAPPED);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SENSITIVE);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SET_FLAGS);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_UNSET_FLAGS);
-//     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_VISIBLE);
-//     mixin ForwardGtkOsCFunc!(.G_OBJECT_CLASS );
-//     mixin ForwardGtkOsCFunc!(.G_OBJECT_GET_CLASS );
-//     mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE_NAME );
-//     mixin ForwardGtkOsCFunc!(.G_TYPE_BOOLEAN);
-//     mixin ForwardGtkOsCFunc!(.G_TYPE_INT);
-//     mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE );
-//     mixin ForwardGtkOsCFunc!(.G_TYPE_STRING);
+
+     mixin ForwardGtkOsCFunc!(.GTK_TYPE_MENU);
+     mixin ForwardGtkOsCFunc!(.GTK_TYPE_WIDGET);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_FLAGS);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_STATE);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_DEFAULT);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_HAS_FOCUS);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_IS_SENSITIVE);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_MAPPED);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SENSITIVE);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_SET_FLAGS);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_UNSET_FLAGS);
+     mixin ForwardGtkOsCFunc!(.GTK_WIDGET_VISIBLE);
+     mixin ForwardGtkOsCFunc!(.G_OBJECT_CLASS );
+     mixin ForwardGtkOsCFunc!(.G_OBJECT_GET_CLASS );
+     mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE_NAME );
+     mixin ForwardGtkOsCFunc!(.G_TYPE_BOOLEAN);
+     mixin ForwardGtkOsCFunc!(.G_TYPE_INT);
+     mixin ForwardGtkOsCFunc!(.G_OBJECT_TYPE );
+     mixin ForwardGtkOsCFunc!(.G_TYPE_STRING);
     mixin ForwardGtkOsCFunc!(.PANGO_PIXELS);
     //mixin ForwardGtkOsCFunc!(.PANGO_TYPE_FONT_DESCRIPTION);
 
@@ -1010,7 +1043,7 @@
     mixin ForwardGtkOsCFunc!(.g_object_unref);
     mixin ForwardGtkOsCFunc!(.g_quark_from_string);
     mixin ForwardGtkOsCFunc!(.g_set_prgname);
-//    mixin ForwardGtkOsCFunc!(.g_signal_connect);
+    mixin ForwardGtkOsCFunc!(.g_signal_connect);
     mixin ForwardGtkOsCFunc!(.g_signal_connect_closure);
     mixin ForwardGtkOsCFunc!(.g_signal_connect_closure_by_id);
 //    mixin ForwardGtkOsCFunc!(.g_signal_connect_after);
@@ -1049,7 +1082,7 @@
     mixin ForwardGtkOsCFunc!(.g_utf8_strlen);
     mixin ForwardGtkOsCFunc!(.g_utf8_to_utf16);
     mixin ForwardGtkOsCFunc!(.g_utf8_to_utf16);
-//    mixin ForwardGtkOsCFunc!(.gdk_atom_intern);
+    mixin ForwardGtkOsCFunc!(.gdk_atom_intern);
 //    mixin ForwardGtkOsCFunc!(.gdk_atom_name);
     mixin ForwardGtkOsCFunc!(.gdk_beep);
     mixin ForwardGtkOsCFunc!(.gdk_bitmap_create_from_data);
@@ -1141,7 +1174,7 @@
     mixin ForwardGtkOsCFunc!(.gdk_pointer_grab);
     mixin ForwardGtkOsCFunc!(.gdk_pointer_is_grabbed);
     mixin ForwardGtkOsCFunc!(.gdk_pointer_ungrab);
-//    mixin ForwardGtkOsCFunc!(.gdk_property_get);
+    mixin ForwardGtkOsCFunc!(.gdk_property_get);
     mixin ForwardGtkOsCFunc!(.gdk_region_destroy);
     mixin ForwardGtkOsCFunc!(.gdk_region_empty);
     mixin ForwardGtkOsCFunc!(.gdk_region_get_clipbox);
@@ -1397,7 +1430,6 @@
     mixin ForwardGtkOsCFunc!(.gtk_label_set_justify);
     mixin ForwardGtkOsCFunc!(.gtk_label_set_line_wrap);
     mixin ForwardGtkOsCFunc!(.gtk_label_set_text);
-    mixin ForwardGtkOsCFunc!(.gtk_label_set_text);
     mixin ForwardGtkOsCFunc!(.gtk_label_set_text_with_mnemonic);
 //    mixin ForwardGtkOsCFunc!(.gtk_list_append_items);
 //    mixin ForwardGtkOsCFunc!(.gtk_list_clear_items);
@@ -2017,14 +2049,41 @@
     gtk_rc_style_set_fg(arg0, arg1, arg2) if (arg2) (arg0)->fg[arg1] = *arg2
     gtk_rc_style_set_text(arg0, arg1, arg2) if (arg2) (arg0)->text[arg1] = *arg2
 
-    gtk_style_get_font_desc(arg0) (arg0)->font_desc
-    gtk_style_get_base(arg0, arg1, arg2) *arg2 = (arg0)->base[arg1]
-    gtk_style_get_bg(arg0, arg1, arg2) *arg2 = (arg0)->bg[arg1]
-    gtk_style_get_black(arg0, arg1) *arg1 = (arg0)->black
-    gtk_style_get_dark(arg0, arg1, arg2) *arg2 = (arg0)->dark[arg1]
-    gtk_style_get_fg(arg0, arg1, arg2) *arg2 = (arg0)->fg[arg1]
-    gtk_style_get_light(arg0, arg1, arg2) *arg2 = (arg0)->light[arg1]
-    gtk_style_get_text(arg0, arg1, arg2) *arg2 = (arg0)->text[arg1]
+    +/
+    //gtk_style_get_font_desc(arg0) (arg0)->font_desc
+    static PangoFontDescription* gtk_style_get_font_desc( GtkStyle* arg0 ) {
+        return arg0.font_desc;
+    }
+    //gtk_style_get_base(arg0, arg1, arg2) *arg2 = (arg0)->base[arg1]
+    static void gtk_style_get_base( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.base[arg1];
+    }
+    //gtk_style_get_bg(arg0, arg1, arg2) *arg2 = (arg0)->bg[arg1]
+    static void gtk_style_get_bg( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.bg[arg1];
+    }
+    //gtk_style_get_black(arg0, arg1) *arg1 = (arg0)->black
+    static void gtk_style_get_black( GtkStyle* arg0, GdkColor* arg1 ) {
+        *arg1 = arg0.black;
+    }
+    //gtk_style_get_dark(arg0, arg1, arg2) *arg2 = (arg0)->dark[arg1]
+    static void gtk_style_get_dark( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.dark[arg1];
+    }
+    //gtk_style_get_fg(arg0, arg1, arg2) *arg2 = (arg0)->fg[arg1]
+    static void gtk_style_get_fg( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.fg[arg1];
+    }
+    //gtk_style_get_light(arg0, arg1, arg2) *arg2 = (arg0)->light[arg1]
+    static void gtk_style_get_light( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.light[arg1];
+    }
+    //gtk_style_get_text(arg0, arg1, arg2) *arg2 = (arg0)->text[arg1]
+    static void gtk_style_get_text( GtkStyle* arg0, int arg1, GdkColor* arg2 ) {
+        *arg2 = arg0.text[arg1];
+    }
+
+    /+
     gtk_style_get_xthickness(arg0) (arg0)->xthickness
     gtk_style_get_ythickness(arg0) (arg0)->ythickness
     gtk_style_get_fg_gc(arg0, arg1, arg2) *arg2 = (arg0)->fg_gc[arg1]
--- a/dwt/internal/gtk/c/gdktypes.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/internal/gtk/c/gdktypes.d	Wed Jan 09 01:08:22 2008 +0100
@@ -1948,7 +1948,24 @@
  * guint
  * pixel_from_rgb (GdkVisual *visual,
  */
-public struct GdkVisual{}
+public struct GdkVisual{
+    GObject parent_instance;
+    int type;
+    int depth;
+    int byte_order;
+    int colormap_size;
+    int bits_per_rgb;
+    uint red_mask;
+    int red_shift;
+    int red_prec;
+    uint green_mask;
+    int green_shift;
+    int green_prec;
+    uint blue_mask;
+    int blue_shift;
+    int blue_prec;
+}
+
 // GObject parentInstance;
 // gdk-Visuals.html
 // GdkVisualType type;
--- a/dwt/internal/gtk/c/gtktypes.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/internal/gtk/c/gtktypes.d	Wed Jan 09 01:08:22 2008 +0100
@@ -2469,7 +2469,9 @@
 /**
  * Main Gtk struct.
  */
-public struct GtkWindow{}
+public struct GtkWindow{
+    GtkBin bin;
+}
 
 
 /**
@@ -4444,7 +4446,9 @@
  * GtkWidget *child;
  * the child widget.
  */
-public struct GtkBin{}
+public struct GtkBin{
+    GtkContainer container;
+}
 
 
 /**
--- a/dwt/widgets/Caret.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Caret.d	Wed Jan 09 01:08:22 2008 +0100
@@ -11,6 +11,8 @@
 module dwt.widgets.Caret;
 
 class Caret{
+    int blinkRate;
+    bool blinkCaret();
 }
 /+++
 
--- a/dwt/widgets/Control.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Control.d	Wed Jan 09 01:08:22 2008 +0100
@@ -13,11 +13,22 @@
 import dwt.internal.gtk.c.gtktypes;
 import dwt.widgets.Widget;
 import dwt.widgets.Shell;
+import dwt.graphics.Point;
 
 class Control : Widget {
     GdkWindow* paintWindow () { return null; };
     public Shell getShell();
     bool isEnabled();
+    bool isDisposed();
+    GdkWindow* eventWindow ();
+    GtkIMContext * imHandle();
+    Control findBackgroundControl ();
+    GdkColor* getBackgroundColor () ;
+    GdkColor* getForegroundColor () ;
+    PangoFontDescription* getFontDescription ();
+    public Point toDisplay (int x, int y);
+    public Point toDisplay (Point point) ;
+    Point getIMCaretPos () ;
 }
 /+++
 import dwt.*;
--- a/dwt/widgets/Display.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Display.d	Wed Jan 09 01:08:22 2008 +0100
@@ -26,6 +26,7 @@
 import dwt.internal.Compatibility;
 import dwt.internal.Converter;
 import dwt.internal.Lock;
+import dwt.internal.LONG;
 import dwt.internal.gtk.c.gdktypes;
 import dwt.internal.gtk.c.gtktypes;
 import dwt.internal.gtk.OS;
@@ -126,31 +127,37 @@
  */
 public class Display : Device {
 
+    package struct CallbackData {
+        Display display;
+        void* data;
+    }
+
 	/* Events Dispatching and Callback */
 	int gdkEventCount;
 	GdkEvent* [] gdkEvents;
 	Widget [] gdkEventWidgets;
 	int [] dispatchEvents;
 	Event [] eventQueue;
-	int /*long*/ fds;
+	GPollFD[] fds;
 	int allocated_nfds;
 	bool wake_state;
 	int max_priority, timeout;
 	void*/*Callback*/ eventCallback, filterCallback;
-	int /*long*/ eventProc, filterProc, windowProc2, windowProc3, windowProc4, windowProc5;
-	void*/*Callback*/ windowCallback2, windowCallback3, windowCallback4, windowCallback5;
+
+    CallbackData*[] windowProcCallbackDatas; // to prevent GC from collect
+
+    CallbackData  filterProcCallbackData;
 	EventTable eventTable, filterTable;
 	static char[] APP_NAME = "SWT";
 	static const char[] DISPATCH_EVENT_KEY = "dwt.internal.gtk.dispatchEvent";
 	static const char[] ADD_WIDGET_KEY = "dwt.internal.addWidget";
-	int /*long*/ [] closures;
+	GClosure*[] closures;
 	int [] signalIds;
-	int /*long*/ shellMapProcClosure;
 
 	/* Widget Table */
 	int [] indexTable;
 	int freeSlot;
-	int /*long*/ lastHandle;
+	GtkWidget* lastHandle;
 	Widget lastWidget;
 	Widget [] widgetTable;
 	const static int GROW_SIZE = 1024;
@@ -167,7 +174,8 @@
 
 	/* Input method resources */
 	Control imControl;
-	int /*long*/ preeditWindow, preeditLabel;
+	GtkWindow* preeditWindow;
+    GtkLabel* preeditLabel;
 
 	/* Sync/Async Widget Communication */
 	Synchronizer synchronizer;
@@ -182,43 +190,30 @@
 	/* Timers */
 	int [] timerIds;
 	Runnable [] timerList;
-	void*/*Callback*/ timerCallback;
-	int /*long*/ timerProc;
-	void*/*Callback*/ windowTimerCallback;
-	int /*long*/ windowTimerProc;
+    CallbackData timerProcCallbackData;
 
 	/* Caret */
 	Caret currentCaret;
-	void*/*Callback*/ caretCallback;
 	int caretId;
-	int /*long*/ caretProc;
+    CallbackData caretProcCallbackData;
 
 	/* Mnemonics */
 	Control mnemonicControl;
 
 	/* Mouse hover */
 	int mouseHoverId;
-	int /*long*/ mouseHoverHandle, mouseHoverProc;
-	void*/*Callback*/ mouseHoverCallback;
-
+    GObject* mouseHoverHandle;
 	/* Menu position callback */
-	int /*long*/ menuPositionProc;
-	void*/*Callback*/ menuPositionCallback;
 
 	/* Tooltip size allocate callback */
-	int /*long*/ sizeAllocateProc;
-	void*/*Callback*/ sizeAllocateCallback;
-	int /*long*/ sizeRequestProc;
-	void*/*Callback*/ sizeRequestCallback;
 
 	/* Shell map callback */
-	int /*long*/ shellMapProc;
-	void*/*Callback*/ shellMapCallback;
+    CallbackData shellMapProcCallbackData;
+    GClosure* shellMapProcClosure;
 
 	/* Idle proc callback */
-	int /*long*/ idleProc;
+    CallbackData idleProcCallbackData;
 	int idleHandle;
-	void*/*Callback*/ idleCallback;
 	static const char[] ADD_IDLE_PROC_KEY;
 	static const char[] REMOVE_IDLE_PROC_KEY;
 	Object idleLock;
@@ -227,25 +222,18 @@
 	/* GtkTreeView callbacks */
 	int[] treeSelection;
 	int treeSelectionLength;
-	int /*long*/ treeSelectionProc;
-	void*/*Callback*/ treeSelectionCallback;
-	int /*long*/ cellDataProcFld;
-	void*/*Callback*/ cellDataCallback;
 
 	/* Set direction callback */
-	int /*long*/ setDirectionProc;
-	void*/*Callback*/ setDirectionCallback;
+    CallbackData setDirectionCallbackData;
 
 	/* Get all children callback */
-	int /*long*/ allChildrenProc;
+    CallbackData allChildrenCallbackData;
     GList* allChildren;
-	void*/*Callback*/ allChildrenCallback;
 
 	/* Settings callbacks */
-	int /*long*/ styleSetProc;
-	void*/*Callback*/ styleSetCallback;
 	GtkWidget* shellHandle;
-	bool settingsChanged, runSettings;
+	bool settingsChanged, runSettingsFld;
+    CallbackData styleSetProcCallbackData;
 
 	/* Entry focus behaviour */
 	bool entrySelectOnFocus;
@@ -271,12 +259,12 @@
 	static const int RESOURCE_SIZE = 1 + 4 + SWT.CURSOR_HAND + 1;
 
 	/* Colors */
-	GdkColor COLOR_WIDGET_DARK_SHADOW, COLOR_WIDGET_NORMAL_SHADOW, COLOR_WIDGET_LIGHT_SHADOW;
-	GdkColor COLOR_WIDGET_HIGHLIGHT_SHADOW, COLOR_WIDGET_BACKGROUND, COLOR_WIDGET_FOREGROUND, COLOR_WIDGET_BORDER;
-	GdkColor COLOR_LIST_FOREGROUND, COLOR_LIST_BACKGROUND, COLOR_LIST_SELECTION, COLOR_LIST_SELECTION_TEXT;
-	GdkColor COLOR_INFO_BACKGROUND, COLOR_INFO_FOREGROUND;
-	GdkColor COLOR_TITLE_FOREGROUND, COLOR_TITLE_BACKGROUND, COLOR_TITLE_BACKGROUND_GRADIENT;
-	GdkColor COLOR_TITLE_INACTIVE_FOREGROUND, COLOR_TITLE_INACTIVE_BACKGROUND, COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT;
+	GdkColor* COLOR_WIDGET_DARK_SHADOW, COLOR_WIDGET_NORMAL_SHADOW, COLOR_WIDGET_LIGHT_SHADOW;
+	GdkColor* COLOR_WIDGET_HIGHLIGHT_SHADOW, COLOR_WIDGET_BACKGROUND, COLOR_WIDGET_FOREGROUND, COLOR_WIDGET_BORDER;
+	GdkColor* COLOR_LIST_FOREGROUND, COLOR_LIST_BACKGROUND, COLOR_LIST_SELECTION, COLOR_LIST_SELECTION_TEXT;
+	GdkColor* COLOR_INFO_BACKGROUND, COLOR_INFO_FOREGROUND;
+	GdkColor* COLOR_TITLE_FOREGROUND, COLOR_TITLE_BACKGROUND, COLOR_TITLE_BACKGROUND_GRADIENT;
+	GdkColor* COLOR_TITLE_INACTIVE_FOREGROUND, COLOR_TITLE_INACTIVE_BACKGROUND, COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT;
 
 	/* Popup Menus */
 	Menu [] popups;
@@ -290,16 +278,10 @@
 	/* Fixed Subclass */
 	static int /*long*/ fixed_type;
 	static int /*long*/ fixed_info_ptr;
-	static void*/*Callback*/ fixedClassInitCallback;
-    //static void* fixedMapCallback;
-	static int /*long*/ fixedClassInitProc;
-    //static int    fixedMapProc;
 
 	/* Renderer Subclass */
 	static int /*long*/ text_renderer_type, pixbuf_renderer_type, toggle_renderer_type;
 	static int /*long*/ text_renderer_info_ptr, pixbuf_renderer_info_ptr, toggle_renderer_info_ptr;
-	static void*/*Callback*/ rendererClassInitCallback, rendererRenderCallback, rendererGetSizeCallback;
-	static int /*long*/ rendererClassInitProc, rendererRenderProc, rendererGetSizeProc;
 
 	/* Key Mappings */
 	static const int [] [] KeyTable = [
@@ -581,7 +563,9 @@
 	synchronized (idleLock){
 		this.idleNeeded = true;
 		if (idleHandle is 0) {
-			idleHandle = OS.g_idle_add ( &idleProcFunc, cast(void*) this );
+            idleProcCallbackData.display = this;
+            idleProcCallbackData.data = null;
+			idleHandle = OS.g_idle_add ( &idleProcFunc, &idleProcCallbackData );
 		}
 	}
 }
@@ -926,7 +910,9 @@
 
 	/* Initialize the filter and event callback */
 	OS.gdk_event_handler_set (&eventProcFunc, cast(void*)this, cast(GDestroyNotify) 0);
-	OS.gdk_window_add_filter  (null, &filterProcFunc, cast(void*)this );
+    filterProcCallbackData.display = this;
+    filterProcCallbackData.data = null;
+	OS.gdk_window_add_filter  (null, &filterProcFunc, cast(void*)&filterProcCallbackData );
 }
 
 Image createImage (char[] name) {
@@ -1420,1561 +1406,1495 @@
 }
 
 private static extern(C) GdkFilterReturn filterProcFunc (GdkXEvent* xEvent, GdkEvent* gdkEvent, void* data) {
-    auto disp = cast(Display)data;
-    return disp.filterProcMeth(xEvent,gdkEvent);
+    auto callbackdata = cast(CallbackData*)data;
+    auto disp = callbackdata.display;
+    if( disp is null ) return GdkFilterReturn.CONTINUE;
+    return disp.filterProcMeth(xEvent,gdkEvent,callbackdata);
+}
+
+GdkFilterReturn filterProcMeth (GdkXEvent* xEvent, GdkEvent* gdkEvent, CallbackData* callbackData) {
+    if( callbackData.data is null ){
+        /*
+         * Feature in GTK.  When button 4, 5, 6, or 7 is released, GTK
+         * does not deliver a corresponding GTK event.  Button 6 and 7
+         * are mapped to buttons 4 and 5 in SWT.  The fix is to change
+         * the button number of the event to a negative number so that
+         * it gets dispatched by GTK.  SWT has been modified to look
+         * for negative button numbers.
+         */
+        XButtonEvent* mouseEvent = cast(XButtonEvent*) xEvent;
+        if (mouseEvent.type is OS.ButtonRelease) {
+            switch (mouseEvent.button) {
+                case 6:
+                case 7:
+                    mouseEvent.button = -mouseEvent.button;
+                    break;
+            }
+        }
+    }
+    Widget widget = getWidget (cast(GtkWidget*)callbackData.data);
+    if (widget is null) return GdkFilterReturn.CONTINUE;
+    return widget.filterProc (xEvent, gdkEvent, callbackData.data);
+}
+
+/**
+ * Returns the location of the on-screen pointer relative
+ * to the top left corner of the screen.
+ *
+ * @return the cursor location
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Point getCursorLocation () {
+	checkDevice ();
+	int x, y;
+	OS.gdk_window_get_pointer (null, &x, &y, null);
+	return new Point (x, y);
+}
+
+/**
+ * Returns an array containing the recommended cursor sizes.
+ *
+ * @return the array of cursor sizes
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+public Point [] getCursorSizes () {
+	checkDevice ();
+	return [new Point (16, 16), new Point (32, 32)];
 }
 
-GdkFilterReturn filterProcMeth (GdkXEvent* xEvent, GdkEvent* gdkEvent) {
-//     /*
-//     * Feature in GTK.  When button 4, 5, 6, or 7 is released, GTK
-//     * does not deliver a corresponding GTK event.  Button 6 and 7
-//     * are mapped to buttons 4 and 5 in SWT.  The fix is to change
-//     * the button number of the event to a negative number so that
-//     * it gets dispatched by GTK.  SWT has been modified to look
-//     * for negative button numbers.
-//     */
-//     XButtonEvent* mouseEvent = cast(XButtonEvent*) xEvent;
-//     if (mouseEvent.type is OS.ButtonRelease) {
-//         switch (mouseEvent.button) {
-//             case 6:
-//             case 7:
-//                 mouseEvent.button = -mouseEvent.button;
-//                 break;
-//         }
-//     }
-// 	Widget widget = getWidget (data);
-// 	if (widget is null) return 0;
-// 	return widget.filterProc (xEvent, gdkEvent, data);
-return GdkFilterReturn.init;
+/**
+ * Returns the application defined property of the receiver
+ * with the specified name, or null if it has not been set.
+ * <p>
+ * Applications may have associated arbitrary objects with the
+ * receiver in this fashion. If the objects stored in the
+ * properties need to be notified when the display is disposed
+ * of, it is the application's responsibility to provide a
+ * <code>disposeExec()</code> handler which does so.
+ * </p>
+ *
+ * @param key the name of the property
+ * @return the value of the property or null if it has not been set
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #setData(String, Object)
+ * @see #disposeExec(Runnable)
+ */
+public Object getData (char[] key) {
+	checkDevice ();
+	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (key ==/*eq*/ DISPATCH_EVENT_KEY) {
+		return new ArrayWrapperInt(dispatchEvents);
+	}
+	if (keys is null) return null;
+	for (int i=0; i<keys.length; i++) {
+		if (keys [i] ==/*eq*/ key) return values [i];
+	}
+	return null;
 }
-//
-// /**
-//  * Returns the location of the on-screen pointer relative
-//  * to the top left corner of the screen.
-//  *
-//  * @return the cursor location
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Point getCursorLocation () {
-// 	checkDevice ();
-// 	int [] x = new int [1], y = new int [1];
-// 	OS.gdk_window_get_pointer (0, x, y, null);
-// 	return new Point (x [0], y [0]);
-// }
-//
-// /**
-//  * Returns an array containing the recommended cursor sizes.
-//  *
-//  * @return the array of cursor sizes
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 3.0
-//  */
-// public Point [] getCursorSizes () {
-// 	checkDevice ();
-// 	return [new Point (16, 16), new Point (32, 32)];
-// }
-//
-// /**
-//  * Returns the application defined property of the receiver
-//  * with the specified name, or null if it has not been set.
-//  * <p>
-//  * Applications may have associated arbitrary objects with the
-//  * receiver in this fashion. If the objects stored in the
-//  * properties need to be notified when the display is disposed
-//  * of, it is the application's responsibility to provide a
-//  * <code>disposeExec()</code> handler which does so.
-//  * </p>
-//  *
-//  * @param key the name of the property
-//  * @return the value of the property or null if it has not been set
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #setData(String, Object)
-//  * @see #disposeExec(Runnable)
-//  */
-// public Object getData (char[] key) {
-// 	checkDevice ();
-// 	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (key ==/*eq*/ DISPATCH_EVENT_KEY) {
-// 		return dispatchEvents;
-// 	}
-// 	if (keys is null) return null;
-// 	for (int i=0; i<keys.length; i++) {
-// 		if (keys [i] ==/*eq*/ key) return values [i];
-// 	}
-// 	return null;
-// }
-//
-// /**
-//  * Returns the application defined, display specific data
-//  * associated with the receiver, or null if it has not been
-//  * set. The <em>display specific data</em> is a single,
-//  * unnamed field that is stored with every display.
-//  * <p>
-//  * Applications may put arbitrary objects in this field. If
-//  * the object stored in the display specific data needs to
-//  * be notified when the display is disposed of, it is the
-//  * application's responsibility to provide a
-//  * <code>disposeExec()</code> handler which does so.
-//  * </p>
-//  *
-//  * @return the display specific data
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #setData(Object)
-//  * @see #disposeExec(Runnable)
-//  */
-// public Object getData () {
-// 	checkDevice ();
-// 	return data;
-// }
-//
-// /**
-//  * Returns a point whose x coordinate is the horizontal
-//  * dots per inch of the display, and whose y coordinate
-//  * is the vertical dots per inch of the display.
-//  *
-//  * @return the horizontal and vertical DPI
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  * </ul>
-//  */
-// public Point getDPI () {
-// 	checkDevice ();
-// 	int widthMM = OS.gdk_screen_width_mm ();
-// 	int width = OS.gdk_screen_width ();
-// 	int dpi = Compatibility.round (254 * width, widthMM * 10);
-// 	return new Point (dpi, dpi);
-// }
-//
-// int /*long*/ gtk_fixed_get_type () {
-// 	return fixed_type;
-// }
-//
-// int /*long*/ gtk_cell_renderer_text_get_type () {
-// 	return text_renderer_type;
-// }
-//
-// int /*long*/ gtk_cell_renderer_pixbuf_get_type () {
-// 	return pixbuf_renderer_type;
-// }
-//
-// int /*long*/ gtk_cell_renderer_toggle_get_type () {
-// 	return toggle_renderer_type;
-// }
-//
-// /**
-//  * Returns the default display. One is created (making the
-//  * thread that invokes this method its user-interface thread)
-//  * if it did not already exist.
-//  *
-//  * @return the default display
-//  */
+
+/**
+ * Returns the application defined, display specific data
+ * associated with the receiver, or null if it has not been
+ * set. The <em>display specific data</em> is a single,
+ * unnamed field that is stored with every display.
+ * <p>
+ * Applications may put arbitrary objects in this field. If
+ * the object stored in the display specific data needs to
+ * be notified when the display is disposed of, it is the
+ * application's responsibility to provide a
+ * <code>disposeExec()</code> handler which does so.
+ * </p>
+ *
+ * @return the display specific data
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #setData(Object)
+ * @see #disposeExec(Runnable)
+ */
+public Object getData () {
+	checkDevice ();
+	return data;
+}
+
+/**
+ * Returns a point whose x coordinate is the horizontal
+ * dots per inch of the display, and whose y coordinate
+ * is the vertical dots per inch of the display.
+ *
+ * @return the horizontal and vertical DPI
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public Point getDPI () {
+	checkDevice ();
+	int widthMM = OS.gdk_screen_width_mm ();
+	int width = OS.gdk_screen_width ();
+	int dpi = Compatibility.round (254 * width, widthMM * 10);
+	return new Point (dpi, dpi);
+}
+
+int /*long*/ gtk_fixed_get_type () {
+	return fixed_type;
+}
+
+int /*long*/ gtk_cell_renderer_text_get_type () {
+	return text_renderer_type;
+}
+
+int /*long*/ gtk_cell_renderer_pixbuf_get_type () {
+	return pixbuf_renderer_type;
+}
+
+int /*long*/ gtk_cell_renderer_toggle_get_type () {
+	return toggle_renderer_type;
+}
+
+/**
+ * Returns the default display. One is created (making the
+ * thread that invokes this method its user-interface thread)
+ * if it did not already exist.
+ *
+ * @return the default display
+ */
 public static synchronized Display getDefault () {
 	if (Default is null) Default = new Display ();
 	return Default;
 }
-//
+
 // /+static bool isValidClass (Class clazz) {
 // //PROTING_TODO	char[] name = clazz.getName ();
 // //PROTING_TODO	int index = name.lastIndexOf ('.');
 // //PROTING_TODO	return name.substring (0, index + 1)==/*eq*/ PACKAGE_PREFIX;
 //     return true;
 // }+/
-//
-// /**
-//  * Returns the button dismissal alignment, one of <code>LEFT</code> or <code>RIGHT</code>.
-//  * The button dismissal alignment is the ordering that should be used when positioning the
-//  * default dismissal button for a dialog.  For example, in a dialog that contains an OK and
-//  * CANCEL button, on platforms where the button dismissal alignment is <code>LEFT</code>, the
-//  * button ordering should be OK/CANCEL.  When button dismissal alignment is <code>RIGHT</code>,
-//  * the button ordering should be CANCEL/OK.
-//  *
-//  * @return the button dismissal order
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1
-//  */
-// public int getDismissalAlignment () {
-// 	checkDevice ();
-// 	return SWT.RIGHT;
-// }
-//
-// /**
-//  * Returns the longest duration, in milliseconds, between
-//  * two mouse button clicks that will be considered a
-//  * <em>double click</em> by the underlying operating system.
-//  *
-//  * @return the double click time
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public int getDoubleClickTime () {
-// 	checkDevice ();
-// 	auto settings = OS.gtk_settings_get_default ();
-// 	int [] buffer = new int [1];
-// 	OS.g_object_get (settings, OS.gtk_double_click_time, buffer, 0);
-// 	return buffer [0];
-// }
-//
-// /**
-//  * Returns the control which currently has keyboard focus,
-//  * or null if keyboard events are not currently going to
-//  * any of the controls built by the currently running
-//  * application.
-//  *
-//  * @return the control under the cursor
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Control getFocusControl () {
-// 	checkDevice ();
-// 	if (focusControl !is null && !focusControl.isDisposed ()) {
-// 		return focusControl;
-// 	}
-// 	if (activeShell is null) return null;
-// 	auto shellHandle = activeShell.shellHandle;
-// 	auto handle = OS.gtk_window_get_focus (shellHandle);
-// 	if (handle is null) return null;
-// 	do {
-// 		Widget widget = getWidget (handle);
-// 		if (widget !is null && (null !is cast(Control)widget)) {
-// 			Control control = cast(Control) widget;
-// 			return control.isEnabled () ? control : null;
-// 		}
-// 	} while ((handle = OS.gtk_widget_get_parent (handle)) !is null);
-// 	return null;
-// }
-//
-// /**
-//  * Returns true when the high contrast mode is enabled.
-//  * Otherwise, false is returned.
-//  * <p>
-//  * Note: This operation is a hint and is not supported on
-//  * platforms that do not have this concept.
-//  * </p>
-//  *
-//  * @return the high contrast mode
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 3.0
-//  */
-// public bool getHighContrast () {
-// 	checkDevice ();
-// 	return false;
-// }
-//
-// public int getDepth () {
-// 	checkDevice ();
-// 	GdkVisual* visual = new GdkVisual ();
-// 	memmove (visual, OS.gdk_visual_get_system());
-// 	return visual.depth;
-// }
-//
-// /**
-//  * Returns the maximum allowed depth of icons on this display, in bits per pixel.
-//  * On some platforms, this may be different than the actual depth of the display.
-//  *
-//  * @return the maximum icon depth
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see Device#getDepth
-//  */
-// public int getIconDepth () {
-// 	checkDevice ();
-// 	return getDepth ();
-// }
-//
-// /**
-//  * Returns an array containing the recommended icon sizes.
-//  *
-//  * @return the array of icon sizes
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see Decorations#setImages(Image[])
-//  *
-//  * @since 3.0
-//  */
-// public Point [] getIconSizes () {
-// 	checkDevice ();
-// 	return [new Point (16, 16), new Point (32, 32)];
-// }
-//
-// int getLastEventTime () {
-// 	return lastEventTime;
-// }
-//
-// int getMessageCount () {
-// 	return synchronizer.getMessageCount ();
-// }
-//
-// /**
-//  * Returns the work area, an EWMH property to store the size
-//  * and position of the screen not covered by dock and panel
-//  * windows.  See http://freedesktop.org/Standards/wm-spec.
-//  */
-// Rectangle getWorkArea() {
-// 	byte[] name = Converter.wcsToMbcs (null, "_NET_WORKAREA", true);
-// 	auto atom = OS.gdk_atom_intern (name, true);
-// 	if (atom is OS.GDK_NONE) return null;
-// 	int /*long*/[] actualType = new int /*long*/[1];
-// 	int[] actualFormat = new int[1];
-// 	int[] actualLength = new int[1];
-// 	int /*long*/[] data = new int /*long*/[1];
-// 	if (!OS.gdk_property_get (OS.GDK_ROOT_PARENT (), atom, OS.GDK_NONE, 0, 16, 0, actualType, actualFormat, actualLength, data)) {
-// 		return null;
-// 	}
-// 	Rectangle result = null;
-// 	if (data [0] !is 0) {
-// 		if (actualLength [0] is 16) {
-// 			int values [] = new int [4];
-// 			memmove (values, data[0], 16);
-// 			result = new Rectangle (values [0],values [1],values [2],values [3]);
-// 		} else if (actualLength [0] is 32) {
-// 			long values [] = new long [4];
-// 			memmove (values, data[0], 32);
-// 			result = new Rectangle (cast(int)values [0],cast(int)values [1],cast(int)values [2],cast(int)values [3]);
-// 		}
-// 		OS.g_free (data [0]);
-// 	}
-// 	return result;
-// }
-//
-// /**
-//  * Returns an array of monitors attached to the device.
-//  *
-//  * @return the array of monitors
-//  *
-//  * @since 3.0
-//  */
-// public Monitor [] getMonitors () {
-// 	checkDevice ();
-// 	Monitor [] monitors = null;
-// 	Rectangle workArea = getWorkArea();
-// 	auto screen = OS.gdk_screen_get_default ();
-// 	if (screen !is null) {
-// 		int monitorCount = OS.gdk_screen_get_n_monitors (screen);
-// 		if (monitorCount > 0) {
-// 			monitors = new Monitor [monitorCount];
-// 			GdkRectangle* dest = new GdkRectangle ();
-// 			for (int i = 0; i < monitorCount; i++) {
-// 				OS.gdk_screen_get_monitor_geometry (screen, i, dest);
-// 				Monitor monitor = new Monitor ();
-// 				monitor.handle = i;
-// 				monitor.x = dest.x;
-// 				monitor.y = dest.y;
-// 				monitor.width = dest.width;
-// 				monitor.height = dest.height;
-// 				if (i is 0 && workArea !is null) {
-// 					monitor.clientX = workArea.x;
-// 					monitor.clientY = workArea.y;
-// 					monitor.clientWidth = workArea.width;
-// 					monitor.clientHeight = workArea.height;
-// 				} else {
-// 					monitor.clientX = monitor.x;
-// 					monitor.clientY = monitor.y;
-// 					monitor.clientWidth = monitor.width;
-// 					monitor.clientHeight = monitor.height;
-// 				}
-// 				monitors [i] = monitor;
-// 			}
-// 		}
-// 	}
-// 	if (monitors is null) {
-// 		/* No multimonitor support detected, default to one monitor */
-// 		Monitor monitor = new Monitor ();
-// 		Rectangle bounds = getBounds ();
-// 		monitor.x = bounds.x;
-// 		monitor.y = bounds.y;
-// 		monitor.width = bounds.width;
-// 		monitor.height = bounds.height;
-// 		if (workArea !is null) {
-// 			monitor.clientX = workArea.x;
-// 			monitor.clientY = workArea.y;
-// 			monitor.clientWidth = workArea.width;
-// 			monitor.clientHeight = workArea.height;
-// 		} else {
-// 			monitor.clientX = monitor.x;
-// 			monitor.clientY = monitor.y;
-// 			monitor.clientWidth = monitor.width;
-// 			monitor.clientHeight = monitor.height;
-// 		}
-// 		monitors = [ monitor ];
-// 	}
-// 	return monitors;
-// }
-//
-// /**
-//  * Returns the primary monitor for that device.
-//  *
-//  * @return the primary monitor
-//  *
-//  * @since 3.0
-//  */
-// public Monitor getPrimaryMonitor () {
-// 	checkDevice ();
-// 	Monitor [] monitors = getMonitors ();
-// 	return monitors [0];
-// }
-//
-// /**
-//  * Returns a (possibly empty) array containing all shells which have
-//  * not been disposed and have the receiver as their display.
-//  *
-//  * @return the receiver's shells
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Shell [] getShells () {
-// 	checkDevice ();
-// 	int index = 0;
-// 	Shell [] result = new Shell [16];
-// 	for (int i = 0; i < widgetTable.length; i++) {
-// 		Widget widget = widgetTable [i];
-// 		if (widget !is null && (null !is cast(Shell)widget)) {
-// 			int j = 0;
-// 			while (j < index) {
-// 				if (result [j] is widget) break;
-// 				j++;
-// 			}
-// 			if (j is index) {
-// 				if (index is result.length) {
-// 					Shell [] newResult = new Shell [index + 16];
-// 					System.arraycopy (result, 0, newResult, 0, index);
-// 					result = newResult;
-// 				}
-// 				result [index++] = cast(Shell) widget;
-// 			}
-// 		}
-// 	}
-// 	if (index is result.length) return result;
-// 	Shell [] newResult = new Shell [index];
-// 	System.arraycopy (result, 0, newResult, 0, index);
-// 	return newResult;
-// }
-//
-// /**
-//  * Returns the thread that has invoked <code>syncExec</code>
-//  * or null if no such runnable is currently being invoked by
-//  * the user-interface thread.
-//  * <p>
-//  * Note: If a runnable invoked by asyncExec is currently
-//  * running, this method will return null.
-//  * </p>
-//  *
-//  * @return the receiver's sync-interface thread
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Thread getSyncThread () {
-// 	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-// 	return synchronizer.syncThread;
-// }
-//
-// /**
-//  * Returns the matching standard color for the given
-//  * constant, which should be one of the color constants
-//  * specified in class <code>SWT</code>. Any value other
-//  * than one of the SWT color constants which is passed
-//  * in will result in the color black. This color should
-//  * not be free'd because it was allocated by the system,
-//  * not the application.
-//  *
-//  * @param id the color constant
-//  * @return the matching color
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see SWT
-//  */
-// public Color getSystemColor (int id) {
-// 	checkDevice ();
-// 	GdkColor gdkColor = null;
-// 	switch (id) {
-// 		case SWT.COLOR_INFO_FOREGROUND: 					gdkColor = COLOR_INFO_FOREGROUND; break;
-// 		case SWT.COLOR_INFO_BACKGROUND: 					gdkColor = COLOR_INFO_BACKGROUND; break;
-// 		case SWT.COLOR_TITLE_FOREGROUND:					gdkColor = COLOR_TITLE_FOREGROUND; break;
-// 		case SWT.COLOR_TITLE_BACKGROUND:					gdkColor = COLOR_TITLE_BACKGROUND; break;
-// 		case SWT.COLOR_TITLE_BACKGROUND_GRADIENT:			gdkColor = COLOR_TITLE_BACKGROUND_GRADIENT; break;
-// 		case SWT.COLOR_TITLE_INACTIVE_FOREGROUND:			gdkColor = COLOR_TITLE_INACTIVE_FOREGROUND; break;
-// 		case SWT.COLOR_TITLE_INACTIVE_BACKGROUND:			gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND; break;
-// 		case SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT:	gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; break;
-// 		case SWT.COLOR_WIDGET_DARK_SHADOW:					gdkColor = COLOR_WIDGET_DARK_SHADOW; break;
-// 		case SWT.COLOR_WIDGET_NORMAL_SHADOW:				gdkColor = COLOR_WIDGET_NORMAL_SHADOW; break;
-// 		case SWT.COLOR_WIDGET_LIGHT_SHADOW: 				gdkColor = COLOR_WIDGET_LIGHT_SHADOW; break;
-// 		case SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW:				gdkColor = COLOR_WIDGET_HIGHLIGHT_SHADOW; break;
-// 		case SWT.COLOR_WIDGET_BACKGROUND: 					gdkColor = COLOR_WIDGET_BACKGROUND; break;
-// 		case SWT.COLOR_WIDGET_FOREGROUND: 					gdkColor = COLOR_WIDGET_FOREGROUND; break;
-// 		case SWT.COLOR_WIDGET_BORDER: 						gdkColor = COLOR_WIDGET_BORDER; break;
-// 		case SWT.COLOR_LIST_FOREGROUND: 					gdkColor = COLOR_LIST_FOREGROUND; break;
-// 		case SWT.COLOR_LIST_BACKGROUND: 					gdkColor = COLOR_LIST_BACKGROUND; break;
-// 		case SWT.COLOR_LIST_SELECTION: 						gdkColor = COLOR_LIST_SELECTION; break;
-// 		case SWT.COLOR_LIST_SELECTION_TEXT: 				gdkColor = COLOR_LIST_SELECTION_TEXT; break;
-// 		default:
-// 			return super.getSystemColor (id);
-// 	}
-// 	if (gdkColor is null) return super.getSystemColor (SWT.COLOR_BLACK);
-// 	return Color.gtk_new (this, gdkColor);
-// }
-//
-// /**
-//  * Returns the matching standard platform cursor for the given
-//  * constant, which should be one of the cursor constants
-//  * specified in class <code>SWT</code>. This cursor should
-//  * not be free'd because it was allocated by the system,
-//  * not the application.  A value of <code>null</code> will
-//  * be returned if the supplied constant is not an SWT cursor
-//  * constant.
-//  *
-//  * @param id the SWT cursor constant
-//  * @return the corresponding cursor or <code>null</code>
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see SWT#CURSOR_ARROW
-//  * @see SWT#CURSOR_WAIT
-//  * @see SWT#CURSOR_CROSS
-//  * @see SWT#CURSOR_APPSTARTING
-//  * @see SWT#CURSOR_HELP
-//  * @see SWT#CURSOR_SIZEALL
-//  * @see SWT#CURSOR_SIZENESW
-//  * @see SWT#CURSOR_SIZENS
-//  * @see SWT#CURSOR_SIZENWSE
-//  * @see SWT#CURSOR_SIZEWE
-//  * @see SWT#CURSOR_SIZEN
-//  * @see SWT#CURSOR_SIZES
-//  * @see SWT#CURSOR_SIZEE
-//  * @see SWT#CURSOR_SIZEW
-//  * @see SWT#CURSOR_SIZENE
-//  * @see SWT#CURSOR_SIZESE
-//  * @see SWT#CURSOR_SIZESW
-//  * @see SWT#CURSOR_SIZENW
-//  * @see SWT#CURSOR_UPARROW
-//  * @see SWT#CURSOR_IBEAM
-//  * @see SWT#CURSOR_NO
-//  * @see SWT#CURSOR_HAND
-//  *
-//  * @since 3.0
-//  */
-// public Cursor getSystemCursor (int id) {
-// 	checkDevice ();
-// 	if (!(0 <= id && id < cursors.length)) return null;
-// 	if (cursors [id] is null) {
-// 		cursors [id] = new Cursor (this, id);
-// 	}
-// 	return cursors [id];
-// }
-//
-// /**
-//  * Returns the matching standard platform image for the given
-//  * constant, which should be one of the icon constants
-//  * specified in class <code>SWT</code>. This image should
-//  * not be free'd because it was allocated by the system,
-//  * not the application.  A value of <code>null</code> will
-//  * be returned either if the supplied constant is not an
-//  * SWT icon constant or if the platform does not define an
-//  * image that corresponds to the constant.
-//  *
-//  * @param id the SWT icon constant
-//  * @return the corresponding image or <code>null</code>
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see SWT#ICON_ERROR
-//  * @see SWT#ICON_INFORMATION
-//  * @see SWT#ICON_QUESTION
-//  * @see SWT#ICON_WARNING
-//  * @see SWT#ICON_WORKING
-//  *
-//  * @since 3.0
-//  */
-// public Image getSystemImage (int id) {
-// 	checkDevice ();
-// 	switch (id) {
-// 		case SWT.ICON_ERROR:
-// 			if (errorImage is null) {
-// 				errorImage = createImage ("gtk-dialog-error");
-// 			}
-// 			return errorImage;
-// 		case SWT.ICON_INFORMATION:
-// 		case SWT.ICON_WORKING:
-// 			if (infoImage is null) {
-// 				infoImage = createImage ("gtk-dialog-info");
-// 			}
-// 			return infoImage;
-// 		case SWT.ICON_QUESTION:
-// 			if (questionImage is null) {
-// 				questionImage = createImage ("gtk-dialog-question");
-// 			}
-// 			return questionImage;
-// 		case SWT.ICON_WARNING:
-// 			if (warningImage is null) {
-// 				warningImage = createImage ("gtk-dialog-warning");
-// 			}
-// 			return warningImage;
-// 	}
-// 	return null;
-// }
-//
-// void initializeSystemColors () {
-// 	GdkColor gdkColor;
-//
-// 	/* Get Tooltip resources */
-// 	auto tooltipShellHandle = OS.gtk_window_new (OS.GTK_WINDOW_POPUP);
-// 	if (tooltipShellHandle is null) SWT.error (SWT.ERROR_NO_HANDLES);
-// 	byte[] gtk_tooltips = Converter.wcsToMbcs (null, "gtk-tooltips", true);
-// 	OS.gtk_widget_set_name (tooltipShellHandle, gtk_tooltips);
-// 	OS.gtk_widget_realize (tooltipShellHandle);
-// 	auto tooltipStyle = OS.gtk_widget_get_style (tooltipShellHandle);
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_fg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_INFO_FOREGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_bg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_INFO_BACKGROUND = gdkColor;
-// 	OS.gtk_widget_destroy (tooltipShellHandle);
-//
-// 	/* Get Shell resources */
-// 	auto style = OS.gtk_widget_get_style (shellHandle);
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_black (style, gdkColor);
-// 	COLOR_WIDGET_DARK_SHADOW = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_dark (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_WIDGET_NORMAL_SHADOW = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_WIDGET_LIGHT_SHADOW = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_light (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_WIDGET_HIGHLIGHT_SHADOW = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_fg (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_WIDGET_FOREGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_WIDGET_BACKGROUND = gdkColor;
-// 	//gdkColor = new GdkColor();
-// 	//OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	//COLOR_TEXT_FOREGROUND = gdkColor;
-// 	//gdkColor = new GdkColor();
-// 	//OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	//COLOR_TEXT_BACKGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_LIST_FOREGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor);
-// 	COLOR_LIST_BACKGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_text (style, OS.GTK_STATE_SELECTED, gdkColor);
-// 	COLOR_LIST_SELECTION_TEXT = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_base (style, OS.GTK_STATE_SELECTED, gdkColor);
-// 	COLOR_LIST_SELECTION = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_bg (style, OS.GTK_STATE_SELECTED, gdkColor);
-// 	COLOR_TITLE_BACKGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_fg (style, OS.GTK_STATE_SELECTED, gdkColor);
-// 	COLOR_TITLE_FOREGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_light (style, OS.GTK_STATE_SELECTED, gdkColor);
-// 	COLOR_TITLE_BACKGROUND_GRADIENT = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_bg (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
-// 	COLOR_TITLE_INACTIVE_BACKGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_fg (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
-// 	COLOR_TITLE_INACTIVE_FOREGROUND = gdkColor;
-// 	gdkColor = new GdkColor();
-// 	OS.gtk_style_get_light (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
-// 	COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = gdkColor;
-// }
-//
-// /**
-//  * Returns a reasonable font for applications to use.
-//  * On some platforms, this will match the "default font"
-//  * or "system font" if such can be found.  This font
-//  * should not be free'd because it was allocated by the
-//  * system, not the application.
-//  * <p>
-//  * Typically, applications which want the default look
-//  * should simply not set the font on the widgets they
-//  * create. Widgets are always created with the correct
-//  * default font for the class of user-interface component
-//  * they represent.
-//  * </p>
-//  *
-//  * @return a font
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Font getSystemFont () {
-// 	checkDevice ();
-// 	if (systemFont !is null) return systemFont;
-// 	auto style = OS.gtk_widget_get_style (shellHandle);
-// 	auto defaultFont = OS.pango_font_description_copy (OS.gtk_style_get_font_desc (style));
-// 	return systemFont = Font.gtk_new (this, defaultFont);
-// }
-//
-// /**
-//  * Returns the single instance of the system tray or null
-//  * when there is no system tray available for the platform.
-//  *
-//  * @return the system tray or <code>null</code>
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 3.0
-//  */
-// public Tray getSystemTray () {
-// 	checkDevice ();
-// 	if (tray !is null) return tray;
-// 	return tray = new Tray (this, SWT.NONE);
-// }
-//
-// /**
-//  * Returns the user-interface thread for the receiver.
-//  *
-//  * @return the receiver's user-interface thread
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  */
-// public Thread getThread () {
-// 	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-// 	return thread;
-// }
-//
+
+/**
+ * Returns the button dismissal alignment, one of <code>LEFT</code> or <code>RIGHT</code>.
+ * The button dismissal alignment is the ordering that should be used when positioning the
+ * default dismissal button for a dialog.  For example, in a dialog that contains an OK and
+ * CANCEL button, on platforms where the button dismissal alignment is <code>LEFT</code>, the
+ * button ordering should be OK/CANCEL.  When button dismissal alignment is <code>RIGHT</code>,
+ * the button ordering should be CANCEL/OK.
+ *
+ * @return the button dismissal order
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1
+ */
+public int getDismissalAlignment () {
+	checkDevice ();
+	return SWT.RIGHT;
+}
+
+/**
+ * Returns the longest duration, in milliseconds, between
+ * two mouse button clicks that will be considered a
+ * <em>double click</em> by the underlying operating system.
+ *
+ * @return the double click time
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public int getDoubleClickTime () {
+	checkDevice ();
+	auto settings = OS.gtk_settings_get_default ();
+	int buffer;
+	OS.g_object_get1 (settings, OS.gtk_double_click_time.ptr, &buffer);
+	return buffer;
+}
+
+/**
+ * Returns the control which currently has keyboard focus,
+ * or null if keyboard events are not currently going to
+ * any of the controls built by the currently running
+ * application.
+ *
+ * @return the control under the cursor
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Control getFocusControl () {
+	checkDevice ();
+	if (focusControl !is null && !focusControl.isDisposed ()) {
+		return focusControl;
+	}
+	if (activeShell is null) return null;
+	auto shellHandle = activeShell.shellHandle;
+	auto handle = OS.gtk_window_get_focus (cast(GtkWindow*)shellHandle);
+	if (handle is null) return null;
+	do {
+		Widget widget = getWidget (handle);
+		if (widget !is null && (null !is cast(Control)widget)) {
+			Control control = cast(Control) widget;
+			return control.isEnabled () ? control : null;
+		}
+	} while ((handle = OS.gtk_widget_get_parent (handle)) !is null);
+	return null;
+}
+
+/**
+ * Returns true when the high contrast mode is enabled.
+ * Otherwise, false is returned.
+ * <p>
+ * Note: This operation is a hint and is not supported on
+ * platforms that do not have this concept.
+ * </p>
+ *
+ * @return the high contrast mode
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+public bool getHighContrast () {
+	checkDevice ();
+	return false;
+}
+
+public int getDepth () {
+	checkDevice ();
+	auto visual = OS.gdk_visual_get_system();
+	return visual.depth;
+}
+
+/**
+ * Returns the maximum allowed depth of icons on this display, in bits per pixel.
+ * On some platforms, this may be different than the actual depth of the display.
+ *
+ * @return the maximum icon depth
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see Device#getDepth
+ */
+public int getIconDepth () {
+	checkDevice ();
+	return getDepth ();
+}
+
+/**
+ * Returns an array containing the recommended icon sizes.
+ *
+ * @return the array of icon sizes
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see Decorations#setImages(Image[])
+ *
+ * @since 3.0
+ */
+public Point [] getIconSizes () {
+	checkDevice ();
+	return [new Point (16, 16), new Point (32, 32)];
+}
+
+int getLastEventTime () {
+	return lastEventTime;
+}
+
+int getMessageCount () {
+	return synchronizer.getMessageCount ();
+}
+
+/**
+ * Returns the work area, an EWMH property to store the size
+ * and position of the screen not covered by dock and panel
+ * windows.  See http://freedesktop.org/Standards/wm-spec.
+ */
+Rectangle getWorkArea() {
+	auto atom = OS.gdk_atom_intern ("_NET_WORKAREA".ptr, true);
+	if (atom is null/*OS.GDK_NONE*/) return null;
+	void* actualType;
+	int actualFormat;
+	int actualLength;
+	char* data;
+	if (!OS.gdk_property_get (cast(GdkDrawable*)OS.GDK_ROOT_PARENT (), atom, null/*OS.GDK_NONE*/, 0, 16, 0, &actualType, &actualFormat, &actualLength, &data)) {
+		return null;
+	}
+	Rectangle result = null;
+	if (data !is null) {
+		if (actualLength is 16) {
+			int[] values = (cast(int*)data)[0..4];
+			result = new Rectangle (values [0],values [1],values [2],values [3]);
+		} else if (actualLength is 32) {
+			long[] values = (cast(long*)data)[0..4];
+			result = new Rectangle (cast(int)values [0],cast(int)values [1],cast(int)values [2],cast(int)values [3]);
+		}
+		OS.g_free (data);
+	}
+	return result;
+}
+
+/**
+ * Returns an array of monitors attached to the device.
+ *
+ * @return the array of monitors
+ *
+ * @since 3.0
+ */
+public dwt.widgets.Monitor.Monitor [] getMonitors () {
+	checkDevice ();
+	dwt.widgets.Monitor.Monitor [] monitors = null;
+	Rectangle workArea = getWorkArea();
+	auto screen = OS.gdk_screen_get_default ();
+	if (screen !is null) {
+		int monitorCount = OS.gdk_screen_get_n_monitors (screen);
+		if (monitorCount > 0) {
+			monitors = new dwt.widgets.Monitor.Monitor [monitorCount];
+			GdkRectangle* dest = new GdkRectangle ();
+			for (int i = 0; i < monitorCount; i++) {
+				OS.gdk_screen_get_monitor_geometry (screen, i, dest);
+				auto monitor = new dwt.widgets.Monitor.Monitor ();
+				monitor.handle = i;
+				monitor.x = dest.x;
+				monitor.y = dest.y;
+				monitor.width = dest.width;
+				monitor.height = dest.height;
+				if (i is 0 && workArea !is null) {
+					monitor.clientX = workArea.x;
+					monitor.clientY = workArea.y;
+					monitor.clientWidth = workArea.width;
+					monitor.clientHeight = workArea.height;
+				} else {
+					monitor.clientX = monitor.x;
+					monitor.clientY = monitor.y;
+					monitor.clientWidth = monitor.width;
+					monitor.clientHeight = monitor.height;
+				}
+				monitors [i] = monitor;
+			}
+		}
+	}
+	if (monitors is null) {
+		/* No multimonitor support detected, default to one monitor */
+		auto monitor = new dwt.widgets.Monitor.Monitor ();
+		Rectangle bounds = getBounds ();
+		monitor.x = bounds.x;
+		monitor.y = bounds.y;
+		monitor.width = bounds.width;
+		monitor.height = bounds.height;
+		if (workArea !is null) {
+			monitor.clientX = workArea.x;
+			monitor.clientY = workArea.y;
+			monitor.clientWidth = workArea.width;
+			monitor.clientHeight = workArea.height;
+		} else {
+			monitor.clientX = monitor.x;
+			monitor.clientY = monitor.y;
+			monitor.clientWidth = monitor.width;
+			monitor.clientHeight = monitor.height;
+		}
+		monitors = [ monitor ];
+	}
+	return monitors;
+}
+
+/**
+ * Returns the primary monitor for that device.
+ *
+ * @return the primary monitor
+ *
+ * @since 3.0
+ */
+public dwt.widgets.Monitor.Monitor getPrimaryMonitor () {
+	checkDevice ();
+	auto monitors = getMonitors ();
+	return monitors [0];
+}
+
+/**
+ * Returns a (possibly empty) array containing all shells which have
+ * not been disposed and have the receiver as their display.
+ *
+ * @return the receiver's shells
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Shell [] getShells () {
+	checkDevice ();
+	int index = 0;
+	Shell [] result = new Shell [16];
+	for (int i = 0; i < widgetTable.length; i++) {
+		Widget widget = widgetTable [i];
+		if (widget !is null && (null !is cast(Shell)widget)) {
+			int j = 0;
+			while (j < index) {
+				if (result [j] is widget) break;
+				j++;
+			}
+			if (j is index) {
+				if (index is result.length) {
+					Shell [] newResult = new Shell [index + 16];
+					System.arraycopy (result, 0, newResult, 0, index);
+					result = newResult;
+				}
+				result [index++] = cast(Shell) widget;
+			}
+		}
+	}
+	if (index is result.length) return result;
+	Shell [] newResult = new Shell [index];
+	System.arraycopy (result, 0, newResult, 0, index);
+	return newResult;
+}
+
+/**
+ * Returns the thread that has invoked <code>syncExec</code>
+ * or null if no such runnable is currently being invoked by
+ * the user-interface thread.
+ * <p>
+ * Note: If a runnable invoked by asyncExec is currently
+ * running, this method will return null.
+ * </p>
+ *
+ * @return the receiver's sync-interface thread
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Thread getSyncThread () {
+	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+	return synchronizer.syncThread;
+}
+
+/**
+ * Returns the matching standard color for the given
+ * constant, which should be one of the color constants
+ * specified in class <code>SWT</code>. Any value other
+ * than one of the SWT color constants which is passed
+ * in will result in the color black. This color should
+ * not be free'd because it was allocated by the system,
+ * not the application.
+ *
+ * @param id the color constant
+ * @return the matching color
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see SWT
+ */
+public Color getSystemColor (int id) {
+	checkDevice ();
+	GdkColor* gdkColor = null;
+	switch (id) {
+		case SWT.COLOR_INFO_FOREGROUND: 					gdkColor = COLOR_INFO_FOREGROUND; break;
+		case SWT.COLOR_INFO_BACKGROUND: 					gdkColor = COLOR_INFO_BACKGROUND; break;
+		case SWT.COLOR_TITLE_FOREGROUND:					gdkColor = COLOR_TITLE_FOREGROUND; break;
+		case SWT.COLOR_TITLE_BACKGROUND:					gdkColor = COLOR_TITLE_BACKGROUND; break;
+		case SWT.COLOR_TITLE_BACKGROUND_GRADIENT:			gdkColor = COLOR_TITLE_BACKGROUND_GRADIENT; break;
+		case SWT.COLOR_TITLE_INACTIVE_FOREGROUND:			gdkColor = COLOR_TITLE_INACTIVE_FOREGROUND; break;
+		case SWT.COLOR_TITLE_INACTIVE_BACKGROUND:			gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND; break;
+		case SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT:	gdkColor = COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT; break;
+		case SWT.COLOR_WIDGET_DARK_SHADOW:					gdkColor = COLOR_WIDGET_DARK_SHADOW; break;
+		case SWT.COLOR_WIDGET_NORMAL_SHADOW:				gdkColor = COLOR_WIDGET_NORMAL_SHADOW; break;
+		case SWT.COLOR_WIDGET_LIGHT_SHADOW: 				gdkColor = COLOR_WIDGET_LIGHT_SHADOW; break;
+		case SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW:				gdkColor = COLOR_WIDGET_HIGHLIGHT_SHADOW; break;
+		case SWT.COLOR_WIDGET_BACKGROUND: 					gdkColor = COLOR_WIDGET_BACKGROUND; break;
+		case SWT.COLOR_WIDGET_FOREGROUND: 					gdkColor = COLOR_WIDGET_FOREGROUND; break;
+		case SWT.COLOR_WIDGET_BORDER: 						gdkColor = COLOR_WIDGET_BORDER; break;
+		case SWT.COLOR_LIST_FOREGROUND: 					gdkColor = COLOR_LIST_FOREGROUND; break;
+		case SWT.COLOR_LIST_BACKGROUND: 					gdkColor = COLOR_LIST_BACKGROUND; break;
+		case SWT.COLOR_LIST_SELECTION: 						gdkColor = COLOR_LIST_SELECTION; break;
+		case SWT.COLOR_LIST_SELECTION_TEXT: 				gdkColor = COLOR_LIST_SELECTION_TEXT; break;
+		default:
+			return super.getSystemColor (id);
+	}
+	if (gdkColor is null) return super.getSystemColor (SWT.COLOR_BLACK);
+	return Color.gtk_new (this, gdkColor);
+}
+
+/**
+ * Returns the matching standard platform cursor for the given
+ * constant, which should be one of the cursor constants
+ * specified in class <code>SWT</code>. This cursor should
+ * not be free'd because it was allocated by the system,
+ * not the application.  A value of <code>null</code> will
+ * be returned if the supplied constant is not an SWT cursor
+ * constant.
+ *
+ * @param id the SWT cursor constant
+ * @return the corresponding cursor or <code>null</code>
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see SWT#CURSOR_ARROW
+ * @see SWT#CURSOR_WAIT
+ * @see SWT#CURSOR_CROSS
+ * @see SWT#CURSOR_APPSTARTING
+ * @see SWT#CURSOR_HELP
+ * @see SWT#CURSOR_SIZEALL
+ * @see SWT#CURSOR_SIZENESW
+ * @see SWT#CURSOR_SIZENS
+ * @see SWT#CURSOR_SIZENWSE
+ * @see SWT#CURSOR_SIZEWE
+ * @see SWT#CURSOR_SIZEN
+ * @see SWT#CURSOR_SIZES
+ * @see SWT#CURSOR_SIZEE
+ * @see SWT#CURSOR_SIZEW
+ * @see SWT#CURSOR_SIZENE
+ * @see SWT#CURSOR_SIZESE
+ * @see SWT#CURSOR_SIZESW
+ * @see SWT#CURSOR_SIZENW
+ * @see SWT#CURSOR_UPARROW
+ * @see SWT#CURSOR_IBEAM
+ * @see SWT#CURSOR_NO
+ * @see SWT#CURSOR_HAND
+ *
+ * @since 3.0
+ */
+public Cursor getSystemCursor (int id) {
+	checkDevice ();
+	if (!(0 <= id && id < cursors.length)) return null;
+	if (cursors [id] is null) {
+		cursors [id] = new Cursor (this, id);
+	}
+	return cursors [id];
+}
+
+/**
+ * Returns the matching standard platform image for the given
+ * constant, which should be one of the icon constants
+ * specified in class <code>SWT</code>. This image should
+ * not be free'd because it was allocated by the system,
+ * not the application.  A value of <code>null</code> will
+ * be returned either if the supplied constant is not an
+ * SWT icon constant or if the platform does not define an
+ * image that corresponds to the constant.
+ *
+ * @param id the SWT icon constant
+ * @return the corresponding image or <code>null</code>
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see SWT#ICON_ERROR
+ * @see SWT#ICON_INFORMATION
+ * @see SWT#ICON_QUESTION
+ * @see SWT#ICON_WARNING
+ * @see SWT#ICON_WORKING
+ *
+ * @since 3.0
+ */
+public Image getSystemImage (int id) {
+	checkDevice ();
+	switch (id) {
+		case SWT.ICON_ERROR:
+			if (errorImage is null) {
+				errorImage = createImage ("gtk-dialog-error");
+			}
+			return errorImage;
+		case SWT.ICON_INFORMATION:
+		case SWT.ICON_WORKING:
+			if (infoImage is null) {
+				infoImage = createImage ("gtk-dialog-info");
+			}
+			return infoImage;
+		case SWT.ICON_QUESTION:
+			if (questionImage is null) {
+				questionImage = createImage ("gtk-dialog-question");
+			}
+			return questionImage;
+		case SWT.ICON_WARNING:
+			if (warningImage is null) {
+				warningImage = createImage ("gtk-dialog-warning");
+			}
+			return warningImage;
+	}
+	return null;
+}
+
+void initializeSystemColors () {
+	GdkColor* gdkColor;
+
+	/* Get Tooltip resources */
+	auto tooltipShellHandle = OS.gtk_window_new (cast(GtkWindowType)OS.GTK_WINDOW_POPUP);
+	if (tooltipShellHandle is null) SWT.error (SWT.ERROR_NO_HANDLES);
+//	byte[] gtk_tooltips = Converter.wcsToMbcs (null, "gtk-tooltips", true);
+	OS.gtk_widget_set_name (tooltipShellHandle, "gtk-tooltips".ptr );
+	OS.gtk_widget_realize (tooltipShellHandle);
+	auto tooltipStyle = OS.gtk_widget_get_style (tooltipShellHandle);
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_fg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_INFO_FOREGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_bg (tooltipStyle, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_INFO_BACKGROUND = gdkColor;
+	OS.gtk_widget_destroy (tooltipShellHandle);
+
+	/* Get Shell resources */
+	auto style = OS.gtk_widget_get_style (shellHandle);
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_black (style, gdkColor);
+	COLOR_WIDGET_DARK_SHADOW = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_dark (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_WIDGET_NORMAL_SHADOW = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_WIDGET_LIGHT_SHADOW = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_light (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_WIDGET_HIGHLIGHT_SHADOW = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_fg (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_WIDGET_FOREGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_bg (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_WIDGET_BACKGROUND = gdkColor;
+	//gdkColor = new GdkColor();
+	//OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor);
+	//COLOR_TEXT_FOREGROUND = gdkColor;
+	//gdkColor = new GdkColor();
+	//OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor);
+	//COLOR_TEXT_BACKGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_text (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_LIST_FOREGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_base (style, OS.GTK_STATE_NORMAL, gdkColor);
+	COLOR_LIST_BACKGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_text (style, OS.GTK_STATE_SELECTED, gdkColor);
+	COLOR_LIST_SELECTION_TEXT = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_base (style, OS.GTK_STATE_SELECTED, gdkColor);
+	COLOR_LIST_SELECTION = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_bg (style, OS.GTK_STATE_SELECTED, gdkColor);
+	COLOR_TITLE_BACKGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_fg (style, OS.GTK_STATE_SELECTED, gdkColor);
+	COLOR_TITLE_FOREGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_light (style, OS.GTK_STATE_SELECTED, gdkColor);
+	COLOR_TITLE_BACKGROUND_GRADIENT = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_bg (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
+	COLOR_TITLE_INACTIVE_BACKGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_fg (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
+	COLOR_TITLE_INACTIVE_FOREGROUND = gdkColor;
+	gdkColor = new GdkColor();
+	OS.gtk_style_get_light (style, OS.GTK_STATE_INSENSITIVE, gdkColor);
+	COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT = gdkColor;
+}
+
+/**
+ * Returns a reasonable font for applications to use.
+ * On some platforms, this will match the "default font"
+ * or "system font" if such can be found.  This font
+ * should not be free'd because it was allocated by the
+ * system, not the application.
+ * <p>
+ * Typically, applications which want the default look
+ * should simply not set the font on the widgets they
+ * create. Widgets are always created with the correct
+ * default font for the class of user-interface component
+ * they represent.
+ * </p>
+ *
+ * @return a font
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Font getSystemFont () {
+	checkDevice ();
+	if (systemFont !is null) return systemFont;
+	auto style = OS.gtk_widget_get_style (shellHandle);
+	auto defaultFont = OS.pango_font_description_copy (OS.gtk_style_get_font_desc (style));
+	return systemFont = Font.gtk_new (this, defaultFont);
+}
+
+/**
+ * Returns the single instance of the system tray or null
+ * when there is no system tray available for the platform.
+ *
+ * @return the system tray or <code>null</code>
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+public Tray getSystemTray () {
+	checkDevice ();
+	if (tray !is null) return tray;
+	return tray = new Tray (this, SWT.NONE);
+}
+
+/**
+ * Returns the user-interface thread for the receiver.
+ *
+ * @return the receiver's user-interface thread
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ */
+public Thread getThread () {
+	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+	return thread;
+}
+
 Widget getWidget (GtkWidget* handle) {
-// 	if (handle is null) return null;
-// 	if (lastWidget !is null && lastHandle is handle) return lastWidget;
-// 	auto index = OS.g_object_get_qdata (handle, SWT_OBJECT_INDEX) - 1;
-// 	if (0 <= index && index < widgetTable.length) {
-// 		lastHandle = handle;
-// 		return lastWidget = widgetTable [cast(int)/*64*/index];
-// 	}
+	if (handle is null) return null;
+	if (lastWidget !is null && lastHandle is handle) return lastWidget;
+	auto index = cast(int) OS.g_object_get_qdata ( cast(GObject*)handle, SWT_OBJECT_INDEX) - 1;
+	if (0 <= index && index < widgetTable.length) {
+		lastHandle = handle;
+		return lastWidget = widgetTable [cast(int)/*64*/index];
+	}
 	return null;
 }
 
 private static extern(C) int idleProcFunc (void* data) {
-    Display display = cast(Display)data;
-    return display.idleProcMeth();
+    auto dbdata = cast(CallbackData*)data;
+    return dbdata.display.idleProc();
 }
-private int idleProcMeth () {
-// 	bool result = runAsyncMessages (false);
-// 	if (!result) {
-// 		synchronized (idleLock) {
-// 			idleHandle = 0;
-// 		}
-// 	}
-// 	return result ? 1 : 0;
+private int idleProc () {
+	bool result = runAsyncMessages (false);
+	if (!result) {
+		synchronized (idleLock) {
+			idleHandle = 0;
+		}
+	}
+	return result ? 1 : 0;
     return 0;
 }
-//
-// /**
-//  * Initializes any internal resources needed by the
-//  * device.
-//  * <p>
-//  * This method is called after <code>create</code>.
-//  * </p>
-//  *
-//  * @see #create
-//  */
-// protected void init () {
-// 	super.init ();
-// 	initializeCallbacks ();
-// 	initializeSystemColors ();
-// 	initializeSystemSettings ();
-// 	initializeWidgetTable ();
-// 	initializeWindowManager ();
-// }
-//
-// void initializeCallbacks () {
-// 	closures = new int /*long*/ [Widget.LAST_SIGNAL];
-// 	signalIds = new int [Widget.LAST_SIGNAL];
-//
-// 	/* Cache signals for GtkWidget */
-// 	signalIds [Widget.BUTTON_PRESS_EVENT] = OS.g_signal_lookup (OS.button_press_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.BUTTON_RELEASE_EVENT] = OS.g_signal_lookup (OS.button_release_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.CONFIGURE_EVENT] = OS.g_signal_lookup (OS.configure_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.DELETE_EVENT] = OS.g_signal_lookup (OS.delete_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.ENTER_NOTIFY_EVENT] = OS.g_signal_lookup (OS.enter_notify_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.EVENT] = OS.g_signal_lookup (OS.event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.EVENT_AFTER] = OS.g_signal_lookup (OS.event_after, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.EXPOSE_EVENT] = OS.g_signal_lookup (OS.expose_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.FOCUS] = OS.g_signal_lookup (OS.focus, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.FOCUS_IN_EVENT] = OS.g_signal_lookup (OS.focus_in_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.FOCUS_OUT_EVENT] = OS.g_signal_lookup (OS.focus_out_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.GRAB_FOCUS] = OS.g_signal_lookup (OS.grab_focus, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.HIDE] = OS.g_signal_lookup (OS.hide, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.KEY_PRESS_EVENT] = OS.g_signal_lookup (OS.key_press_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.KEY_RELEASE_EVENT] = OS.g_signal_lookup (OS.key_release_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.LEAVE_NOTIFY_EVENT] = OS.g_signal_lookup (OS.leave_notify_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.MAP] = OS.g_signal_lookup (OS.map, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.MAP_EVENT] = OS.g_signal_lookup (OS.map_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.MNEMONIC_ACTIVATE] = OS.g_signal_lookup (OS.mnemonic_activate, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.MOTION_NOTIFY_EVENT] = OS.g_signal_lookup (OS.motion_notify_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.POPUP_MENU] = OS.g_signal_lookup (OS.popup_menu, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.REALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.SCROLL_EVENT] = OS.g_signal_lookup (OS.scroll_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.SHOW] = OS.g_signal_lookup (OS.show, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.SHOW_HELP] = OS.g_signal_lookup (OS.show_help, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.SIZE_ALLOCATE] = OS.g_signal_lookup (OS.size_allocate, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.STYLE_SET] = OS.g_signal_lookup (OS.style_set, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.UNMAP] = OS.g_signal_lookup (OS.unmap, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.UNMAP_EVENT] = OS.g_signal_lookup (OS.unmap_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.UNREALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_signal_lookup (OS.visibility_notify_event, OS.GTK_TYPE_WIDGET ());
-// 	signalIds [Widget.WINDOW_STATE_EVENT] = OS.g_signal_lookup (OS.window_state_event, OS.GTK_TYPE_WIDGET ());
-//
-// 	windowCallback2 = new void*/*Callback*/ (this, "windowProc", 2);
-// 	windowProc2 = windowCallback2.getAddress ();
-// 	if (windowProc2 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	closures [Widget.ACTIVATE] = OS.g_cclosure_new (windowProc2, Widget.ACTIVATE, 0);
-// 	closures [Widget.ACTIVATE_INVERSE] = OS.g_cclosure_new (windowProc2, Widget.ACTIVATE_INVERSE, 0);
-// 	closures [Widget.CHANGED] = OS.g_cclosure_new (windowProc2, Widget.CHANGED, 0);
-// 	closures [Widget.CLICKED] = OS.g_cclosure_new (windowProc2, Widget.CLICKED, 0);
-// 	closures [Widget.DAY_SELECTED] = OS.g_cclosure_new (windowProc2, Widget.DAY_SELECTED, 0);
-// 	closures [Widget.HIDE] = OS.g_cclosure_new (windowProc2, Widget.HIDE, 0);
-// 	closures [Widget.GRAB_FOCUS] = OS.g_cclosure_new (windowProc2, Widget.GRAB_FOCUS, 0);
-// 	closures [Widget.MAP] = OS.g_cclosure_new (windowProc2, Widget.MAP, 0);
-// 	closures [Widget.MONTH_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.MONTH_CHANGED, 0);
-// 	closures [Widget.OUTPUT] = OS.g_cclosure_new (windowProc2, Widget.OUTPUT, 0);
-// 	closures [Widget.POPUP_MENU] = OS.g_cclosure_new (windowProc2, Widget.POPUP_MENU, 0);
-// 	closures [Widget.PREEDIT_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.PREEDIT_CHANGED, 0);
-// 	closures [Widget.REALIZE] = OS.g_cclosure_new (windowProc2, Widget.REALIZE, 0);
-// 	closures [Widget.SELECT] = OS.g_cclosure_new (windowProc2, Widget.SELECT, 0);
-// 	closures [Widget.SHOW] = OS.g_cclosure_new (windowProc2, Widget.SHOW, 0);
-// 	closures [Widget.VALUE_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.VALUE_CHANGED, 0);
-// 	closures [Widget.UNMAP] = OS.g_cclosure_new (windowProc2, Widget.UNMAP, 0);
-// 	closures [Widget.UNREALIZE] = OS.g_cclosure_new (windowProc2, Widget.UNREALIZE, 0);
-//
-// 	windowCallback3 = new void*/*Callback*/ (this, "windowProc", 3);
-// 	windowProc3 = windowCallback3.getAddress ();
-// 	if (windowProc3 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	closures [Widget.BUTTON_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT, 0);
-// 	closures [Widget.BUTTON_PRESS_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT_INVERSE, 0);
-// 	closures [Widget.BUTTON_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT, 0);
-// 	closures [Widget.BUTTON_RELEASE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT_INVERSE, 0);
-// 	closures [Widget.COMMIT] = OS.g_cclosure_new (windowProc3, Widget.COMMIT, 0);
-// 	closures [Widget.CONFIGURE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.CONFIGURE_EVENT, 0);
-// 	closures [Widget.DELETE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.DELETE_EVENT, 0);
-// 	closures [Widget.ENTER_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.ENTER_NOTIFY_EVENT, 0);
-// 	closures [Widget.EVENT] = OS.g_cclosure_new (windowProc3, Widget.EVENT, 0);
-// 	closures [Widget.EVENT_AFTER] = OS.g_cclosure_new (windowProc3, Widget.EVENT_AFTER, 0);
-// 	closures [Widget.EXPOSE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT, 0);
-// 	closures [Widget.EXPOSE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT_INVERSE, 0);
-// 	closures [Widget.FOCUS] = OS.g_cclosure_new (windowProc3, Widget.FOCUS, 0);
-// 	closures [Widget.FOCUS_IN_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_IN_EVENT, 0);
-// 	closures [Widget.FOCUS_OUT_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_OUT_EVENT, 0);
-// 	closures [Widget.KEY_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_PRESS_EVENT, 0);
-// 	closures [Widget.KEY_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_RELEASE_EVENT, 0);
-// 	closures [Widget.INPUT] = OS.g_cclosure_new (windowProc3, Widget.INPUT, 0);
-// 	closures [Widget.LEAVE_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.LEAVE_NOTIFY_EVENT, 0);
-// 	closures [Widget.MAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MAP_EVENT, 0);
-// 	closures [Widget.MNEMONIC_ACTIVATE] = OS.g_cclosure_new (windowProc3, Widget.MNEMONIC_ACTIVATE, 0);
-// 	closures [Widget.MOTION_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT, 0);
-// 	closures [Widget.MOTION_NOTIFY_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT_INVERSE, 0);
-// 	closures [Widget.MOVE_FOCUS] = OS.g_cclosure_new (windowProc3, Widget.MOVE_FOCUS, 0);
-// 	closures [Widget.SCROLL_EVENT] = OS.g_cclosure_new (windowProc3, Widget.SCROLL_EVENT, 0);
-// 	closures [Widget.SHOW_HELP] = OS.g_cclosure_new (windowProc3, Widget.SHOW_HELP, 0);
-// 	closures [Widget.SIZE_ALLOCATE] = OS.g_cclosure_new (windowProc3, Widget.SIZE_ALLOCATE, 0);
-// 	closures [Widget.STYLE_SET] = OS.g_cclosure_new (windowProc3, Widget.STYLE_SET, 0);
-// 	closures [Widget.TOGGLED] = OS.g_cclosure_new (windowProc3, Widget.TOGGLED, 0);
-// 	closures [Widget.UNMAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.UNMAP_EVENT, 0);
-// 	closures [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.VISIBILITY_NOTIFY_EVENT, 0);
-// 	closures [Widget.WINDOW_STATE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.WINDOW_STATE_EVENT, 0);
-//
-// 	windowCallback4 = new void*/*Callback*/ (this, "windowProc", 4);
-// 	windowProc4 = windowCallback4.getAddress ();
-// 	if (windowProc4 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	closures [Widget.DELETE_RANGE] = OS.g_cclosure_new (windowProc4, Widget.DELETE_RANGE, 0);
-// 	closures [Widget.DELETE_TEXT] = OS.g_cclosure_new (windowProc4, Widget.DELETE_TEXT, 0);
-// 	closures [Widget.ROW_ACTIVATED] = OS.g_cclosure_new (windowProc4, Widget.ROW_ACTIVATED, 0);
-// 	closures [Widget.SCROLL_CHILD] = OS.g_cclosure_new (windowProc4, Widget.SCROLL_CHILD, 0);
-// 	closures [Widget.SWITCH_PAGE] = OS.g_cclosure_new (windowProc4, Widget.SWITCH_PAGE, 0);
-// 	closures [Widget.TEST_COLLAPSE_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_COLLAPSE_ROW, 0);
-// 	closures [Widget.TEST_EXPAND_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_EXPAND_ROW, 0);
-//
-// 	windowCallback5 = new void*/*Callback*/ (this, "windowProc", 5);
-// 	windowProc5 = windowCallback5.getAddress ();
-// 	if (windowProc5 is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	closures [Widget.CHANGE_VALUE] = OS.g_cclosure_new (windowProc5, Widget.CHANGE_VALUE, 0);
-// 	closures [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = OS.g_cclosure_new (windowProc5, Widget.EXPAND_COLLAPSE_CURSOR_ROW, 0);
-// 	closures [Widget.INSERT_TEXT] = OS.g_cclosure_new (windowProc5, Widget.INSERT_TEXT, 0);
-// 	closures [Widget.TEXT_BUFFER_INSERT_TEXT] = OS.g_cclosure_new (windowProc5, Widget.TEXT_BUFFER_INSERT_TEXT, 0);
-//
-// 	for (int i = 0; i < Widget.LAST_SIGNAL; i++) {
-// 		if (closures [i] !is null) OS.g_closure_ref (closures [i]);
-// 	}
-//
-// 	timerCallback = new void*/*Callback*/ (this, "timerProc", 1);
-// 	timerProc = timerCallback.getAddress ();
-// 	if (timerProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	windowTimerCallback = new void*/*Callback*/ (this, "windowTimerProc", 1);
-// 	windowTimerProc = windowTimerCallback.getAddress ();
-// 	if (windowTimerProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	mouseHoverCallback = new void*/*Callback*/ (this, "mouseHoverProc", 1);
-// 	mouseHoverProc = mouseHoverCallback.getAddress ();
-// 	if (mouseHoverProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	caretCallback = new void*/*Callback*/(this, "caretProc", 1);
-// 	caretProc = caretCallback.getAddress();
-// 	if (caretProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	menuPositionCallback = new void*/*Callback*/(this, "menuPositionProc", 5);
-// 	menuPositionProc = menuPositionCallback.getAddress();
-// 	if (menuPositionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	sizeAllocateCallback = new void*/*Callback*/(this, "sizeAllocateProc", 3);
-// 	sizeAllocateProc = sizeAllocateCallback.getAddress();
-// 	if (sizeAllocateProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	sizeRequestCallback = new void*/*Callback*/(this, "sizeRequestProc", 3);
-// 	sizeRequestProc = sizeRequestCallback.getAddress();
-// 	if (sizeRequestProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	shellMapCallback = new void*/*Callback*/(this, "shellMapProc", 3);
-// 	shellMapProc = shellMapCallback.getAddress();
-// 	if (shellMapProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	shellMapProcClosure = OS.g_cclosure_new (shellMapProc, 0, 0);
-// 	OS.g_closure_ref (shellMapProcClosure);
-//
-// 	treeSelectionCallback = new void*/*Callback*/(this, "treeSelectionProc", 4);
-// 	treeSelectionProc = treeSelectionCallback.getAddress();
-// 	if (treeSelectionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	cellDataCallback = new void*/*Callback*/ (this, "cellDataProc", 5);
-// 	cellDataProcFld = cellDataCallback.getAddress ();
-// 	if (cellDataProcFld is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	setDirectionCallback = new void*/*Callback*/ (this, "setDirectionProc", 2);
-// 	setDirectionProc = setDirectionCallback.getAddress ();
-// 	if (setDirectionProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	allChildrenCallback = new void*/*Callback*/ (this, "allChildrenProc", 2);
-// 	allChildrenProc = allChildrenCallback.getAddress ();
-// 	if (allChildrenProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	checkIfEventCallback = new void*/*Callback*/ (this, "checkIfEventProc", 3);
-// 	checkIfEventProc = checkIfEventCallback.getAddress ();
-// 	if (checkIfEventProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-//
-// 	idleCallback = new void*/*Callback*/ (this, "idleProc", 1);
-// 	idleProc = idleCallback.getAddress ();
-// 	if (idleProc is null) error (SWT.ERROR_NO_MORE_CALLBACKS);
-// }
-//
-// void initializeSystemSettings () {
-// 	styleSetCallback = new void*/*Callback*/ (this, "styleSetProc", 3);
-// 	styleSetProc = styleSetCallback.getAddress ();
-// 	if (styleSetProc is null) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-// 	OS.g_signal_connect (shellHandle, OS.style_set, styleSetProc, 0);
-//
-// 	/*
-// 	* Feature in GTK.  Despite the fact that the
-// 	* gtk-entry-select-on-focus property is a global
-// 	* setting, it is initialized when the GtkEntry
-// 	* is initialized.  This means that it cannot be
-// 	* accessed before a GtkEntry is created.  The
-// 	* fix is to for the initializaion by creating
-// 	* a temporary GtkEntry.
-// 	*/
-// 	auto entry = OS.gtk_entry_new ();
-// 	OS.gtk_widget_destroy (entry);
-// 	int [] buffer2 = new int [1];
-// 	auto settings = OS.gtk_settings_get_default ();
-// 	OS.g_object_get (settings, OS.gtk_entry_select_on_focus, buffer2, 0);
-// 	entrySelectOnFocus = buffer2 [0] !is 0;
-// }
-//
-// void initializeWidgetTable () {
-// 	indexTable = new int [GROW_SIZE];
-// 	widgetTable = new Widget [GROW_SIZE];
-// 	for (int i=0; i<GROW_SIZE-1; i++) indexTable [i] = i + 1;
-// 	indexTable [GROW_SIZE - 1] = -1;
-// }
-//
-// void initializeWindowManager () {
-// 	/* Get the window manager name */
-// 	windowManager = "";
-// 	if (OS.GTK_VERSION >= OS.VERSION (2, 2, 0)) {
-// 		auto screen = OS.gdk_screen_get_default ();
-// 		if (screen !is null) {
-// 			auto ptr2 = OS.gdk_x11_screen_get_window_manager_name (screen);
-// 			if (ptr2 !is null) {
-// 				int length = OS.strlen (ptr2);
-// 				if (length > 0) {
-// 					byte [] buffer2 = new byte [length];
-// 					memmove (buffer2, ptr2, length);
-// 					windowManager = new char[] (Converter.mbcsToWcs (null, buffer2));
-// 				}
-// 			}
-// 		}
-// 	}
-// }
-//
-// /**
-//  * Invokes platform specific functionality to dispose a GC handle.
-//  * <p>
-//  * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
-//  * API for <code>Display</code>. It is marked public only so that it
-//  * can be shared within the packages provided by SWT. It is not
-//  * available on all platforms, and should never be called from
-//  * application code.
-//  * </p>
-//  *
-//  * @param hDC the platform specific GC handle
-//  * @param data the platform specific GC data
-//  */
+
+/**
+ * Initializes any internal resources needed by the
+ * device.
+ * <p>
+ * This method is called after <code>create</code>.
+ * </p>
+ *
+ * @see #create
+ */
+protected void init () {
+	super.init ();
+	initializeCallbacks ();
+	initializeSystemColors ();
+	initializeSystemSettings ();
+	initializeWidgetTable ();
+	initializeWindowManager ();
+}
+
+void initializeCallbacks () {
+	closures = new GClosure* [Widget.LAST_SIGNAL];
+	signalIds = new int [Widget.LAST_SIGNAL];
+
+	/* Cache signals for GtkWidget */
+	signalIds [Widget.BUTTON_PRESS_EVENT] = OS.g_signal_lookup (OS.button_press_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.BUTTON_RELEASE_EVENT] = OS.g_signal_lookup (OS.button_release_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.CONFIGURE_EVENT] = OS.g_signal_lookup (OS.configure_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.DELETE_EVENT] = OS.g_signal_lookup (OS.delete_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.ENTER_NOTIFY_EVENT] = OS.g_signal_lookup (OS.enter_notify_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.EVENT] = OS.g_signal_lookup (OS.event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.EVENT_AFTER] = OS.g_signal_lookup (OS.event_after.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.EXPOSE_EVENT] = OS.g_signal_lookup (OS.expose_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.FOCUS] = OS.g_signal_lookup (OS.focus.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.FOCUS_IN_EVENT] = OS.g_signal_lookup (OS.focus_in_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.FOCUS_OUT_EVENT] = OS.g_signal_lookup (OS.focus_out_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.GRAB_FOCUS] = OS.g_signal_lookup (OS.grab_focus.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.HIDE] = OS.g_signal_lookup (OS.hide.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.KEY_PRESS_EVENT] = OS.g_signal_lookup (OS.key_press_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.KEY_RELEASE_EVENT] = OS.g_signal_lookup (OS.key_release_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.LEAVE_NOTIFY_EVENT] = OS.g_signal_lookup (OS.leave_notify_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.MAP] = OS.g_signal_lookup (OS.map.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.MAP_EVENT] = OS.g_signal_lookup (OS.map_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.MNEMONIC_ACTIVATE] = OS.g_signal_lookup (OS.mnemonic_activate.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.MOTION_NOTIFY_EVENT] = OS.g_signal_lookup (OS.motion_notify_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.POPUP_MENU] = OS.g_signal_lookup (OS.popup_menu.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.REALIZE] = OS.g_signal_lookup (OS.realize.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.SCROLL_EVENT] = OS.g_signal_lookup (OS.scroll_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.SHOW] = OS.g_signal_lookup (OS.show.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.SHOW_HELP] = OS.g_signal_lookup (OS.show_help.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.SIZE_ALLOCATE] = OS.g_signal_lookup (OS.size_allocate.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.STYLE_SET] = OS.g_signal_lookup (OS.style_set.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.UNMAP] = OS.g_signal_lookup (OS.unmap.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.UNMAP_EVENT] = OS.g_signal_lookup (OS.unmap_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.UNREALIZE] = OS.g_signal_lookup (OS.realize.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_signal_lookup (OS.visibility_notify_event.ptr, OS.GTK_TYPE_WIDGET ());
+	signalIds [Widget.WINDOW_STATE_EVENT] = OS.g_signal_lookup (OS.window_state_event.ptr, OS.GTK_TYPE_WIDGET ());
+
+    GClosure* do_cclosure_new( GCallback cb, int value, int notify ){
+        CallbackData* res= new CallbackData;
+        res.display = this;
+        res.data = cast(void*)value;
+        windowProcCallbackDatas ~= res;
+        return OS.g_cclosure_new( cb, cast(void*)res, cast(GClosureNotify)notify );
+    }
+
+    GCallback windowProc2 = cast(GCallback)&windowProcFunc2;
+	closures [Widget.ACTIVATE] = do_cclosure_new (windowProc2, Widget.ACTIVATE, 0);
+	closures [Widget.ACTIVATE_INVERSE] = do_cclosure_new (windowProc2, Widget.ACTIVATE_INVERSE, 0);
+	closures [Widget.CHANGED] = do_cclosure_new (windowProc2, Widget.CHANGED, 0);
+	closures [Widget.CLICKED] = do_cclosure_new (windowProc2, Widget.CLICKED, 0);
+	closures [Widget.DAY_SELECTED] = do_cclosure_new (windowProc2, Widget.DAY_SELECTED, 0);
+	closures [Widget.HIDE] = do_cclosure_new (windowProc2, Widget.HIDE, 0);
+	closures [Widget.GRAB_FOCUS] = do_cclosure_new (windowProc2, Widget.GRAB_FOCUS, 0);
+	closures [Widget.MAP] = do_cclosure_new (windowProc2, Widget.MAP, 0);
+	closures [Widget.MONTH_CHANGED] = do_cclosure_new (windowProc2, Widget.MONTH_CHANGED, 0);
+	closures [Widget.OUTPUT] = do_cclosure_new (windowProc2, Widget.OUTPUT, 0);
+	closures [Widget.POPUP_MENU] = do_cclosure_new (windowProc2, Widget.POPUP_MENU, 0);
+	closures [Widget.PREEDIT_CHANGED] = do_cclosure_new (windowProc2, Widget.PREEDIT_CHANGED, 0);
+	closures [Widget.REALIZE] = do_cclosure_new (windowProc2, Widget.REALIZE, 0);
+	closures [Widget.SELECT] = do_cclosure_new (windowProc2, Widget.SELECT, 0);
+	closures [Widget.SHOW] = do_cclosure_new (windowProc2, Widget.SHOW, 0);
+	closures [Widget.VALUE_CHANGED] = do_cclosure_new (windowProc2, Widget.VALUE_CHANGED, 0);
+	closures [Widget.UNMAP] = do_cclosure_new (windowProc2, Widget.UNMAP, 0);
+	closures [Widget.UNREALIZE] = do_cclosure_new (windowProc2, Widget.UNREALIZE, 0);
+
+    GCallback windowProc3 = cast(GCallback)&windowProcFunc3;
+	closures [Widget.BUTTON_PRESS_EVENT] = do_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT, 0);
+	closures [Widget.BUTTON_PRESS_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT_INVERSE, 0);
+	closures [Widget.BUTTON_RELEASE_EVENT] = do_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT, 0);
+	closures [Widget.BUTTON_RELEASE_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT_INVERSE, 0);
+	closures [Widget.COMMIT] = do_cclosure_new (windowProc3, Widget.COMMIT, 0);
+	closures [Widget.CONFIGURE_EVENT] = do_cclosure_new (windowProc3, Widget.CONFIGURE_EVENT, 0);
+	closures [Widget.DELETE_EVENT] = do_cclosure_new (windowProc3, Widget.DELETE_EVENT, 0);
+	closures [Widget.ENTER_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.ENTER_NOTIFY_EVENT, 0);
+	closures [Widget.EVENT] = do_cclosure_new (windowProc3, Widget.EVENT, 0);
+	closures [Widget.EVENT_AFTER] = do_cclosure_new (windowProc3, Widget.EVENT_AFTER, 0);
+	closures [Widget.EXPOSE_EVENT] = do_cclosure_new (windowProc3, Widget.EXPOSE_EVENT, 0);
+	closures [Widget.EXPOSE_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.EXPOSE_EVENT_INVERSE, 0);
+	closures [Widget.FOCUS] = do_cclosure_new (windowProc3, Widget.FOCUS, 0);
+	closures [Widget.FOCUS_IN_EVENT] = do_cclosure_new (windowProc3, Widget.FOCUS_IN_EVENT, 0);
+	closures [Widget.FOCUS_OUT_EVENT] = do_cclosure_new (windowProc3, Widget.FOCUS_OUT_EVENT, 0);
+	closures [Widget.KEY_PRESS_EVENT] = do_cclosure_new (windowProc3, Widget.KEY_PRESS_EVENT, 0);
+	closures [Widget.KEY_RELEASE_EVENT] = do_cclosure_new (windowProc3, Widget.KEY_RELEASE_EVENT, 0);
+	closures [Widget.INPUT] = do_cclosure_new (windowProc3, Widget.INPUT, 0);
+	closures [Widget.LEAVE_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.LEAVE_NOTIFY_EVENT, 0);
+	closures [Widget.MAP_EVENT] = do_cclosure_new (windowProc3, Widget.MAP_EVENT, 0);
+	closures [Widget.MNEMONIC_ACTIVATE] = do_cclosure_new (windowProc3, Widget.MNEMONIC_ACTIVATE, 0);
+	closures [Widget.MOTION_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT, 0);
+	closures [Widget.MOTION_NOTIFY_EVENT_INVERSE] = do_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT_INVERSE, 0);
+	closures [Widget.MOVE_FOCUS] = do_cclosure_new (windowProc3, Widget.MOVE_FOCUS, 0);
+	closures [Widget.SCROLL_EVENT] = do_cclosure_new (windowProc3, Widget.SCROLL_EVENT, 0);
+	closures [Widget.SHOW_HELP] = do_cclosure_new (windowProc3, Widget.SHOW_HELP, 0);
+	closures [Widget.SIZE_ALLOCATE] = do_cclosure_new (windowProc3, Widget.SIZE_ALLOCATE, 0);
+	closures [Widget.STYLE_SET] = do_cclosure_new (windowProc3, Widget.STYLE_SET, 0);
+	closures [Widget.TOGGLED] = do_cclosure_new (windowProc3, Widget.TOGGLED, 0);
+	closures [Widget.UNMAP_EVENT] = do_cclosure_new (windowProc3, Widget.UNMAP_EVENT, 0);
+	closures [Widget.VISIBILITY_NOTIFY_EVENT] = do_cclosure_new (windowProc3, Widget.VISIBILITY_NOTIFY_EVENT, 0);
+	closures [Widget.WINDOW_STATE_EVENT] = do_cclosure_new (windowProc3, Widget.WINDOW_STATE_EVENT, 0);
+
+    GCallback windowProc4 = cast(GCallback)&windowProcFunc4;
+	closures [Widget.DELETE_RANGE] = do_cclosure_new (windowProc4, Widget.DELETE_RANGE, 0);
+	closures [Widget.DELETE_TEXT] = do_cclosure_new (windowProc4, Widget.DELETE_TEXT, 0);
+	closures [Widget.ROW_ACTIVATED] = do_cclosure_new (windowProc4, Widget.ROW_ACTIVATED, 0);
+	closures [Widget.SCROLL_CHILD] = do_cclosure_new (windowProc4, Widget.SCROLL_CHILD, 0);
+	closures [Widget.SWITCH_PAGE] = do_cclosure_new (windowProc4, Widget.SWITCH_PAGE, 0);
+	closures [Widget.TEST_COLLAPSE_ROW] = do_cclosure_new (windowProc4, Widget.TEST_COLLAPSE_ROW, 0);
+	closures [Widget.TEST_EXPAND_ROW] = do_cclosure_new (windowProc4, Widget.TEST_EXPAND_ROW, 0);
+
+    GCallback windowProc5 = cast(GCallback)&windowProcFunc5;
+	closures [Widget.CHANGE_VALUE] = do_cclosure_new (windowProc5, Widget.CHANGE_VALUE, 0);
+	closures [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = do_cclosure_new (windowProc5, Widget.EXPAND_COLLAPSE_CURSOR_ROW, 0);
+	closures [Widget.INSERT_TEXT] = do_cclosure_new (windowProc5, Widget.INSERT_TEXT, 0);
+	closures [Widget.TEXT_BUFFER_INSERT_TEXT] = do_cclosure_new (windowProc5, Widget.TEXT_BUFFER_INSERT_TEXT, 0);
+
+	for (int i = 0; i < Widget.LAST_SIGNAL; i++) {
+		if (closures [i] !is null) OS.g_closure_ref (closures [i]);
+	}
+    shellMapProcCallbackData.display = this;
+    shellMapProcCallbackData.data = null;
+	shellMapProcClosure = OS.g_cclosure_new (cast(GCallback)&shellMapProcFunc, &shellMapProcCallbackData, cast(GClosureNotify)0);
+	OS.g_closure_ref (shellMapProcClosure);
+}
+
+void initializeSystemSettings () {
+    styleSetProcCallbackData.display = this;
+    styleSetProcCallbackData.data = null;
+	OS.g_signal_connect (shellHandle, OS.style_set.ptr, cast(GCallback)&styleSetProcFunc, &styleSetProcCallbackData);
+
+	/*
+	* Feature in GTK.  Despite the fact that the
+	* gtk-entry-select-on-focus property is a global
+	* setting, it is initialized when the GtkEntry
+	* is initialized.  This means that it cannot be
+	* accessed before a GtkEntry is created.  The
+	* fix is to for the initializaion by creating
+	* a temporary GtkEntry.
+	*/
+	auto entry = OS.gtk_entry_new ();
+	OS.gtk_widget_destroy (entry);
+	int buffer2;
+	auto settings = OS.gtk_settings_get_default ();
+	OS.g_object_get1 (settings, OS.gtk_entry_select_on_focus.ptr, &buffer2);
+	entrySelectOnFocus = buffer2 !is 0;
+}
+
+void initializeWidgetTable () {
+	indexTable = new int [GROW_SIZE];
+	widgetTable = new Widget [GROW_SIZE];
+	for (int i=0; i<GROW_SIZE-1; i++) indexTable [i] = i + 1;
+	indexTable [GROW_SIZE - 1] = -1;
+}
+
+void initializeWindowManager () {
+	/* Get the window manager name */
+	windowManager = "";
+	if (OS.GTK_VERSION >= OS.buildVERSION (2, 2, 0)) {
+		auto screen = OS.gdk_screen_get_default ();
+		if (screen !is null) {
+			auto ptr2 = OS.gdk_x11_screen_get_window_manager_name (screen);
+            windowManager = fromUtf8z( ptr2 );
+		}
+	}
+}
+
+/**
+ * Invokes platform specific functionality to dispose a GC handle.
+ * <p>
+ * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
+ * API for <code>Display</code>. It is marked public only so that it
+ * can be shared within the packages provided by SWT. It is not
+ * available on all platforms, and should never be called from
+ * application code.
+ * </p>
+ *
+ * @param hDC the platform specific GC handle
+ * @param data the platform specific GC data
+ */
 public void internal_dispose_GC (GdkGC* gdkGC, GCData data) {
-// 	OS.g_object_unref (gdkGC);
+	OS.g_object_unref (gdkGC);
 }
-//
-// /**
-//  * Invokes platform specific functionality to allocate a new GC handle.
-//  * <p>
-//  * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
-//  * API for <code>Display</code>. It is marked public only so that it
-//  * can be shared within the packages provided by SWT. It is not
-//  * available on all platforms, and should never be called from
-//  * application code.
-//  * </p>
-//  *
-//  * @param data the platform specific GC data
-//  * @return the platform specific GC handle
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  * @exception SWTError <ul>
-//  *    <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li>
-//  * </ul>
-//  */
+
+/**
+ * Invokes platform specific functionality to allocate a new GC handle.
+ * <p>
+ * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
+ * API for <code>Display</code>. It is marked public only so that it
+ * can be shared within the packages provided by SWT. It is not
+ * available on all platforms, and should never be called from
+ * application code.
+ * </p>
+ *
+ * @param data the platform specific GC data
+ * @return the platform specific GC handle
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ * @exception SWTError <ul>
+ *    <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li>
+ * </ul>
+ */
 public GdkGC* internal_new_GC (GCData data) {
-// 	if (isDisposed()) SWT.error(SWT.ERROR_DEVICE_DISPOSED);
-// 	auto root = OS.GDK_ROOT_PARENT ();
-// 	auto gdkGC = OS.gdk_gc_new (root);
-// 	if (gdkGC is null) SWT.error (SWT.ERROR_NO_HANDLES);
-// 	OS.gdk_gc_set_subwindow (gdkGC, OS.GDK_INCLUDE_INFERIORS);
-// 	if (data !is null) {
-// 		int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
-// 		if ((data.style & mask) is 0) {
-// 			data.style |= SWT.LEFT_TO_RIGHT;
-// 		}
-// 		data.device = this;
-// 		data.drawable = root;
-// 		data.background = getSystemColor (SWT.COLOR_WHITE).handle;
-// 		data.foreground = getSystemColor (SWT.COLOR_BLACK).handle;
-// 		data.font = getSystemFont ().handle;
-// 	}
-//     return gdkGC;
+	if (isDisposed()) SWT.error(SWT.ERROR_DEVICE_DISPOSED);
+	auto root = cast(GdkDrawable *) OS.GDK_ROOT_PARENT ();
+	auto gdkGC = OS.gdk_gc_new (root);
+	if (gdkGC is null) SWT.error (SWT.ERROR_NO_HANDLES);
+	OS.gdk_gc_set_subwindow (gdkGC, cast(GdkSubwindowMode)OS.GDK_INCLUDE_INFERIORS);
+	if (data !is null) {
+		int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
+		if ((data.style & mask) is 0) {
+			data.style |= SWT.LEFT_TO_RIGHT;
+		}
+		data.device = this;
+		data.drawable = root;
+		data.background = getSystemColor (SWT.COLOR_WHITE).handle;
+		data.foreground = getSystemColor (SWT.COLOR_BLACK).handle;
+		data.font = getSystemFont ().handle;
+	}
+    return gdkGC;
     return null;
 }
-//
+
 bool isValidThread () {
 	return thread is Thread.getThis ();
 }
-//
-// /**
-//  * Maps a point from one coordinate system to another.
-//  * When the control is null, coordinates are mapped to
-//  * the display.
-//  * <p>
-//  * NOTE: On right-to-left platforms where the coordinate
-//  * systems are mirrored, special care needs to be taken
-//  * when mapping coordinates from one control to another
-//  * to ensure the result is correctly mirrored.
-//  *
-//  * Mapping a point that is the origin of a rectangle and
-//  * then adding the width and height is not equivalent to
-//  * mapping the rectangle.  When one control is mirrored
-//  * and the other is not, adding the width and height to a
-//  * point that was mapped causes the rectangle to extend
-//  * in the wrong direction.  Mapping the entire rectangle
-//  * instead of just one point causes both the origin and
-//  * the corner of the rectangle to be mapped.
-//  * </p>
-//  *
-//  * @param from the source <code>Control</code> or <code>null</code>
-//  * @param to the destination <code>Control</code> or <code>null</code>
-//  * @param point to be mapped
-//  * @return point with mapped coordinates
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the point is null</li>
-//  *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1.2
-//  */
-// public Point map (Control from, Control to, Point point) {
-// 	checkDevice ();
-// 	if (point is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	return map (from, to, point.x, point.y);
-// }
-//
-// /**
-//  * Maps a point from one coordinate system to another.
-//  * When the control is null, coordinates are mapped to
-//  * the display.
-//  * <p>
-//  * NOTE: On right-to-left platforms where the coordinate
-//  * systems are mirrored, special care needs to be taken
-//  * when mapping coordinates from one control to another
-//  * to ensure the result is correctly mirrored.
-//  *
-//  * Mapping a point that is the origin of a rectangle and
-//  * then adding the width and height is not equivalent to
-//  * mapping the rectangle.  When one control is mirrored
-//  * and the other is not, adding the width and height to a
-//  * point that was mapped causes the rectangle to extend
-//  * in the wrong direction.  Mapping the entire rectangle
-//  * instead of just one point causes both the origin and
-//  * the corner of the rectangle to be mapped.
-//  * </p>
-//  *
-//  * @param from the source <code>Control</code> or <code>null</code>
-//  * @param to the destination <code>Control</code> or <code>null</code>
-//  * @param x coordinates to be mapped
-//  * @param y coordinates to be mapped
-//  * @return point with mapped coordinates
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1.2
-//  */
-// public Point map (Control from, Control to, int x, int y) {
-// 	checkDevice ();
-// 	if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
-// 	if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
-// 	Point point = new Point (x, y);
-// 	if (from is to) return point;
-// 	if (from !is null) {
-// 		auto window = from.eventWindow ();
-// 		int [] origin_x = new int [1], origin_y = new int [1];
-// 		OS.gdk_window_get_origin (window, origin_x, origin_y);
-// 		point.x += origin_x [0];
-// 		point.y += origin_y [0];
-// 	}
-// 	if (to !is null) {
-// 		auto window = to.eventWindow ();
-// 		int [] origin_x = new int [1], origin_y = new int [1];
-// 		OS.gdk_window_get_origin (window, origin_x, origin_y);
-// 		point.x -= origin_x [0];
-// 		point.y -= origin_y [0];
-// 	}
-// 	return point;
-// }
-//
-// /**
-//  * Maps a point from one coordinate system to another.
-//  * When the control is null, coordinates are mapped to
-//  * the display.
-//  * <p>
-//  * NOTE: On right-to-left platforms where the coordinate
-//  * systems are mirrored, special care needs to be taken
-//  * when mapping coordinates from one control to another
-//  * to ensure the result is correctly mirrored.
-//  *
-//  * Mapping a point that is the origin of a rectangle and
-//  * then adding the width and height is not equivalent to
-//  * mapping the rectangle.  When one control is mirrored
-//  * and the other is not, adding the width and height to a
-//  * point that was mapped causes the rectangle to extend
-//  * in the wrong direction.  Mapping the entire rectangle
-//  * instead of just one point causes both the origin and
-//  * the corner of the rectangle to be mapped.
-//  * </p>
-//  *
-//  * @param from the source <code>Control</code> or <code>null</code>
-//  * @param to the destination <code>Control</code> or <code>null</code>
-//  * @param rectangle to be mapped
-//  * @return rectangle with mapped coordinates
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li>
-//  *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1.2
-//  */
-// public Rectangle map (Control from, Control to, Rectangle rectangle) {
-// 	checkDevice();
-// 	if (rectangle is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height);
-// }
-//
-// static char mbcsToWcs (char ch) {
-// 	int key = ch & 0xFFFF;
-// 	if (key <= 0x7F) return ch;
-// 	byte [] buffer;
-// 	if (key <= 0xFF) {
-// 		buffer = new byte [1];
-// 		buffer [0] = cast(byte) key;
-// 	} else {
-// 		buffer = new byte [2];
-// 		buffer [0] = cast(byte) ((key >> 8) & 0xFF);
-// 		buffer [1] = cast(byte) (key & 0xFF);
-// 	}
-// 	char [] result = Converter.mbcsToWcs (null, buffer);
-// 	if (result.length is 0) return 0;
-// 	return result [0];
-// }
-//
-// int /*long*/ menuPositionProcMeth (int /*long*/ menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) {
-// 	Widget widget = getWidget (menu);
-// 	if (widget is null) return 0;
-// 	return widget.menuPositionProc (menu, x, y, push_in, user_data);
-// }
-//
-// /**
-//  * Maps a point from one coordinate system to another.
-//  * When the control is null, coordinates are mapped to
-//  * the display.
-//  * <p>
-//  * NOTE: On right-to-left platforms where the coordinate
-//  * systems are mirrored, special care needs to be taken
-//  * when mapping coordinates from one control to another
-//  * to ensure the result is correctly mirrored.
-//  *
-//  * Mapping a point that is the origin of a rectangle and
-//  * then adding the width and height is not equivalent to
-//  * mapping the rectangle.  When one control is mirrored
-//  * and the other is not, adding the width and height to a
-//  * point that was mapped causes the rectangle to extend
-//  * in the wrong direction.  Mapping the entire rectangle
-//  * instead of just one point causes both the origin and
-//  * the corner of the rectangle to be mapped.
-//  * </p>
-//  *
-//  * @param from the source <code>Control</code> or <code>null</code>
-//  * @param to the destination <code>Control</code> or <code>null</code>
-//  * @param x coordinates to be mapped
-//  * @param y coordinates to be mapped
-//  * @param width coordinates to be mapped
-//  * @param height coordinates to be mapped
-//  * @return rectangle with mapped coordinates
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1.2
-//  */
-// public Rectangle map (Control from, Control to, int x, int y, int width, int height) {
-// 	checkDevice();
-// 	if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
-// 	if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
-// 	Rectangle rect = new Rectangle (x, y, width, height);
-// 	if (from is to) return rect;
-// 	if (from !is null) {
-// 		auto window = from.eventWindow ();
-// 		int [] origin_x = new int [1], origin_y = new int [1];
-// 		OS.gdk_window_get_origin (window, origin_x, origin_y);
-// 		rect.x += origin_x [0];
-// 		rect.y += origin_y [0];
-// 	}
-// 	if (to !is null) {
-// 		auto window = to.eventWindow ();
-// 		int [] origin_x = new int [1], origin_y = new int [1];
-// 		OS.gdk_window_get_origin (window, origin_x, origin_y);
-// 		rect.x -= origin_x [0];
-// 		rect.y -= origin_y [0];
-// 	}
-// 	return rect;
-// }
-//
-// private extern(C) int mouseHoverProcMeth (void* handle) {
-// }
-//
-// int /*long*/ mouseHoverProcMeth (int /*long*/ handle) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.hoverProc (handle);
-// }
-//
-// /**
-//  * Generate a low level system event.
-//  *
-//  * <code>post</code> is used to generate low level keyboard
-//  * and mouse events. The intent is to enable automated UI
-//  * testing by simulating the input from the user.  Most
-//  * SWT applications should never need to call this method.
-//  * <p>
-//  * Note that this operation can fail when the operating system
-//  * fails to generate the event for any reason.  For example,
-//  * this can happen when there is no such key or mouse button
-//  * or when the system event queue is full.
-//  * </p>
-//  * <p>
-//  * <b>Event Types:</b>
-//  * <p>KeyDown, KeyUp
-//  * <p>The following fields in the <code>Event</code> apply:
-//  * <ul>
-//  * <li>(in) type KeyDown or KeyUp</li>
-//  * <p> Either one of:
-//  * <li>(in) character a character that corresponds to a keyboard key</li>
-//  * <li>(in) keyCode the key code of the key that was typed,
-//  *          as defined by the key code constants in class <code>SWT</code></li>
-//  * </ul>
-//  * <p>MouseDown, MouseUp</p>
-//  * <p>The following fields in the <code>Event</code> apply:
-//  * <ul>
-//  * <li>(in) type MouseDown or MouseUp
-//  * <li>(in) button the button that is pressed or released
-//  * </ul>
-//  * <p>MouseMove</p>
-//  * <p>The following fields in the <code>Event</code> apply:
-//  * <ul>
-//  * <li>(in) type MouseMove
-//  * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates
-//  * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates
-//  * </ul>
-//  * </dl>
-//  *
-//  * @param event the event to be generated
-//  *
-//  * @return true if the event was generated or false otherwise
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the event is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 3.0
-//  *
-//  */
-// public bool post (Event event) {
-// 	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-// 	if (event is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (!OS.GDK_WINDOWING_X11()) return false;
-// 	auto xDisplay = OS.GDK_DISPLAY ();
-// 	int type = event.type;
-// 	switch (type) {
-// 		case SWT.KeyDown:
-// 		case SWT.KeyUp: {
-// 			int keyCode = 0;
-// 			auto keysym = untranslateKey (event.keyCode);
-// 			if (keysym !is 0) keyCode = OS.XKeysymToKeycode (xDisplay, keysym);
-// 			if (keyCode is 0) {
-// 				char key = event.character;
-// 				switch (key) {
-// 					case SWT.BS: keysym = OS.GDK_BackSpace; break;
-// 					case SWT.CR: keysym = OS.GDK_Return; break;
-// 					case SWT.DEL: keysym = OS.GDK_Delete; break;
-// 					case SWT.ESC: keysym = OS.GDK_Escape; break;
-// 					case SWT.TAB: keysym = OS.GDK_Tab; break;
-// 					case SWT.LF: keysym = OS.GDK_Linefeed; break;
-// 					default:
-// 						keysym = wcsToMbcs (key);
-// 				}
-// 				keyCode = OS.XKeysymToKeycode (xDisplay, keysym);
-// 				if (keyCode is 0) return false;
-// 			}
-// 			OS.XTestFakeKeyEvent (xDisplay, keyCode, type is SWT.KeyDown, 0);
-// 			return true;
-// 		}
-// 		case SWT.MouseDown:
-// 		case SWT.MouseMove:
-// 		case SWT.MouseUp: {
-// 			if (type is SWT.MouseMove) {
-// 				OS.XTestFakeMotionEvent (xDisplay, -1, event.x, event.y, 0);
-// 			} else {
-// 				int button = event.button;
-// 				switch (button) {
-// 					case 1:
-// 					case 2:
-// 					case 3:	break;
-// 					case 4: button = 6;	break;
-// 					case 5: button = 7;	break;
-// 					default: return false;
-// 				}
-// 				OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseDown, 0);
-// 			}
-// 			return true;
-// 		}
-// 		/*
-// 		* This code is intentionally commented. After posting a
-// 		* mouse wheel event the system may respond unpredictably
-// 		* to subsequent mouse actions.
-// 		*/
-// //		case SWT.MouseWheel: {
-// //			if (event.count is 0) return false;
-// //			int button = event.count < 0 ? 5 : 4;
-// //			OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseWheel, 0);
-// //		}
-// 	}
-// 	return false;
-// }
-//
-// void postEvent (Event event) {
-// 	/*
-// 	* Place the event at the end of the event queue.
-// 	* This code is always called in the Display's
-// 	* thread so it must be re-enterant but does not
-// 	* need to be synchronized.
-// 	*/
-// 	if (eventQueue is null) eventQueue = new Event [4];
-// 	int index = 0;
-// 	int length = eventQueue.length;
-// 	while (index < length) {
-// 		if (eventQueue [index] is null) break;
-// 		index++;
-// 	}
-// 	if (index is length) {
-// 		Event [] newQueue = new Event [length + 4];
-// 		System.arraycopy (eventQueue, 0, newQueue, 0, length);
-// 		eventQueue = newQueue;
-// 	}
-// 	eventQueue [index] = event;
-// }
-//
-void putGdkEvents () {
-// 	if (gdkEventCount !is 0) {
-// 		for (int i = 0; i < gdkEventCount; i++) {
-// 			auto event = gdkEvents [i];
-// 			Widget widget = gdkEventWidgets [i];
-// 			if (widget is null || !widget.isDisposed ()) {
-// 				OS.gdk_event_put (event);
-// 			}
-// 			OS.gdk_event_free (event);
-// 			gdkEvents [i] = 0;
-// 			gdkEventWidgets [i] = null;
-// 		}
-// 		gdkEventCount = 0;
-// 	}
+
+/**
+ * Maps a point from one coordinate system to another.
+ * When the control is null, coordinates are mapped to
+ * the display.
+ * <p>
+ * NOTE: On right-to-left platforms where the coordinate
+ * systems are mirrored, special care needs to be taken
+ * when mapping coordinates from one control to another
+ * to ensure the result is correctly mirrored.
+ *
+ * Mapping a point that is the origin of a rectangle and
+ * then adding the width and height is not equivalent to
+ * mapping the rectangle.  When one control is mirrored
+ * and the other is not, adding the width and height to a
+ * point that was mapped causes the rectangle to extend
+ * in the wrong direction.  Mapping the entire rectangle
+ * instead of just one point causes both the origin and
+ * the corner of the rectangle to be mapped.
+ * </p>
+ *
+ * @param from the source <code>Control</code> or <code>null</code>
+ * @param to the destination <code>Control</code> or <code>null</code>
+ * @param point to be mapped
+ * @return point with mapped coordinates
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the point is null</li>
+ *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1.2
+ */
+public Point map (Control from, Control to, Point point) {
+	checkDevice ();
+	if (point is null) error (SWT.ERROR_NULL_ARGUMENT);
+	return map (from, to, point.x, point.y);
+}
+
+/**
+ * Maps a point from one coordinate system to another.
+ * When the control is null, coordinates are mapped to
+ * the display.
+ * <p>
+ * NOTE: On right-to-left platforms where the coordinate
+ * systems are mirrored, special care needs to be taken
+ * when mapping coordinates from one control to another
+ * to ensure the result is correctly mirrored.
+ *
+ * Mapping a point that is the origin of a rectangle and
+ * then adding the width and height is not equivalent to
+ * mapping the rectangle.  When one control is mirrored
+ * and the other is not, adding the width and height to a
+ * point that was mapped causes the rectangle to extend
+ * in the wrong direction.  Mapping the entire rectangle
+ * instead of just one point causes both the origin and
+ * the corner of the rectangle to be mapped.
+ * </p>
+ *
+ * @param from the source <code>Control</code> or <code>null</code>
+ * @param to the destination <code>Control</code> or <code>null</code>
+ * @param x coordinates to be mapped
+ * @param y coordinates to be mapped
+ * @return point with mapped coordinates
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1.2
+ */
+public Point map (Control from, Control to, int x, int y) {
+	checkDevice ();
+	if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
+	if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
+	Point point = new Point (x, y);
+	if (from is to) return point;
+	if (from !is null) {
+		auto window = from.eventWindow ();
+		int origin_x, origin_y;
+		OS.gdk_window_get_origin (window, &origin_x, &origin_y);
+		point.x += origin_x;
+		point.y += origin_y;
+	}
+	if (to !is null) {
+		auto window = to.eventWindow ();
+        int origin_x, origin_y;
+		OS.gdk_window_get_origin (window, &origin_x, &origin_y);
+		point.x -= origin_x;
+		point.y -= origin_y;
+	}
+	return point;
+}
+
+/**
+ * Maps a point from one coordinate system to another.
+ * When the control is null, coordinates are mapped to
+ * the display.
+ * <p>
+ * NOTE: On right-to-left platforms where the coordinate
+ * systems are mirrored, special care needs to be taken
+ * when mapping coordinates from one control to another
+ * to ensure the result is correctly mirrored.
+ *
+ * Mapping a point that is the origin of a rectangle and
+ * then adding the width and height is not equivalent to
+ * mapping the rectangle.  When one control is mirrored
+ * and the other is not, adding the width and height to a
+ * point that was mapped causes the rectangle to extend
+ * in the wrong direction.  Mapping the entire rectangle
+ * instead of just one point causes both the origin and
+ * the corner of the rectangle to be mapped.
+ * </p>
+ *
+ * @param from the source <code>Control</code> or <code>null</code>
+ * @param to the destination <code>Control</code> or <code>null</code>
+ * @param rectangle to be mapped
+ * @return rectangle with mapped coordinates
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li>
+ *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1.2
+ */
+public Rectangle map (Control from, Control to, Rectangle rectangle) {
+	checkDevice();
+	if (rectangle is null) error (SWT.ERROR_NULL_ARGUMENT);
+	return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+}
+
+static wchar mbcsToWcs (wchar ch) {
+	int key = ch & 0xFFFF;
+	if (key <= 0x7F) return ch;
+	char [] buffer;
+	if (key <= 0xFF) {
+		buffer = new char [1];
+		buffer [0] = cast(char) key;
+	} else {
+		buffer = new char [2];
+		buffer [0] = cast(char) ((key >> 8) & 0xFF);
+		buffer [1] = cast(char) (key & 0xFF);
+	}
+	wchar [] result = Converter.mbcsToWcs (null, buffer);
+	if (result.length is 0) return 0;
+	return result [0];
+}
+
+int /*long*/ menuPositionProcMeth (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) {
+	Widget widget = getWidget (menu);
+	if (widget is null) return 0;
+	return widget.menuPositionProc (menu, x, y, push_in, user_data);
 }
 
-// /**
-//  * Reads an event from the operating system's event queue,
-//  * dispatches it appropriately, and returns <code>true</code>
-//  * if there is potentially more work to do, or <code>false</code>
-//  * if the caller can sleep until another event is placed on
-//  * the event queue.
-//  * <p>
-//  * In addition to checking the system event queue, this method also
-//  * checks if any inter-thread messages (created by <code>syncExec()</code>
-//  * or <code>asyncExec()</code>) are waiting to be processed, and if
-//  * so handles them before returning.
-//  * </p>
-//  *
-//  * @return <code>false</code> if the caller can sleep upon return from this method
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
-//  * </ul>
-//  *
-//  * @see #sleep
-//  * @see #wake
-//  */
-// public bool readAndDispatch () {
-// 	checkDevice ();
-// 	bool events = false;
-// 	events |= runSettings ();
-// 	events |= runPopups ();
-// 	events |= OS.g_main_context_iteration (0, false);
-// 	if (events) {
-// 		runDeferredEvents ();
-// 		return true;
-// 	}
-// 	return runAsyncMessages (false);
-// }
-//
+/**
+ * Maps a point from one coordinate system to another.
+ * When the control is null, coordinates are mapped to
+ * the display.
+ * <p>
+ * NOTE: On right-to-left platforms where the coordinate
+ * systems are mirrored, special care needs to be taken
+ * when mapping coordinates from one control to another
+ * to ensure the result is correctly mirrored.
+ *
+ * Mapping a point that is the origin of a rectangle and
+ * then adding the width and height is not equivalent to
+ * mapping the rectangle.  When one control is mirrored
+ * and the other is not, adding the width and height to a
+ * point that was mapped causes the rectangle to extend
+ * in the wrong direction.  Mapping the entire rectangle
+ * instead of just one point causes both the origin and
+ * the corner of the rectangle to be mapped.
+ * </p>
+ *
+ * @param from the source <code>Control</code> or <code>null</code>
+ * @param to the destination <code>Control</code> or <code>null</code>
+ * @param x coordinates to be mapped
+ * @param y coordinates to be mapped
+ * @param width coordinates to be mapped
+ * @param height coordinates to be mapped
+ * @return rectangle with mapped coordinates
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1.2
+ */
+public Rectangle map (Control from, Control to, int x, int y, int width, int height) {
+	checkDevice();
+	if (from !is null && from.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
+	if (to !is null && to.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);
+	Rectangle rect = new Rectangle (x, y, width, height);
+	if (from is to) return rect;
+	if (from !is null) {
+		auto window = from.eventWindow ();
+		int origin_x, origin_y;
+		OS.gdk_window_get_origin (window, &origin_x, &origin_y);
+		rect.x += origin_x;
+		rect.y += origin_y;
+	}
+	if (to !is null) {
+		auto window = to.eventWindow ();
+        int origin_x, origin_y;
+		OS.gdk_window_get_origin (window, &origin_x, &origin_y);
+		rect.x -= origin_x;
+		rect.y -= origin_y;
+	}
+	return rect;
+}
+
+private extern(C) int mouseHoverProcMeth (void* handle) {
+//PORTING_TODO
+    return 0;
+}
+
+int /*long*/ mouseHoverProcMeth (GtkWidget* handle) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.hoverProc (handle);
+}
+
+/**
+ * Generate a low level system event.
+ *
+ * <code>post</code> is used to generate low level keyboard
+ * and mouse events. The intent is to enable automated UI
+ * testing by simulating the input from the user.  Most
+ * SWT applications should never need to call this method.
+ * <p>
+ * Note that this operation can fail when the operating system
+ * fails to generate the event for any reason.  For example,
+ * this can happen when there is no such key or mouse button
+ * or when the system event queue is full.
+ * </p>
+ * <p>
+ * <b>Event Types:</b>
+ * <p>KeyDown, KeyUp
+ * <p>The following fields in the <code>Event</code> apply:
+ * <ul>
+ * <li>(in) type KeyDown or KeyUp</li>
+ * <p> Either one of:
+ * <li>(in) character a character that corresponds to a keyboard key</li>
+ * <li>(in) keyCode the key code of the key that was typed,
+ *          as defined by the key code constants in class <code>SWT</code></li>
+ * </ul>
+ * <p>MouseDown, MouseUp</p>
+ * <p>The following fields in the <code>Event</code> apply:
+ * <ul>
+ * <li>(in) type MouseDown or MouseUp
+ * <li>(in) button the button that is pressed or released
+ * </ul>
+ * <p>MouseMove</p>
+ * <p>The following fields in the <code>Event</code> apply:
+ * <ul>
+ * <li>(in) type MouseMove
+ * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates
+ * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates
+ * </ul>
+ * </dl>
+ *
+ * @param event the event to be generated
+ *
+ * @return true if the event was generated or false otherwise
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the event is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 3.0
+ *
+ */
+public bool post (Event event) {
+	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+	if (event is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (!OS.GDK_WINDOWING_X11()) return false;
+	auto xDisplay = OS.GDK_DISPLAY ();
+	int type = event.type;
+	switch (type) {
+		case SWT.KeyDown:
+		case SWT.KeyUp: {
+			int keyCode = 0;
+			auto keysym = untranslateKey (event.keyCode);
+			if (keysym !is 0) keyCode = OS.XKeysymToKeycode (xDisplay, keysym);
+			if (keyCode is 0) {
+				char key = event.character;
+				switch (key) {
+					case SWT.BS: keysym = OS.GDK_BackSpace; break;
+					case SWT.CR: keysym = OS.GDK_Return; break;
+					case SWT.DEL: keysym = OS.GDK_Delete; break;
+					case SWT.ESC: keysym = OS.GDK_Escape; break;
+					case SWT.TAB: keysym = OS.GDK_Tab; break;
+					case SWT.LF: keysym = OS.GDK_Linefeed; break;
+					default:
+						keysym = wcsToMbcs (key);
+				}
+				keyCode = OS.XKeysymToKeycode (xDisplay, keysym);
+				if (keyCode is 0) return false;
+			}
+			OS.XTestFakeKeyEvent (xDisplay, keyCode, type is SWT.KeyDown, 0);
+			return true;
+		}
+		case SWT.MouseDown:
+		case SWT.MouseMove:
+		case SWT.MouseUp: {
+			if (type is SWT.MouseMove) {
+				OS.XTestFakeMotionEvent (xDisplay, -1, event.x, event.y, 0);
+			} else {
+				int button = event.button;
+				switch (button) {
+					case 1:
+					case 2:
+					case 3:	break;
+					case 4: button = 6;	break;
+					case 5: button = 7;	break;
+					default: return false;
+				}
+				OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseDown, 0);
+			}
+			return true;
+		}
+		/*
+		* This code is intentionally commented. After posting a
+		* mouse wheel event the system may respond unpredictably
+		* to subsequent mouse actions.
+		*/
+//		case SWT.MouseWheel: {
+//			if (event.count is 0) return false;
+//			int button = event.count < 0 ? 5 : 4;
+//			OS.XTestFakeButtonEvent (xDisplay, button, type is SWT.MouseWheel, 0);
+//		}
+	}
+	return false;
+}
+
+void postEvent (Event event) {
+	/*
+	* Place the event at the end of the event queue.
+	* This code is always called in the Display's
+	* thread so it must be re-enterant but does not
+	* need to be synchronized.
+	*/
+	if (eventQueue is null) eventQueue = new Event [4];
+	int index = 0;
+	int length = eventQueue.length;
+	while (index < length) {
+		if (eventQueue [index] is null) break;
+		index++;
+	}
+	if (index is length) {
+		Event [] newQueue = new Event [length + 4];
+		System.arraycopy (eventQueue, 0, newQueue, 0, length);
+		eventQueue = newQueue;
+	}
+	eventQueue [index] = event;
+}
+
+void putGdkEvents () {
+	if (gdkEventCount !is 0) {
+		for (int i = 0; i < gdkEventCount; i++) {
+			auto event = gdkEvents [i];
+			Widget widget = gdkEventWidgets [i];
+			if (widget is null || !widget.isDisposed ()) {
+				OS.gdk_event_put (event);
+			}
+			OS.gdk_event_free (event);
+			gdkEvents [i] = null;
+			gdkEventWidgets [i] = null;
+		}
+		gdkEventCount = 0;
+	}
+}
+
+/**
+ * Reads an event from the operating system's event queue,
+ * dispatches it appropriately, and returns <code>true</code>
+ * if there is potentially more work to do, or <code>false</code>
+ * if the caller can sleep until another event is placed on
+ * the event queue.
+ * <p>
+ * In addition to checking the system event queue, this method also
+ * checks if any inter-thread messages (created by <code>syncExec()</code>
+ * or <code>asyncExec()</code>) are waiting to be processed, and if
+ * so handles them before returning.
+ * </p>
+ *
+ * @return <code>false</code> if the caller can sleep upon return from this method
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
+ * </ul>
+ *
+ * @see #sleep
+ * @see #wake
+ */
+public bool readAndDispatch () {
+	checkDevice ();
+	bool events = false;
+	events |= runSettings ();
+	events |= runPopups ();
+	events |= cast(bool)OS.g_main_context_iteration (null, false);
+	if (events) {
+		runDeferredEvents ();
+		return true;
+	}
+	return runAsyncMessages (false);
+}
+
 synchronized void register () {
 	for (int i=0; i<Displays.length; i++) {
 		if (Displays [i] is null) {
@@ -2988,1010 +2908,1024 @@
 	Displays = newDisplays;
 }
 
-// /**
-//  * Releases any internal resources back to the operating
-//  * system and clears all fields except the device handle.
-//  * <p>
-//  * Disposes all shells which are currently open on the display.
-//  * After this method has been invoked, all related related shells
-//  * will answer <code>true</code> when sent the message
-//  * <code>isDisposed()</code>.
-//  * </p><p>
-//  * When a device is destroyed, resources that were acquired
-//  * on behalf of the programmer need to be returned to the
-//  * operating system.  For example, if the device allocated a
-//  * font to be used as the system font, this font would be
-//  * freed in <code>release</code>.  Also,to assist the garbage
-//  * collector and minimize the amount of memory that is not
-//  * reclaimed when the programmer keeps a reference to a
-//  * disposed device, all fields except the handle are zero'd.
-//  * The handle is needed by <code>destroy</code>.
-//  * </p>
-//  * This method is called before <code>destroy</code>.
-//  *
-//  * @see Device#dispose
-//  * @see #destroy
-//  */
-// protected void release () {
-// 	sendEvent (SWT.Dispose, new Event ());
-// 	Shell [] shells = getShells ();
-// 	for (int i=0; i<shells.length; i++) {
-// 		Shell shell = shells [i];
-// 		if (!shell.isDisposed ())  shell.dispose ();
-// 	}
-// 	if (tray !is null) tray.dispose ();
-// 	tray = null;
-// 	while (readAndDispatch ()) {}
-// 	if (disposeList !is null) {
-// 		for (int i=0; i<disposeList.length; i++) {
-// 			if (disposeList [i] !is null) disposeList [i].run ();
-// 		}
-// 	}
-// 	disposeList = null;
-// 	synchronizer.releaseSynchronizer ();
-// 	synchronizer = null;
-// 	releaseDisplay ();
-// 	super.release ();
-// }
-//
-// void releaseDisplay () {
-// 	windowCallback2.dispose ();  windowCallback2 = null;
-// 	windowCallback3.dispose ();  windowCallback3 = null;
-// 	windowCallback4.dispose ();  windowCallback4 = null;
-// 	windowCallback5.dispose ();  windowCallback5 = null;
-// 	windowProc2 = windowProc3 = windowProc4 = windowProc5 = 0;
-//
-// 	/* Dispose xfilter callback */
-// 	filterCallback.dispose(); filterCallback = null;
-// 	filterProc = 0;
-//
-// 	/* Dispose checkIfEvent callback */
-// 	checkIfEventCallback.dispose(); checkIfEventCallback = null;
-// 	checkIfEventProc = 0;
-//
-// 	/* Dispose preedit window */
-// 	if (preeditWindow !is null) OS.gtk_widget_destroy (preeditWindow);
-// 	imControl = null;
-//
-// 	/* Dispose the menu callback */
-// 	menuPositionCallback.dispose (); menuPositionCallback = null;
-// 	menuPositionProc = 0;
-//
-// 	/* Dispose the tooltip map callback */
-// 	sizeAllocateCallback.dispose (); sizeAllocateCallback = null;
-// 	sizeAllocateProc = 0;
-// 	sizeRequestCallback.dispose (); sizeRequestCallback = null;
-// 	sizeRequestProc = 0;
-//
-// 	/* Dispose the shell map callback */
-// 	shellMapCallback.dispose (); shellMapCallback = null;
-// 	shellMapProc = 0;
-//
-// 	/* Dispose the run async messages callback */
-// 	idleCallback.dispose (); idleCallback = null;
-// 	idleProc = 0;
-// 	if (idleHandle !is null) OS.g_source_remove (idleHandle);
-// 	idleHandle = 0;
-//
-// 	/* Dispose GtkTreeView callbacks */
-// 	treeSelectionCallback.dispose (); treeSelectionCallback = null;
-// 	treeSelectionProc = 0;
-// 	cellDataCallback.dispose (); cellDataCallback = null;
-// 	cellDataProcFld = 0;
-//
-// 	/* Dispose the set direction callback */
-// 	setDirectionCallback.dispose (); setDirectionCallback = null;
-// 	setDirectionProc = 0;
-//
-// 	/* Dispose the set direction callback */
-// 	allChildrenCallback.dispose (); allChildrenCallback = null;
-// 	allChildrenProc = 0;
-//
-// 	/* Dispose the caret callback */
-// 	if (caretId !is null) OS.gtk_timeout_remove (caretId);
-// 	caretId = 0;
-// 	caretProc = 0;
-// 	caretCallback.dispose ();
-// 	caretCallback = null;
-//
-// 	/* Release closures */
-// 	for (int i = 0; i < Widget.LAST_SIGNAL; i++) {
-// 		if (closures [i] !is null) OS.g_closure_unref (closures [i]);
-// 	}
-// 	if (shellMapProcClosure !is null) OS.g_closure_unref (shellMapProcClosure);
-//
-// 	/* Dispose the timer callback */
-// 	if (timerIds !is null) {
-// 		for (int i=0; i<timerIds.length; i++) {
-// 			if (timerIds [i] !is null) OS.gtk_timeout_remove (timerIds [i]);
-// 		}
-// 	}
-// 	timerIds = null;
-// 	timerList = null;
-// 	timerProc = 0;
-// 	timerCallback.dispose ();
-// 	timerCallback = null;
-// 	windowTimerProc = 0;
-// 	windowTimerCallback.dispose ();
-// 	windowTimerCallback = null;
-//
-// 	/* Dispose mouse hover callback */
-// 	if (mouseHoverId !is null) OS.gtk_timeout_remove (mouseHoverId);
-// 	mouseHoverId = 0;
-// 	mouseHoverHandle = mouseHoverProc = 0;
-// 	mouseHoverCallback.dispose ();
-// 	mouseHoverCallback = null;
-//
-// 	/* Dispose the default font */
-// 	if (systemFont !is null) systemFont.dispose ();
-// 	systemFont = null;
-//
-// 	/* Dispose the System Images */
-// 	if (errorImage !is null) errorImage.dispose();
-// 	if (infoImage !is null) infoImage.dispose();
-// 	if (questionImage !is null) questionImage.dispose();
-// 	if (warningImage !is null) warningImage.dispose();
-// 	errorImage = infoImage = questionImage = warningImage = null;
-//
-// 	/* Release the System Cursors */
-// 	for (int i = 0; i < cursors.length; i++) {
-// 		if (cursors [i] !is null) cursors [i].dispose ();
-// 	}
-// 	cursors = null;
-//
-// 	/* Release Acquired Resources */
-// 	if (resources !is null) {
-// 		for (int i=0; i<resources.length; i++) {
-// 			if (resources [i] !is null) resources [i].dispose ();
-// 		}
-// 		resources = null;
-// 	}
-//
-// 	/* Release the System Colors */
-// 	COLOR_WIDGET_DARK_SHADOW = COLOR_WIDGET_NORMAL_SHADOW = COLOR_WIDGET_LIGHT_SHADOW =
-// 	COLOR_WIDGET_HIGHLIGHT_SHADOW = COLOR_WIDGET_BACKGROUND = COLOR_WIDGET_BORDER =
-// 	COLOR_LIST_FOREGROUND = COLOR_LIST_BACKGROUND = COLOR_LIST_SELECTION = COLOR_LIST_SELECTION_TEXT =
-// 	COLOR_INFO_BACKGROUND = COLOR_INFO_FOREGROUND = null;
-//
-// 	/* Dispose the event callback */
-// 	OS.gdk_event_handler_set (0, 0, 0);
-// 	eventCallback.dispose ();  eventCallback = null;
-//
-// 	/* Dispose the hidden shell */
-// 	if (shellHandle !is null) OS.gtk_widget_destroy (shellHandle);
-// 	shellHandle = 0;
-//
-// 	/* Dispose the settings callback */
-// 	styleSetCallback.dispose(); styleSetCallback = null;
-// 	styleSetProc = 0;
-//
-// 	/* Release the sleep resources */
-// 	max_priority = timeout = null;
-// 	if (fds !is null) OS.g_free (fds);
-// 	fds = 0;
-//
-// 	/* Release references */
-// 	popups = null;
-// 	thread = null;
-// 	activeShell = null;
-// 	lastWidget = null;
-// 	indexTable = null;
-// 	widgetTable = null;
-// }
-//
-// /**
-//  * Removes the listener from the collection of listeners who will
-//  * be notified when an event of the given type occurs anywhere in
-//  * a widget. The event type is one of the event constants defined
-//  * in class <code>SWT</code>.
-//  *
-//  * @param eventType the type of event to listen for
-//  * @param listener the listener which should no longer be notified when the event occurs
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  * </ul>
-//  *
-//  * @see Listener
-//  * @see SWT
-//  * @see #addFilter
-//  * @see #addListener
-//  *
-//  * @since 3.0
-//  */
-// public void removeFilter (int eventType, Listener listener) {
-// 	checkDevice ();
-// 	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (filterTable is null) return;
-// 	filterTable.unhook (eventType, listener);
-// 	if (filterTable.size () is 0) filterTable = null;
-// }
-//
-// int /*long*/ removeGdkEvent () {
-// 	if (gdkEventCount is 0) return 0;
-// 	auto event = gdkEvents [0];
-// 	--gdkEventCount;
-// 	System.arraycopy (gdkEvents, 1, gdkEvents, 0, gdkEventCount);
-// 	System.arraycopy (gdkEventWidgets, 1, gdkEventWidgets, 0, gdkEventCount);
-// 	gdkEvents [gdkEventCount] = 0;
-// 	gdkEventWidgets [gdkEventCount] = null;
-// 	if (gdkEventCount is 0) {
-// 		gdkEvents = null;
-// 		gdkEventWidgets = null;
-// 	}
-// 	return event;
-// }
-//
-// void removeIdleProc () {
-// 	synchronized(idleLock) {
-// 		if (idleHandle !is null) OS.g_source_remove (idleHandle);
-// 		idleNeeded = false;
-// 		idleHandle = 0;
-// 	}
-// }
-// /**
-//  * Removes the listener from the collection of listeners who will
-//  * be notified when an event of the given type occurs. The event type
-//  * is one of the event constants defined in class <code>SWT</code>.
-//  *
-//  * @param eventType the type of event to listen for
-//  * @param listener the listener which should no longer be notified when the event occurs
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see Listener
-//  * @see SWT
-//  * @see #addListener
-//  *
-//  * @since 2.0
-//  */
-// public void removeListener (int eventType, Listener listener) {
-// 	checkDevice ();
-// 	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (eventTable is null) return;
-// 	eventTable.unhook (eventType, listener);
-// }
-//
-// void removeMouseHoverTimeout (int /*long*/ handle) {
-// 	if (handle !is mouseHoverHandle) return;
-// 	if (mouseHoverId !is null) OS.gtk_timeout_remove (mouseHoverId);
-// 	mouseHoverId = 0;
-// 	mouseHoverHandle = 0;
-// }
-//
-// void removePopup (Menu menu) {
-// 	if (popups is null) return;
-// 	for (int i=0; i<popups.length; i++) {
-// 		if (popups [i] is menu) {
-// 			popups [i] = null;
-// 			return;
-// 		}
-// 	}
-// }
-//
-// Widget removeWidget (int /*long*/ handle) {
-// 	if (handle is null) return null;
-// 	lastWidget = null;
-// 	Widget widget = null;
-// 	int index = cast(int)/*64*/ OS.g_object_get_qdata (handle, SWT_OBJECT_INDEX) - 1;
-// 	if (0 <= index && index < widgetTable.length) {
-// 		widget = widgetTable [index];
-// 		widgetTable [index] = null;
-// 		indexTable [index] = freeSlot;
-// 		freeSlot = index;
-// 		OS.g_object_set_qdata (handle, SWT_OBJECT_INDEX, 0);
-// 	}
-// 	return widget;
-// }
-//
-// bool runAsyncMessages (bool all) {
-// 	return synchronizer.runAsyncMessages (all);
-// }
-//
-// bool runDeferredEvents () {
-// 	/*
-// 	* Run deferred events.  This code is always
-// 	* called in the Display's thread so it must
-// 	* be re-enterant but need not be synchronized.
-// 	*/
-// 	while (eventQueue !is null) {
-//
-// 		/* Take an event off the queue */
-// 		Event event = eventQueue [0];
-// 		if (event is null) break;
-// 		int length = eventQueue.length;
-// 		System.arraycopy (eventQueue, 1, eventQueue, 0, --length);
-// 		eventQueue [length] = null;
-//
-// 		/* Run the event */
-// 		Widget widget = event.widget;
-// 		if (widget !is null && !widget.isDisposed ()) {
-// 			Widget item = event.item;
-// 			if (item is null || !item.isDisposed ()) {
-// 				widget.sendEvent (event);
-// 			}
-// 		}
-//
-// 		/*
-// 		* At this point, the event queue could
-// 		* be null due to a recursive invokation
-// 		* when running the event.
-// 		*/
-// 	}
-//
-// 	/* Clear the queue */
-// 	eventQueue = null;
-// 	return true;
-// }
-//
-// bool runPopups () {
-// 	if (popups is null) return false;
-// 	bool result = false;
-// 	while (popups !is null) {
-// 		Menu menu = popups [0];
-// 		if (menu is null) break;
-// 		int length = popups.length;
-// 		System.arraycopy (popups, 1, popups, 0, --length);
-// 		popups [length] = null;
-// 		runDeferredEvents ();
-// 		if (!menu.isDisposed ()) menu._setVisible (true);
-// 		result = true;
-// 	}
-// 	popups = null;
-// 	return result;
-// }
-//
-// bool runSettingsMeth () {
-// 	if (!runSettings) return false;
-// 	runSettings = false;
-// 	saveResources ();
-// 	initializeSystemColors ();
-// 	sendEvent (SWT.Settings, null);
-// 	Shell [] shells = getShells ();
-// 	for (int i=0; i<shells.length; i++) {
-// 		Shell shell = shells [i];
-// 		if (!shell.isDisposed ()) {
-// 			shell.fixStyle ();
-// 			shell.redraw (true);
-// 			shell.layout (true, true);
-// 		}
-// 	}
-// 	return true;
-// }
-//
-// /**
-//  * On platforms which support it, sets the application name
-//  * to be the argument. On Motif, for example, this can be used
-//  * to set the name used for resource lookup.  Specifying
-//  * <code>null</code> for the name clears it.
-//  *
-//  * @param name the new app name or <code>null</code>
-//  */
-// public static void setAppName (char[] name) {
-// 	APP_NAME = name;
-// }
-//
-// /**
-//  * Sets the location of the on-screen pointer relative to the top left corner
-//  * of the screen.  <b>Note: It is typically considered bad practice for a
-//  * program to move the on-screen pointer location.</b>
-//  *
-//  * @param x the new x coordinate for the cursor
-//  * @param y the new y coordinate for the cursor
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.1
-//  */
-// public void setCursorLocation (int x, int y) {
-// 	checkDevice ();
-// 	if (OS.GDK_WINDOWING_X11 ()) {
-// 		auto xDisplay = OS.GDK_DISPLAY ();
-// 		auto xWindow = OS.XDefaultRootWindow (xDisplay);
-// 		OS.XWarpPointer (xDisplay, OS.None, xWindow, 0, 0, 0, 0, x, y);
-// 	}
-// }
-//
-// /**
-//  * Sets the location of the on-screen pointer relative to the top left corner
-//  * of the screen.  <b>Note: It is typically considered bad practice for a
-//  * program to move the on-screen pointer location.</b>
-//  *
-//  * @param point new position
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_NULL_ARGUMENT - if the point is null
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @since 2.0
-//  */
-// public void setCursorLocation (Point point) {
-// 	checkDevice ();
-// 	if (point is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	setCursorLocation (point.x, point.y);
-// }
-//
-// /**
-//  * Sets the application defined property of the receiver
-//  * with the specified name to the given argument.
-//  * <p>
-//  * Applications may have associated arbitrary objects with the
-//  * receiver in this fashion. If the objects stored in the
-//  * properties need to be notified when the display is disposed
-//  * of, it is the application's responsibility provide a
-//  * <code>disposeExec()</code> handler which does so.
-//  * </p>
-//  *
-//  * @param key the name of the property
-//  * @param value the new value for the property
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #getData(String)
-//  * @see #disposeExec(Runnable)
-//  */
-// public void setData (char[] key, Object value) {
-// 	checkDevice ();
-// 	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
-//
-// 	if (key==/*eq*/ DISPATCH_EVENT_KEY) {
-// 		if (value is null || (null !is cast(ArrayWrapperInt)value)) {
-// 			dispatchEvents = value.array;
-// 			if (value is null) putGdkEvents ();
-// 			return;
-// 		}
-// 	}
-//
-// 	if (key==/*eq*/ ADD_WIDGET_KEY) {
-//         auto wrap = cast(ArrayWrapperObject) value;
-//         if( wrap is null ) SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, " []");
-//         Object [] data = wrap.array;
-// 		auto handle = (cast(LONG) data [0]).value;
-// 		Widget widget = cast(Widget) data [1];
-// 		if (widget !is null) {
-// 			addWidget (handle, widget);
-// 		} else {
-// 			removeWidget (handle);
-// 		}
-// 	}
-//
-// 	if (key==/*eq*/ ADD_IDLE_PROC_KEY) {
-// 		addIdleProc ();
-// 		return;
-// 	}
-// 	if (key==/*eq*/ REMOVE_IDLE_PROC_KEY) {
-// 		removeIdleProc ();
-// 		return;
-// 	}
-//
-// 	/* Remove the key/value pair */
-// 	if (value is null) {
-// 		if (keys is null) return;
-// 		int index = 0;
-// 		while (index < keys.length && !keys [index]==/*eq*/ key) index++;
-// 		if (index is keys.length) return;
-// 		if (keys.length is 1) {
-// 			keys = null;
-// 			values = null;
-// 		} else {
-// 			char[] [] newKeys = new char[] [keys.length - 1];
-// 			Object [] newValues = new Object [values.length - 1];
-// 			System.arraycopy (keys, 0, newKeys, 0, index);
-// 			System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index);
-// 			System.arraycopy (values, 0, newValues, 0, index);
-// 			System.arraycopy (values, index + 1, newValues, index, newValues.length - index);
-// 			keys = newKeys;
-// 			values = newValues;
-// 		}
-// 		return;
-// 	}
-//
-// 	/* Add the key/value pair */
-// 	if (keys is null) {
-// 		keys = [key];
-// 		values = [value];
-// 		return;
-// 	}
-// 	for (int i=0; i<keys.length; i++) {
-// 		if (keys [i]==/*eq*/ key) {
-// 			values [i] = value;
-// 			return;
-// 		}
-// 	}
-// 	char[] [] newKeys = new char[] [keys.length + 1];
-// 	Object [] newValues = new Object [values.length + 1];
-// 	System.arraycopy (keys, 0, newKeys, 0, keys.length);
-// 	System.arraycopy (values, 0, newValues, 0, values.length);
-// 	newKeys [keys.length] = key;
-// 	newValues [values.length] = value;
-// 	keys = newKeys;
-// 	values = newValues;
-// }
-//
-// /**
-//  * Sets the application defined, display specific data
-//  * associated with the receiver, to the argument.
-//  * The <em>display specific data</em> is a single,
-//  * unnamed field that is stored with every display.
-//  * <p>
-//  * Applications may put arbitrary objects in this field. If
-//  * the object stored in the display specific data needs to
-//  * be notified when the display is disposed of, it is the
-//  * application's responsibility provide a
-//  * <code>disposeExec()</code> handler which does so.
-//  * </p>
-//  *
-//  * @param data the new display specific data
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #getData()
-//  * @see #disposeExec(Runnable)
-//  */
-// public void setData (Object data) {
-// 	checkDevice ();
-// 	this.data = data;
-// }
-//
-// int /*long*/ setDirectionProcMeth (int /*long*/ widget, int /*long*/ direction) {
-// 	OS.gtk_widget_set_direction (widget, cast(int)/*64*/ direction);
-// 	if (OS.GTK_IS_CONTAINER (widget)) {
-// 		OS.gtk_container_forall (widget, setDirectionProc, direction);
-// 	}
-// 	return 0;
-// }
-//
-// /**
-//  * Sets the synchronizer used by the display to be
-//  * the argument, which can not be null.
-//  *
-//  * @param synchronizer the new synchronizer for the display (must not be null)
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
-//  * </ul>
-//  */
-// public void setSynchronizer (Synchronizer synchronizer) {
-// 	checkDevice ();
-// 	if (synchronizer is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (this.synchronizer !is null) {
-// 		this.synchronizer.runAsyncMessages(true);
-// 	}
-// 	this.synchronizer = synchronizer;
-// }
-//
-// void showIMWindow (Control control) {
-// 	imControl = control;
-// 	if (preeditWindow is null) {
-// 		preeditWindow = OS.gtk_window_new (OS.GTK_WINDOW_POPUP);
-// 		if (preeditWindow is null) error (SWT.ERROR_NO_HANDLES);
-// 		preeditLabel = OS.gtk_label_new (null);
-// 		if (preeditLabel is null) error (SWT.ERROR_NO_HANDLES);
-// 		OS.gtk_container_add (preeditWindow, preeditLabel);
-// 		OS.gtk_widget_show (preeditLabel);
-// 	}
-// 	int /*long*/ [] preeditString = new int /*long*/ [1];
-// 	int /*long*/ [] pangoAttrs = new int /*long*/ [1];
-// 	auto imHandle = control.imHandle ();
-// 	OS.gtk_im_context_get_preedit_string (imHandle, preeditString, pangoAttrs, null);
-// 	if (preeditString [0] !is null && OS.strlen (preeditString [0]) > 0) {
-// 		Control widget = control.findBackgroundControl ();
-// 		if (widget is null) widget = control;
-// 		OS.gtk_widget_modify_bg (preeditWindow,  OS.GTK_STATE_NORMAL, widget.getBackgroundColor ());
-// 		widget.setForegroundColor (preeditLabel, control.getForegroundColor());
-// 		OS.gtk_widget_modify_font (preeditLabel, control.getFontDescription ());
-// 		if (pangoAttrs [0] !is null) OS.gtk_label_set_attributes (preeditLabel, pangoAttrs[0]);
-// 		OS.gtk_label_set_text (preeditLabel, preeditString [0]);
-// 		Point point = control.toDisplay (control.getIMCaretPos ());
-// 		OS.gtk_window_move (preeditWindow, point.x, point.y);
-// 		GtkRequisition* requisition = new GtkRequisition ();
-// 		OS.gtk_widget_size_request (preeditLabel, requisition);
-// 		OS.gtk_window_resize (preeditWindow, requisition.width, requisition.height);
-// 		OS.gtk_widget_show (preeditWindow);
-// 	} else {
-// 		OS.gtk_widget_hide (preeditWindow);
-// 	}
-// 	if (preeditString [0] !is null) OS.g_free (preeditString [0]);
-// 	if (pangoAttrs [0] !is null) OS.pango_attr_list_unref (pangoAttrs [0]);
-// }
-//
-// /**
-//  * Causes the user-interface thread to <em>sleep</em> (that is,
-//  * to be put in a state where it does not consume CPU cycles)
-//  * until an event is received or it is otherwise awakened.
-//  *
-//  * @return <code>true</code> if an event requiring dispatching was placed on the queue.
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #wake
-//  */
-// public bool sleep () {
-// 	checkDevice ();
-// 	if (gdkEventCount is 0) {
-// 		gdkEvents = null;
-// 		gdkEventWidgets = null;
-// 	}
-// 	if (settingsChanged) {
-// 		settingsChanged = false;
-// 		runSettings = true;
-// 		return false;
-// 	}
-// 	if (getMessageCount () !is 0) return true;
-// 	if (fds is null) {
-// 		allocated_nfds = 2;
-// 		fds = OS.g_malloc (OS.GPollFD_sizeof () * allocated_nfds);
-// 	}
-// 	max_priority [0] = timeout [0] = 0;
-// 	auto context = OS.g_main_context_default ();
-// 	bool result = false;
-// 	do {
-// 		if (OS.g_main_context_acquire (context)) {
-// 			result = OS.g_main_context_prepare (context, max_priority);
-// 			int nfds;
-// 			while ((nfds = OS.g_main_context_query (context, max_priority [0], timeout, fds, allocated_nfds)) > allocated_nfds) {
-// 				OS.g_free (fds);
-// 				allocated_nfds = nfds;
-// 				fds = OS.g_malloc (OS.GPollFD_sizeof() * allocated_nfds);
-// 			}
-// 			auto poll = OS.g_main_context_get_poll_func (context);
-// 			if (poll !is null) {
-// 				if (nfds > 0 || timeout [0] !is 0) {
-// 					/*
-// 					* Bug in GTK. For some reason, g_main_context_wakeup() may
-// 					* fail to wake up the UI thread from the polling function.
-// 					* The fix is to sleep for a maximum of 50 milliseconds.
-// 					*/
-// 					if (timeout [0] < 0) timeout [0] = 50;
-//
-// 					/* Exit the OS lock to allow other threads to enter GTK */
-// 					Lock lock = OS.lock;
-// 					int count = lock.lock ();
-// 					for (int i = 0; i < count; i++) lock.unlock ();
-// 					try {
-// 						wake_state = false;
-// 						OS.Call (poll, fds, nfds, timeout [0]);
-// 					} finally {
-// 						for (int i = 0; i < count; i++) lock.lock ();
-// 						lock.unlock ();
-// 					}
-// 				}
-// 			}
-// 			OS.g_main_context_check (context, max_priority [0], fds, nfds);
-// 			OS.g_main_context_release (context);
-// 		}
-// 	} while (!result && getMessageCount () is null && !wake_state);
-// 	wake_state = false;
-// 	return true;
-// }
-//
-// /**
-//  * Causes the <code>run()</code> method of the runnable to
-//  * be invoked by the user-interface thread after the specified
-//  * number of milliseconds have elapsed. If milliseconds is less
-//  * than zero, the runnable is not executed.
-//  * <p>
-//  * Note that at the time the runnable is invoked, widgets
-//  * that have the receiver as their display may have been
-//  * disposed. Therefore, it is necessary to check for this
-//  * case inside the runnable before accessing the widget.
-//  * </p>
-//  *
-//  * @param milliseconds the delay before running the runnable
-//  * @param runnable code to run on the user-interface thread
-//  *
-//  * @exception IllegalArgumentException <ul>
-//  *    <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
-//  * </ul>
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #asyncExec
-//  */
-// public void timerExec (int milliseconds, Runnable runnable) {
-// 	checkDevice ();
-// 	if (runnable is null) error (SWT.ERROR_NULL_ARGUMENT);
-// 	if (timerList is null) timerList = new Runnable [4];
-// 	if (timerIds is null) timerIds = new int [4];
-// 	int index = 0;
-// 	while (index < timerList.length) {
-// 		if (timerList [index] is runnable) break;
-// 		index++;
-// 	}
-// 	if (index !is timerList.length) {
-// 		OS.gtk_timeout_remove (timerIds [index]);
-// 		timerList [index] = null;
-// 		timerIds [index] = 0;
-// 		if (milliseconds < 0) return;
-// 	} else {
-// 		if (milliseconds < 0) return;
-// 		index = 0;
-// 		while (index < timerList.length) {
-// 			if (timerList [index] is null) break;
-// 			index++;
-// 		}
-// 		if (index is timerList.length) {
-// 			Runnable [] newTimerList = new Runnable [timerList.length + 4];
-// 			System.arraycopy (timerList, 0, newTimerList, 0, timerList.length);
-// 			timerList = newTimerList;
-// 			int [] newTimerIds = new int [timerIds.length + 4];
-// 			System.arraycopy (timerIds, 0, newTimerIds, 0, timerIds.length);
-// 			timerIds = newTimerIds;
-// 		}
-// 	}
-// 	int timerId = OS.gtk_timeout_add (milliseconds, timerProc, index);
-// 	if (timerId !is null) {
-// 		timerIds [index] = timerId;
-// 		timerList [index] = runnable;
-// 	}
-// }
-//
-// int /*long*/ timerProcMeth (int /*long*/ i) {
-// 	if (timerList is null) return 0;
-// 	int index = cast(int)/*64*/i;
-// 	if (0 <= index && index < timerList.length) {
-// 		Runnable runnable = timerList [index];
-// 		timerList [index] = null;
-// 		timerIds [index] = 0;
-// 		if (runnable !is null) runnable.run ();
-// 	}
-// 	return 0;
-// }
-//
-// int /*long*/ caretProcMeth (int /*long*/ clientData) {
-// 	caretId = 0;
-// 	if (currentCaret is null) {
-// 		return 0;
-// 	}
-// 	if (currentCaret.blinkCaret()) {
-// 		int blinkRate = currentCaret.blinkRate;
-// 		if (blinkRate is 0) return 0;
-// 		caretId = OS.gtk_timeout_add (blinkRate, caretProc, 0);
-// 	} else {
-// 		currentCaret = null;
-// 	}
-// 	return 0;
-// }
-//
-// int /*long*/ sizeAllocateProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
-// 	Widget widget = getWidget (user_data);
-// 	if (widget is null) return 0;
-// 	return widget.sizeAllocateProc (handle, arg0, user_data);
-// }
-//
-// int /*long*/ sizeRequestProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
-// 	Widget widget = getWidget (user_data);
-// 	if (widget is null) return 0;
-// 	return widget.sizeRequestProc (handle, arg0, user_data);
-// }
-//
-// int /*long*/ treeSelectionProcMeth (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int /*long*/ data) {
-// 	Widget widget = getWidget (data);
-// 	if (widget is null) return 0;
-// 	return widget.treeSelectionProc (model, path, iter, treeSelection, treeSelectionLength++);
-// }
-//
-// void saveResources () {
-// 	int resourceCount = 0;
-// 	if (resources is null) {
-// 		resources = new Resource [RESOURCE_SIZE];
-// 	} else {
-// 		resourceCount = resources.length;
-// 		Resource [] newResources = new Resource [resourceCount + RESOURCE_SIZE];
-// 		System.arraycopy (resources, 0, newResources, 0, resourceCount);
-// 		resources = newResources;
-// 	}
-// 	if (systemFont !is null) {
-// 		resources [resourceCount++] = systemFont;
-// 		systemFont = null;
-// 	}
-// 	if (errorImage !is null) resources [resourceCount++] = errorImage;
-// 	if (infoImage !is null) resources [resourceCount++] = infoImage;
-// 	if (questionImage !is null) resources [resourceCount++] = questionImage;
-// 	if (warningImage !is null) resources [resourceCount++] = warningImage;
-// 	errorImage = infoImage = questionImage = warningImage = null;
-// 	for (int i=0; i<cursors.length; i++) {
-// 		if (cursors [i] !is null) resources [resourceCount++] = cursors [i];
-// 		cursors [i] = null;
-// 	}
-// 	if (resourceCount < RESOURCE_SIZE) {
-// 		Resource [] newResources = new Resource [resourceCount];
-// 		System.arraycopy (resources, 0, newResources, 0, resourceCount);
-// 		resources = newResources;
-// 	}
-// }
-//
+/**
+ * Releases any internal resources back to the operating
+ * system and clears all fields except the device handle.
+ * <p>
+ * Disposes all shells which are currently open on the display.
+ * After this method has been invoked, all related related shells
+ * will answer <code>true</code> when sent the message
+ * <code>isDisposed()</code>.
+ * </p><p>
+ * When a device is destroyed, resources that were acquired
+ * on behalf of the programmer need to be returned to the
+ * operating system.  For example, if the device allocated a
+ * font to be used as the system font, this font would be
+ * freed in <code>release</code>.  Also,to assist the garbage
+ * collector and minimize the amount of memory that is not
+ * reclaimed when the programmer keeps a reference to a
+ * disposed device, all fields except the handle are zero'd.
+ * The handle is needed by <code>destroy</code>.
+ * </p>
+ * This method is called before <code>destroy</code>.
+ *
+ * @see Device#dispose
+ * @see #destroy
+ */
+protected void release () {
+	sendEvent (SWT.Dispose, new Event ());
+	Shell [] shells = getShells ();
+	for (int i=0; i<shells.length; i++) {
+		Shell shell = shells [i];
+		if (!shell.isDisposed ())  shell.dispose ();
+	}
+	if (tray !is null) tray.dispose ();
+	tray = null;
+	while (readAndDispatch ()) {}
+	if (disposeList !is null) {
+		for (int i=0; i<disposeList.length; i++) {
+			if (disposeList [i] !is null) disposeList [i].run ();
+		}
+	}
+	disposeList = null;
+	synchronizer.releaseSynchronizer ();
+	synchronizer = null;
+	releaseDisplay ();
+	super.release ();
+}
+
+void releaseDisplay () {
+
+	/* Dispose xfilter callback */
+
+	/* Dispose checkIfEvent callback */
+
+	/* Dispose preedit window */
+	if (preeditWindow !is null) OS.gtk_widget_destroy ( &preeditWindow.bin.container.widget);
+	imControl = null;
+
+	/* Dispose the menu callback */
+
+	/* Dispose the tooltip map callback */
+
+	/* Dispose the shell map callback */
+
+	/* Dispose the run async messages callback */
+	if (idleHandle !is 0) OS.g_source_remove (idleHandle);
+	idleHandle = 0;
+
+	/* Dispose GtkTreeView callbacks */
+
+	/* Dispose the set direction callback */
+
+	/* Dispose the set direction callback */
+
+	/* Dispose the caret callback */
+	if (caretId !is 0) OS.gtk_timeout_remove (caretId);
+	caretId = 0;
+
+	/* Release closures */
+	for (int i = 0; i < Widget.LAST_SIGNAL; i++) {
+		if (closures [i] !is null) OS.g_closure_unref (closures [i]);
+	}
+	if (shellMapProcClosure !is null) OS.g_closure_unref (shellMapProcClosure);
+
+	/* Dispose the timer callback */
+	if (timerIds !is null) {
+		for (int i=0; i<timerIds.length; i++) {
+			if (timerIds [i] !is 0) OS.gtk_timeout_remove (timerIds [i]);
+		}
+	}
+	timerIds = null;
+	timerList = null;
+
+	/* Dispose mouse hover callback */
+	if (mouseHoverId !is 0) OS.gtk_timeout_remove (mouseHoverId);
+	mouseHoverId = 0;
+	mouseHoverHandle = null;
+
+	/* Dispose the default font */
+	if (systemFont !is null) systemFont.dispose ();
+	systemFont = null;
+
+	/* Dispose the System Images */
+	if (errorImage !is null) errorImage.dispose();
+	if (infoImage !is null) infoImage.dispose();
+	if (questionImage !is null) questionImage.dispose();
+	if (warningImage !is null) warningImage.dispose();
+	errorImage = infoImage = questionImage = warningImage = null;
+
+	/* Release the System Cursors */
+	for (int i = 0; i < cursors.length; i++) {
+		if (cursors [i] !is null) cursors [i].dispose ();
+	}
+	cursors = null;
+
+	/* Release Acquired Resources */
+	if (resources !is null) {
+		for (int i=0; i<resources.length; i++) {
+			if (resources [i] !is null) resources [i].dispose ();
+		}
+		resources = null;
+	}
+
+	/* Release the System Colors */
+	COLOR_WIDGET_DARK_SHADOW = COLOR_WIDGET_NORMAL_SHADOW = COLOR_WIDGET_LIGHT_SHADOW =
+	COLOR_WIDGET_HIGHLIGHT_SHADOW = COLOR_WIDGET_BACKGROUND = COLOR_WIDGET_BORDER =
+	COLOR_LIST_FOREGROUND = COLOR_LIST_BACKGROUND = COLOR_LIST_SELECTION = COLOR_LIST_SELECTION_TEXT =
+	COLOR_INFO_BACKGROUND = COLOR_INFO_FOREGROUND = null;
+
+	/* Dispose the event callback */
+	OS.gdk_event_handler_set (null, null, cast(GDestroyNotify) 0);
+
+	/* Dispose the hidden shell */
+	if (shellHandle !is null) OS.gtk_widget_destroy (shellHandle);
+	shellHandle = null;
+
+	/* Dispose the settings callback */
+
+	/* Release the sleep resources */
+	max_priority = 0;
+    timeout = 0;
+	if (fds !is null) OS.g_free (fds.ptr);
+	fds = null;
+
+	/* Release references */
+	popups = null;
+	thread = null;
+	activeShell = null;
+	lastWidget = null;
+	indexTable = null;
+	widgetTable = null;
+}
+
+/**
+ * Removes the listener from the collection of listeners who will
+ * be notified when an event of the given type occurs anywhere in
+ * a widget. The event type is one of the event constants defined
+ * in class <code>SWT</code>.
+ *
+ * @param eventType the type of event to listen for
+ * @param listener the listener which should no longer be notified when the event occurs
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Listener
+ * @see SWT
+ * @see #addFilter
+ * @see #addListener
+ *
+ * @since 3.0
+ */
+public void removeFilter (int eventType, Listener listener) {
+	checkDevice ();
+	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (filterTable is null) return;
+	filterTable.unhook (eventType, listener);
+	if (filterTable.size () is 0) filterTable = null;
+}
+
+GdkEvent* removeGdkEvent () {
+	if (gdkEventCount is 0) return null;
+	auto event = gdkEvents [0];
+	--gdkEventCount;
+	SimpleType!(GdkEvent*).arraycopy (gdkEvents, 1, gdkEvents, 0, gdkEventCount);
+	System.arraycopy (gdkEventWidgets, 1, gdkEventWidgets, 0, gdkEventCount);
+	gdkEvents [gdkEventCount] = null;
+	gdkEventWidgets [gdkEventCount] = null;
+	if (gdkEventCount is 0) {
+		gdkEvents = null;
+		gdkEventWidgets = null;
+	}
+	return event;
+}
+
+void removeIdleProc () {
+	synchronized(idleLock) {
+		if (idleHandle !is 0) OS.g_source_remove (idleHandle);
+		idleNeeded = false;
+		idleHandle = 0;
+	}
+}
+/**
+ * Removes the listener from the collection of listeners who will
+ * be notified when an event of the given type occurs. The event type
+ * is one of the event constants defined in class <code>SWT</code>.
+ *
+ * @param eventType the type of event to listen for
+ * @param listener the listener which should no longer be notified when the event occurs
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see Listener
+ * @see SWT
+ * @see #addListener
+ *
+ * @since 2.0
+ */
+public void removeListener (int eventType, Listener listener) {
+	checkDevice ();
+	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable is null) return;
+	eventTable.unhook (eventType, listener);
+}
+
+void removeMouseHoverTimeout (void* handle) {
+	if (handle !is mouseHoverHandle) return;
+	if (mouseHoverId !is 0) OS.gtk_timeout_remove (mouseHoverId);
+	mouseHoverId = 0;
+	mouseHoverHandle = null;
+}
+
+void removePopup (Menu menu) {
+	if (popups is null) return;
+	for (int i=0; i<popups.length; i++) {
+		if (popups [i] is menu) {
+			popups [i] = null;
+			return;
+		}
+	}
+}
+
+Widget removeWidget (GtkWidget* handle) {
+	if (handle is null) return null;
+	lastWidget = null;
+	Widget widget = null;
+	int index = cast(int)/*64*/ OS.g_object_get_qdata (cast(GObject*)handle, SWT_OBJECT_INDEX) - 1;
+	if (0 <= index && index < widgetTable.length) {
+		widget = widgetTable [index];
+		widgetTable [index] = null;
+		indexTable [index] = freeSlot;
+		freeSlot = index;
+		OS.g_object_set_qdata (cast(GObject*)handle, SWT_OBJECT_INDEX, null);
+	}
+	return widget;
+}
+
+bool runAsyncMessages (bool all) {
+	return synchronizer.runAsyncMessages (all);
+}
+
+bool runDeferredEvents () {
+	/*
+	* Run deferred events.  This code is always
+	* called in the Display's thread so it must
+	* be re-enterant but need not be synchronized.
+	*/
+	while (eventQueue !is null) {
+
+		/* Take an event off the queue */
+		Event event = eventQueue [0];
+		if (event is null) break;
+		int len = eventQueue.length;
+		System.arraycopy (eventQueue, 1, eventQueue, 0, --len);
+		eventQueue [len] = null;
+
+		/* Run the event */
+		Widget widget = event.widget;
+		if (widget !is null && !widget.isDisposed ()) {
+			Widget item = event.item;
+			if (item is null || !item.isDisposed ()) {
+				widget.sendEvent (event);
+			}
+		}
+
+		/*
+		* At this point, the event queue could
+		* be null due to a recursive invokation
+		* when running the event.
+		*/
+	}
+
+	/* Clear the queue */
+	eventQueue = null;
+	return true;
+}
+
+bool runPopups () {
+	if (popups is null) return false;
+	bool result = false;
+	while (popups !is null) {
+		Menu menu = popups [0];
+		if (menu is null) break;
+		int len = popups.length;
+		System.arraycopy (popups, 1, popups, 0, --len);
+		popups [len] = null;
+		runDeferredEvents ();
+		if (!menu.isDisposed ()) menu._setVisible (true);
+		result = true;
+	}
+	popups = null;
+	return result;
+}
+
+bool runSettings () {
+	if (!runSettingsFld) return false;
+	runSettingsFld = false;
+	saveResources ();
+	initializeSystemColors ();
+	sendEvent (SWT.Settings, null);
+	Shell [] shells = getShells ();
+	for (int i=0; i<shells.length; i++) {
+		Shell shell = shells [i];
+		if (!shell.isDisposed ()) {
+			shell.fixStyle ();
+			shell.redraw (true);
+			shell.layout (true, true);
+		}
+	}
+	return true;
+}
+
+/**
+ * On platforms which support it, sets the application name
+ * to be the argument. On Motif, for example, this can be used
+ * to set the name used for resource lookup.  Specifying
+ * <code>null</code> for the name clears it.
+ *
+ * @param name the new app name or <code>null</code>
+ */
+public static void setAppName (char[] name) {
+	APP_NAME = name;
+}
+
+/**
+ * Sets the location of the on-screen pointer relative to the top left corner
+ * of the screen.  <b>Note: It is typically considered bad practice for a
+ * program to move the on-screen pointer location.</b>
+ *
+ * @param x the new x coordinate for the cursor
+ * @param y the new y coordinate for the cursor
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.1
+ */
+public void setCursorLocation (int x, int y) {
+	checkDevice ();
+	if (OS.GDK_WINDOWING_X11 ()) {
+		auto xDisplay = OS.GDK_DISPLAY ();
+		auto xWindow = OS.XDefaultRootWindow (xDisplay);
+		OS.XWarpPointer (xDisplay, OS.None, xWindow, 0, 0, 0, 0, x, y);
+	}
+}
+
+/**
+ * Sets the location of the on-screen pointer relative to the top left corner
+ * of the screen.  <b>Note: It is typically considered bad practice for a
+ * program to move the on-screen pointer location.</b>
+ *
+ * @param point new position
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_NULL_ARGUMENT - if the point is null
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @since 2.0
+ */
+public void setCursorLocation (Point point) {
+	checkDevice ();
+	if (point is null) error (SWT.ERROR_NULL_ARGUMENT);
+	setCursorLocation (point.x, point.y);
+}
+
+/**
+ * Sets the application defined property of the receiver
+ * with the specified name to the given argument.
+ * <p>
+ * Applications may have associated arbitrary objects with the
+ * receiver in this fashion. If the objects stored in the
+ * properties need to be notified when the display is disposed
+ * of, it is the application's responsibility provide a
+ * <code>disposeExec()</code> handler which does so.
+ * </p>
+ *
+ * @param key the name of the property
+ * @param value the new value for the property
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #getData(String)
+ * @see #disposeExec(Runnable)
+ */
+public void setData (char[] key, Object value) {
+	checkDevice ();
+	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
+
+	if (key==/*eq*/ DISPATCH_EVENT_KEY) {
+        ArrayWrapperInt wrappedValue;
+		if (value is null || (null !is (wrappedValue=cast(ArrayWrapperInt)value))) {
+			dispatchEvents = wrappedValue.array;
+			if (value is null) putGdkEvents ();
+			return;
+		}
+	}
+
+	if (key==/*eq*/ ADD_WIDGET_KEY) {
+        auto wrap = cast(ArrayWrapperObject) value;
+        if( wrap is null ) SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, " []");
+        Object [] data = wrap.array;
+		auto handle = (cast(LONG) data [0]).value;
+		Widget widget = cast(Widget) data [1];
+		if (widget !is null) {
+			addWidget (handle, widget);
+		} else {
+			removeWidget (cast(GtkWidget*)handle);
+		}
+	}
+
+	if (key==/*eq*/ ADD_IDLE_PROC_KEY) {
+		addIdleProc ();
+		return;
+	}
+	if (key==/*eq*/ REMOVE_IDLE_PROC_KEY) {
+		removeIdleProc ();
+		return;
+	}
+
+	/* Remove the key/value pair */
+	if (value is null) {
+		if (keys is null) return;
+		int index = 0;
+		while (index < keys.length && keys [index]!=/*!eq*/ key) index++;
+		if (index is keys.length) return;
+		if (keys.length is 1) {
+			keys = null;
+			values = null;
+		} else {
+			char[] [] newKeys = new char[] [keys.length - 1];
+			Object [] newValues = new Object [values.length - 1];
+			System.arraycopy (keys, 0, newKeys, 0, index);
+			System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index);
+			System.arraycopy (values, 0, newValues, 0, index);
+			System.arraycopy (values, index + 1, newValues, index, newValues.length - index);
+			keys = newKeys;
+			values = newValues;
+		}
+		return;
+	}
+
+	/* Add the key/value pair */
+	if (keys is null) {
+		keys = [key];
+		values = [value];
+		return;
+	}
+	for (int i=0; i<keys.length; i++) {
+		if (keys [i]==/*eq*/ key) {
+			values [i] = value;
+			return;
+		}
+	}
+	char[] [] newKeys = new char[] [keys.length + 1];
+	Object [] newValues = new Object [values.length + 1];
+	System.arraycopy (keys, 0, newKeys, 0, keys.length);
+	System.arraycopy (values, 0, newValues, 0, values.length);
+	newKeys [keys.length] = key;
+	newValues [values.length] = value;
+	keys = newKeys;
+	values = newValues;
+}
+
+/**
+ * Sets the application defined, display specific data
+ * associated with the receiver, to the argument.
+ * The <em>display specific data</em> is a single,
+ * unnamed field that is stored with every display.
+ * <p>
+ * Applications may put arbitrary objects in this field. If
+ * the object stored in the display specific data needs to
+ * be notified when the display is disposed of, it is the
+ * application's responsibility provide a
+ * <code>disposeExec()</code> handler which does so.
+ * </p>
+ *
+ * @param data the new display specific data
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #getData()
+ * @see #disposeExec(Runnable)
+ */
+public void setData (Object data) {
+	checkDevice ();
+	this.data = data;
+}
+
+private static extern(C) int /*long*/ setDirectionProcFunc (GtkWidget* widget, void* direction) {
+    return setDirectionProc( widget, cast(int)direction );
+}
+static int /*long*/ setDirectionProc (GtkWidget* widget, int /*long*/ direction) {
+	OS.gtk_widget_set_direction (widget, cast(GtkTextDirection) direction);
+	if (OS.GTK_IS_CONTAINER (widget)) {
+		OS.gtk_container_forall (cast(GtkContainer*)widget, cast(GtkCallback)&setDirectionProcFunc, cast(void*)direction);
+	}
+	return 0;
+}
+
+/**
+ * Sets the synchronizer used by the display to be
+ * the argument, which can not be null.
+ *
+ * @param synchronizer the new synchronizer for the display (must not be null)
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
+ * </ul>
+ */
+public void setSynchronizer (Synchronizer synchronizer) {
+	checkDevice ();
+	if (synchronizer is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (this.synchronizer !is null) {
+		this.synchronizer.runAsyncMessages(true);
+	}
+	this.synchronizer = synchronizer;
+}
+
+void showIMWindow (Control control) {
+	imControl = control;
+	if (preeditWindow is null) {
+		preeditWindow = cast(GtkWindow*)OS.gtk_window_new (cast(GtkWindowType)OS.GTK_WINDOW_POPUP);
+		if (preeditWindow is null) error (SWT.ERROR_NO_HANDLES);
+		preeditLabel = cast(GtkLabel*) OS.gtk_label_new (null);
+		if (preeditLabel is null) error (SWT.ERROR_NO_HANDLES);
+		OS.gtk_container_add (cast(GtkContainer*)preeditWindow, cast(GtkWidget*) preeditLabel);
+		OS.gtk_widget_show (cast(GtkWidget*)preeditLabel);
+	}
+	char* preeditString;
+	PangoAttrList* pangoAttrs;
+	auto imHandle = control.imHandle ();
+	OS.gtk_im_context_get_preedit_string (imHandle, &preeditString, &pangoAttrs, null);
+	if (preeditString !is null && strlen (preeditString) > 0) {
+		Control widget = control.findBackgroundControl ();
+		if (widget is null) widget = control;
+		OS.gtk_widget_modify_bg (cast(GtkWidget*)preeditWindow, cast(GtkStateType) OS.GTK_STATE_NORMAL, widget.getBackgroundColor ());
+		widget.setForegroundColor (cast(GtkWidget*)preeditLabel, control.getForegroundColor());
+		OS.gtk_widget_modify_font (cast(GtkWidget*)preeditLabel, control.getFontDescription ());
+		if (pangoAttrs !is null) OS.gtk_label_set_attributes (preeditLabel, pangoAttrs);
+		OS.gtk_label_set_text (preeditLabel, preeditString);
+		Point point = control.toDisplay (control.getIMCaretPos ());
+		OS.gtk_window_move (preeditWindow, point.x, point.y);
+		GtkRequisition* requisition = new GtkRequisition ();
+		OS.gtk_widget_size_request (cast(GtkWidget*)preeditLabel, requisition);
+		OS.gtk_window_resize (preeditWindow, requisition.width, requisition.height);
+		OS.gtk_widget_show (cast(GtkWidget*)preeditWindow);
+	} else {
+		OS.gtk_widget_hide (cast(GtkWidget*)preeditWindow);
+	}
+	if (preeditString !is null) OS.g_free (preeditString);
+	if (pangoAttrs !is null) OS.pango_attr_list_unref (pangoAttrs);
+}
+
+/**
+ * Causes the user-interface thread to <em>sleep</em> (that is,
+ * to be put in a state where it does not consume CPU cycles)
+ * until an event is received or it is otherwise awakened.
+ *
+ * @return <code>true</code> if an event requiring dispatching was placed on the queue.
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #wake
+ */
+public bool sleep () {
+	checkDevice ();
+	if (gdkEventCount is 0) {
+		gdkEvents = null;
+		gdkEventWidgets = null;
+	}
+	if (settingsChanged) {
+		settingsChanged = false;
+		runSettingsFld = true;
+		return false;
+	}
+	if (getMessageCount () !is 0) return true;
+	if (fds is null) {
+		allocated_nfds = 2;
+		fds = new GPollFD[ allocated_nfds ];
+	}
+	max_priority = timeout = 0;
+	auto context = OS.g_main_context_default ();
+	bool result = false;
+	do {
+		if (OS.g_main_context_acquire (context)) {
+			result = cast(bool)OS.g_main_context_prepare (context, &max_priority);
+			int nfds;
+			while ((nfds = OS.g_main_context_query (context, max_priority, &timeout, fds.ptr, allocated_nfds)) > allocated_nfds) {
+				OS.g_free (fds.ptr);
+				allocated_nfds = nfds;
+				fds = new GPollFD[allocated_nfds];
+			}
+			GPollFunc poll = OS.g_main_context_get_poll_func (context);
+			if (poll !is null) {
+				if (nfds > 0 || timeout !is 0) {
+					/*
+					* Bug in GTK. For some reason, g_main_context_wakeup() may
+					* fail to wake up the UI thread from the polling function.
+					* The fix is to sleep for a maximum of 50 milliseconds.
+					*/
+					if (timeout < 0) timeout = 50;
+
+					/* Exit the OS lock to allow other threads to enter GTK */
+					Lock lock = OS.lock;
+					int count = lock.lock ();
+					for (int i = 0; i < count; i++) lock.unlock ();
+					try {
+						wake_state = false;
+						poll( fds.ptr, nfds, timeout);
+					} finally {
+						for (int i = 0; i < count; i++) lock.lock ();
+						lock.unlock ();
+					}
+				}
+			}
+			OS.g_main_context_check (context, max_priority, fds.ptr, nfds);
+			OS.g_main_context_release (context);
+		}
+	} while (!result && getMessageCount () is 0 && !wake_state);
+	wake_state = false;
+	return true;
+}
+
+/**
+ * Causes the <code>run()</code> method of the runnable to
+ * be invoked by the user-interface thread after the specified
+ * number of milliseconds have elapsed. If milliseconds is less
+ * than zero, the runnable is not executed.
+ * <p>
+ * Note that at the time the runnable is invoked, widgets
+ * that have the receiver as their display may have been
+ * disposed. Therefore, it is necessary to check for this
+ * case inside the runnable before accessing the widget.
+ * </p>
+ *
+ * @param milliseconds the delay before running the runnable
+ * @param runnable code to run on the user-interface thread
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
+ * </ul>
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #asyncExec
+ */
+public void timerExec (int milliseconds, Runnable runnable) {
+	checkDevice ();
+	if (runnable is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (timerList is null) timerList = new Runnable [4];
+	if (timerIds is null) timerIds = new int [4];
+	int index = 0;
+	while (index < timerList.length) {
+		if (timerList [index] is runnable) break;
+		index++;
+	}
+	if (index !is timerList.length) {
+		OS.gtk_timeout_remove (timerIds [index]);
+		timerList [index] = null;
+		timerIds [index] = 0;
+		if (milliseconds < 0) return;
+	} else {
+		if (milliseconds < 0) return;
+		index = 0;
+		while (index < timerList.length) {
+			if (timerList [index] is null) break;
+			index++;
+		}
+		if (index is timerList.length) {
+			Runnable [] newTimerList = new Runnable [timerList.length + 4];
+			SimpleType!(Runnable).arraycopy (timerList, 0, newTimerList, 0, timerList.length);
+			timerList = newTimerList;
+			int [] newTimerIds = new int [timerIds.length + 4];
+			System.arraycopy (timerIds, 0, newTimerIds, 0, timerIds.length);
+			timerIds = newTimerIds;
+		}
+	}
+    timerProcCallbackData.display = this;
+    timerProcCallbackData.data = cast(void*)index;
+	int timerId = OS.gtk_timeout_add (milliseconds, &timerProcFunc, &timerProcCallbackData);
+	if (timerId !is 0) {
+		timerIds [index] = timerId;
+		timerList [index] = runnable;
+	}
+}
+
+private static extern(C) int timerProcFunc ( void * data ) {
+    CallbackData* cbdata = cast( CallbackData* ) data;
+    return cbdata.display.timerProc( cast(int) cbdata.data );
+}
+
+int /*long*/ timerProc (int /*long*/ i) {
+	if (timerList is null) return 0;
+	int index = cast(int)/*64*/i;
+	if (0 <= index && index < timerList.length) {
+		Runnable runnable = timerList [index];
+		timerList [index] = null;
+		timerIds [index] = 0;
+		if (runnable !is null) runnable.run ();
+	}
+	return 0;
+}
+
+private static extern(C) int caretProcFunc ( void * data ) {
+    CallbackData* cbdata = cast( CallbackData* ) data;
+    return cbdata.display.caretProc( cast(int) cbdata.data );
+}
+int /*long*/ caretProc (int /*long*/ clientData) {
+	caretId = 0;
+	if (currentCaret is null) {
+		return 0;
+	}
+	if (currentCaret.blinkCaret()) {
+		int blinkRate = currentCaret.blinkRate;
+		if (blinkRate is 0) return 0;
+        caretProcCallbackData.display = this;
+        caretProcCallbackData.data = cast(void*)0;
+		caretId = OS.gtk_timeout_add (blinkRate, &caretProcFunc, &caretProcCallbackData);
+	} else {
+		currentCaret = null;
+	}
+	return 0;
+}
+
+int /*long*/ sizeAllocateProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+	Widget widget = getWidget ( cast(GtkWidget*)user_data);
+	if (widget is null) return 0;
+	return widget.sizeAllocateProc (handle, arg0, user_data);
+}
+
+int /*long*/ sizeRequestProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+	Widget widget = getWidget (cast(GtkWidget*)user_data);
+	if (widget is null) return 0;
+	return widget.sizeRequestProc (handle, arg0, user_data);
+}
+
+int /*long*/ treeSelectionProcMeth (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int /*long*/ data) {
+	Widget widget = getWidget (cast(GtkWidget*)data);
+	if (widget is null) return 0;
+	return widget.treeSelectionProc (model, path, iter, treeSelection, treeSelectionLength++);
+}
+
+void saveResources () {
+	int resourceCount = 0;
+	if (resources is null) {
+		resources = new Resource [RESOURCE_SIZE];
+	} else {
+		resourceCount = resources.length;
+		Resource [] newResources = new Resource [resourceCount + RESOURCE_SIZE];
+		System.arraycopy (resources, 0, newResources, 0, resourceCount);
+		resources = newResources;
+	}
+	if (systemFont !is null) {
+		resources [resourceCount++] = systemFont;
+		systemFont = null;
+	}
+	if (errorImage !is null) resources [resourceCount++] = errorImage;
+	if (infoImage !is null) resources [resourceCount++] = infoImage;
+	if (questionImage !is null) resources [resourceCount++] = questionImage;
+	if (warningImage !is null) resources [resourceCount++] = warningImage;
+	errorImage = infoImage = questionImage = warningImage = null;
+	for (int i=0; i<cursors.length; i++) {
+		if (cursors [i] !is null) resources [resourceCount++] = cursors [i];
+		cursors [i] = null;
+	}
+	if (resourceCount < RESOURCE_SIZE) {
+		Resource [] newResources = new Resource [resourceCount];
+		System.arraycopy (resources, 0, newResources, 0, resourceCount);
+		resources = newResources;
+	}
+}
+
 void sendEvent (int eventType, Event event) {
-// 	if (eventTable is null && filterTable is null) {
-// 		return;
-// 	}
-// 	if (event is null) event = new Event ();
-// 	event.display = this;
-// 	event.type = eventType;
-// 	if (event.time is 0) event.time = getLastEventTime ();
-// 	if (!filterEvent (event)) {
-// 		if (eventTable !is null) eventTable.sendEvent (event);
-// 	}
+	if (eventTable is null && filterTable is null) {
+		return;
+	}
+	if (event is null) event = new Event ();
+	event.display = this;
+	event.type = eventType;
+	if (event.time is 0) event.time = getLastEventTime ();
+	if (!filterEvent (event)) {
+		if (eventTable !is null) eventTable.sendEvent (event);
+	}
+}
+
+void setCurrentCaret (Caret caret) {
+	if (caretId !is 0) OS.gtk_timeout_remove(caretId);
+	caretId = 0;
+	currentCaret = caret;
+	if (caret is null) return;
+	int blinkRate = currentCaret.blinkRate;
+    caretProcCallbackData.display = this;
+    caretProcCallbackData.data = cast(void*)0;
+	caretId = OS.gtk_timeout_add (blinkRate, &caretProcFunc, &caretProcCallbackData);
+}
+
+private static extern(C) int /*long*/ shellMapProcFunc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+    auto cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.shellMapProc( handle, arg0, cast(int)cbdata.data );
+}
+
+int /*long*/ shellMapProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+	Widget widget = getWidget (cast(GtkWidget*)handle);
+	if (widget is null) return 0;
+	return widget.shellMapProc (handle, arg0, user_data);
+}
+
+private static extern(C) int /*long*/ styleSetProcFunc (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) {
+    auto cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.styleSetProcMeth( gobject, arg1, cast(int)cbdata.data );
+}
+int /*long*/ styleSetProcMeth (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) {
+	settingsChanged = true;
+	return 0;
+}
+
+/**
+ * Causes the <code>run()</code> method of the runnable to
+ * be invoked by the user-interface thread at the next
+ * reasonable opportunity. The thread which calls this method
+ * is suspended until the runnable completes.  Specifying <code>null</code>
+ * as the runnable simply wakes the user-interface thread.
+ * <p>
+ * Note that at the time the runnable is invoked, widgets
+ * that have the receiver as their display may have been
+ * disposed. Therefore, it is necessary to check for this
+ * case inside the runnable before accessing the widget.
+ * </p>
+ *
+ * @param runnable code to run on the user-interface thread or <code>null</code>
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #asyncExec
+ */
+public void syncExec (Runnable runnable) {
+	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+	synchronized (idleLock) {
+		if (idleNeeded && idleHandle is 0) {
+			//NOTE: calling unlocked function in OS
+            idleProcCallbackData.display = this;
+            idleProcCallbackData.data = cast(void*)0;
+            //PORTING_TODO: was _g_idle_add, calling directly
+			idleHandle = OS.g_idle_add (&idleProcFunc, &idleProcCallbackData);
+		}
+	}
+	synchronizer.syncExec (runnable);
+}
+
+static int translateKey (int key) {
+	for (int i=0; i<KeyTable.length; i++) {
+		if (KeyTable [i] [0] is key) return KeyTable [i] [1];
+	}
+	return 0;
+}
+
+static int untranslateKey (int key) {
+	for (int i=0; i<KeyTable.length; i++) {
+		if (KeyTable [i] [1] is key) return KeyTable [i] [0];
+	}
+	return 0;
 }
-//
-// void setCurrentCaret (Caret caret) {
-// 	if (caretId !is null) OS.gtk_timeout_remove(caretId);
-// 	caretId = 0;
-// 	currentCaret = caret;
-// 	if (caret is null) return;
-// 	int blinkRate = currentCaret.blinkRate;
-// 	caretId = OS.gtk_timeout_add (blinkRate, caretProc, 0);
-// }
-//
-// int /*long*/ shellMapProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.shellMapProc (handle, arg0, user_data);
-// }
-//
-// int /*long*/ styleSetProcMeth (int /*long*/ gobject, int /*long*/ arg1, int /*long*/ user_data) {
-// 	settingsChanged = true;
-// 	return 0;
-// }
-//
-// /**
-//  * Causes the <code>run()</code> method of the runnable to
-//  * be invoked by the user-interface thread at the next
-//  * reasonable opportunity. The thread which calls this method
-//  * is suspended until the runnable completes.  Specifying <code>null</code>
-//  * as the runnable simply wakes the user-interface thread.
-//  * <p>
-//  * Note that at the time the runnable is invoked, widgets
-//  * that have the receiver as their display may have been
-//  * disposed. Therefore, it is necessary to check for this
-//  * case inside the runnable before accessing the widget.
-//  * </p>
-//  *
-//  * @param runnable code to run on the user-interface thread or <code>null</code>
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #asyncExec
-//  */
-// public void syncExec (Runnable runnable) {
-// 	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-// 	synchronized (idleLock) {
-// 		if (idleNeeded && idleHandle is null) {
-// 			//NOTE: calling unlocked function in OS
-// 			idleHandle = OS._g_idle_add (idleProc, 0);
-// 		}
-// 	}
-// 	synchronizer.syncExec (runnable);
-// }
-//
-// static int translateKey (int key) {
-// 	for (int i=0; i<KeyTable.length; i++) {
-// 		if (KeyTable [i] [0] is key) return KeyTable [i] [1];
-// 	}
-// 	return 0;
-// }
-//
-// static int untranslateKey (int key) {
-// 	for (int i=0; i<KeyTable.length; i++) {
-// 		if (KeyTable [i] [1] is key) return KeyTable [i] [0];
-// 	}
-// 	return 0;
-// }
-//
-// /**
-//  * Forces all outstanding paint requests for the display
-//  * to be processed before this method returns.
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see Control#update()
-//  */
-// public void update () {
-// 	checkDevice ();
-// 	flushExposes (0, true);
-// 	OS.gdk_window_process_all_updates ();
-// }
-//
-// /**
-//  * If the receiver's user-interface thread was <code>sleep</code>ing,
-//  * causes it to be awakened and start running again. Note that this
-//  * method may be called from any thread.
-//  *
-//  * @exception SWTException <ul>
-//  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
-//  * </ul>
-//  *
-//  * @see #sleep
-//  */
-// public void wake () {
-// 	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
-// 	if (thread is Thread.currentThread ()) return;
-// 	wakeThread ();
-// }
-//
-// void wakeThread () {
-// 	OS.g_main_context_wakeup (0);
-// 	wake_state = true;
-// }
-//
-// static char wcsToMbcs (char ch) {
-// 	int key = ch & 0xFFFF;
-// 	if (key <= 0x7F) return ch;
-// 	byte [] buffer = Converter.wcsToMbcs (null,[ch], false);
-// 	if (buffer.length is 1) return cast(char) buffer [0];
-// 	if (buffer.length is 2) {
-// 		return cast(char) (((buffer [0] & 0xFF) << 8) | (buffer [1] & 0xFF));
-// 	}
-// 	return 0;
-// }
+
+/**
+ * Forces all outstanding paint requests for the display
+ * to be processed before this method returns.
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see Control#update()
+ */
+public void update () {
+	checkDevice ();
+	flushExposes (null, true);
+	OS.gdk_window_process_all_updates ();
+}
+
+/**
+ * If the receiver's user-interface thread was <code>sleep</code>ing,
+ * causes it to be awakened and start running again. Note that this
+ * method may be called from any thread.
+ *
+ * @exception SWTException <ul>
+ *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+ * </ul>
+ *
+ * @see #sleep
+ */
+public void wake () {
+	if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+	if (thread is Thread.getThis ()) return;
+	wakeThread ();
+}
+
+void wakeThread () {
+	OS.g_main_context_wakeup (null);
+	wake_state = true;
+}
+
+static dchar wcsToMbcs (char ch) {
+    //PORTING_TODO not sure about this
+	int key = ch & 0xFFFF;
+	if (key <= 0x7F) return ch;
+	char [] buffer = Converter.wcsToMbcs (null,[ch], false);
+	if (buffer.length is 1) return '\0';
+	if (buffer.length is 2) {
+        return cast(char) (((buffer [0] & 0xFF) << 8) | (buffer [1] & 0xFF));
+	}
+	return '\0';
+}
 
-// int /*long*/ windowProcMeth (GtkWidget* handle, int /*long*/ user_data) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.windowProc (handle, user_data);
-// }
-//
-// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.windowProc (handle, arg0, user_data);
-// }
-//
-// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.windowProc (handle, arg0, arg1, user_data);
-// }
-//
-// int /*long*/ windowProcMeth (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.windowProc (handle, arg0, arg1, arg2, user_data);
-// }
-//
-// int /*long*/ windowTimerProcMeth (int /*long*/ handle) {
-// 	Widget widget = getWidget (handle);
-// 	if (widget is null) return 0;
-// 	return widget.timerProc (handle);
-// }
+private static extern(C) int /*long*/ windowProcFunc2 (GtkWidget* handle, int /*long*/ user_data) {
+    CallbackData* cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.windowProc( handle, cast(int)cbdata.data );
+}
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.windowProc (handle, user_data);
+}
+
+private static extern(C) int /*long*/ windowProcFunc3 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+    CallbackData* cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, cast(int)cbdata.data );
+}
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.windowProc (handle, arg0, user_data);
+}
+
+private static extern(C) int /*long*/ windowProcFunc4 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) {
+    CallbackData* cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, arg1, cast(int)cbdata.data );
+}
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.windowProc (handle, arg0, arg1, user_data);
+}
+
+private static extern(C) int /*long*/ windowProcFunc5 (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) {
+    CallbackData* cbdata = cast(CallbackData*)user_data;
+    return cbdata.display.windowProc( cast(GtkWidget*)handle, arg0, arg1, arg2, cast(int)cbdata.data );
+}
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.windowProc (handle, arg0, arg1, arg2, user_data);
+}
+
+private static extern(C) int /*long*/ windowTimerProcFunc (int /*long*/ handle) {
+    //PORTING_TODO ??
+    return 0;
+//    CallbackData* cbdata = cast(CallbackData*)user_data;
+//    return cbdata.display.windowTimerProc( handle, cast(int)cbdata.data );
+}
+int /*long*/ windowTimerProc (GtkWidget* handle) {
+	Widget widget = getWidget (handle);
+	if (widget is null) return 0;
+	return widget.timerProc (handle);
+}
 
 }
--- a/dwt/widgets/EventTable.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/EventTable.d	Wed Jan 09 01:08:22 2008 +0100
@@ -17,6 +17,8 @@
     public void hook (int eventType, Listener listener) {}
     public void sendEvent (Event event) ;
     public bool hooks (int eventType) ;
+    public void unhook (int eventType, Listener listener) ;
+    public int size () ;
 }
 
 /+++
--- a/dwt/widgets/Menu.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Menu.d	Wed Jan 09 01:08:22 2008 +0100
@@ -10,7 +10,11 @@
  *******************************************************************************/
 module dwt.widgets.Menu;
 
-class Menu{}
+class Menu{
+bool isDisposed();
+void  dispose();
+void _setVisible (bool visible);
+}
 
 /+++
 import dwt.internal.*;
--- a/dwt/widgets/Shell.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Shell.d	Wed Jan 09 01:08:22 2008 +0100
@@ -16,6 +16,11 @@
 class Shell : Widget {
     GtkWidget* shellHandle;
     bool isDisposed();
+    void dispose();
+    void fixStyle ();
+    void redraw (bool);
+    void layout (bool, bool);
+
 }
 
 /++
--- a/dwt/widgets/Synchronizer.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Synchronizer.d	Wed Jan 09 01:08:22 2008 +0100
@@ -17,6 +17,11 @@
     public this (Display display) {
     }
     package void asyncExec (Runnable runnable) {}
+    package void syncExec (Runnable runnable) {}
+    int getMessageCount ();
+    package Thread syncThread;
+    bool runAsyncMessages (bool all);
+    void releaseSynchronizer ();
 }
 /++
 import dwt.*;
--- a/dwt/widgets/Tray.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Tray.d	Wed Jan 09 01:08:22 2008 +0100
@@ -9,8 +9,11 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 module dwt.widgets.Tray;
-
-class Tray{}
+import dwt.widgets.Display;
+class Tray{
+    public this( Display, int );
+        void dispose();
+}
 
 /++
 import dwt.*;
--- a/dwt/widgets/Widget.d	Tue Jan 08 08:07:04 2008 +0100
+++ b/dwt/widgets/Widget.d	Wed Jan 09 01:08:22 2008 +0100
@@ -12,8 +12,13 @@
 
 import dwt.internal.gtk.c.gtktypes;
 import dwt.internal.gtk.c.gdktypes;
+import dwt.widgets.Event;
 
 class Widget{
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) ;
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) ;
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data);
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data);
     static const int DISPOSED = 1<<0;
     static const int CANVAS = 1<<1;
     static const int KEYED_DATA = 1<<2;
@@ -35,11 +40,97 @@
     int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, GtkWidget* data) {
         return 0;
     }
+    GdkFilterReturn filterProc (GdkXEvent* xEvent, GdkEvent* gdkEvent, void* data);
     void fixedMapProc (GtkWidget* widget) {
     }
 void rendererGetSizeProc(GtkCellRenderer *cell, GtkWidget *handle, GdkRectangle *cell_area, int *x_offset, int *y_offset, int *width, int *height);
 void rendererRenderProc (GtkCellRenderer * cell, GdkDrawable * window, GtkWidget * handle, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, int flags);
+int /*long*/ menuPositionProc (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) ;
+int /*long*/ hoverProc (GtkWidget* handle);
+bool isDisposed();
+void sendEvent (Event event) ;
+void setForegroundColor (GtkWidget* handle, GdkColor* color);
 
+int /*long*/ shellMapProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+    return 0;
+}
+
+int /*long*/ sizeAllocateProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+    return 0;
+}
+
+int /*long*/ sizeRequestProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
+    return 0;
+}
+int /*long*/ timerProc (GtkWidget* widget) {
+    return 0;
+}
+
+int /*long*/ treeSelectionProc (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int [] selection, int length) {
+    return 0;
+}
+    static const int ACTIVATE = 1;
+    static const int BUTTON_PRESS_EVENT = 2;
+    static const int BUTTON_PRESS_EVENT_INVERSE = 3;
+    static const int BUTTON_RELEASE_EVENT = 4;
+    static const int BUTTON_RELEASE_EVENT_INVERSE = 5;
+    static const int CHANGED = 6;
+    static const int CHANGE_VALUE = 7;
+    static const int CLICKED = 8;
+    static const int COMMIT = 9;
+    static const int CONFIGURE_EVENT = 10;
+    static const int DELETE_EVENT = 11;
+    static const int DELETE_RANGE = 12;
+    static const int DELETE_TEXT = 13;
+    static const int ENTER_NOTIFY_EVENT = 14;
+    static const int EVENT = 15;
+    static const int EVENT_AFTER = 16;
+    static const int EXPAND_COLLAPSE_CURSOR_ROW = 17;
+    static const int EXPOSE_EVENT = 18;
+    static const int EXPOSE_EVENT_INVERSE = 19;
+    static const int FOCUS = 20;
+    static const int FOCUS_IN_EVENT = 21;
+    static const int FOCUS_OUT_EVENT = 22;
+    static const int GRAB_FOCUS = 23;
+    static const int HIDE = 24;
+    static const int INPUT = 25;
+    static const int INSERT_TEXT = 26;
+    static const int KEY_PRESS_EVENT = 27;
+    static const int KEY_RELEASE_EVENT = 28;
+    static const int LEAVE_NOTIFY_EVENT = 29;
+    static const int MAP = 30;
+    static const int MAP_EVENT = 31;
+    static const int MNEMONIC_ACTIVATE = 32;
+    static const int MOTION_NOTIFY_EVENT = 33;
+    static const int MOTION_NOTIFY_EVENT_INVERSE = 34;
+    static const int MOVE_FOCUS = 35;
+    static const int OUTPUT = 36;
+    static const int POPUP_MENU = 37;
+    static const int PREEDIT_CHANGED = 38;
+    static const int REALIZE = 39;
+    static const int ROW_ACTIVATED = 40;
+    static const int SCROLL_CHILD = 41;
+    static const int SCROLL_EVENT = 42;
+    static const int SELECT = 43;
+    static const int SHOW = 44;
+    static const int SHOW_HELP = 45;
+    static const int SIZE_ALLOCATE = 46;
+    static const int STYLE_SET = 47;
+    static const int SWITCH_PAGE = 48;
+    static const int TEST_COLLAPSE_ROW = 49;
+    static const int TEST_EXPAND_ROW = 50;
+    static const int TEXT_BUFFER_INSERT_TEXT = 51;
+    static const int TOGGLED = 52;
+    static const int UNMAP = 53;
+    static const int UNMAP_EVENT = 54;
+    static const int UNREALIZE = 55;
+    static const int VALUE_CHANGED = 56;
+    static const int VISIBILITY_NOTIFY_EVENT = 57;
+    static const int WINDOW_STATE_EVENT = 58;
+    static const int ACTIVATE_INVERSE = 59;
+    static const int DAY_SELECTED = 60;
+    static const int MONTH_CHANGED = 61;
+    static const int LAST_SIGNAL = 62;
 }
 
 /++
--- a/todo.txt	Tue Jan 08 08:07:04 2008 +0100
+++ b/todo.txt	Wed Jan 09 01:08:22 2008 +0100
@@ -56,65 +56,65 @@
 graphics/TextStyle                     // OK
 graphics/Transform                     // OK
 
-widgets/TableColumn
-widgets/DirectoryDialog
-widgets/DateTime
-widgets/RunnableLock
-widgets/Group
-widgets/MessageBox
-widgets/ToolItem
-widgets/Item
-widgets/Dialog
-widgets/ProgressBar
 widgets/Button
-widgets/Tree
 widgets/Canvas
-widgets/TabFolder
+widgets/Caret                          //
+widgets/ColorDialog
+widgets/Combo
+widgets/Composite
 widgets/Control
+widgets/CoolBar
+widgets/CoolItem
+widgets/DateTime
+widgets/Decorations
+widgets/Dialog
+widgets/DirectoryDialog
+widgets/Display                        // OK
 widgets/Event                          // refs to GC,Display,Rectangle,.. included dummy types
-widgets/Link
-widgets/Combo
-widgets/ToolTip
-widgets/CoolItem
+widgets/EventTable                     //
+widgets/ExpandBar
+widgets/ExpandItem
+widgets/FileDialog
+widgets/FontDialog
+widgets/Group
+widgets/ImageList
+widgets/Item
+widgets/Label
 widgets/Layout
-widgets/ToolBar
-widgets/Widget
-widgets/Text
-widgets/Tray
-widgets/ImageList
-widgets/TableItem
+widgets/Link
+widgets/List
+widgets/Listener                       // OK
+widgets/Menu
+widgets/MenuItem
+widgets/MessageBox
+widgets/Monitor
+widgets/ProgressBar
+widgets/RunnableLock
+widgets/Sash
+widgets/Scale
+widgets/Scrollable
+widgets/ScrollBar
 widgets/Shell                          //
-widgets/ScrollBar
+widgets/Slider
 widgets/Spinner
-widgets/EventTable                     //
+widgets/Synchronizer
+widgets/TabFolder
+widgets/TabItem
 widgets/Table
-widgets/ColorDialog
-widgets/Composite
-widgets/FileDialog
-widgets/Sash
-widgets/Listener                       // OK
-widgets/Scale
-widgets/Display                        //
-widgets/List
-widgets/TabItem
-widgets/Decorations
+widgets/TableColumn
+widgets/TableItem
+widgets/Text
+widgets/ToolBar
+widgets/ToolItem
+widgets/ToolTip
 widgets/Tracker
-widgets/Monitor
-widgets/CoolBar
-widgets/ExpandItem
-widgets/Caret                          //
-widgets/FontDialog
+widgets/Tray
 widgets/TrayItem
-widgets/ExpandBar
+widgets/Tree
+widgets/TreeColumn
+widgets/TreeItem
 widgets/TypedListener
-widgets/Menu
-widgets/Slider
-widgets/TreeItem
-widgets/MenuItem
-widgets/Label
-widgets/Synchronizer
-widgets/Scrollable
-widgets/TreeColumn
+widgets/Widget
 
 layout/FormLayout
 layout/FormAttachment