273850 SWT.MouseDown event not fired on combo widget arrow down (GTK only)
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 c194081..f6f8358 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
@@ -56,12 +56,12 @@
  * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
  */
 public class Combo extends Composite {
-	int /*long*/ buttonHandle, entryHandle, listHandle, textRenderer, cellHandle, popupHandle;
+	int /*long*/ buttonHandle, entryHandle, listHandle, textRenderer, cellHandle, popupHandle, menuHandle;
 	int lastEventTime, visibleCount = 5;
 	int /*long*/ gdkEventKey = 0;
 	int fixStart = -1, fixEnd = -1;
 	String [] items = new String [0];
-	boolean ignoreSelect, lockText;
+	boolean ignoreSelect, lockText, selectionAdded;
 
 	static final int INNER_BORDER = 2;
 
@@ -460,6 +460,15 @@
 		OS.gtk_cell_layout_set_attributes (handle, textRenderer, OS.text, 0, 0);
 
 		/*
+		* Feature in GTK. Toggle button creation differs between GTK versions. The 
+		* fix is to call size_request() to force the creation of the button 
+		* for those versions of GTK that defer the creation. 
+		*/
+		if (OS.GTK_VERSION < OS.VERSION (2, 8, 0)) {
+			OS.gtk_widget_size_request(handle, new GtkRequisition());
+		}
+		if (popupHandle != 0) findMenuHandle ();
+		/*
 		* Feature in GTK.  There is no API to query the button
 		* handle from a combo box although it is possible to get the
 		* text field.  The button handle is needed to hook events.  The
@@ -564,6 +573,7 @@
 	if (buttonHandle != 0) display.removeWidget (buttonHandle);
 	if (entryHandle != 0) display.removeWidget (entryHandle);
 	if (listHandle != 0) display.removeWidget (listHandle);
+	if (menuHandle != 0) display.removeWidget (menuHandle);
 	int /*long*/ imContext = imContext ();
 	if (imContext != 0) display.removeWidget (imContext);
 }
@@ -610,6 +620,23 @@
 	return hdl;
 }
 
+void findMenuHandle() {
+	OS.gtk_container_forall (popupHandle, display.allChildrenProc, 0);
+	if (display.allChildren != 0) {
+		int /*long*/ list = display.allChildren;
+		while (list != 0) {
+			int /*long*/ widget = OS.g_list_data (list);
+			if (OS.G_OBJECT_TYPE (widget) == OS.GTK_TYPE_MENU ()) {
+				menuHandle = widget;
+				break;
+			}
+			list = OS.g_list_next (list);
+		}
+		OS.g_list_free (display.allChildren);
+		display.allChildren = 0;
+	}
+}
+
 void fixModal (int /*long*/ group, int /*long*/ modalGroup) {
 	if (popupHandle != 0) {
 		if (group != 0) {
@@ -677,7 +704,7 @@
 	}
 	int eventMask =	OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | 
 		OS.GDK_BUTTON_RELEASE_MASK;
- 	int /*long*/ [] handles = new int /*long*/ [] {buttonHandle, entryHandle, listHandle};
+ 	int /*long*/ [] handles = new int /*long*/ [] {buttonHandle, entryHandle, listHandle, menuHandle};
 	for (int i=0; i<handles.length; i++) {
 		int /*long*/ eventHandle = handles [i];
 		if (eventHandle != 0) {
@@ -1119,7 +1146,7 @@
 	if (OS.GTK_VERSION >= OS.VERSION (2, 4, 0)) {
 		GdkEventButton gdkEvent = new GdkEventButton ();
 		OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
-		if (gdkEvent.type == OS.GDK_BUTTON_PRESS && gdkEvent.button == 1 && (style & SWT.READ_ONLY) != 0) {
+		if (gdkEvent.type == OS.GDK_BUTTON_PRESS && gdkEvent.button == 1) {
 			return gtk_button_press_event(widget, event, false);
 		}
 	}
@@ -1273,10 +1300,22 @@
 		OS.memmove (event, gdkEvent, GdkEvent.sizeof);
 		switch (event.type) {
 			case OS.GDK_BUTTON_PRESS: {
+				if (OS.GTK_VERSION < OS.VERSION (2, 8, 0) && !selectionAdded) {
+					int /*long*/ grabHandle = OS.gtk_grab_get_current ();
+					if (grabHandle != 0) {
+						if (OS.G_OBJECT_TYPE (grabHandle) == OS.GTK_TYPE_MENU ()) {
+							menuHandle = grabHandle;
+							OS.g_signal_connect_closure_by_id (menuHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT], false);
+							OS.g_signal_connect_closure_by_id (menuHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT_INVERSE], true);
+							display.addWidget (menuHandle, this);
+							selectionAdded = true;
+						}
+					}
+				}
 				GdkEventButton gdkEventButton = new GdkEventButton ();
 				OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof);
 				if (gdkEventButton.button == 1) {
-					if ((style & SWT.READ_ONLY) != 0 && !sendMouseEvent (SWT.MouseDown, gdkEventButton.button, display.clickCount, 0, false, gdkEventButton.time, gdkEventButton.x_root, gdkEventButton.y_root, false, gdkEventButton.state)) {
+					if (!sendMouseEvent (SWT.MouseDown, gdkEventButton.button, display.clickCount, 0, false, gdkEventButton.time, gdkEventButton.x_root, gdkEventButton.y_root, false, gdkEventButton.state)) {
 						return 1;
 					}
 					if (OS.GTK_VERSION >= OS.VERSION (2, 6, 0)) {
@@ -1514,6 +1553,7 @@
 	if (buttonHandle != 0) display.addWidget (buttonHandle, this);
 	if (entryHandle != 0) display.addWidget (entryHandle, this);
 	if (listHandle != 0) display.addWidget (listHandle, this);
+	if (menuHandle != 0) display.addWidget (menuHandle, this);
 	int /*long*/ imContext = imContext ();
 	if (imContext != 0) display.addWidget (imContext, this);
 }