diff options
author | Anatoly Spektor <aspektor@redhat.com> | 2013-05-22 17:10:25 -0400 |
---|---|---|
committer | Anatoly Spektor <aspektor@redhat.com> | 2013-05-22 17:10:25 -0400 |
commit | 146fcd204f6173428bbe11fa6103c32de022fc8a (patch) | |
tree | 4c43704e5e3c84df39f7d6be87f95f8a88dd4e67 | |
parent | f1f45c74fe38a901552d12f65eebf46b85a192dd (diff) | |
download | eclipse.platform.swt-gsignal.tar.gz eclipse.platform.swt-gsignal.tar.xz eclipse.platform.swt-gsignal.zip |
Gsignal closures implementation that fixes invalidate_notifier errorsgsignal
18 files changed, 119 insertions, 96 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java index 8282c908b3..2455f8c8fd 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java @@ -528,9 +528,9 @@ long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ event) { void hookEvents () { super.hookEvents(); - OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); + OS.g_signal_connect_closure (handle, OS.clicked, getClosure(CLICKED, display.windowProc2), false); if (labelHandle != 0) { - OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); + OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); } } 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 7833301184..dda7477969 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 @@ -665,9 +665,9 @@ void hookEvents(long /*int*/ [] handles) { if (eventHandle != 0) { /* Connect the mouse signals */ OS.gtk_widget_add_events (eventHandle, eventMask); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, display.closures [MOTION_NOTIFY_EVENT], false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, getClosure(BUTTON_RELEASE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, getClosure(MOTION_NOTIFY_EVENT, display.windowProc3), false); /* * Feature in GTK. Events such as mouse move are propagated up * the widget hierarchy and are seen by the parent. This is the @@ -675,16 +675,16 @@ void hookEvents(long /*int*/ [] handles) { * hook a signal after and stop the propagation using a negative * event number to distinguish this case. */ - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT_INVERSE], true); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT_INVERSE], true); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, display.closures [MOTION_NOTIFY_EVENT_INVERSE], true); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT_INVERSE, display.windowProc3), true); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, getClosure(BUTTON_RELEASE_EVENT_INVERSE, display.windowProc3), true); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, getClosure(MOTION_NOTIFY_EVENT_INVERSE, display.windowProc3), true); /* Connect the event_after signal for both key and mouse */ if (eventHandle != focusHandle ()) { - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), 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); + OS.g_signal_connect_closure(eventHandle, OS.selection_done, getClosure(SELECTION_DONE, display.windowProc2), true); } } } 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 12219c962e..4c8bde68b4 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 @@ -283,29 +283,29 @@ void hookEvents () { long /*int*/ focusHandle = focusHandle (); int focusMask = OS.GDK_KEY_PRESS_MASK | OS.GDK_KEY_RELEASE_MASK | OS.GDK_FOCUS_CHANGE_MASK; OS.gtk_widget_add_events (focusHandle, focusMask); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [POPUP_MENU], 0, display.closures [POPUP_MENU], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [SHOW_HELP], 0, display.closures [SHOW_HELP], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [KEY_PRESS_EVENT], 0, display.closures [KEY_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [KEY_RELEASE_EVENT], 0, display.closures [KEY_RELEASE_EVENT], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS], 0, display.closures [FOCUS], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS_IN_EVENT], 0, display.closures [FOCUS_IN_EVENT], false); - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS_OUT_EVENT], 0, display.closures [FOCUS_OUT_EVENT], false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [POPUP_MENU], 0, getClosure(POPUP_MENU, display.windowProc2), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [SHOW_HELP], 0, getClosure(SHOW_HELP, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [KEY_PRESS_EVENT], 0, getClosure(KEY_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [KEY_RELEASE_EVENT], 0, getClosure(KEY_RELEASE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS], 0, getClosure(FOCUS, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS_IN_EVENT], 0, getClosure(FOCUS_IN_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [FOCUS_OUT_EVENT], 0, getClosure(FOCUS_OUT_EVENT, display.windowProc3), false); /* Connect the mouse signals */ long /*int*/ eventHandle = eventHandle (); int eventMask = OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_SCROLL_MASK | OS.GDK_SMOOTH_SCROLL_MASK; OS.gtk_widget_add_events (eventHandle, eventMask); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, display.closures [MOTION_NOTIFY_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [SCROLL_EVENT], 0, display.closures [SCROLL_EVENT], false); - + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, getClosure(BUTTON_RELEASE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, getClosure(MOTION_NOTIFY_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [SCROLL_EVENT], 0, getClosure(SCROLL_EVENT, display.windowProc3), false); + /* Connect enter/exit signals */ long /*int*/ enterExitHandle = enterExitHandle (); int enterExitMask = OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK; OS.gtk_widget_add_events (enterExitHandle, enterExitMask); - OS.g_signal_connect_closure_by_id (enterExitHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.closures [ENTER_NOTIFY_EVENT], false); - OS.g_signal_connect_closure_by_id (enterExitHandle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, display.closures [LEAVE_NOTIFY_EVENT], false); + OS.g_signal_connect_closure_by_id (enterExitHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, getClosure(ENTER_NOTIFY_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (enterExitHandle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, getClosure(LEAVE_NOTIFY_EVENT, display.windowProc3), false); /* * Feature in GTK. Events such as mouse move are propagate up @@ -318,14 +318,14 @@ void hookEvents () { * lightweight widgets. */ long /*int*/ blockHandle = fixedHandle != 0 ? fixedHandle : eventHandle; - OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT_INVERSE], true); - OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT_INVERSE], true); - OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, display.closures [MOTION_NOTIFY_EVENT_INVERSE], true); + OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT_INVERSE, display.windowProc3), true); + OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, getClosure(BUTTON_RELEASE_EVENT_INVERSE, display.windowProc3), true); + OS.g_signal_connect_closure_by_id (blockHandle, display.signalIds [MOTION_NOTIFY_EVENT], 0, getClosure(MOTION_NOTIFY_EVENT_INVERSE, display.windowProc3), true); /* Connect the event_after signal for both key and mouse */ - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); if (focusHandle != eventHandle) { - OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); } /* Connect the paint signal */ @@ -333,31 +333,30 @@ void hookEvents () { int paintMask = OS.GDK_EXPOSURE_MASK | OS.GDK_VISIBILITY_NOTIFY_MASK; OS.gtk_widget_add_events (paintHandle, paintMask); - OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [EXPOSE_EVENT], 0, display.closures [EXPOSE_EVENT_INVERSE], false); - + OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [EXPOSE_EVENT], 0, getClosure(EXPOSE_EVENT_INVERSE, display.windowProc3), false); /* * As of GTK 2.17.11, obscured controls no longer send expose * events. It is no longer necessary to track visiblity notify * events. */ if (OS.GTK_VERSION < OS.VERSION (2, 17, 11)) { - OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [VISIBILITY_NOTIFY_EVENT], 0, display.closures [VISIBILITY_NOTIFY_EVENT], false); + OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [VISIBILITY_NOTIFY_EVENT], 0, getClosure(VISIBILITY_NOTIFY_EVENT, display.windowProc3), false); } - OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [EXPOSE_EVENT], 0, display.closures [EXPOSE_EVENT], true); + OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [EXPOSE_EVENT], 0, getClosure(EXPOSE_EVENT, display.windowProc3), true); /* Connect the Input Method signals */ - OS.g_signal_connect_closure_by_id (handle, display.signalIds [REALIZE], 0, display.closures [REALIZE], true); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [UNREALIZE], 0, display.closures [UNREALIZE], false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [REALIZE], 0, getClosure(REALIZE, display.windowProc2), true); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [UNREALIZE], 0, getClosure(UNREALIZE, display.windowProc2), false); long /*int*/ imHandle = imHandle (); if (imHandle != 0) { - OS.g_signal_connect_closure (imHandle, OS.commit, display.closures [COMMIT], false); - OS.g_signal_connect_closure (imHandle, OS.preedit_changed, display.closures [PREEDIT_CHANGED], false); + OS.g_signal_connect_closure (imHandle, OS.commit, getClosure(COMMIT, display.windowProc3), false); + OS.g_signal_connect_closure (imHandle, OS.preedit_changed, getClosure(PREEDIT_CHANGED, display.windowProc2), false); } - OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [STYLE_SET], 0, display.closures [STYLE_SET], false); + OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [STYLE_SET], 0, getClosure(STYLE_SET, display.windowProc3), false); long /*int*/ topHandle = topHandle (); - OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, display.closures [MAP], true); + OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, getClosure(MAP, display.windowProc2), true); } boolean hooksPaint () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 810e919914..fe73bb0240 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -11,6 +11,9 @@ package org.eclipse.swt.widgets; +import java.util.HashMap; +import java.util.Map; + import org.eclipse.swt.*; import org.eclipse.swt.internal.*; import org.eclipse.swt.internal.cairo.*; @@ -152,7 +155,10 @@ public class Display extends Device { boolean ignoreActivate, ignoreFocus; Tracker tracker; - + + Map closure_map = new HashMap (); + Integer n_notifier = new Integer(0); + /* Input method resources */ Control imControl; long /*int*/ preeditWindow, preeditLabel; @@ -3493,11 +3499,12 @@ void releaseDisplay () { caretCallback = null; /* Release closures */ - for (int i = 0; i < Widget.LAST_SIGNAL; i++) { - if (closures [i] != 0) OS.g_closure_unref (closures [i]); + if (OS.GLIB_VERSION < OS.VERSION(2, 36, 0)){ + for (int i = 0; i < Widget.LAST_SIGNAL; i++) { + if (closures [i] != 0) OS.g_closure_unref (closures [i]); + } + if (shellMapProcClosure != 0) OS.g_closure_unref (shellMapProcClosure); } - if (shellMapProcClosure != 0) OS.g_closure_unref (shellMapProcClosure); - /* Dispose the timer callback */ if (timerIds != null) { for (int i=0; i<timerIds.length; i++) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandItem.java index cf65c83111..743c288a37 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandItem.java @@ -346,12 +346,12 @@ boolean hasFocus () { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE], false); - OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE_INVERSE], true); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [FOCUS_OUT_EVENT], 0, display.closures [FOCUS_OUT_EVENT], false); - OS.g_signal_connect_closure (clientHandle, OS.size_allocate, display.closures [SIZE_ALLOCATE], true); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.closures [ENTER_NOTIFY_EVENT], false); + OS.g_signal_connect_closure (handle, OS.activate, getClosure(ACTIVATE, display.windowProc2), false); + OS.g_signal_connect_closure (handle, OS.activate, getClosure(ACTIVATE_INVERSE, display.windowProc2), true); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [FOCUS_OUT_EVENT], 0, getClosure(FOCUS_OUT_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure (clientHandle, OS.size_allocate, getClosure(SIZE_ALLOCATE, display.windowProc3), true); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [ENTER_NOTIFY_EVENT], 0, getClosure(ENTER_NOTIFY_EVENT, display.windowProc3), false); } void redraw () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java index c84d4e4ee2..3c0d9a39e8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java @@ -193,7 +193,7 @@ public String getText () { void hookEvents () { super.hookEvents(); if (labelHandle != 0) { - OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); + OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java index 6192bb829c..aeb1514e37 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java @@ -328,7 +328,7 @@ public String getText () { void hookEvents () { super.hookEvents(); if (labelHandle != 0) { - OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); + OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java index fbc2776b82..2f0fdb1ae5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java @@ -686,9 +686,9 @@ long /*int*/ gtk_show_help (long /*int*/ widget, long /*int*/ helpType) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW], 0, display.closures [SHOW], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [HIDE], 0, display.closures [HIDE], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW_HELP], 0, display.closures [SHOW_HELP], false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW], 0, getClosure(SHOW, display.windowProc2), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [HIDE], 0, getClosure(HIDE, display.windowProc2), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW_HELP], 0, getClosure(SHOW_HELP, display.windowProc3), false); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MenuItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MenuItem.java index 4f2a77114e..a39ac4b4bd 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MenuItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MenuItem.java @@ -468,9 +468,9 @@ long /*int*/ gtk_show_help (long /*int*/ widget, long /*int*/ helpType) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE], false); - OS.g_signal_connect_closure (handle, OS.select, display.closures [SELECT], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW_HELP], 0, display.closures [SHOW_HELP], false); + OS.g_signal_connect_closure (handle, OS.activate, getClosure(ACTIVATE, display.windowProc2), false); + OS.g_signal_connect_closure (handle, OS.select, getClosure(SELECT, display.windowProc2), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [SHOW_HELP], 0, getClosure(SHOW_HELP, display.windowProc3), false); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java index 6891f4e187..569ce28052 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java @@ -531,10 +531,10 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure (handle, OS.change_value, display.closures [CHANGE_VALUE], false); - OS.g_signal_connect_closure (adjustmentHandle, OS.value_changed, display.closures [VALUE_CHANGED], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); + OS.g_signal_connect_closure (handle, OS.change_value, getClosure(CHANGE_VALUE, display.windowProc5), false); + OS.g_signal_connect_closure (adjustmentHandle, OS.value_changed, getClosure(VALUE_CHANGED, display.windowProc2), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); } /** 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 6cd7da57ac..bc69ece921 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 @@ -824,14 +824,14 @@ boolean hasBorder () { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [KEY_PRESS_EVENT], 0, display.closures [KEY_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [WINDOW_STATE_EVENT], 0, display.closures [WINDOW_STATE_EVENT], false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [SIZE_ALLOCATE], 0, display.closures [SIZE_ALLOCATE], false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [CONFIGURE_EVENT], 0, display.closures [CONFIGURE_EVENT], false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [DELETE_EVENT], 0, display.closures [DELETE_EVENT], false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [KEY_PRESS_EVENT], 0, getClosure(KEY_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [WINDOW_STATE_EVENT], 0, getClosure(WINDOW_STATE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [SIZE_ALLOCATE], 0, getClosure(SIZE_ALLOCATE, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [CONFIGURE_EVENT], 0, getClosure(CONFIGURE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [DELETE_EVENT], 0, getClosure(DELETE_EVENT, display.windowProc3), false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [MAP_EVENT], 0, display.shellMapProcClosure, false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.closures [ENTER_NOTIFY_EVENT], false); - OS.g_signal_connect_closure (shellHandle, OS.move_focus, display.closures [MOVE_FOCUS], false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, getClosure(ENTER_NOTIFY_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure (shellHandle, OS.move_focus, getClosure(MOVE_FOCUS, display.windowProc3), false); if (!OS.GTK3) { long /*int*/ window = gtk_widget_get_window (shellHandle); OS.gdk_window_add_filter (window, display.filterProc, shellHandle); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabItem.java index 3cf0aba18d..8063773fef 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabItem.java @@ -219,8 +219,8 @@ long /*int*/ gtk_mnemonic_activate (long /*int*/ widget, long /*int*/ arg1) { void hookEvents () { super.hookEvents (); - if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.closures [ENTER_NOTIFY_EVENT], false); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [ENTER_NOTIFY_EVENT], 0, getClosure(ENTER_NOTIFY_EVENT, display.windowProc3), false); } void register () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java index 38f78eb8bc..a27c414c4e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java @@ -397,10 +397,10 @@ void hookEvents () { super.hookEvents (); OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); if (buttonHandle != 0) { - OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [SIZE_ALLOCATE], 0, display.closures [SIZE_ALLOCATE], false); - OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [SIZE_ALLOCATE], 0, getClosure(SIZE_ALLOCATE, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); } - if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); } /** 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 ad21ebb3e7..c4f73ffbc2 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 @@ -672,7 +672,7 @@ long /*int*/ gtk_mnemonic_activate (long /*int*/ widget, long /*int*/ arg1) { void hookEvents () { super.hookEvents (); if ((style & SWT.SEPARATOR) != 0) return; - OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); + OS.g_signal_connect_closure (handle, OS.clicked, getClosure(CLICKED, display.windowProc2), false); /* * Feature in GTK. GtkToolItem does not respond to basic listeners * such as button-press, enter-notify to it. The fix is to assign @@ -682,14 +682,14 @@ void hookEvents () { if ((style & SWT.DROP_DOWN) != 0) { long /*int*/ list = OS.gtk_container_get_children(eventHandle); eventHandle = OS.g_list_nth_data(list, 0); - if (arrowHandle != 0) OS.g_signal_connect_closure (arrowHandle, OS.clicked, display.closures [CLICKED], false); + if (arrowHandle != 0) OS.g_signal_connect_closure (arrowHandle, OS.clicked, getClosure(CLICKED, display.windowProc2), false); } - OS.g_signal_connect_closure (handle, OS.create_menu_proxy, display.closures [CREATE_MENU_PROXY], false); + OS.g_signal_connect_closure (handle, OS.create_menu_proxy, getClosure(CREATE_MENU_PROXY, display.windowProc2), false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.closures [ENTER_NOTIFY_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, display.closures [LEAVE_NOTIFY_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [FOCUS_IN_EVENT], 0, display.closures [FOCUS_IN_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [FOCUS_OUT_EVENT], 0, display.closures [FOCUS_OUT_EVENT], false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, getClosure(ENTER_NOTIFY_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, getClosure(LEAVE_NOTIFY_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [FOCUS_IN_EVENT], 0, getClosure(FOCUS_IN_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [FOCUS_OUT_EVENT], 0, getClosure(FOCUS_OUT_EVENT, display.windowProc3), false); /* * Feature in GTK. Usually, GTK widgets propagate all events to their * parent when they are done their own processing. However, in contrast @@ -705,9 +705,9 @@ void hookEvents () { OS.GDK_KEY_PRESS_MASK | OS.GDK_KEY_RELEASE_MASK | OS.GDK_FOCUS_CHANGE_MASK; OS.gtk_widget_add_events (eventHandle, mask); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT], false); - OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures[EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [BUTTON_RELEASE_EVENT], 0, getClosure(BUTTON_RELEASE_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); long /*int*/ topHandle = topHandle (); OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, display.closures [MAP], true); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java index 56a4232c78..d29b58021d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java @@ -619,16 +619,16 @@ long /*int*/ gtk_size_allocate (long /*int*/ widget, long /*int*/ allocation) { void hookEvents () { if ((style & SWT.BALLOON) != 0) { - OS.g_signal_connect_closure_by_id (handle, display.signalIds [EXPOSE_EVENT], 0, display.closures [EXPOSE_EVENT], true); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [EXPOSE_EVENT], 0, getClosure(EXPOSE_EVENT, display.windowProc3), true); OS.gtk_widget_add_events (handle, OS.GDK_BUTTON_PRESS_MASK); - OS.g_signal_connect_closure (handle, OS.button_press_event, display.closures [BUTTON_PRESS_EVENT], false); + OS.g_signal_connect_closure (handle, OS.button_press_event, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); } else { if (OS.GTK_VERSION < OS.VERSION (2, 12, 0)) { long /*int*/ tipWindow = OS.GTK_TOOLTIPS_TIP_WINDOW (handle); if (tipWindow != 0) { - OS.g_signal_connect_closure (tipWindow, OS.size_allocate, display.closures [SIZE_ALLOCATE], false); + OS.g_signal_connect_closure (tipWindow, OS.size_allocate, getClosure(SIZE_ALLOCATE, display.windowProc3), false); OS.gtk_widget_add_events (tipWindow, OS.GDK_BUTTON_PRESS_MASK); - OS.g_signal_connect_closure (tipWindow, OS.button_press_event, display.closures [BUTTON_PRESS_EVENT], false); + OS.g_signal_connect_closure (tipWindow, OS.button_press_event, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); } } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java index 2b28c146b5..1fb46edbb0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java @@ -364,13 +364,13 @@ long /*int*/ gtk_status_icon_popup_menu (long /*int*/ widget, long /*int*/ butto void hookEvents () { if (OS.GTK_VERSION >= OS.VERSION (2, 10, 0)) { - OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE], false); - OS.g_signal_connect_closure (handle, OS.popup_menu, display.closures [STATUS_ICON_POPUP_MENU], false); + OS.g_signal_connect_closure (handle, OS.activate, getClosure(ACTIVATE, display.windowProc2), false); + OS.g_signal_connect_closure (handle, OS.popup_menu, getClosure(STATUS_ICON_POPUP_MENU, display.windowProc4), false); } else { int eventMask = OS.GDK_BUTTON_PRESS_MASK; OS.gtk_widget_add_events (handle, eventMask); - OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, display.closures [BUTTON_PRESS_EVENT], false); - OS.g_signal_connect_closure_by_id (imageHandle, display.signalIds [SIZE_ALLOCATE], 0, display.closures [SIZE_ALLOCATE], false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [BUTTON_PRESS_EVENT], 0, getClosure(BUTTON_PRESS_EVENT, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (imageHandle, display.signalIds [SIZE_ALLOCATE], 0, getClosure(SIZE_ALLOCATE, display.windowProc3), false); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java index 1148d8a700..bdc9a23622 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java @@ -397,12 +397,12 @@ long /*int*/ gtk_size_allocate (long /*int*/ widget, long /*int*/ allocation) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); + OS.g_signal_connect_closure (handle, OS.clicked, getClosure(CLICKED, display.windowProc2), false); if (buttonHandle != 0) { - OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [SIZE_ALLOCATE], 0, display.closures [SIZE_ALLOCATE], false); - OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); + OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [SIZE_ALLOCATE], 0, getClosure(SIZE_ALLOCATE, display.windowProc3), false); + OS.g_signal_connect_closure_by_id (buttonHandle, display.signalIds [EVENT_AFTER], 0, getClosure(EVENT_AFTER, display.windowProc3), false); } - if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, getClosure(MNEMONIC_ACTIVATE, display.windowProc3), false); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java index bb2684cd7b..9f279d79f1 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java @@ -2184,4 +2184,21 @@ void gtk_widget_get_preferred_size (long /*int*/ widget, GtkRequisition requisit OS.gtk_widget_size_request (widget, requisition); } } + +long /*int*/ getClosure(int closure, long windowProcNum) { + + Integer closureId = new Integer(closure); + + if (display.closure_map.containsKey(closureId)){ + display.n_notifier = Integer.valueOf(display.n_notifier.intValue() + 1); + } + + display.closure_map.put(closureId, display.n_notifier); + + if (closure == 0 || display.n_notifier.intValue() > 255) { + display.closures[closure] = OS.g_cclosure_new (windowProcNum, closure, 0); + } + + return display.closures [closure]; +} } |