*** empty log message ***
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java
index 73d1f0a..efbe39b 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java
@@ -734,6 +734,19 @@
 	return 0;
 }
 
+int gtk_button_press_event (int widget, int event) {
+	int result = super.gtk_button_press_event (widget, event) ;
+	if (result != 0) return result;
+	GdkEventButton gdkEvent = new GdkEventButton ();
+	OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+	if (gdkEvent.button == 3 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
+		if (showMenu ((int)gdkEvent.x_root, (int)gdkEvent.y_root)) {
+			return 1;
+		}
+	}	
+	return 0;
+}
+
 int gtk_changed (int widget) {
 	sendEvent (SWT.Modify);
 	return 0;
@@ -764,6 +777,20 @@
 	return 0;
 }
 
+int gtk_event_after (int widget, int gdkEvent) {
+	GdkEvent event = new GdkEvent ();
+	OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+	switch (event.type) {
+		case OS.GDK_FOCUS_CHANGE: {
+			GdkEventFocus gdkEventFocus = new GdkEventFocus ();
+			OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof);
+			sendFocusEvent (gdkEventFocus.in != 0 ? SWT.FocusIn : SWT.FocusOut);
+			break;
+		}
+	}
+	return 0;
+}
+
 int gtk_key_press_event (int widget, int event) {
 	if (widget != entryHandle) {
 		return super.gtk_key_press_event (widget, event);
@@ -780,6 +807,12 @@
 	return super.gtk_key_press_event (widget, event);
 }
 
+int gtk_popup_menu (int widget) {
+	int [] x = new int [1], y = new int [1];
+	OS.gdk_window_get_pointer (0, x, y, null);
+	return showMenu (x [0], y [0]) ? 1 : 0;
+}
+
 int gtk_select_child (int list, int widget) {
 	if (lastSelectedItem == widget) return 0;
 	int event = OS.gtk_get_current_event ();	
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
index f315a68..234da35 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
@@ -1600,12 +1600,6 @@
 	display.dragStartX = (int) gdkEvent.x;
 	display.dragStartY = (int) gdkEvent.y;
 	display.dragging = false;
-	int result = 0;
-	if (gdkEvent.button == 3 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
-		if (showMenu ((int)gdkEvent.x_root, (int)gdkEvent.y_root)) {
-			result = 1;
-		}
-	}
 	int button = gdkEvent.button;
 	int type = gdkEvent.type != OS.GDK_2BUTTON_PRESS ? SWT.MouseDown : SWT.MouseDoubleClick;
 	sendMouseEvent (type, button, event);
@@ -1619,7 +1613,7 @@
 	if (!shell.isDisposed ()) {
 		shell.setActiveControl (this);
 	}
-	return result;
+	return 0;
 }
 
 int gtk_button_release_event (int widget, int event) {
@@ -1653,6 +1647,14 @@
 	GdkEvent event = new GdkEvent ();
 	OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
 	switch (event.type) {
+		case OS.GDK_BUTTON_PRESS: {
+			GdkEventButton gdkEventButton = new GdkEventButton ();
+			OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof);
+			if (gdkEventButton.button == 3) {
+				showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root);
+			}
+			break;
+		}
 		case OS.GDK_FOCUS_CHANGE: {
 			GdkEventFocus gdkEventFocus = new GdkEventFocus ();
 			OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof);
@@ -1778,7 +1780,8 @@
 int gtk_popup_menu (int widget) {
 	int [] x = new int [1], y = new int [1];
 	OS.gdk_window_get_pointer (0, x, y, null);
-	return showMenu (x [0], y [0]) ? 1 : 0;
+	showMenu (x [0], y [0]);
+	return 0;
 }
 
 int gtk_preedit_changed (int imcontext) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
index 3a33394..3712e2a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
@@ -948,11 +948,24 @@
 		// widget could be disposed at this point
 		if (isDisposed ()) return;
 		OS.gtk_widget_show (shellHandle);
-		while (!isDisposed () && !OS.GTK_WIDGET_MAPPED (shellHandle)) {
+		
+		//TEMPORARY CODE
+		final boolean[] mapped = new boolean [1];
+		Callback proc = new Callback(new Object() {
+			public int proc(int widget, int event, int userdata) {
+				mapped [0] = true;
+				return 0;
+			}
+		}, "proc", 3);
+		int id = OS.g_signal_connect (shellHandle, OS.map_event, proc.getAddress (), 0);		
+		while (!isDisposed () && !mapped [0]) {
 			OS.gtk_main_iteration ();
 		}
+		proc.dispose();
 		// widget could be disposed at this point
 		if (isDisposed ()) return;
+		OS.g_signal_handler_disconnect (shellHandle, id);
+		
 		adjustTrim ();
 	} else {	
 		OS.gtk_widget_hide (shellHandle);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java
index ae777c0..818c2be 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java
@@ -820,6 +820,19 @@
 	return 0;
 }
 
+int gtk_button_press_event (int widget, int event) {
+	int result = super.gtk_button_press_event (widget, event) ;
+	if (result != 0) return result;
+	GdkEventButton gdkEvent = new GdkEventButton ();
+	OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+	if (gdkEvent.button == 3 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
+		if (showMenu ((int)gdkEvent.x_root, (int)gdkEvent.y_root)) {
+			return 1;
+		}
+	}	
+	return 0;
+}
+
 int gtk_changed (int widget) {
 	sendEvent (SWT.Modify);
 	return 0;
@@ -876,6 +889,20 @@
 	return 0;
 }
 
+int gtk_event_after (int widget, int gdkEvent) {
+	GdkEvent event = new GdkEvent ();
+	OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+	switch (event.type) {
+		case OS.GDK_FOCUS_CHANGE: {
+			GdkEventFocus gdkEventFocus = new GdkEventFocus ();
+			OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof);
+			sendFocusEvent (gdkEventFocus.in != 0 ? SWT.FocusIn : SWT.FocusOut);
+			break;
+		}
+	}
+	return 0;
+}
+
 int gtk_insert_text (int widget, int int0, int int1, int int2) {
 	if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
 	if ((style & SWT.SINGLE) != 0) {
@@ -936,6 +963,12 @@
 	return super.gtk_key_press_event (widget, event);
 }
 
+int gtk_popup_menu (int widget) {
+	int [] x = new int [1], y = new int [1];
+	OS.gdk_window_get_pointer (0, x, y, null);
+	return showMenu (x [0], y [0]) ? 1 : 0;
+}
+
 void hookEvents () {
 	super.hookEvents();
 	int windowProc2 = display.windowProc2;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
index 90c239e..8f93be9 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java
@@ -475,6 +475,22 @@
 	return 0;
 }
 
+int gtk_event_after (int widget, int gdkEvent) {
+	GdkEvent event = new GdkEvent ();
+	OS.memmove (event, gdkEvent, GdkEvent.sizeof);
+	switch (event.type) {
+		case OS.GDK_BUTTON_PRESS: {
+			GdkEventButton gdkEventButton = new GdkEventButton ();
+			OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof);
+			if (gdkEventButton.button == 3) {
+				parent.showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root);
+			}
+			break;
+		}
+	}	
+	return 0;
+}
+
 int gtk_leave_notify_event (int widget, int event) {
 	if (drawHotImage) {
 		drawHotImage = false;
@@ -511,6 +527,7 @@
 	OS.gtk_widget_add_events (handle, mask);
 	OS.g_signal_connect (handle, OS.button_press_event, windowProc3, BUTTON_PRESS_EVENT);
 	OS.g_signal_connect (handle, OS.button_release_event, windowProc3, BUTTON_RELEASE_EVENT);
+	OS.g_signal_connect (handle, OS.event_after, windowProc3, EVENT_AFTER);
 }
 
 /**