changeset 28:10acbb123580

Widget and TypedListener
author Frank Benoit <benoit@tionex.de>
date Wed, 09 Jan 2008 02:59:32 +0100
parents ffa3c27c4328
children ffffd0cd3b59
files dwt/dwthelper/utils.d dwt/graphics/Device.d dwt/graphics/GC.d dwt/graphics/Image.d dwt/internal/cairo/Cairo.d dwt/internal/gtk/OS.d dwt/internal/gtk/c/cairotypes.d dwt/internal/gtk/c/gdktypes.d dwt/widgets/Display.d dwt/widgets/EventTable.d dwt/widgets/TypedListener.d dwt/widgets/Widget.d todo.txt
diffstat 13 files changed, 636 insertions(+), 299 deletions(-) [+]
line wrap: on
line diff
--- a/dwt/dwthelper/utils.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/dwthelper/utils.d	Wed Jan 09 02:59:32 2008 +0100
@@ -26,6 +26,8 @@
 
 alias ArrayWrapperT!(int)    ArrayWrapperInt;
 alias ArrayWrapperT!(Object) ArrayWrapperObject;
+alias ArrayWrapperT!(char)   ArrayWrapperString;
+alias ArrayWrapperT!(char[])   ArrayWrapperString2;
 
 
 
--- a/dwt/graphics/Device.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/graphics/Device.d	Wed Jan 09 02:59:32 2008 +0100
@@ -77,7 +77,7 @@
 	 * platforms and should never be accessed from application code.
 	 * </p>
 	 */
-	protected dwt.internal.gtk.c.cairotypes.Display* xDisplay;
+	protected void* xDisplay;
 	GtkWidget* shellHandle;
 
 	/* Debugging */
@@ -287,7 +287,7 @@
 	}
 }
 
