summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio_quarti@ca.ibm.com>2012-08-31 04:19:33 -0400
committerSilenio Quarti <silenio_quarti@ca.ibm.com>2012-08-31 04:19:33 -0400
commit8a770faaa4942f4e1cde0428ab3348bcc4c88e3f (patch)
tree7debf1e0e16c6edb7ebf9f09fcd15e530534968b
parent19969099fb0b8b88c03bc7dc1b553ccf865db827 (diff)
downloadeclipse.platform.swt-8a770faaa4942f4e1cde0428ab3348bcc4c88e3f.tar.gz
eclipse.platform.swt-8a770faaa4942f4e1cde0428ab3348bcc4c88e3f.tar.xz
eclipse.platform.swt-8a770faaa4942f4e1cde0428ab3348bcc4c88e3f.zip
Bug 383189 - Warnings and Errors in the SWT Combo when running on Linux
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java104
1 files changed, 66 insertions, 38 deletions
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 2199d28a60..a0fcb98f99 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
@@ -341,7 +341,7 @@ void clearText () {
public Point computeSize (int wHint, int hHint, boolean changed) {
checkWidget ();
- if ((style & SWT.READ_ONLY) != 0 || menuHandle != 0) {
+ if ((style & SWT.READ_ONLY) != 0) {
return computeNativeSize (handle, wHint, hHint, changed);
}
if (wHint != SWT.DEFAULT && wHint < 0) wHint = 0;
@@ -441,8 +441,10 @@ void createHandle (int index) {
if (OS.GTK_VERSION < OS.VERSION (2, 8, 0)) {
OS.gtk_widget_size_request(handle, new GtkRequisition());
}
- if (popupHandle != 0) findMenuHandle ();
- findButtonHandle ();
+ menuHandle = findMenuHandle ();
+ if (menuHandle != 0) OS.g_object_ref (menuHandle);
+ buttonHandle = findButtonHandle ();
+ if (buttonHandle != 0) OS.g_object_ref (buttonHandle);
/*
* Feature in GTK. By default, read only combo boxes
* process the RETURN key rather than allowing the
@@ -525,8 +527,7 @@ int /*long*/ findPopupHandle (int /*long*/ oldList) {
return result;
}
-
-void findButtonHandle() {
+int /*long*/ findButtonHandle() {
/*
* Feature in GTK. There is no API to query the button
* handle from a combo box although it is possible to get the
@@ -534,32 +535,33 @@ void findButtonHandle() {
* fix is to walk the combo tree and find the first child that is
* an instance of button.
*/
+ int /*long*/ result = 0;
OS.gtk_container_forall (handle, 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.GTK_IS_BUTTON (widget)) {
- buttonHandle = widget;
- OS.g_object_ref (buttonHandle);
+ result = widget;
break;
}
- list = OS.g_list_next (list);
}
OS.g_list_free (display.allChildren);
display.allChildren = 0;
}
+ return result;
}
-void findMenuHandle() {
+int /*long*/ findMenuHandle() {
+ if (popupHandle == 0) return 0;
+ int /*long*/ result = 0;
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;
- OS.g_object_ref (menuHandle);
+ result = widget;
break;
}
list = OS.g_list_next (list);
@@ -567,6 +569,7 @@ void findMenuHandle() {
OS.g_list_free (display.allChildren);
display.allChildren = 0;
}
+ return result;
}
void fixModal (int /*long*/ group, int /*long*/ modalGroup) {
@@ -607,7 +610,6 @@ int /*long*/ fontHandle () {
}
int /*long*/ focusHandle () {
- if ((style & SWT.READ_ONLY) != 0 && buttonHandle != 0) return buttonHandle;
if (entryHandle != 0) return entryHandle;
return super.focusHandle ();
}
@@ -629,9 +631,20 @@ void hookEvents () {
OS.g_signal_connect_closure (entryHandle, OS.activate, display.closures [ACTIVATE], false);
OS.g_signal_connect_closure (entryHandle, OS.populate_popup, display.closures [POPULATE_POPUP], false);
}
- 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, menuHandle};
+
+ hookEvents(new int /*long*/ [] {buttonHandle, entryHandle, menuHandle});
+
+ int /*long*/ imContext = imContext ();
+ if (imContext != 0) {
+ OS.g_signal_connect_closure (imContext, OS.commit, display.closures [COMMIT], false);
+ int id = OS.g_signal_lookup (OS.commit, OS.gtk_im_context_get_type ());
+ int blockMask = OS.G_SIGNAL_MATCH_DATA | OS.G_SIGNAL_MATCH_ID;
+ OS.g_signal_handlers_block_matched (imContext, blockMask, id, 0, 0, 0, entryHandle);
+ }
+}
+
+void hookEvents(int /*long*/ [] handles) {
+ int eventMask = OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK;
for (int i=0; i<handles.length; i++) {
int /*long*/ eventHandle = handles [i];
if (eventHandle != 0) {
@@ -655,17 +668,11 @@ void hookEvents () {
if (eventHandle != focusHandle ()) {
OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false);
}
+ if (OS.G_OBJECT_TYPE (eventHandle) == OS.GTK_TYPE_MENU ()) {
+ OS.g_signal_connect_closure(eventHandle, OS.selection_done, display.closures[SELECTION_DONE], true);
+ }
}
}
- int /*long*/ imContext = imContext ();
- if (imContext != 0) {
- OS.g_signal_connect_closure (imContext, OS.commit, display.closures [COMMIT], false);
- int id = OS.g_signal_lookup (OS.commit, OS.gtk_im_context_get_type ());
- int blockMask = OS.G_SIGNAL_MATCH_DATA | OS.G_SIGNAL_MATCH_ID;
- OS.g_signal_handlers_block_matched (imContext, blockMask, id, 0, 0, 0, entryHandle);
- }
-
- if (menuHandle != 0) OS.g_signal_connect_closure(menuHandle, OS.selection_done, display.closures[SELECTION_DONE], true);
}
int /*long*/ imContext () {
@@ -1226,20 +1233,6 @@ int /*long*/ gtk_event_after (int /*long*/ widget, int /*long*/ gdkEvent) {
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_object_ref (menuHandle);
- 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);
- OS.g_signal_connect_closure (menuHandle, OS.selection_done, display.closures [SELECTION_DONE], false);
- display.addWidget (menuHandle, this);
- selectionAdded = true;
- }
- }
- }
GdkEventButton gdkEventButton = new GdkEventButton ();
OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof);
if (gdkEventButton.button == 1) {
@@ -1386,6 +1379,13 @@ int /*long*/ gtk_selection_done(int /*long*/ menushell) {
}
return 0;
}
+
+int /*long*/ gtk_style_set (int /*long*/ widget, int /*long*/ previousStyle) {
+ setButtonHandle (findButtonHandle ());
+ setMenuHandle (findMenuHandle ());
+ return super.gtk_style_set (widget, previousStyle);
+}
+
/**
* Searches the receiver's list starting at the first item
* (index 0) until an item is found that is equal to the
@@ -1726,6 +1726,34 @@ int setBounds (int x, int y, int width, int height, boolean move, boolean resize
return super.setBounds (x, y, width, newHeight, move, resize);
}
+void setButtonHandle (int /*long*/ widget) {
+ if (buttonHandle == widget) return;
+ if (buttonHandle != 0) {
+ display.removeWidget (buttonHandle);
+ OS.g_object_unref (buttonHandle);
+ }
+ buttonHandle = widget;
+ if (buttonHandle != 0) {
+ OS.g_object_ref (buttonHandle);
+ display.addWidget (buttonHandle, this);
+ hookEvents (new int /*long*/[]{buttonHandle});
+ }
+}
+
+void setMenuHandle (int /*long*/ widget) {
+ if (menuHandle == widget) return;
+ if (menuHandle != 0) {
+ display.removeWidget (menuHandle);
+ OS.g_object_unref (menuHandle);
+ }
+ menuHandle = widget;
+ if (menuHandle != 0) {
+ OS.g_object_ref (menuHandle);
+ display.addWidget (menuHandle, this);
+ hookEvents (new int /*long*/[]{menuHandle});
+ }
+}
+
void setFontDescription (int /*long*/ font) {
super.setFontDescription (font);
if (entryHandle != 0) OS.gtk_widget_modify_font (entryHandle, font);