diff options
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java | 18 |
1 files changed, 15 insertions, 3 deletions
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 46d3bc0372..71a664aa24 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 @@ -48,6 +48,8 @@ public class ToolItem extends Item { Image hotImage, disabledImage; String toolTipText; boolean drawHotImage; + /** True iff map has been hooked for this ToolItem. See bug 546914. */ + boolean mapHooked; /** * Constructs a new instance of this class given its parent @@ -792,9 +794,11 @@ void hookEvents () { } else { OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.getClosure (EVENT_AFTER), false); } - - long topHandle = topHandle (); - OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, display.getClosure (MAP), true); + if (!mapHooked) { + long topHandle = topHandle (); + OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, display.getClosure (MAP), true); + mapHooked = true; + } } /** @@ -951,6 +955,14 @@ public void setControl (Control control) { if (this.control == control) return; this.control = control; parent.relayout (); + // Fix the Z-order in order to ensure proper event traversal. See bug 546914. + if (control != null) { + parent.fixZOrder(); + if (!mapHooked) { + OS.g_signal_connect_closure_by_id (topHandle(), display.signalIds [MAP], 0, display.getClosure (MAP), true); + mapHooked = true; + } + } } /** |