-static synchronized Device findDevice (dwt.internal.gtk.c.cairotypes.Display* xDisplay) {
+static synchronized Device findDevice (void* xDisplay) {
 	for (int i=0; i<Devices.length; i++) {
 		Device device = Devices [i];
 		if (device !is null && device.xDisplay is xDisplay) {
@@ -847,7 +847,7 @@
 	}
 }
 
-private static extern(C) int /*long*/ XErrorProcFunc (dwt.internal.gtk.c.cairotypes.Display* xDisplay, dwt.internal.gtk.OS.XErrorEvent* xErrorEvent) {
+private static extern(C) int /*long*/ XErrorProcFunc (void* xDisplay, dwt.internal.gtk.OS.XErrorEvent* xErrorEvent) {
 	Device device = findDevice (xDisplay);
 	if (device != null) {
 		if (device.warningLevel == 0) {
@@ -867,7 +867,7 @@
 	return 0;
 }
 
-private static extern(C)  int /*long*/ XIOErrorProcFunc (dwt.internal.gtk.c.cairotypes.Display* xDisplay) {
+private static extern(C)  int /*long*/ XIOErrorProcFunc (void* xDisplay) {
 	Device device = findDevice (xDisplay);
 	if (device != null) {
 		if (DEBUG || device.debugging) {
--- a/dwt/graphics/GC.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/graphics/GC.d	Wed Jan 09 02:59:32 2008 +0100
@@ -1099,11 +1099,11 @@
 			attrib = new XRenderPictureAttributes();
 			attrib.repeat = true;
 		}
-		maskPict = OS.XRenderCreatePicture(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, OS.gdk_x11_drawable_get_xid(maskPixmap), OS.XRenderFindStandardFormat(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, maskType), attribCount, attrib);
+		maskPict = OS.XRenderCreatePicture(cast(void*)xDisplay, OS.gdk_x11_drawable_get_xid(maskPixmap), OS.XRenderFindStandardFormat(cast(void*)xDisplay, maskType), attribCount, attrib);
 		if (maskPict is 0) SWT.error(SWT.ERROR_NO_HANDLES);
 	}
-	auto format = OS.XRenderFindVisualFormat(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, OS.gdk_x11_visual_get_xvisual(OS.gdk_visual_get_system()));
-	auto destPict = OS.XRenderCreatePicture(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, OS.gdk_x11_drawable_get_xid(drawable), format, 0, null);
+	auto format = OS.XRenderFindVisualFormat(cast(void*)xDisplay, OS.gdk_x11_visual_get_xvisual(OS.gdk_visual_get_system()));
+	auto destPict = OS.XRenderCreatePicture(cast(void*)xDisplay, OS.gdk_x11_drawable_get_xid(drawable), format, 0, null);
 	if (destPict is 0) SWT.error(SWT.ERROR_NO_HANDLES);
 	int srcPict = OS.XRenderCreatePicture(xDisplay, OS.gdk_x11_drawable_get_xid(srcImage.pixmap), format, 0, null);
 	if (srcPict is 0) SWT.error(SWT.ERROR_NO_HANDLES);
@@ -2832,7 +2832,7 @@
 	int w, h;
 	OS.gdk_drawable_get_size(drawable, &w, &h);
 	int width = w, height = h;
-	auto surface = Cairo.cairo_xlib_surface_create(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, xDrawable, xVisual, width, height);
+	auto surface = Cairo.cairo_xlib_surface_create(cast(void*)xDisplay, xDrawable, xVisual, width, height);
 	if (surface is null) SWT.error(SWT.ERROR_NO_HANDLES);
 	Cairo.cairo_surface_set_device_offset(surface, translateX, translateY);
 	data.cairo = cairo = Cairo.cairo_create(surface);
--- a/dwt/graphics/Image.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/graphics/Image.d	Wed Jan 09 02:59:32 2008 +0100
@@ -758,7 +758,7 @@
 		auto xDrawable = OS.GDK_PIXMAP_XID(pixmap);
 		auto xVisual = OS.gdk_x11_visual_get_xvisual(OS.gdk_visual_get_system());
         // PORTING_FIXME  cast and types not good
-		surface = Cairo.cairo_xlib_surface_create(cast(dwt.internal.gtk.c.cairotypes.Display*)xDisplay, xDrawable, xVisual, width, height);
+		surface = Cairo.cairo_xlib_surface_create(cast(void*)xDisplay, xDrawable, xVisual, width, height);
 	}
 	/* Destroy the image mask if the there is a GC created on the image */
 	if (transparentPixel != -1 && memGC != null) destroyMask();
--- a/dwt/internal/cairo/Cairo.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/internal/cairo/Cairo.d	Wed Jan 09 02:59:32 2008 +0100
@@ -27,7 +27,7 @@
 import tango.core.Traits;
 private extern(C) {
 cairo_surface_t *
-cairo_xlib_surface_create (Display     *dpy,
+cairo_xlib_surface_create (void     *dpy,
                XID/*Drawable*/ drawable,
                Visual      *visual,
                int      width,
--- a/dwt/internal/gtk/OS.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/internal/gtk/OS.d	Wed Jan 09 02:59:32 2008 +0100
@@ -124,8 +124,8 @@
 private extern (C){
     GdkWindow * gdk_window_lookup(uint);
     uint                XRenderCreatePicture(void *, uint, XRenderPictFormat *, uint, XRenderPictureAttributes *);
-    XRenderPictFormat * XRenderFindStandardFormat (dwt.internal.gtk.c.cairotypes.Display *dpy, int format);
-    XRenderPictFormat * XRenderFindVisualFormat (dwt.internal.gtk.c.cairotypes.Display *dpy, void *visual);
+    XRenderPictFormat * XRenderFindStandardFormat (void *dpy, int format);
+    XRenderPictFormat * XRenderFindVisualFormat (void *dpy, void *visual);
     void XRenderSetPictureTransform (void     *dpy,uint picture, XTransform *transform);
     void XRenderSetPictureClipRectangles(void *, uint, int, int, XRectangle *, int);
     void XRenderFreePicture(void *, uint);
@@ -176,16 +176,16 @@
                int width, int height);
 
 private extern(C) PangoContext *gdk_pango_context_get();
-private extern(C) int XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep);
+private extern(C) int XRenderQueryExtension (void *dpy, int *event_basep, int *error_basep);
 alias int Status;
-private extern(C) Status XRenderQueryVersion (Display *dpy,
+private extern(C) Status XRenderQueryVersion (void *dpy,
                 int     *major_versionp,
                 int     *minor_versionp);
 struct FcConfig{};
 private extern(C) int FcConfigAppFontAddFile (FcConfig *config, char  *file);
 
-alias extern(C) int function( dwt.internal.gtk.c.cairotypes.Display* ) XSynchronizeResult;
-private extern(C) XSynchronizeResult function( dwt.internal.gtk.c.cairotypes.Display*, int ) XSynchronize;
+alias extern(C) int function( void* ) XSynchronizeResult;
+private extern(C) XSynchronizeResult function( void*, int ) XSynchronize;
 
 //struct Visual{}
 //private extern(C) Visual* gdk_x11_visual_get_xvisual(GdkVisual* visual);
@@ -197,8 +197,8 @@
 
 private extern (C) bool GDK_WINDOWING_X11();
 private extern (C) int XFlush(void *);
-public alias extern(C) int function(dwt.internal.gtk.c.cairotypes.Display*) XIOErrorHandler;
-public alias extern(C) int function(dwt.internal.gtk.c.cairotypes.Display*, XErrorEvent *) XErrorHandler;
+public alias extern(C) int function(void*) XIOErrorHandler;
+public alias extern(C) int function(void*, XErrorEvent *) XErrorHandler;
 
 private extern (C) XIOErrorHandler XSetIOErrorHandler(XIOErrorHandler);
 private extern (C) XErrorHandler XSetErrorHandler(XErrorHandler);
@@ -2040,16 +2040,39 @@
     g_slist_data(arg0) (arg0)->data
     g_list_set_next(arg0, arg1) (arg0)->next = arg1
     g_list_set_previous(arg0, arg1) (arg0)->prev = arg1
+    +/
 
-    gtk_rc_style_get_bg_pixmap_name(arg0, arg1) (arg0)->bg_pixmap_name[arg1]
-    gtk_rc_style_get_color_flags(arg0, arg1) (arg0)->color_flags[arg1]
-    gtk_rc_style_set_bg(arg0, arg1, arg2) if (arg2) (arg0)->bg[arg1] = *arg2
-    gtk_rc_style_set_bg_pixmap_name(arg0, arg1, arg2) (arg0)->bg_pixmap_name[arg1] = (char *)arg2
-    gtk_rc_style_set_color_flags(arg0, arg1, arg2) (arg0)->color_flags[arg1] = arg2
-    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_rc_style_get_bg_pixmap_name(arg0, arg1) (arg0)->bg_pixmap_name[arg1]
+    static char* gtk_rc_style_get_bg_pixmap_name( GtkRcStyle* arg0, int arg1 ) {
+        return arg0.bg_pixmap_name[arg1];
+    }
+    //gtk_rc_style_get_color_flags(arg0, arg1) (arg0)->color_flags[arg1]
+    static int gtk_rc_style_get_color_flags( GtkRcStyle* arg0, int arg1 ) {
+        return arg0.color_flags[arg1];
+    }
+    //gtk_rc_style_set_bg(arg0, arg1, arg2) if (arg2) (arg0)->bg[arg1] = *arg2
+    static void gtk_rc_style_set_bg( GtkRcStyle* arg0, int arg1, GdkColor* arg2 ) {
+        if (arg2) arg0.bg[arg1] = *arg2;
+    }
+    //gtk_rc_style_set_bg_pixmap_name(arg0, arg1, arg2) (arg0)->bg_pixmap_name[arg1] = (char *)arg2
+    static void gtk_rc_style_set_bg_pixmap_name( GtkRcStyle* arg0, int arg1, char* arg2 ) {
+        arg0.bg_pixmap_name[arg1] = arg2;
+    }
 
-    +/
+    //gtk_rc_style_set_color_flags(arg0, arg1, arg2) (arg0)->color_flags[arg1] = arg2
+    static void gtk_rc_style_set_color_flags( GtkRcStyle* arg0, int arg1, int arg2 ) {
+        arg0.color_flags[arg1] = arg2;
+    }
+
+    //gtk_rc_style_set_fg(arg0, arg1, arg2) if (arg2) (arg0)->fg[arg1] = *arg2
+    static void gtk_rc_style_set_fg( GtkRcStyle* arg0, int arg1, GdkColor* arg2 ) {
+        if (arg2) arg0.fg[arg1] = *arg2;
+    }
+    //gtk_rc_style_set_text(arg0, arg1, arg2) if (arg2) (arg0)->text[arg1] = *arg2
+    static void gtk_rc_style_set_text( GtkRcStyle* arg0, int arg1, GdkColor* arg2 ) {
+        if (arg2) arg0.text[arg1] = *arg2;
+    }
+
     //gtk_style_get_font_desc(arg0) (arg0)->font_desc
     static PangoFontDescription* gtk_style_get_font_desc( GtkStyle* arg0 ) {
         return arg0.font_desc;
--- a/dwt/internal/gtk/c/cairotypes.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/internal/gtk/c/cairotypes.d	Wed Jan 09 02:59:32 2008 +0100
@@ -28,7 +28,7 @@
 
 private alias void* HDC;
 
-struct Display{};	// to support XLib surfaces
+//struct Display{};	// to support XLib surfaces
 struct Visual;	// to support XLib surfaces
 //struct Screen;	// to support XLib surfaces
 
--- a/dwt/internal/gtk/c/gdktypes.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/internal/gtk/c/gdktypes.d	Wed Jan 09 02:59:32 2008 +0100
@@ -2251,8 +2251,8 @@
 	uint state;
 	uint keyval;
 	int length;
-	char *string;
-	ushort hardwareKeycode;
+	char *str; // d builtin alias "string"
+	ushort hardware_keycode;
 	byte group;
 	uint bitfield;
 	//uint isModifier : 1;
--- a/dwt/widgets/Display.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/widgets/Display.d	Wed Jan 09 02:59:32 2008 +0100
@@ -634,8 +634,8 @@
 	popups [index] = menu;
 }
 
-void addWidget (int/**/ handle, Widget widget) {
-	if (handle is 0) return;
+void addWidget (GtkWidget* handle, Widget widget) {
+	if (handle is null) return;
 	if (freeSlot is -1) {
 		int len = (freeSlot = indexTable.length) + GROW_SIZE;
 		int[] newIndexTable = new int[len];
@@ -858,7 +858,7 @@
 	if (!OS.gtk_init_check (&cnt, null)) {
 		SWT.error (SWT.ERROR_NO_HANDLES, null, " [gtk_init_check() failed]");
 	}
-	if (OS.GDK_WINDOWING_X11 ()) xDisplay = cast(dwt.internal.gtk.c.cairotypes.Display*) OS.GDK_DISPLAY ();
+	if (OS.GDK_WINDOWING_X11 ()) xDisplay = cast(void*) OS.GDK_DISPLAY ();
 	char* ptr = OS.gtk_check_version (MAJOR, MINOR, MICRO);
 	if (ptr !is null) {
 		char [] buffer = fromUtf8z(ptr);
@@ -3350,7 +3350,7 @@
 		auto handle = (cast(LONG) data [0]).value;
 		Widget widget = cast(Widget) data [1];
 		if (widget !is null) {
-			addWidget (handle, widget);
+			addWidget (cast(GtkWidget*)handle, widget);
 		} else {
 			removeWidget (cast(GtkWidget*)handle);
 		}
--- a/dwt/widgets/EventTable.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/widgets/EventTable.d	Wed Jan 09 02:59:32 2008 +0100
@@ -12,12 +12,14 @@
 
 import dwt.widgets.Listener;
 import dwt.widgets.Event;
+import dwt.internal.SWTEventListener;
 
 class EventTable{
     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 void unhook (int eventType, SWTEventListener listener) ;
     public int size () ;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/widgets/TypedListener.d	Wed Jan 09 02:59:32 2008 +0100
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+module dwt.widgets.TypedListener;
+
+
+import dwt.internal.SWTEventListener;
+import dwt.SWT;
+import dwt.widgets.Listener;
+import dwt.widgets.Event;
+import dwt.events.ArmEvent;
+import dwt.events.ArmListener;
+import dwt.events.ControlEvent;
+import dwt.events.ControlListener;
+import dwt.events.DisposeEvent;
+import dwt.events.DisposeListener;
+import dwt.events.DragDetectEvent;
+import dwt.events.DragDetectListener;
+import dwt.events.ExpandEvent;
+import dwt.events.ExpandListener;
+import dwt.events.FocusEvent;
+import dwt.events.FocusListener;
+import dwt.events.HelpEvent;
+import dwt.events.HelpListener;
+import dwt.events.KeyEvent;
+import dwt.events.KeyListener;
+import dwt.events.MenuEvent;
+import dwt.events.MenuListener;
+import dwt.events.MenuDetectEvent;
+import dwt.events.MenuDetectListener;
+import dwt.events.ModifyEvent;
+import dwt.events.ModifyListener;
+import dwt.events.MouseEvent;
+import dwt.events.MouseListener;
+import dwt.events.MouseMoveListener;
+import dwt.events.MouseTrackListener;
+import dwt.events.MouseWheelListener;
+import dwt.events.PaintEvent;
+import dwt.events.PaintListener;
+import dwt.events.SelectionEvent;
+import dwt.events.SelectionListener;
+import dwt.events.ShellEvent;
+import dwt.events.ShellListener;
+import dwt.events.TraverseEvent;
+import dwt.events.TraverseListener;
+import dwt.events.TreeEvent;
+import dwt.events.TreeListener;
+import dwt.events.VerifyEvent;
+import dwt.events.VerifyListener;
+import dwt.graphics.GC;
+
+
+/**
+ * Instances of this class are <em>internal SWT implementation</em>
+ * objects which provide a mapping between the typed and untyped
+ * listener mechanisms that SWT supports.
+ * <p>
+ * <b>IMPORTANT:</b> This class is <em>not</em> part of the SWT
+ * public API. It is marked public only so that it can be shared
+ * within the packages provided by SWT. It should never be
+ * referenced from application code.
+ * </p>
+ *
+ * @see Listener
+ */
+public class TypedListener : Listener {
+
+	/**
+	 * The receiver's event listener
+	 */
+	protected SWTEventListener eventListener;
+
+/**
+ * Constructs a new instance of this class for the given event listener.
+ * <p>
+ * <b>IMPORTANT:</b> This method is <em>not</em> part of the SWT
+ * public API. It is marked public only so that it can be shared
+ * within the packages provided by SWT. It should never be
+ * referenced from application code.
+ * </p>
+ *
+ * @param listener the event listener to store in the receiver
+ */
+public this (SWTEventListener listener) {
+	eventListener = listener;
+}
+
+/**
+ * Returns the receiver's event listener.
+ * <p>
+ * <b>IMPORTANT:</b> This method is <em>not</em> part of the SWT
+ * public API. It is marked public only so that it can be shared
+ * within the packages provided by SWT. It should never be
+ * referenced from application code.
+ * </p>
+ *
+ * @return the receiver's event listener
+ */
+public SWTEventListener getEventListener () {
+	return eventListener;
+}
+
+/**
+ * Handles the given event.
+ * <p>
+ * <b>IMPORTANT:</b> This method is <em>not</em> part of the SWT
+ * public API. It is marked public only so that it can be shared
+ * within the packages provided by SWT. It should never be
+ * referenced from application code.
+ * </p>
+ * @param e the event to handle
+ */
+public void handleEvent (Event e) {
+	switch (e.type) {
+		case SWT.Activate: {
+			(cast(ShellListener) eventListener).shellActivated(new ShellEvent(e));
+			break;
+		}
+		case SWT.Arm: {
+			(cast(ArmListener) eventListener).widgetArmed (new ArmEvent (e));
+			break;
+		}
+		case SWT.Close: {
+			/* Fields set by Decorations */
+			ShellEvent event = new ShellEvent (e);
+			(cast(ShellListener) eventListener).shellClosed(event);
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.Collapse: {
+			if ( auto l = cast(TreeListener)eventListener ) {
+				l.treeCollapsed(new TreeEvent(e));
+			} else {
+				(cast(ExpandListener) eventListener).itemCollapsed(new ExpandEvent(e));
+			}
+			break;
+		}
+		case SWT.Deactivate: {
+			(cast(ShellListener) eventListener).shellDeactivated(new ShellEvent(e));
+			break;
+		}
+		case SWT.Deiconify: {
+			(cast(ShellListener) eventListener).shellDeiconified(new ShellEvent(e));
+			break;
+		}
+		case SWT.DefaultSelection: {
+			(cast(SelectionListener)eventListener).widgetDefaultSelected(new SelectionEvent(e));
+			break;
+		}
+		case SWT.Dispose: {
+			(cast(DisposeListener) eventListener).widgetDisposed(new DisposeEvent(e));
+			break;
+		}
+		case SWT.DragDetect: {
+			(cast(DragDetectListener) eventListener).dragDetected(new DragDetectEvent(e));
+			break;
+		}
+		case SWT.Expand: {
+			if (auto l = cast(TreeListener)eventListener ) {
+				l.treeExpanded(new TreeEvent(e));
+			} else {
+				(cast(ExpandListener) eventListener).itemExpanded(new ExpandEvent(e));
+			}
+			break;
+		}
+		case SWT.FocusIn: {
+			(cast(FocusListener) eventListener).focusGained(new FocusEvent(e));
+			break;
+		}
+		case SWT.FocusOut: {
+			(cast(FocusListener) eventListener).focusLost(new FocusEvent(e));
+			break;
+		}
+		case SWT.Help: {
+			(cast(HelpListener) eventListener).helpRequested (new HelpEvent (e));
+			break;
+		}
+		case SWT.Hide: {
+			(cast(MenuListener) eventListener).menuHidden(new MenuEvent(e));
+			break;
+		}
+		case SWT.Iconify: {
+			(cast(ShellListener) eventListener).shellIconified(new ShellEvent(e));
+			break;
+		}
+		case SWT.KeyDown: {
+			/* Fields set by Control */
+			KeyEvent event = new KeyEvent(e);
+			(cast(KeyListener) eventListener).keyPressed(event);
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.KeyUp: {
+			/* Fields set by Control */
+			KeyEvent event = new KeyEvent(e);
+			(cast(KeyListener) eventListener).keyReleased(event);
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.Modify: {
+			(cast(ModifyListener) eventListener).modifyText(new ModifyEvent(e));
+			break;
+		}
+		case SWT.MenuDetect: {
+			MenuDetectEvent event = new MenuDetectEvent(e);
+			(cast(MenuDetectListener) eventListener).menuDetected(event);
+			e.x = event.x;
+			e.y = event.y;
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.MouseDown: {
+			(cast(MouseListener) eventListener).mouseDown(new MouseEvent(e));
+			break;
+		}
+		case SWT.MouseDoubleClick: {
+			(cast(MouseListener) eventListener).mouseDoubleClick(new MouseEvent(e));
+			break;
+		}
+		case SWT.MouseEnter: {
+			(cast(MouseTrackListener) eventListener).mouseEnter (new MouseEvent (e));
+			break;
+		}
+		case SWT.MouseExit: {
+			(cast(MouseTrackListener) eventListener).mouseExit (new MouseEvent (e));
+			break;
+		}
+		case SWT.MouseHover: {
+			(cast(MouseTrackListener) eventListener).mouseHover (new MouseEvent (e));
+			break;
+		}
+		case SWT.MouseMove: {
+			(cast(MouseMoveListener) eventListener).mouseMove(new MouseEvent(e));
+			return;
+		}
+		case SWT.MouseWheel: {
+			(cast(MouseWheelListener) eventListener).mouseScrolled(new MouseEvent(e));
+			return;
+		}
+		case SWT.MouseUp: {
+			(cast(MouseListener) eventListener).mouseUp(new MouseEvent(e));
+			break;
+		}
+		case SWT.Move: {
+			(cast(ControlListener) eventListener).controlMoved(new ControlEvent(e));
+			break;
+		}
+		case SWT.Paint: {
+			/* Fields set by Control */
+			PaintEvent event = new PaintEvent (e);
+			(cast(PaintListener) eventListener).paintControl (event);
+			e.gc = event.gc;
+			break;
+		}
+		case SWT.Resize: {
+			(cast(ControlListener) eventListener).controlResized(new ControlEvent(e));
+			break;
+		}
+		case SWT.Selection: {
+			/* Fields set by Sash */
+			SelectionEvent event = new SelectionEvent (e);
+			(cast(SelectionListener) eventListener).widgetSelected (event);
+			e.x = event.x;
+			e.y = event.y;
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.Show: {
+			(cast(MenuListener) eventListener).menuShown(new MenuEvent(e));
+			break;
+		}
+		case SWT.Traverse: {
+			/* Fields set by Control */
+			TraverseEvent event = new TraverseEvent (e);
+			(cast(TraverseListener) eventListener).keyTraversed (event);
+			e.detail = event.detail;
+			e.doit = event.doit;
+			break;
+		}
+		case SWT.Verify: {
+			/* Fields set by Text, RichText */
+			VerifyEvent event = new VerifyEvent (e);
+			(cast(VerifyListener) eventListener).verifyText (event);
+			e.text = event.text;
+			e.doit = event.doit;
+			break;
+		}
+	}
+}
+
+}
--- a/dwt/widgets/Widget.d	Wed Jan 09 01:08:22 2008 +0100
+++ b/dwt/widgets/Widget.d	Wed Jan 09 02:59:32 2008 +0100
@@ -10,10 +10,25 @@
  *******************************************************************************/
 module dwt.widgets.Widget;
 
+import dwt.SWT;
+import dwt.dwthelper.utils;
 import dwt.internal.gtk.c.gtktypes;
 import dwt.internal.gtk.c.gdktypes;
+
+import dwt.events.DisposeListener;
+import dwt.internal.Converter;
+import dwt.internal.SWTEventListener;
+import dwt.internal.gtk.OS;
+import dwt.widgets.Display;
 import dwt.widgets.Event;
+import dwt.widgets.EventTable;
+import dwt.widgets.Listener;
+import dwt.widgets.TypedListener;
 
+import tango.stdc.stringz;
+import tango.stdc.string;
+
+/+
 class Widget{
 int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) ;
 int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) ;
@@ -133,11 +148,7 @@
     static const int LAST_SIGNAL = 62;
 }
 
-/++
-import dwt.SWT;
-import dwt.internal.*;
-import dwt.internal.gtk.*;
-import dwt.events.*;
++/
 
 /**
  * This class is the abstract superclass of all user interface objects.
@@ -176,7 +187,7 @@
 	 * platforms and should never be accessed from application code.
 	 * </p>
 	 */
-	public int /*long*/ handle;
+	public GtkWidget* handle;
 	int style, state;
 	Display display;
 	EventTable eventTable;
@@ -287,7 +298,7 @@
 /**
  * Prevents uninitialized instances from being created outside the package.
  */
-Widget () {}
+this () {}
 
 /**
  * Constructs a new instance of this class given its parent
@@ -318,7 +329,7 @@
  * @see #checkSubclass
  * @see #getStyle
  */
-public Widget (Widget parent, int style) {
+public this (Widget parent, int style) {
 	checkSubclass ();
 	checkParent (parent);
 	this.style = style;
@@ -326,7 +337,7 @@
 }
 
 void _addListener (int eventType, Listener listener) {
-	if (eventTable == null) eventTable = new EventTable ();
+	if (eventTable is null) eventTable = new EventTable ();
 	eventTable.hook (eventType, listener);
 }
 
@@ -355,7 +366,7 @@
  */
 public void addListener (int eventType, Listener listener) {
 	checkWidget ();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
 	_addListener (eventType, listener);
 }
 
@@ -380,28 +391,28 @@
  */
 public void addDisposeListener (DisposeListener listener) {
 	checkWidget ();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
 	TypedListener typedListener = new TypedListener (listener);
 	addListener (SWT.Dispose, typedListener);
 }
 
-int /*long*/ paintWindow () {
-	return 0;
+GdkWindow* paintWindow () {
+	return null;
 }
 
 static int checkBits (int style, int int0, int int1, int int2, int int3, int int4, int int5) {
 	int mask = int0 | int1 | int2 | int3 | int4 | int5;
-	if ((style & mask) == 0) style |= int0;
-	if ((style & int0) != 0) style = (style & ~mask) | int0;
-	if ((style & int1) != 0) style = (style & ~mask) | int1;
-	if ((style & int2) != 0) style = (style & ~mask) | int2;
-	if ((style & int3) != 0) style = (style & ~mask) | int3;
-	if ((style & int4) != 0) style = (style & ~mask) | int4;
-	if ((style & int5) != 0) style = (style & ~mask) | int5;
+	if ((style & mask) is 0) style |= int0;
+	if ((style & int0) !is 0) style = (style & ~mask) | int0;
+	if ((style & int1) !is 0) style = (style & ~mask) | int1;
+	if ((style & int2) !is 0) style = (style & ~mask) | int2;
+	if ((style & int3) !is 0) style = (style & ~mask) | int3;
+	if ((style & int4) !is 0) style = (style & ~mask) | int4;
+	if ((style & int5) !is 0) style = (style & ~mask) | int5;
 	return style;
 }
 
-int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
+int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, GtkWidget* data) {
 	return 0;
 }
 
@@ -411,10 +422,10 @@
 
 void checkOrientation (Widget parent) {
 	style &= ~SWT.MIRRORED;
-	if ((style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT)) == 0) {
-		if (parent != null) {
-			if ((parent.style & SWT.LEFT_TO_RIGHT) != 0) style |= SWT.LEFT_TO_RIGHT;
-			if ((parent.style & SWT.RIGHT_TO_LEFT) != 0) style |= SWT.RIGHT_TO_LEFT;
+	if ((style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT)) is 0) {
+		if (parent !is null) {
+			if ((parent.style & SWT.LEFT_TO_RIGHT) !is 0) style |= SWT.LEFT_TO_RIGHT;
+			if ((parent.style & SWT.RIGHT_TO_LEFT) !is 0) style |= SWT.RIGHT_TO_LEFT;
 		}
 	}
 	style = checkBits (style, SWT.LEFT_TO_RIGHT, SWT.RIGHT_TO_LEFT, 0, 0, 0, 0);
@@ -433,7 +444,7 @@
  * </ul>
  */
 void checkParent (Widget parent) {
-	if (parent == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (parent is null) error (SWT.ERROR_NULL_ARGUMENT);
 	if (parent.isDisposed ()) error (SWT.ERROR_INVALID_ARGUMENT);
 	parent.checkWidget ();
 	parent.checkOpen ();
@@ -496,9 +507,9 @@
  */
 protected void checkWidget () {
 	Display display = this.display;
-	if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
-	if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
-	if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
+	if (display is null) error (SWT.ERROR_WIDGET_DISPOSED);
+	if (display.thread !is Thread.getThis ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
+	if ((state & DISPOSED) !is 0) error (SWT.ERROR_WIDGET_DISPOSED);
 }
 
 void createHandle (int index) {
@@ -512,15 +523,15 @@
 }
 
 void deregister () {
-	if (handle == 0) return;
-	if ((state & HANDLE) != 0) display.removeWidget (handle);
+	if (handle is null) return;
+	if ((state & HANDLE) !is 0) display.removeWidget (handle);
 }
 
 void destroyWidget () {
-	int /*long*/ topHandle = topHandle ();
+	GtkWidget* h = topHandle ();
 	releaseHandle ();
-	if (topHandle != 0 && (state & HANDLE) != 0) {
-		OS.gtk_widget_destroy (topHandle);
+	if (h !is null && (state & HANDLE) !is 0) {
+		OS.gtk_widget_destroy (h);
 	}
 }
 
@@ -585,7 +596,7 @@
  */
 public Object getData () {
 	checkWidget();
-	return (state & KEYED_DATA) != 0 ? ((Object []) data) [0] : data;
+	return (state & KEYED_DATA) !is 0 ? (cast(ArrayWrapperObject)data).array[0] : data;
 }
 /**
  * Returns the application defined property of the receiver
@@ -611,13 +622,13 @@
  *
  * @see #setData(String, Object)
  */
-public Object getData (String key) {
+public Object getData (char[] key) {
 	checkWidget();
-	if (key == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if ((state & KEYED_DATA) != 0) {
-		Object [] table = (Object []) data;
+	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if ((state & KEYED_DATA) !is 0) {
+		char[][] table = (cast(ArrayWrapperString2) data).array;
 		for (int i=1; i<table.length; i+=2) {
-			if (key.equals (table [i])) return table [i+1];
+			if (key ==/*eq*/ table [i] ) return new ArrayWrapperString( table [i+1] );
 		}
 	}
 	return null;
@@ -640,21 +651,21 @@
  */
 public Display getDisplay () {
 	Display display = this.display;
-	if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
+	if (display is null) error (SWT.ERROR_WIDGET_DISPOSED);
 	return display;
 }
 
-String getName () {
-//	String string = getClass ().getName ();
-//	int index = string.lastIndexOf ('.');
-//	if (index == -1) return string;
-	String string = getClass ().getName ();
-	int index = string.length ();
-	while ((--index > 0) && (string.charAt (index) != '.')) {}
-	return string.substring (index + 1, string.length ());
+char[] getName () {
+//	char[] str = getClass ().getName ();
+//	int index = str.lastIndexOf ('.');
+//	if (index is -1) return str;
+	char[] str = this.classinfo.name;
+	int index = str.length;
+	while ((--index > 0) && (str[index] !is '.')) {}
+	return str[index + 1 .. $ ];
 }
 
-String getNameText () {
+char[] getNameText () {
 	return "";
 }
 
@@ -684,27 +695,27 @@
 }
 
 
-int /*long*/ gtk_activate (int /*long*/ widget) {
+int /*long*/ gtk_activate (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_button_press_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_button_press_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_button_release_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_button_release_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_changed (int /*long*/ widget) {
+int /*long*/ gtk_changed (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_change_value (int /*long*/ widget, int /*long*/ scroll, int /*long*/ value1, int /*long*/ value2) {
+int /*long*/ gtk_change_value (GtkWidget* widget, int /*long*/ scroll, int /*long*/ value1, int /*long*/ value2) {
 	return 0;
 }
 
-int /*long*/ gtk_clicked (int /*long*/ widget) {
+int /*long*/ gtk_clicked (GtkWidget* widget) {
 	return 0;
 }
 
@@ -712,127 +723,123 @@
 	return 0;
 }
 
-int /*long*/ gtk_configure_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_configure_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_day_selected (int /*long*/ widget) {
-	return 0;
-}
-
-int /*long*/ gtk_delete_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_day_selected (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_delete_range (int /*long*/ widget, int /*long*/ iter1, int /*long*/ iter2) {
+int /*long*/ gtk_delete_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_delete_text (int /*long*/ widget, int /*long*/ start_pos, int /*long*/ end_pos) {
+int /*long*/ gtk_delete_range (GtkWidget* widget, int /*long*/ iter1, int /*long*/ iter2) {
 	return 0;
 }
 
-int /*long*/ gtk_enter_notify_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_delete_text (GtkWidget* widget, int /*long*/ start_pos, int /*long*/ end_pos) {
 	return 0;
 }
 
-int /*long*/ gtk_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_enter_notify_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_event_after (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_expand_collapse_cursor_row (int /*long*/ widget, int /*long*/ logical, int /*long*/ expand, int /*long*/ open_all) {
+int /*long*/ gtk_event_after (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_expose_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_expand_collapse_cursor_row (GtkWidget* widget, int /*long*/ logical, int /*long*/ expand, int /*long*/ open_all) {
 	return 0;
 }
 
-int /*long*/ gtk_focus (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_expose_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_focus_in_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_focus (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_focus_out_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_focus_in_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_grab_focus (int /*long*/ widget) {
+int /*long*/ gtk_focus_out_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_hide (int /*long*/ widget) {
+int /*long*/ gtk_grab_focus (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_input (int /*long*/ widget, int /*long*/ arg1) {
+int /*long*/ gtk_hide (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_insert_text (int /*long*/ widget, int /*long*/ new_text, int /*long*/ new_text_length, int /*long*/ position) {
+int /*long*/ gtk_input (GtkWidget* widget, int /*long*/ arg1) {
+	return 0;
+}
+
+int /*long*/ gtk_insert_text (GtkWidget* widget, int /*long*/ new_text, int /*long*/ new_text_length, int /*long*/ position) {
 	return 0;
 }
 
-int /*long*/ gtk_key_press_event (int /*long*/ widget, int /*long*/ event) {
-	GdkEventKey gdkEvent = new GdkEventKey ();
-	OS.memmove (gdkEvent, event, GdkEventKey.sizeof);
-	return sendKeyEvent (SWT.KeyDown, gdkEvent) ? 0 : 1;
+int /*long*/ gtk_key_press_event (GtkWidget* widget, GdkEventKey* event) {
+	return sendKeyEvent (SWT.KeyDown, event) ? 0 : 1;
 }
 
-int /*long*/ gtk_key_release_event (int /*long*/ widget, int /*long*/ event) {
-	GdkEventKey gdkEvent = new GdkEventKey ();
-	OS.memmove (gdkEvent, event, GdkEventKey.sizeof);
-	return sendKeyEvent (SWT.KeyUp, gdkEvent) ? 0 : 1;
+int /*long*/ gtk_key_release_event (GtkWidget* widget, GdkEventKey* event) {
+	return sendKeyEvent (SWT.KeyUp, event) ? 0 : 1;
 }
 
-int /*long*/ gtk_leave_notify_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_leave_notify_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_map (int /*long*/ widget) {
+int /*long*/ gtk_map (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_map_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_map_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_mnemonic_activate (int /*long*/ widget, int /*long*/ arg1) {
+int /*long*/ gtk_mnemonic_activate (GtkWidget* widget, int /*long*/ arg1) {
 	return 0;
 }
 
-int /*long*/ gtk_month_changed (int /*long*/ widget) {
+int /*long*/ gtk_month_changed (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_motion_notify_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_motion_notify_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_move_focus (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_move_focus (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_output (int /*long*/ widget) {
+int /*long*/ gtk_output (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_popup_menu (int /*long*/ widget) {
+int /*long*/ gtk_popup_menu (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_preedit_changed (int /*long*/ imcontext) {
+int /*long*/ gtk_preedit_changed (GtkWidget* imcontext) {
 	return 0;
 }
 
-int /*long*/ gtk_realize (int /*long*/ widget) {
+int /*long*/ gtk_realize (GtkWidget* widget) {
 	return 0;
 }
 
@@ -840,11 +847,11 @@
 	return 0;
 }
 
-int /*long*/ gtk_scroll_child (int /*long*/ widget, int /*long*/ scrollType, int /*long*/ horizontal) {
+int /*long*/ gtk_scroll_child (GtkWidget* widget, int /*long*/ scrollType, int /*long*/ horizontal) {
 	return 0;
 }
 
-int /*long*/ gtk_scroll_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_scroll_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
@@ -852,23 +859,23 @@
 	return 0;
 }
 
-int /*long*/ gtk_show (int /*long*/ widget) {
+int /*long*/ gtk_show (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_show_help (int /*long*/ widget, int /*long*/ helpType) {
+int /*long*/ gtk_show_help (GtkWidget* widget, int /*long*/ helpType) {
 	return 0;
 }
 
-int /*long*/ gtk_size_allocate (int /*long*/ widget, int /*long*/ allocation) {
+int /*long*/ gtk_size_allocate (GtkWidget* widget, int /*long*/ allocation) {
 	return 0;
 }
 
-int /*long*/ gtk_style_set (int /*long*/ widget, int /*long*/ previousStyle) {
+int /*long*/ gtk_style_set (GtkWidget* widget, int /*long*/ previousStyle) {
 	return 0;
 }
 
-int /*long*/ gtk_switch_page (int /*long*/ widget, int /*long*/ page, int /*long*/ page_num) {
+int /*long*/ gtk_switch_page (GtkWidget* widget, int /*long*/ page, int /*long*/ page_num) {
 	return 0;
 }
 
@@ -880,7 +887,7 @@
 	return 0;
 }
 
-int /*long*/ gtk_text_buffer_insert_text (int /*long*/ widget, int /*long*/ iter, int /*long*/ text, int /*long*/ length) {
+int /*long*/ gtk_text_buffer_insert_text (GtkWidget* widget, int /*long*/ iter, int /*long*/ text, int /*long*/ length) {
 	return 0;
 }
 
@@ -892,15 +899,15 @@
 	return 0;
 }
 
-int /*long*/ gtk_unmap (int /*long*/ widget) {
+int /*long*/ gtk_unmap (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ gtk_unmap_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_unmap_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_unrealize (int /*long*/ widget) {
+int /*long*/ gtk_unrealize (GtkWidget* widget) {
 	return 0;
 }
 
@@ -908,46 +915,46 @@
 	return 0;
 }
 
-int /*long*/ gtk_visibility_notify_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_visibility_notify_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int /*long*/ gtk_window_state_event (int /*long*/ widget, int /*long*/ event) {
+int /*long*/ gtk_window_state_event (GtkWidget* widget, int /*long*/ event) {
 	return 0;
 }
 
-int fontHeight (int /*long*/ font, int /*long*/ widgetHandle) {
-	int /*long*/ context = OS.gtk_widget_get_pango_context (widgetHandle);
-	int /*long*/ lang = OS.pango_context_get_language (context);
-	int /*long*/ metrics = OS.pango_context_get_metrics (context, font, lang);
+int fontHeight ( PangoFontDescription* font, GtkWidget* widgetHandle ) {
+	auto context = OS.gtk_widget_get_pango_context (widgetHandle);
+	auto lang = OS.pango_context_get_language (context);
+	auto metrics = OS.pango_context_get_metrics (context, font, lang);
 	int ascent = OS.pango_font_metrics_get_ascent (metrics);
 	int descent = OS.pango_font_metrics_get_descent (metrics);
 	OS.pango_font_metrics_unref (metrics);
 	return OS.PANGO_PIXELS (ascent + descent);
 }
 
-int /*long*/ filterProc(int /*long*/ xEvent, int /*long*/ gdkEvent, int /*long*/ data2) {
-	return 0;
+GdkFilterReturn filterProc (GdkXEvent* xEvent, GdkEvent* gdkEvent, void* data) {
+	return cast(GdkFilterReturn)0;
 }
 
-boolean filters (int eventType) {
+bool filters (int eventType) {
 	return display.filters (eventType);
 }
 
-int /*long*/ fixedMapProc (int /*long*/ widget) {
+int /*long*/ fixedMapProc (GtkWidget* widget) {
 	return 0;
 }
 
-char [] fixMnemonic (String string) {
-	int length = string.length ();
-	char [] text = new char [length];
-	string.getChars (0, length, text, 0);
+char [] fixMnemonic (char[] str) {
+	int len = str.length;
+	char [] text = new char [len];
+	text = str[0 .. len];
 	int i = 0, j = 0;
-	char [] result = new char [length * 2];
-	while (i < length) {
+	char [] result = new char [len * 2];
+	while (i < len) {
 		switch (text [i]) {
 			case '&':
-				if (i + 1 < length && text [i + 1] == '&') {
+				if (i + 1 < len && text [i + 1] is '&') {
 					i++;
 				} else {
 					text [i] = '_';
@@ -973,8 +980,8 @@
  *
  * @return <code>true</code> when the widget is disposed and <code>false</code> otherwise
  */
-public boolean isDisposed () {
-	return (state & DISPOSED) != 0;
+public bool isDisposed () {
+	return (state & DISPOSED) !is 0;
 }
 
 /**
@@ -993,17 +1000,17 @@
  *
  * @see SWT
  */
-public boolean isListening (int eventType) {
+public bool isListening (int eventType) {
 	checkWidget ();
 	return hooks (eventType);
 }
 
-boolean isValidThread () {
+bool isValidThread () {
 	return getDisplay ().isValidThread ();
 }
 
-boolean isValidSubclass() {
-	return Display.isValidClass(getClass());
+bool isValidSubclass() {
+	return true;//Display.isValidClass(getClass());
 }
 
 void hookEvents () {
@@ -1022,31 +1029,31 @@
  *
  * @see #isListening
  */
-boolean hooks (int eventType) {
-	if (eventTable == null) return false;
+bool hooks (int eventType) {
+	if (eventTable is null) return false;
 	return eventTable.hooks (eventType);
 }
 
-int /*long*/ hoverProc (int /*long*/ widget) {
+int /*long*/ hoverProc (GtkWidget* widget) {
 	return 0;
 }
 
-int /*long*/ menuPositionProc (int /*long*/ menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) {
+int /*long*/ menuPositionProc (GtkWidget * menu, int /*long*/ x, int /*long*/ y, int /*long*/ push_in, int /*long*/ user_data) {
 	return 0;
 }
 
-boolean mnemonicHit (int /*long*/ mnemonicHandle, char key) {
+bool mnemonicHit (int /*long*/ mnemonicHandle, char key) {
 	if (!mnemonicMatch (mnemonicHandle, key)) return false;
-	OS.g_signal_handlers_block_matched (mnemonicHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, MNEMONIC_ACTIVATE);
-	boolean result = OS.gtk_widget_mnemonic_activate (mnemonicHandle, false);
-	OS.g_signal_handlers_unblock_matched (mnemonicHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, MNEMONIC_ACTIVATE);
+	OS.g_signal_handlers_block_matched ( cast(void*)mnemonicHandle, cast(GSignalMatchType)OS.G_SIGNAL_MATCH_DATA, 0, 0, null, null, cast(void*)MNEMONIC_ACTIVATE);
+	bool result = cast(bool)OS.gtk_widget_mnemonic_activate (cast(GtkWidget*)mnemonicHandle, false);
+	OS.g_signal_handlers_unblock_matched (cast(void*)mnemonicHandle, cast(GSignalMatchType)OS.G_SIGNAL_MATCH_DATA, 0, 0, null, null, cast(void*)MNEMONIC_ACTIVATE);
 	return result;
 }
 
-boolean mnemonicMatch (int /*long*/ mnemonicHandle, char key) {
+bool mnemonicMatch (int /*long*/ mnemonicHandle, char key) {
 	int keyval1 = OS.gdk_keyval_to_lower (OS.gdk_unicode_to_keyval (key));
-	int keyval2 = OS.gdk_keyval_to_lower (OS.gtk_label_get_mnemonic_keyval (mnemonicHandle));
-	return keyval1 == keyval2;
+	int keyval2 = OS.gdk_keyval_to_lower (OS.gtk_label_get_mnemonic_keyval (cast(GtkLabel*)mnemonicHandle));
+	return keyval1 is keyval2;
 }
 
 /**
@@ -1070,7 +1077,7 @@
  */
 public void notifyListeners (int eventType, Event event) {
 	checkWidget();
-	if (event == null) event = new Event ();
+	if (event is null) event = new Event ();
 	sendEvent (eventType, event);
 }
 
@@ -1083,19 +1090,19 @@
 }
 
 void register () {
-	if (handle == 0) return;
-	if ((state & HANDLE) != 0) display.addWidget (handle, this);
+	if (handle is null) return;
+	if ((state & HANDLE) !is 0) display.addWidget (handle, this);
 }
 
-void release (boolean destroy) {
-	if ((state & DISPOSE_SENT) == 0) {
+void release (bool destroy) {
+	if ((state & DISPOSE_SENT) is 0) {
 		state |= DISPOSE_SENT;
 		sendEvent (SWT.Dispose);
 	}
-	if ((state & DISPOSED) == 0) {
+	if ((state & DISPOSED) is 0) {
 		releaseChildren (destroy);
 	}
-	if ((state & RELEASED) == 0) {
+	if ((state & RELEASED) is 0) {
 		state |= RELEASED;
 		if (destroy) {
 			releaseParent ();
@@ -1108,11 +1115,11 @@
 	}
 }
 
-void releaseChildren (boolean destroy) {
+void releaseChildren (bool destroy) {
 }
 
 void releaseHandle () {
-	handle = 0;
+	handle = null;
 	state |= DISPOSED;
 	display = null;
 }
@@ -1150,8 +1157,8 @@
  */
 public void removeListener (int eventType, Listener handler) {
 	checkWidget ();
-	if (handler == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (eventTable == null) return;
+	if (handler is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable is null) return;
 	eventTable.unhook (eventType, handler);
 }
 
@@ -1181,16 +1188,16 @@
  */
 protected void removeListener (int eventType, SWTEventListener handler) {
 	checkWidget ();
-	if (handler == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (eventTable == null) return;
+	if (handler is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable is null) return;
 	eventTable.unhook (eventType, handler);
 }
 
-int /*long*/ rendererGetSizeProc (int /*long*/ cell, int /*long*/ handle, int /*long*/ cell_area, int /*long*/ x_offset, int /*long*/ y_offset, int /*long*/ width, int /*long*/ height) {
+void rendererGetSizeProc(GtkCellRenderer *cell, GtkWidget *handle, GdkRectangle *cell_area, int *x_offset, int *y_offset, int *width, int *height) {
 	return 0;
 }
 
-int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*long*/ handle, int /*long*/ background_area, int /*long*/ cell_area, int /*long*/ expose_area, int /*long*/ flags) {
+void rendererRenderProc (GtkCellRenderer * cell, GdkDrawable * window, GtkWidget * handle, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, int flags){
 	return 0;
 }
 
@@ -1213,15 +1220,15 @@
  */
 public void removeDisposeListener (DisposeListener listener) {
 	checkWidget ();
-	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
-	if (eventTable == null) return;
+	if (listener is null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (eventTable is null) return;
 	eventTable.unhook (SWT.Dispose, listener);
 }
 
 void sendEvent (Event event) {
 	Display display = event.display;
 	if (!display.filterEvent (event)) {
-		if (eventTable != null) eventTable.sendEvent (event);
+		if (eventTable !is null) eventTable.sendEvent (event);
 	}
 }
 
@@ -1233,15 +1240,15 @@
 	sendEvent (eventType, event, true);
 }
 
-void sendEvent (int eventType, Event event, boolean send) {
-	if (eventTable == null && !display.filters (eventType)) {
+void sendEvent (int eventType, Event event, bool send) {
+	if (eventTable is null && !display.filters (eventType)) {
 		return;
 	}
-	if (event == null) event = new Event ();
+	if (event is null) event = new Event ();
 	event.type = eventType;
 	event.display = display;
 	event.widget = this;
-	if (event.time == 0) {
+	if (event.time is 0) {
 		event.time = display.getLastEventTime ();
 	}
 	if (send) {
@@ -1251,9 +1258,9 @@
 	}
 }
 
-boolean sendKeyEvent (int type, GdkEventKey keyEvent) {
-	int length = keyEvent.length;
-	if (keyEvent.string == 0 || OS.g_utf8_strlen (keyEvent.string, length) <= 1) {
+bool sendKeyEvent (int type, GdkEventKey* keyEvent) {
+	int len = keyEvent.length;
+	if (keyEvent.str is null || OS.g_utf8_strlen (keyEvent.str, len) <= 1) {
 		Event event = new Event ();
 		event.time = keyEvent.time;
 		if (!setKeyState (event, keyEvent)) return true;
@@ -1269,21 +1276,19 @@
 		if (isDisposed ()) return false;
 		return event.doit;
 	}
-	byte [] buffer = new byte [length];
-	OS.memmove (buffer, keyEvent.string, length);
-	char [] chars = Converter.mbcsToWcs (null, buffer);
-	return sendIMKeyEvent (type, keyEvent, chars) != null;
+	char [] chars = fromUtf8z( keyEvent.str );
+	return sendIMKeyEvent (type, keyEvent, chars) !is null;
 }
 
-char [] sendIMKeyEvent (int type, GdkEventKey keyEvent, char  [] chars) {
+char [] sendIMKeyEvent (int type, GdkEventKey* keyEvent, char  [] chars) {
 	int index = 0, count = 0, state = 0;
-	int /*long*/ ptr = 0;
-	if (keyEvent == null) {
+	GdkEvent*  ptr = null;
+	if (keyEvent is null) {
 		ptr = OS.gtk_get_current_event ();
-		if (ptr != 0) {
+		if (ptr !is null) {
 			keyEvent = new GdkEventKey ();
-			OS.memmove (keyEvent, ptr, GdkEventKey.sizeof);
-			switch (keyEvent.type) {
+			memmove (keyEvent, ptr, GdkEventKey.sizeof);
+			switch (cast(int)keyEvent.type) {
 				case OS.GDK_KEY_PRESS:
 				case OS.GDK_KEY_RELEASE:
 					state = keyEvent.state;
@@ -1294,14 +1299,14 @@
 			}
 		}
 	}
-	if (keyEvent == null) {
-		int [] buffer = new int [1];
-		OS.gtk_get_current_event_state (buffer);
-		state = buffer [0];
+	if (keyEvent is null) {
+		GdkModifierType buffer;
+		OS.gtk_get_current_event_state (&buffer);
+		state = buffer;
 	}
 	while (index < chars.length) {
 		Event event = new Event ();
-		if (keyEvent != null && chars.length <= 1) {
+		if (keyEvent !is null && chars.length <= 1) {
 			setKeyState (event, keyEvent);
 		} else {
 			setInputState (event, state);
@@ -1316,15 +1321,15 @@
 		* the key by returning null.
 		*/
 		if (isDisposed ()) {
-			if (ptr != 0) OS.gdk_event_free (ptr);
+			if (ptr !is null) OS.gdk_event_free (ptr);
 			return null;
 		}
 		if (event.doit) chars [count++] = chars [index];
 		index++;
 	}
-	if (ptr != 0) OS.gdk_event_free (ptr);
-	if (count == 0) return null;
-	if (index != count) {
+	if (ptr !is null) OS.gdk_event_free (ptr);
+	if (count is 0) return null;
+	if (index !is count) {
 		char [] result = new char [count];
 		System.arraycopy (chars, 0, result, 0, count);
 		return result;
@@ -1356,8 +1361,8 @@
  */
 public void setData (Object data) {
 	checkWidget();
-	if ((state & KEYED_DATA) != 0) {
-		((Object []) this.data) [0] = data;
+	if ((state & KEYED_DATA) !is 0) {
+		(cast(ArrayWrapperObject) this.data).array[0] = data;
 	} else {
 		this.data = data;
 	}
@@ -1387,94 +1392,100 @@
  *
  * @see #getData(String)
  */
-public void setData (String key, Object value) {
+public void setData (char[] key, Object value) {
 	checkWidget();
-	if (key == null) error (SWT.ERROR_NULL_ARGUMENT);
+	if (key is null) error (SWT.ERROR_NULL_ARGUMENT);
 	int index = 1;
 	Object [] table = null;
-	if ((state & KEYED_DATA) != 0) {
-		table = (Object []) data;
-		while (index < table.length) {
-			if (key.equals (table [index])) break;
+	if ((state & KEYED_DATA) !is 0) {
+		auto arr = (cast(ArrayWrapperString2) data).array;
+        ArrayWrapperString[] strtable;
+        foreach( str; arr ){
+            strtable ~= new ArrayWrapperString( str );
+        }
+		while (index < strtable.length) {
+			if (key ==/*eq*/ strtable [index].array ) break;
 			index += 2;
 		}
+        table = cast(Object[])strtable;
 	}
-	if (value != null) {
-		if ((state & KEYED_DATA) != 0) {
-			if (index == table.length) {
+	if (value !is null) {
+		if ((state & KEYED_DATA) !is 0) {
+			if (index is table.length) {
 				Object [] newTable = new Object [table.length + 2];
 				System.arraycopy (table, 0, newTable, 0, table.length);
-				data = table = newTable;
+                table = newTable;
+                data = new ArrayWrapperObject( table );
 			}
 		} else {
 			table = new Object [3];
 			table [0] = data;
-			data = table;
+            data = new ArrayWrapperObject( table );
 			state |= KEYED_DATA;
 		}
-		table [index] = key;
+		table [index] = new ArrayWrapperString( key );
 		table [index + 1] = value;
 	} else {
-		if ((state & KEYED_DATA) != 0) {
-			if (index != table.length) {
-				int length = table.length - 2;
-				if (length == 1) {
+		if ((state & KEYED_DATA) !is 0) {
+			if (index !is table.length) {
+				int len = table.length - 2;
+				if (len is 1) {
 					data = table [0];
 					state &= ~KEYED_DATA;
 				} else {
-					Object [] newTable = new Object [length];
+					Object [] newTable = new Object [len];
 					System.arraycopy (table, 0, newTable, 0, index);
-					System.arraycopy (table, index + 2, newTable, index, length - index);
-					data = newTable;
+					System.arraycopy (table, index + 2, newTable, index, len - index);
+					data = new ArrayWrapperObject( newTable );
 				}
 			}
 		}
 	}
 }
 
-void setForegroundColor (int /*long*/ handle, GdkColor color) {
-	int /*long*/ style = OS.gtk_widget_get_modifier_style (handle);
+void setForegroundColor (GtkWidget* handle, GdkColor* color) {
+    auto style = OS.gtk_widget_get_modifier_style (handle);
 	OS.gtk_rc_style_set_fg (style, OS.GTK_STATE_NORMAL, color);
 	OS.gtk_rc_style_set_fg (style, OS.GTK_STATE_ACTIVE, color);
 	OS.gtk_rc_style_set_fg (style, OS.GTK_STATE_PRELIGHT, color);
 	int flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_NORMAL);
-	flags = (color == null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
+	flags = (color is null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_NORMAL, flags);
 	flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_ACTIVE);
-	flags = (color == null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
+	flags = (color is null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_ACTIVE, flags);
 	flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_PRELIGHT);
-	flags = (color == null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
+	flags = (color is null) ? flags & ~OS.GTK_RC_FG: flags | OS.GTK_RC_FG;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_PRELIGHT, flags);
 
 	OS.gtk_rc_style_set_text (style, OS.GTK_STATE_NORMAL, color);
 	OS.gtk_rc_style_set_text (style, OS.GTK_STATE_ACTIVE, color);
 	OS.gtk_rc_style_set_text (style, OS.GTK_STATE_PRELIGHT, color);
 	flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_NORMAL);
-	flags = (color == null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
+	flags = (color is null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_NORMAL, flags);
 	flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_PRELIGHT);
-	flags = (color == null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
+	flags = (color is null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_PRELIGHT, flags);
 	flags = OS.gtk_rc_style_get_color_flags (style, OS.GTK_STATE_ACTIVE);
-	flags = (color == null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
+	flags = (color is null) ? flags & ~OS.GTK_RC_TEXT: flags | OS.GTK_RC_TEXT;
 	OS.gtk_rc_style_set_color_flags (style, OS.GTK_STATE_ACTIVE, flags);
 	OS.gtk_widget_modify_style (handle, style);
 }
 
-boolean setInputState (Event event, int state) {
-	if ((state & OS.GDK_MOD1_MASK) != 0) event.stateMask |= SWT.ALT;
-	if ((state & OS.GDK_SHIFT_MASK) != 0) event.stateMask |= SWT.SHIFT;
-	if ((state & OS.GDK_CONTROL_MASK) != 0) event.stateMask |= SWT.CONTROL;
-	if ((state & OS.GDK_BUTTON1_MASK) != 0) event.stateMask |= SWT.BUTTON1;
-	if ((state & OS.GDK_BUTTON2_MASK) != 0) event.stateMask |= SWT.BUTTON2;
-	if ((state & OS.GDK_BUTTON3_MASK) != 0) event.stateMask |= SWT.BUTTON3;
+bool setInputState (Event event, int state) {
+	if ((state & OS.GDK_MOD1_MASK) !is 0) event.stateMask |= SWT.ALT;
+	if ((state & OS.GDK_SHIFT_MASK) !is 0) event.stateMask |= SWT.SHIFT;
+	if ((state & OS.GDK_CONTROL_MASK) !is 0) event.stateMask |= SWT.CONTROL;
+	if ((state & OS.GDK_BUTTON1_MASK) !is 0) event.stateMask |= SWT.BUTTON1;
+	if ((state & OS.GDK_BUTTON2_MASK) !is 0) event.stateMask |= SWT.BUTTON2;
+	if ((state & OS.GDK_BUTTON3_MASK) !is 0) event.stateMask |= SWT.BUTTON3;
 	return true;
 }
 
-boolean setKeyState (Event event, GdkEventKey keyEvent) {
-	if (keyEvent.string != 0 && OS.g_utf8_strlen (keyEvent.string, keyEvent.length) > 1) return false;
-	boolean isNull = false;
+bool setKeyState (Event event, GdkEventKey* keyEvent) {
+	if (keyEvent.str !is null && OS.g_utf8_strlen (keyEvent.str, keyEvent.length) > 1) return false;
+	bool isNull = false;
 	event.keyCode = Display.translateKey (keyEvent.keyval);
 	switch (keyEvent.keyval) {
 		case OS.GDK_BackSpace:		event.character = SWT.BS; break;
@@ -1487,24 +1498,26 @@
 		case OS.GDK_Tab:
 		case OS.GDK_ISO_Left_Tab: 	event.character = SWT.TAB; break;
 		default: {
-			if (event.keyCode == 0) {
-				int [] keyval = new int [1], effective_group= new int [1], level = new int [1], consumed_modifiers = new int [1];
-				if (OS.gdk_keymap_translate_keyboard_state(OS.gdk_keymap_get_default (), keyEvent.hardware_keycode, 0, keyEvent.group, keyval, effective_group, level, consumed_modifiers)) {
-					event.keyCode = OS.gdk_keyval_to_unicode (keyval [0]);
+			if (event.keyCode is 0) {
+				uint keyval;
+                int effective_group, level;
+                GdkModifierType consumed_modifiers;
+				if (OS.gdk_keymap_translate_keyboard_state(OS.gdk_keymap_get_default (), keyEvent.hardware_keycode, cast(GdkModifierType)0, keyEvent.group, &keyval, &effective_group, &level, &consumed_modifiers)) {
+					event.keyCode = OS.gdk_keyval_to_unicode (keyval );
 				}
 			}
 			int key = keyEvent.keyval;
-			if ((keyEvent.state & OS.GDK_CONTROL_MASK) != 0 && (0 <= key && key <= 0x7F)) {
+			if ((keyEvent.state & OS.GDK_CONTROL_MASK) !is 0 && (0 <= key && key <= 0x7F)) {
 				if ('a'  <= key && key <= 'z') key -= 'a' - 'A';
 				if (64 <= key && key <= 95) key -= 64;
-				event.character = (char) key;
-				isNull = keyEvent.keyval == '@' && key == 0;
+				event.character = cast(char) key;
+				isNull = keyEvent.keyval is '@' && key is 0;
 			} else {
-				event.character = (char) OS.gdk_keyval_to_unicode (key);
+				event.character = cast(char) OS.gdk_keyval_to_unicode (key);
 			}
 		}
 	}
-	if (event.keyCode == 0 && event.character == 0) {
+	if (event.keyCode is 0 && event.character is 0) {
 		if (!isNull) return false;
 	}
 	return setInputState (event, keyEvent.state);
@@ -1531,20 +1544,20 @@
  *
  * @return a string representation of the receiver
  */
-public String toString () {
-	String string = "*Disposed*";
+public char[] toString () {
+	char[] str = "*Disposed*";
 	if (!isDisposed ()) {
-		string = "*Wrong Thread*";
-		if (isValidThread ()) string = getNameText ();
+		str = "*Wrong Thread*";
+		if (isValidThread ()) str = getNameText ();
 	}
-	return getName () + " {" + string + "}";
+	return getName () ~ " {" ~ str ~ "}";
 }
 
-int /*long*/ topHandle () {
+GtkWidget* topHandle () {
 	return handle;
 }
 
-int /*long*/ timerProc (int /*long*/ widget) {
+int /*long*/ timerProc (GtkWidget* widget) {
 	return 0;
 }
 
@@ -1552,12 +1565,12 @@
 	return 0;
 }
 
-boolean translateTraversal (int event) {
+bool translateTraversal (int event) {
 	return false;
 }
 
-int /*long*/ windowProc (int /*long*/ handle, int /*long*/ user_data) {
-	switch ((int)/*64*/user_data) {
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ user_data) {
+	switch (cast(int)/*64*/user_data) {
 		case ACTIVATE: return gtk_activate (handle);
 		case CHANGED: return gtk_changed (handle);
 		case CLICKED: return gtk_clicked (handle);
@@ -1570,24 +1583,24 @@
 		case POPUP_MENU: return gtk_popup_menu (handle);
 		case PREEDIT_CHANGED: return gtk_preedit_changed (handle);
 		case REALIZE: return gtk_realize (handle);
-		case SELECT: return gtk_select (handle);
+		case SELECT: return gtk_select (cast(int)handle);
 		case SHOW: return gtk_show (handle);
-		case VALUE_CHANGED: return gtk_value_changed (handle);
+		case VALUE_CHANGED: return gtk_value_changed (cast(int)handle);
 		case UNMAP: return gtk_unmap (handle);
 		case UNREALIZE: return gtk_unrealize (handle);
 		default: return 0;
 	}
 }
 
-int /*long*/ windowProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
-	switch ((int)/*64*/user_data) {
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ user_data) {
+	switch (cast(int)/*64*/user_data) {
 		case EXPOSE_EVENT_INVERSE: {
-			GdkEventExpose gdkEvent = new GdkEventExpose ();
-			OS.memmove (gdkEvent, arg0, GdkEventExpose.sizeof);
-			int /*long*/ paintWindow = paintWindow();
-			int /*long*/ window = gdkEvent.window;
-			if (window != paintWindow) return 0;
-			return (state & OBSCURED) != 0 ? 1 : 0;
+			GdkEventExpose* gdkEvent = new GdkEventExpose ();
+			memmove (gdkEvent, cast(void*)arg0, GdkEventExpose.sizeof);
+			auto paintWindow = paintWindow();
+			auto window = gdkEvent.window;
+			if (window !is paintWindow) return 0;
+			return (state & OBSCURED) !is 0 ? 1 : 0;
 		}
 		case BUTTON_PRESS_EVENT_INVERSE:
 		case BUTTON_RELEASE_EVENT_INVERSE:
@@ -1596,7 +1609,7 @@
 		}
 		case BUTTON_PRESS_EVENT: return gtk_button_press_event (handle, arg0);
 		case BUTTON_RELEASE_EVENT: return gtk_button_release_event (handle, arg0);
-		case COMMIT: return gtk_commit (handle, arg0);
+		case COMMIT: return gtk_commit (cast(int)handle, arg0);
 		case CONFIGURE_EVENT: return gtk_configure_event (handle, arg0);
 		case DELETE_EVENT: return gtk_delete_event (handle, arg0);
 		case ENTER_NOTIFY_EVENT: return gtk_enter_notify_event (handle, arg0);
@@ -1606,8 +1619,8 @@
 		case FOCUS: return gtk_focus (handle, arg0);
 		case FOCUS_IN_EVENT: return gtk_focus_in_event (handle, arg0);
 		case FOCUS_OUT_EVENT: return gtk_focus_out_event (handle, arg0);
-		case KEY_PRESS_EVENT: return gtk_key_press_event (handle, arg0);
-		case KEY_RELEASE_EVENT: return gtk_key_release_event (handle, arg0);
+		case KEY_PRESS_EVENT: return gtk_key_press_event (handle, cast(GdkEventKey*)arg0);
+		case KEY_RELEASE_EVENT: return gtk_key_release_event (handle, cast(GdkEventKey*)arg0);
 		case INPUT: return gtk_input (handle, arg0);
 		case LEAVE_NOTIFY_EVENT: return gtk_leave_notify_event (handle, arg0);
 		case MAP_EVENT: return gtk_map_event (handle, arg0);
@@ -1618,7 +1631,7 @@
 		case SHOW_HELP: return gtk_show_help (handle, arg0);
 		case SIZE_ALLOCATE: return gtk_size_allocate (handle, arg0);
 		case STYLE_SET: return gtk_style_set (handle, arg0);
-		case TOGGLED: return gtk_toggled (handle, arg0);
+		case TOGGLED: return gtk_toggled (cast(int)handle, arg0);
 		case UNMAP_EVENT: return gtk_unmap_event (handle, arg0);
 		case VISIBILITY_NOTIFY_EVENT: return gtk_visibility_notify_event (handle, arg0);
 		case WINDOW_STATE_EVENT: return gtk_window_state_event (handle, arg0);
@@ -1626,21 +1639,21 @@
 	}
 }
 
-int /*long*/ windowProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) {
-	switch ((int)/*64*/user_data) {
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ user_data) {
+	switch (cast(int)/*64*/user_data) {
 		case DELETE_RANGE: return gtk_delete_range (handle, arg0, arg1);
 		case DELETE_TEXT: return gtk_delete_text (handle, arg0, arg1);
-		case ROW_ACTIVATED: return gtk_row_activated (handle, arg0, arg1);
+		case ROW_ACTIVATED: return gtk_row_activated (cast(int)handle, arg0, arg1);
 		case SCROLL_CHILD: return gtk_scroll_child (handle, arg0, arg1);
 		case SWITCH_PAGE: return gtk_switch_page (handle, arg0, arg1);
-		case TEST_COLLAPSE_ROW: return gtk_test_collapse_row (handle, arg0, arg1);
-		case TEST_EXPAND_ROW: return gtk_test_expand_row(handle, arg0, arg1);
+		case TEST_COLLAPSE_ROW: return gtk_test_collapse_row (cast(int)handle, arg0, arg1);
+		case TEST_EXPAND_ROW: return gtk_test_expand_row(cast(int)handle, arg0, arg1);
 		default: return 0;
 	}
 }
 
-int /*long*/ windowProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) {
-	switch ((int)/*64*/user_data) {
+int /*long*/ windowProc (GtkWidget* handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) {
+	switch (cast(int)/*64*/user_data) {
 		case CHANGE_VALUE: return gtk_change_value (handle, arg0, arg1, arg2);
 		case EXPAND_COLLAPSE_CURSOR_ROW: return gtk_expand_collapse_cursor_row (handle, arg0, arg1, arg2);
 		case INSERT_TEXT: return gtk_insert_text (handle, arg0, arg1, arg2);
@@ -1650,4 +1663,3 @@
 }
 
 }
-++/
\ No newline at end of file
--- a/todo.txt	Wed Jan 09 01:08:22 2008 +0100
+++ b/todo.txt	Wed Jan 09 02:59:32 2008 +0100
@@ -113,8 +113,8 @@
 widgets/Tree
 widgets/TreeColumn
 widgets/TreeItem
-widgets/TypedListener
-widgets/Widget
+widgets/TypedListener                  // OK
+widgets/Widget                         // OK
 
 layout/FormLayout
 layout/FormAttachment