From 365d9e3002ce9e8ba155a42ea16cecffc7fe94e0 Mon Sep 17 00:00:00 2001 From: Billy Biggs Date: Mon, 24 Oct 2005 15:27:23 +0000 Subject: 76804 - Improve SWT performance over GTK window system --- .../gtk/org/eclipse/swt/widgets/Button.java | 4 +- .../gtk/org/eclipse/swt/widgets/Combo.java | 32 +++--- .../gtk/org/eclipse/swt/widgets/Composite.java | 4 +- .../gtk/org/eclipse/swt/widgets/Control.java | 55 +++++---- .../gtk/org/eclipse/swt/widgets/Display.java | 124 ++++++++++++++++++++- .../gtk/org/eclipse/swt/widgets/Group.java | 2 +- .../gtk/org/eclipse/swt/widgets/Label.java | 2 +- .../gtk/org/eclipse/swt/widgets/List.java | 4 +- .../gtk/org/eclipse/swt/widgets/Menu.java | 8 +- .../gtk/org/eclipse/swt/widgets/MenuItem.java | 8 +- .../gtk/org/eclipse/swt/widgets/Scale.java | 2 +- .../gtk/org/eclipse/swt/widgets/ScrollBar.java | 4 +- .../gtk/org/eclipse/swt/widgets/Shell.java | 24 ++-- .../gtk/org/eclipse/swt/widgets/Slider.java | 4 +- .../gtk/org/eclipse/swt/widgets/Spinner.java | 16 +-- .../gtk/org/eclipse/swt/widgets/TabFolder.java | 2 +- .../gtk/org/eclipse/swt/widgets/TabItem.java | 2 +- .../gtk/org/eclipse/swt/widgets/Table.java | 6 +- .../gtk/org/eclipse/swt/widgets/TableColumn.java | 6 +- .../gtk/org/eclipse/swt/widgets/Text.java | 22 ++-- .../gtk/org/eclipse/swt/widgets/ToolItem.java | 20 ++-- .../gtk/org/eclipse/swt/widgets/TrayItem.java | 4 +- .../gtk/org/eclipse/swt/widgets/Tree.java | 12 +- .../gtk/org/eclipse/swt/widgets/TreeColumn.java | 6 +- .../gtk/org/eclipse/swt/widgets/Widget.java | 115 ++++++++++--------- 25 files changed, 292 insertions(+), 196 deletions(-) (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets') 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 720124c721..4a27f2d030 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 @@ -406,9 +406,9 @@ int /*long*/ gtk_key_press_event (int /*long*/ widget, int /*long*/ event) { void hookEvents () { super.hookEvents(); - OS.g_signal_connect (handle, OS.clicked, display.windowProc2, CLICKED); + OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); if (labelHandle != 0) { - OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE); + OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], 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 e366315936..2cc864905f 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 @@ -498,14 +498,10 @@ boolean hasFocus () { void hookEvents () { //TODO - fix multiple enter/exit super.hookEvents (); - int /*long*/ windowProc2 = display.windowProc2; - int /*long*/ windowProc3 = display.windowProc3; - int /*long*/ windowProc4 = display.windowProc4; - int /*long*/ windowProc5 = display.windowProc5; - OS.g_signal_connect_after (entryHandle, OS.changed, windowProc2, CHANGED); - OS.g_signal_connect (entryHandle, OS.insert_text, windowProc5, INSERT_TEXT); - OS.g_signal_connect (entryHandle, OS.delete_text, windowProc4, DELETE_TEXT); - OS.g_signal_connect (entryHandle, OS.activate, windowProc2, ACTIVATE); + OS.g_signal_connect_closure (entryHandle, OS.changed, display.closures [CHANGED], true); + OS.g_signal_connect_closure (entryHandle, OS.insert_text, display.closures [INSERT_TEXT], false); + OS.g_signal_connect_closure (entryHandle, OS.delete_text, display.closures [DELETE_TEXT], false); + OS.g_signal_connect_closure (entryHandle, OS.activate, display.closures [ACTIVATE], false); int eventMask = OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK; @@ -515,11 +511,11 @@ void hookEvents () { if (eventHandle != 0) { /* Connect the mouse signals */ OS.gtk_widget_add_events (eventHandle, eventMask); - OS.g_signal_connect (eventHandle, OS.button_press_event, windowProc3, BUTTON_PRESS_EVENT); - OS.g_signal_connect (eventHandle, OS.button_release_event, windowProc3, BUTTON_RELEASE_EVENT); - OS.g_signal_connect (eventHandle, OS.motion_notify_event, windowProc3, MOTION_NOTIFY_EVENT); - OS.g_signal_connect (eventHandle, OS.enter_notify_event, windowProc3, ENTER_NOTIFY_EVENT); - OS.g_signal_connect (eventHandle, OS.leave_notify_event, windowProc3, LEAVE_NOTIFY_EVENT); + 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 [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); /* * Feature in GTK. Events such as mouse move are propagated up * the widget hierarchy and are seen by the parent. This is the @@ -527,19 +523,19 @@ void hookEvents () { * hook a signal after and stop the propagation using a negative * event number to distinguish this case. */ - OS.g_signal_connect_after (eventHandle, OS.button_press_event, windowProc3, -BUTTON_PRESS_EVENT); - OS.g_signal_connect_after (eventHandle, OS.button_release_event, windowProc3, -BUTTON_RELEASE_EVENT); - OS.g_signal_connect_after (eventHandle, OS.motion_notify_event, windowProc3, -MOTION_NOTIFY_EVENT); + 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); /* Connect the event_after signal for both key and mouse */ if (eventHandle != entryHandle) { - OS.g_signal_connect (eventHandle, OS.event_after, windowProc3, EVENT_AFTER); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); } } } int /*long*/ imContext = imContext (); if (imContext != 0) { - OS.g_signal_connect (imContext, OS.commit, windowProc3, COMMIT); + 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); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java index 0c47ae768c..bb7c5ab163 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java @@ -638,10 +638,10 @@ void hookEvents () { if ((state & CANVAS) != 0) { OS.gtk_widget_add_events (handle, OS.GDK_POINTER_MOTION_HINT_MASK); if (scrolledHandle != 0) { - OS.g_signal_connect (scrolledHandle, OS.scroll_child, display.windowProc4, SCROLL_CHILD); + OS.g_signal_connect_closure (scrolledHandle, OS.scroll_child, display.closures [SCROLL_CHILD], false); } if ((style & SWT.NO_BACKGROUND) != 0) { - OS.g_signal_connect (handle, OS.style_set, display.windowProc3, STYLE_SET); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [STYLE_SET], 0, display.closures [STYLE_SET], false); } } } 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 8a45b0c8bd..854d5cb863 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 @@ -141,20 +141,17 @@ boolean hasFocus () { } void hookEvents () { - int /*long*/ windowProc2 = display.windowProc2; - int /*long*/ windowProc3 = display.windowProc3; - /* Connect the keyboard signals */ int /*long*/ 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 (focusHandle, OS.popup_menu, windowProc2, POPUP_MENU); - OS.g_signal_connect (focusHandle, OS.show_help, windowProc3, SHOW_HELP); - OS.g_signal_connect (focusHandle, OS.key_press_event, windowProc3, KEY_PRESS_EVENT); - OS.g_signal_connect (focusHandle, OS.key_release_event, windowProc3, KEY_RELEASE_EVENT); - OS.g_signal_connect (focusHandle, OS.focus, windowProc3, FOCUS); - OS.g_signal_connect (focusHandle, OS.focus_in_event, windowProc3, FOCUS_IN_EVENT); - OS.g_signal_connect (focusHandle, OS.focus_out_event, windowProc3, FOCUS_OUT_EVENT); + 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); /* Connect the mouse signals */ int /*long*/ eventHandle = eventHandle (); @@ -162,12 +159,12 @@ void hookEvents () { OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK; OS.gtk_widget_add_events (eventHandle, eventMask); - OS.g_signal_connect (eventHandle, OS.button_press_event, windowProc3, BUTTON_PRESS_EVENT); - OS.g_signal_connect (eventHandle, OS.button_release_event, windowProc3, BUTTON_RELEASE_EVENT); - OS.g_signal_connect (eventHandle, OS.motion_notify_event, windowProc3, MOTION_NOTIFY_EVENT); - OS.g_signal_connect (eventHandle, OS.enter_notify_event, windowProc3, ENTER_NOTIFY_EVENT); - OS.g_signal_connect (eventHandle, OS.leave_notify_event, windowProc3, LEAVE_NOTIFY_EVENT); - OS.g_signal_connect (eventHandle, OS.scroll_event, windowProc3, SCROLL_EVENT); + 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 [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 [SCROLL_EVENT], 0, display.closures [SCROLL_EVENT], false); /* * Feature in GTK. Events such as mouse move are propagate up * the widget hierarchy and are seen by the parent. This is the @@ -179,35 +176,35 @@ void hookEvents () { * lightweight widgets. */ int /*long*/ blockHandle = fixedHandle != 0 ? fixedHandle : eventHandle; - OS.g_signal_connect_after (blockHandle, OS.button_press_event, windowProc3, -BUTTON_PRESS_EVENT); - OS.g_signal_connect_after (blockHandle, OS.button_release_event, windowProc3, -BUTTON_RELEASE_EVENT); - OS.g_signal_connect_after (blockHandle, OS.motion_notify_event, windowProc3, -MOTION_NOTIFY_EVENT); + 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); /* Connect the event_after signal for both key and mouse */ - OS.g_signal_connect (eventHandle, OS.event_after, windowProc3, EVENT_AFTER); + OS.g_signal_connect_closure_by_id (eventHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); if (focusHandle != eventHandle) { - OS.g_signal_connect (focusHandle, OS.event_after, windowProc3, EVENT_AFTER); + OS.g_signal_connect_closure_by_id (focusHandle, display.signalIds [EVENT_AFTER], 0, display.closures [EVENT_AFTER], false); } /* Connect the paint signal */ int /*long*/ paintHandle = paintHandle (); int paintMask = OS.GDK_EXPOSURE_MASK | OS.GDK_VISIBILITY_NOTIFY_MASK; OS.gtk_widget_add_events (paintHandle, paintMask); - OS.g_signal_connect (paintHandle, OS.expose_event, windowProc3, -EXPOSE_EVENT); - OS.g_signal_connect (paintHandle, OS.visibility_notify_event, windowProc3, VISIBILITY_NOTIFY_EVENT); - OS.g_signal_connect_after (paintHandle, OS.expose_event, windowProc3, EXPOSE_EVENT); + 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 [VISIBILITY_NOTIFY_EVENT], 0, display.closures [VISIBILITY_NOTIFY_EVENT], false); + OS.g_signal_connect_closure_by_id (paintHandle, display.signalIds [EXPOSE_EVENT], 0, display.closures [EXPOSE_EVENT], true); /* Connect the Input Method signals */ - OS.g_signal_connect_after (handle, OS.realize, windowProc2, REALIZE); - OS.g_signal_connect (handle, OS.unrealize, windowProc2, UNREALIZE); + 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); int /*long*/ imHandle = imHandle (); if (imHandle != 0) { - OS.g_signal_connect (imHandle, OS.commit, windowProc3, COMMIT); - OS.g_signal_connect (imHandle, OS.preedit_changed, windowProc2, PREEDIT_CHANGED); + 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); } int /*long*/ topHandle = topHandle (); - OS.g_signal_connect_after (topHandle, OS.map, windowProc2, MAP); + OS.g_signal_connect_closure_by_id (topHandle, display.signalIds [MAP], 0, display.closures [MAP], true); } int /*long*/ hoverProc (int /*long*/ widget) { 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 5c9bfd68f2..0b32f9f95c 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 @@ -111,6 +111,9 @@ public class Display extends Device { static String APP_NAME = "SWT"; static final String DISPATCH_EVENT_KEY = "org.eclipse.swt.internal.gtk.dispatchEvent"; static final String ADD_WIDGET_KEY = "org.eclipse.swt.internal.addWidget"; + int /*long*/ [] closures; + int [] signalIds; + int /*long*/ shellMapProcClosure; /* Widget Table */ int freeSlot; @@ -2053,22 +2056,124 @@ protected void init () { } void initializeCallbacks () { + closures = new int /*long*/ [Widget.LAST_SIGNAL]; + signalIds = new int [Widget.LAST_SIGNAL]; + + /* Cache signals for GtkWidget */ + signalIds [Widget.BUTTON_PRESS_EVENT] = OS.g_signal_lookup (OS.button_press_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.BUTTON_RELEASE_EVENT] = OS.g_signal_lookup (OS.button_release_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.CONFIGURE_EVENT] = OS.g_signal_lookup (OS.configure_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.DELETE_EVENT] = OS.g_signal_lookup (OS.delete_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.ENTER_NOTIFY_EVENT] = OS.g_signal_lookup (OS.enter_notify_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EVENT] = OS.g_signal_lookup (OS.event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EVENT_AFTER] = OS.g_signal_lookup (OS.event_after, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.EXPOSE_EVENT] = OS.g_signal_lookup (OS.expose_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS] = OS.g_signal_lookup (OS.focus, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS_IN_EVENT] = OS.g_signal_lookup (OS.focus_in_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.FOCUS_OUT_EVENT] = OS.g_signal_lookup (OS.focus_out_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.GRAB_FOCUS] = OS.g_signal_lookup (OS.grab_focus, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.HIDE] = OS.g_signal_lookup (OS.hide, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.KEY_PRESS_EVENT] = OS.g_signal_lookup (OS.key_press_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.KEY_RELEASE_EVENT] = OS.g_signal_lookup (OS.key_release_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.LEAVE_NOTIFY_EVENT] = OS.g_signal_lookup (OS.leave_notify_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MAP] = OS.g_signal_lookup (OS.map, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MAP_EVENT] = OS.g_signal_lookup (OS.map_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MNEMONIC_ACTIVATE] = OS.g_signal_lookup (OS.mnemonic_activate, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.MOTION_NOTIFY_EVENT] = OS.g_signal_lookup (OS.motion_notify_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.POPUP_MENU] = OS.g_signal_lookup (OS.popup_menu, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.REALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SCROLL_EVENT] = OS.g_signal_lookup (OS.scroll_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SHOW] = OS.g_signal_lookup (OS.show, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SHOW_HELP] = OS.g_signal_lookup (OS.show_help, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.SIZE_ALLOCATE] = OS.g_signal_lookup (OS.size_allocate, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.STYLE_SET] = OS.g_signal_lookup (OS.style_set, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNMAP] = OS.g_signal_lookup (OS.unmap, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNMAP_EVENT] = OS.g_signal_lookup (OS.unmap_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.UNREALIZE] = OS.g_signal_lookup (OS.realize, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_signal_lookup (OS.visibility_notify_event, OS.GTK_TYPE_WIDGET ()); + signalIds [Widget.WINDOW_STATE_EVENT] = OS.g_signal_lookup (OS.window_state_event, OS.GTK_TYPE_WIDGET ()); + windowCallback2 = new Callback (this, "windowProc", 2); windowProc2 = windowCallback2.getAddress (); if (windowProc2 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - + + closures [Widget.ACTIVATE] = OS.g_cclosure_new (windowProc2, Widget.ACTIVATE, 0); + closures [Widget.CHANGED] = OS.g_cclosure_new (windowProc2, Widget.CHANGED, 0); + closures [Widget.CLICKED] = OS.g_cclosure_new (windowProc2, Widget.CLICKED, 0); + closures [Widget.HIDE] = OS.g_cclosure_new (windowProc2, Widget.HIDE, 0); + closures [Widget.GRAB_FOCUS] = OS.g_cclosure_new (windowProc2, Widget.GRAB_FOCUS, 0); + closures [Widget.MAP] = OS.g_cclosure_new (windowProc2, Widget.MAP, 0); + closures [Widget.OUTPUT] = OS.g_cclosure_new (windowProc2, Widget.OUTPUT, 0); + closures [Widget.POPUP_MENU] = OS.g_cclosure_new (windowProc2, Widget.POPUP_MENU, 0); + closures [Widget.PREEDIT_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.PREEDIT_CHANGED, 0); + closures [Widget.REALIZE] = OS.g_cclosure_new (windowProc2, Widget.REALIZE, 0); + closures [Widget.SELECT] = OS.g_cclosure_new (windowProc2, Widget.SELECT, 0); + closures [Widget.SHOW] = OS.g_cclosure_new (windowProc2, Widget.SHOW, 0); + closures [Widget.VALUE_CHANGED] = OS.g_cclosure_new (windowProc2, Widget.VALUE_CHANGED, 0); + closures [Widget.UNMAP] = OS.g_cclosure_new (windowProc2, Widget.UNMAP, 0); + closures [Widget.UNREALIZE] = OS.g_cclosure_new (windowProc2, Widget.UNREALIZE, 0); + windowCallback3 = new Callback (this, "windowProc", 3); windowProc3 = windowCallback3.getAddress (); if (windowProc3 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - + + closures [Widget.BUTTON_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT, 0); + closures [Widget.BUTTON_PRESS_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_PRESS_EVENT_INVERSE, 0); + closures [Widget.BUTTON_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT, 0); + closures [Widget.BUTTON_RELEASE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.BUTTON_RELEASE_EVENT_INVERSE, 0); + closures [Widget.COMMIT] = OS.g_cclosure_new (windowProc3, Widget.COMMIT, 0); + closures [Widget.CONFIGURE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.CONFIGURE_EVENT, 0); + closures [Widget.DELETE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.DELETE_EVENT, 0); + closures [Widget.ENTER_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.ENTER_NOTIFY_EVENT, 0); + closures [Widget.EVENT] = OS.g_cclosure_new (windowProc3, Widget.EVENT, 0); + closures [Widget.EVENT_AFTER] = OS.g_cclosure_new (windowProc3, Widget.EVENT_AFTER, 0); + closures [Widget.EXPOSE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT, 0); + closures [Widget.EXPOSE_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.EXPOSE_EVENT_INVERSE, 0); + closures [Widget.FOCUS] = OS.g_cclosure_new (windowProc3, Widget.FOCUS, 0); + closures [Widget.FOCUS_IN_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_IN_EVENT, 0); + closures [Widget.FOCUS_OUT_EVENT] = OS.g_cclosure_new (windowProc3, Widget.FOCUS_OUT_EVENT, 0); + closures [Widget.KEY_PRESS_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_PRESS_EVENT, 0); + closures [Widget.KEY_RELEASE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.KEY_RELEASE_EVENT, 0); + closures [Widget.INPUT] = OS.g_cclosure_new (windowProc3, Widget.INPUT, 0); + closures [Widget.LEAVE_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.LEAVE_NOTIFY_EVENT, 0); + closures [Widget.MAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MAP_EVENT, 0); + closures [Widget.MNEMONIC_ACTIVATE] = OS.g_cclosure_new (windowProc3, Widget.MNEMONIC_ACTIVATE, 0); + closures [Widget.MOTION_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT, 0); + closures [Widget.MOTION_NOTIFY_EVENT_INVERSE] = OS.g_cclosure_new (windowProc3, Widget.MOTION_NOTIFY_EVENT_INVERSE, 0); + closures [Widget.MOVE_FOCUS] = OS.g_cclosure_new (windowProc3, Widget.MOVE_FOCUS, 0); + closures [Widget.SCROLL_EVENT] = OS.g_cclosure_new (windowProc3, Widget.SCROLL_EVENT, 0); + closures [Widget.SHOW_HELP] = OS.g_cclosure_new (windowProc3, Widget.SHOW_HELP, 0); + closures [Widget.SIZE_ALLOCATE] = OS.g_cclosure_new (windowProc3, Widget.SIZE_ALLOCATE, 0); + closures [Widget.STYLE_SET] = OS.g_cclosure_new (windowProc3, Widget.STYLE_SET, 0); + closures [Widget.TOGGLED] = OS.g_cclosure_new (windowProc3, Widget.TOGGLED, 0); + closures [Widget.UNMAP_EVENT] = OS.g_cclosure_new (windowProc3, Widget.UNMAP_EVENT, 0); + closures [Widget.VISIBILITY_NOTIFY_EVENT] = OS.g_cclosure_new (windowProc3, Widget.VISIBILITY_NOTIFY_EVENT, 0); + closures [Widget.WINDOW_STATE_EVENT] = OS.g_cclosure_new (windowProc3, Widget.WINDOW_STATE_EVENT, 0); + windowCallback4 = new Callback (this, "windowProc", 4); windowProc4 = windowCallback4.getAddress (); if (windowProc4 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - + + closures [Widget.DELETE_RANGE] = OS.g_cclosure_new (windowProc4, Widget.DELETE_RANGE, 0); + closures [Widget.DELETE_TEXT] = OS.g_cclosure_new (windowProc4, Widget.DELETE_TEXT, 0); + closures [Widget.ROW_ACTIVATED] = OS.g_cclosure_new (windowProc4, Widget.ROW_ACTIVATED, 0); + closures [Widget.SCROLL_CHILD] = OS.g_cclosure_new (windowProc4, Widget.SCROLL_CHILD, 0); + closures [Widget.SWITCH_PAGE] = OS.g_cclosure_new (windowProc4, Widget.SWITCH_PAGE, 0); + closures [Widget.TEST_COLLAPSE_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_COLLAPSE_ROW, 0); + closures [Widget.TEST_EXPAND_ROW] = OS.g_cclosure_new (windowProc4, Widget.TEST_EXPAND_ROW, 0); + windowCallback5 = new Callback (this, "windowProc", 5); windowProc5 = windowCallback5.getAddress (); if (windowProc5 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - + + closures [Widget.CHANGE_VALUE] = OS.g_cclosure_new (windowProc5, Widget.CHANGE_VALUE, 0); + closures [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = OS.g_cclosure_new (windowProc5, Widget.EXPAND_COLLAPSE_CURSOR_ROW, 0); + closures [Widget.INSERT_TEXT] = OS.g_cclosure_new (windowProc5, Widget.INSERT_TEXT, 0); + + for (int i = 0; i < Widget.LAST_SIGNAL; i++) { + if (closures [i] != 0) OS.g_closure_ref (closures [i]); + } + timerCallback = new Callback (this, "timerProc", 1); timerProc = timerCallback.getAddress (); if (timerProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); @@ -2092,7 +2197,10 @@ void initializeCallbacks () { shellMapCallback = new Callback(this, "shellMapProc", 3); shellMapProc = shellMapCallback.getAddress(); if (shellMapProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); - + + shellMapProcClosure = OS.g_cclosure_new (shellMapProc, 0, 0); + OS.g_closure_ref (shellMapProcClosure); + treeSelectionCallback = new Callback(this, "treeSelectionProc", 4); treeSelectionProc = treeSelectionCallback.getAddress(); if (treeSelectionProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); @@ -2742,6 +2850,12 @@ void releaseDisplay () { caretCallback.dispose (); caretCallback = null; + /* Release closures */ + 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); + /* Dispose the timer callback */ if (timerIds != null) { for (int i=0; i= OS.VERSION (2, 6, 0)) { - OS.g_signal_connect (handle, OS.change_value, display.windowProc5, CHANGE_VALUE); + OS.g_signal_connect_closure (handle, OS.change_value, display.closures [CHANGE_VALUE], false); } - OS.g_signal_connect (adjustmentHandle, OS.value_changed, display.windowProc2, VALUE_CHANGED); + OS.g_signal_connect_closure (adjustmentHandle, OS.value_changed, display.closures [VALUE_CHANGED], 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 45a7f24ffd..44f8080058 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 @@ -586,19 +586,17 @@ boolean hasBorder () { void hookEvents () { super.hookEvents (); - int /*long*/ shellMapProc = display.shellMapProc; - int /*long*/ windowProc3 = display.windowProc3; - OS.g_signal_connect (shellHandle, OS.map_event, windowProc3, MAP_EVENT); - OS.g_signal_connect (shellHandle, OS.unmap_event, windowProc3, UNMAP_EVENT); - OS.g_signal_connect (shellHandle, OS.window_state_event, windowProc3, WINDOW_STATE_EVENT); - OS.g_signal_connect (shellHandle, OS.size_allocate, windowProc3, SIZE_ALLOCATE); - OS.g_signal_connect (shellHandle, OS.configure_event, windowProc3, CONFIGURE_EVENT); - OS.g_signal_connect (shellHandle, OS.delete_event, windowProc3, DELETE_EVENT); - OS.g_signal_connect (shellHandle, OS.focus_in_event, windowProc3, FOCUS_IN_EVENT); - OS.g_signal_connect (shellHandle, OS.focus_out_event, windowProc3, FOCUS_OUT_EVENT); - OS.g_signal_connect (shellHandle, OS.map_event, shellMapProc, 0); - OS.g_signal_connect (shellHandle, OS.enter_notify_event, windowProc3, ENTER_NOTIFY_EVENT); - OS.g_signal_connect (shellHandle, OS.move_focus, windowProc3, MOVE_FOCUS); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [MAP_EVENT], 0, display.closures [MAP_EVENT], false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [UNMAP_EVENT], 0, display.closures [UNMAP_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 [FOCUS_IN_EVENT], 0, display.closures [FOCUS_IN_EVENT], false); + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [FOCUS_OUT_EVENT], 0, display.closures [FOCUS_OUT_EVENT], 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); } public boolean isEnabled () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java index bea0d96e0a..2b8b9250e8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java @@ -194,9 +194,9 @@ int /*long*/ gtk_value_changed (int /*long*/ adjustment) { void hookEvents () { super.hookEvents (); if (OS.GTK_VERSION >= OS.VERSION (2, 6, 0)) { - OS.g_signal_connect (handle, OS.change_value, display.windowProc5, CHANGE_VALUE); + OS.g_signal_connect_closure (handle, OS.change_value, display.closures [CHANGE_VALUE], false); } - OS.g_signal_connect (handle, OS.value_changed, display.windowProc2, VALUE_CHANGED); + OS.g_signal_connect_closure (handle, OS.value_changed, display.closures [VALUE_CHANGED], false); } void register () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java index 1fe4e64843..7b2137e984 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java @@ -634,18 +634,14 @@ int /*long*/ gtk_value_changed (int /*long*/ widget) { void hookEvents () { super.hookEvents(); - int /*long*/ windowProc2 = display.windowProc2; - int /*long*/ windowProc3 = display.windowProc3; - int /*long*/ windowProc4 = display.windowProc4; - int /*long*/ windowProc5 = display.windowProc5; - OS.g_signal_connect_after (handle, OS.changed, windowProc2, CHANGED); - OS.g_signal_connect (handle, OS.insert_text, windowProc5, INSERT_TEXT); - OS.g_signal_connect (handle, OS.delete_text, windowProc4, DELETE_TEXT); - OS.g_signal_connect (handle, OS.value_changed, windowProc2, VALUE_CHANGED); - OS.g_signal_connect (handle, OS.activate, windowProc2, ACTIVATE); + OS.g_signal_connect_closure (handle, OS.changed, display.closures [CHANGED], true); + OS.g_signal_connect_closure (handle, OS.insert_text, display.closures [INSERT_TEXT], false); + OS.g_signal_connect_closure (handle, OS.delete_text, display.closures [DELETE_TEXT], false); + OS.g_signal_connect_closure (handle, OS.value_changed, display.closures [VALUE_CHANGED], false); + OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE], false); int /*long*/ imContext = imContext (); if (imContext != 0) { - OS.g_signal_connect (imContext, OS.commit, windowProc3, COMMIT); + 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 mask = OS.G_SIGNAL_MATCH_DATA | OS.G_SIGNAL_MATCH_ID; OS.g_signal_handlers_block_matched (imContext, mask, id, 0, 0, 0, handle); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabFolder.java index f403708a97..3197f4aff4 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabFolder.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabFolder.java @@ -407,7 +407,7 @@ int /*long*/ gtk_switch_page (int /*long*/ widget, int /*long*/ page, int /*long void hookEvents () { super.hookEvents (); - OS.g_signal_connect (handle, OS.switch_page, display.windowProc4, SWITCH_PAGE); + OS.g_signal_connect_closure (handle, OS.switch_page, display.closures [SWITCH_PAGE], false); } /** 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 cfa402f026..95c9a73694 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 @@ -185,7 +185,7 @@ int /*long*/ gtk_mnemonic_activate (int /*long*/ widget, int /*long*/ arg1) { void hookEvents () { super.hookEvents (); - if (labelHandle != 0) OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); } void register () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java index 10f91e25ed..8ffa44629e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java @@ -1726,10 +1726,10 @@ void hideFirstColumn () { void hookEvents () { super.hookEvents (); int /*long*/ selection = OS.gtk_tree_view_get_selection(handle); - OS.g_signal_connect (selection, OS.changed, display.windowProc2, CHANGED); - OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, ROW_ACTIVATED); + OS.g_signal_connect_closure (selection, OS.changed, display.closures [CHANGED], false); + OS.g_signal_connect_closure (handle, OS.row_activated, display.closures [ROW_ACTIVATED], false); if (checkRenderer != 0) { - OS.g_signal_connect (checkRenderer, OS.toggled, display.windowProc3, TOGGLED); + OS.g_signal_connect_closure (checkRenderer, OS.toggled, display.closures [TOGGLED], false); } } 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 0fdbd143ec..70dfd114ec 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 @@ -354,9 +354,9 @@ int /*long*/ gtk_size_allocate (int /*long*/ widget, int /*long*/ allocation) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect (handle, OS.clicked, display.windowProc2, CLICKED); - if (buttonHandle != 0) OS.g_signal_connect (buttonHandle, OS.size_allocate, display.windowProc3, SIZE_ALLOCATE); - if (labelHandle != 0) OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE); + 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); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], false); } /** 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 b364e5aabe..07485d4d52 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 @@ -1200,24 +1200,20 @@ int /*long*/ gtk_popup_menu (int /*long*/ widget) { void hookEvents () { super.hookEvents(); - int /*long*/ windowProc2 = display.windowProc2; - int /*long*/ windowProc3 = display.windowProc3; - int /*long*/ windowProc4 = display.windowProc4; - int /*long*/ windowProc5 = display.windowProc5; if ((style & SWT.SINGLE) != 0) { - OS.g_signal_connect_after (handle, OS.changed, windowProc2, CHANGED); - OS.g_signal_connect (handle, OS.insert_text, windowProc5, INSERT_TEXT); - OS.g_signal_connect (handle, OS.delete_text, windowProc4, DELETE_TEXT); - OS.g_signal_connect (handle, OS.activate, windowProc2, ACTIVATE); - OS.g_signal_connect (handle, OS.grab_focus, windowProc2, GRAB_FOCUS); + OS.g_signal_connect_closure (handle, OS.changed, display.closures [CHANGED], true); + OS.g_signal_connect_closure (handle, OS.insert_text, display.closures [INSERT_TEXT], false); + OS.g_signal_connect_closure (handle, OS.delete_text, display.closures [DELETE_TEXT], false); + OS.g_signal_connect_closure (handle, OS.activate, display.closures [ACTIVATE], false); + OS.g_signal_connect_closure (handle, OS.grab_focus, display.closures [GRAB_FOCUS], false); } else { - OS.g_signal_connect (bufferHandle, OS.changed, windowProc2, CHANGED); - OS.g_signal_connect (bufferHandle, OS.insert_text, windowProc5, INSERT_TEXT); - OS.g_signal_connect (bufferHandle, OS.delete_range, windowProc4, DELETE_RANGE); + OS.g_signal_connect_closure (bufferHandle, OS.changed, display.closures [CHANGED], false); + OS.g_signal_connect_closure (bufferHandle, OS.insert_text, display.closures [INSERT_TEXT], false); + OS.g_signal_connect_closure (bufferHandle, OS.delete_range, display.closures [DELETE_RANGE], false); } int /*long*/ imContext = imContext (); if (imContext != 0) { - OS.g_signal_connect (imContext, OS.commit, windowProc3, COMMIT); + 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 mask = OS.G_SIGNAL_MATCH_DATA | OS.G_SIGNAL_MATCH_ID; OS.g_signal_handlers_block_matched (imContext, mask, id, 0, 0, 0, handle); 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 d5015273af..7bc2ea8c8f 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 @@ -602,14 +602,12 @@ boolean hasFocus () { void hookEvents () { super.hookEvents (); if ((style & SWT.SEPARATOR) != 0) return; - int /*long*/ windowProc2 = display.windowProc2; - int /*long*/ windowProc3 = display.windowProc3; - OS.g_signal_connect (handle, OS.clicked, windowProc2, CLICKED); - OS.g_signal_connect (handle, OS.enter_notify_event, windowProc3, ENTER_NOTIFY_EVENT); - OS.g_signal_connect (handle, OS.leave_notify_event, windowProc3, LEAVE_NOTIFY_EVENT); - if (labelHandle != 0) OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE); + OS.g_signal_connect_closure (handle, OS.clicked, display.closures [CLICKED], false); + 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_by_id (handle, display.signalIds [LEAVE_NOTIFY_EVENT], 0, display.closures [LEAVE_NOTIFY_EVENT], 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 (handle, OS.focus_out_event, windowProc3, FOCUS_OUT_EVENT); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [FOCUS_OUT_EVENT], 0, display.closures [FOCUS_OUT_EVENT], false); /* * Feature in GTK. Usually, GTK widgets propagate all events to their @@ -626,12 +624,12 @@ void hookEvents () { OS.GDK_KEY_PRESS_MASK | OS.GDK_KEY_RELEASE_MASK | OS.GDK_FOCUS_CHANGE_MASK; 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); + 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 [BUTTON_RELEASE_EVENT], 0, display.closures [BUTTON_RELEASE_EVENT], false); + OS.g_signal_connect_closure_by_id (handle, display.signalIds [EVENT_AFTER], 0, display.closures[EVENT_AFTER], false); int /*long*/ topHandle = topHandle (); - OS.g_signal_connect_after (topHandle, OS.map, windowProc2, MAP); + 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/TrayItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java index e6d5d683e1..ad6139e2b5 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 @@ -230,8 +230,8 @@ int /*long*/ gtk_size_allocate (int /*long*/ widget, int /*long*/ allocation) { void hookEvents () { int eventMask = OS.GDK_BUTTON_PRESS_MASK; OS.gtk_widget_add_events (handle, eventMask); - OS.g_signal_connect (handle, OS.button_press_event, display.windowProc3, BUTTON_PRESS_EVENT); - OS.g_signal_connect (imageHandle, OS.size_allocate, display.windowProc3, SIZE_ALLOCATE); + 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); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index 337aec404b..96d3a0c179 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -1715,13 +1715,13 @@ void hideFirstColumn () { void hookEvents () { super.hookEvents (); int /*long*/ selection = OS.gtk_tree_view_get_selection(handle); - OS.g_signal_connect (selection, OS.changed, display.windowProc2, CHANGED); - OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, ROW_ACTIVATED); - OS.g_signal_connect (handle, OS.test_expand_row, display.windowProc4, TEST_EXPAND_ROW); - OS.g_signal_connect (handle, OS.test_collapse_row, display.windowProc4, TEST_COLLAPSE_ROW); - OS.g_signal_connect (handle, OS.expand_collapse_cursor_row, display.windowProc5, EXPAND_COLLAPSE_CURSOR_ROW); + OS.g_signal_connect_closure (selection, OS.changed, display.closures [CHANGED], false); + OS.g_signal_connect_closure (handle, OS.row_activated, display.closures [ROW_ACTIVATED], false); + OS.g_signal_connect_closure (handle, OS.test_expand_row, display.closures [TEST_EXPAND_ROW], false); + OS.g_signal_connect_closure (handle, OS.test_collapse_row, display.closures [TEST_COLLAPSE_ROW], false); + OS.g_signal_connect_closure (handle, OS.expand_collapse_cursor_row, display.closures [EXPAND_COLLAPSE_CURSOR_ROW], false); if (checkRenderer != 0) { - OS.g_signal_connect (checkRenderer, OS.toggled, display.windowProc3, TOGGLED); + OS.g_signal_connect_closure (checkRenderer, OS.toggled, display.closures [TOGGLED], 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 c561b455d4..643b815bd6 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 @@ -355,9 +355,9 @@ int /*long*/ gtk_size_allocate (int /*long*/ widget, int /*long*/ allocation) { void hookEvents () { super.hookEvents (); - OS.g_signal_connect (handle, OS.clicked, display.windowProc2, CLICKED); - if (buttonHandle != 0) OS.g_signal_connect (buttonHandle, OS.size_allocate, display.windowProc3, SIZE_ALLOCATE); - if (labelHandle != 0) OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE); + 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); + if (labelHandle != 0) OS.g_signal_connect_closure_by_id (labelHandle, display.signalIds [MNEMONIC_ACTIVATE], 0, display.closures [MNEMONIC_ACTIVATE], 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 f8973e604c..26ec9fdddf 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 @@ -96,57 +96,62 @@ public abstract class Widget { /* GTK signals data */ static final int ACTIVATE = 1; static final int BUTTON_PRESS_EVENT = 2; - static final int BUTTON_RELEASE_EVENT = 3; - static final int CHANGED = 4; - static final int CHANGE_VALUE = 5; - static final int CLICKED = 6; - static final int COMMIT = 7; - static final int CONFIGURE_EVENT = 8; - static final int DELETE_EVENT = 9; - static final int DELETE_RANGE = 10; - static final int DELETE_TEXT = 11; - static final int ENTER_NOTIFY_EVENT = 12; - static final int EVENT = 13; - static final int EVENT_AFTER = 14; - static final int EXPAND_COLLAPSE_CURSOR_ROW = 15; - static final int EXPOSE_EVENT = 16; - static final int FOCUS = 17; - static final int FOCUS_IN_EVENT = 18; - static final int FOCUS_OUT_EVENT = 19; - static final int GRAB_FOCUS = 20; - static final int HIDE = 21; - static final int INPUT = 22; - static final int INSERT_TEXT = 23; - static final int KEY_PRESS_EVENT = 24; - static final int KEY_RELEASE_EVENT = 25; - static final int LEAVE_NOTIFY_EVENT = 26; - static final int MAP = 27; - static final int MAP_EVENT = 28; - static final int MNEMONIC_ACTIVATE = 29; - static final int MOTION_NOTIFY_EVENT = 30; - static final int MOVE_FOCUS = 31; - static final int OUTPUT = 32; - static final int POPUP_MENU = 33; - static final int PREEDIT_CHANGED = 34; - static final int REALIZE = 35; - static final int ROW_ACTIVATED = 36; - static final int SCROLL_CHILD = 37; - static final int SCROLL_EVENT = 38; - static final int SELECT = 39; - static final int SHOW = 40; - static final int SHOW_HELP = 41; - static final int SIZE_ALLOCATE = 42; - static final int STYLE_SET = 43; - static final int SWITCH_PAGE = 44; - static final int TEST_COLLAPSE_ROW = 45; - static final int TEST_EXPAND_ROW = 46; - static final int TOGGLED = 47; - static final int UNMAP = 48; - static final int UNMAP_EVENT = 49; - static final int UNREALIZE = 50; - static final int VALUE_CHANGED = 51; - static final int VISIBILITY_NOTIFY_EVENT = 52; - static final int WINDOW_STATE_EVENT = 53; + static final int BUTTON_PRESS_EVENT_INVERSE = 3; + static final int BUTTON_RELEASE_EVENT = 4; + static final int BUTTON_RELEASE_EVENT_INVERSE = 5; + static final int CHANGED = 6; + static final int CHANGE_VALUE = 7; + static final int CLICKED = 8; + static final int COMMIT = 9; + static final int CONFIGURE_EVENT = 10; + static final int DELETE_EVENT = 11; + static final int DELETE_RANGE = 12; + static final int DELETE_TEXT = 13; + static final int ENTER_NOTIFY_EVENT = 14; + static final int EVENT = 15; + static final int EVENT_AFTER = 16; + static final int EXPAND_COLLAPSE_CURSOR_ROW = 17; + static final int EXPOSE_EVENT = 18; + static final int EXPOSE_EVENT_INVERSE = 19; + static final int FOCUS = 20; + static final int FOCUS_IN_EVENT = 21; + static final int FOCUS_OUT_EVENT = 22; + static final int GRAB_FOCUS = 23; + static final int HIDE = 24; + static final int INPUT = 25; + static final int INSERT_TEXT = 26; + static final int KEY_PRESS_EVENT = 27; + static final int KEY_RELEASE_EVENT = 28; + static final int LEAVE_NOTIFY_EVENT = 29; + static final int MAP = 30; + static final int MAP_EVENT = 31; + static final int MNEMONIC_ACTIVATE = 32; + static final int MOTION_NOTIFY_EVENT = 33; + static final int MOTION_NOTIFY_EVENT_INVERSE = 34; + static final int MOVE_FOCUS = 35; + static final int OUTPUT = 36; + static final int POPUP_MENU = 37; + static final int PREEDIT_CHANGED = 38; + static final int REALIZE = 39; + static final int ROW_ACTIVATED = 40; + static final int SCROLL_CHILD = 41; + static final int SCROLL_EVENT = 42; + static final int SELECT = 43; + static final int SHOW = 44; + static final int SHOW_HELP = 45; + static final int SIZE_ALLOCATE = 46; + static final int STYLE_SET = 47; + static final int SWITCH_PAGE = 48; + static final int TEST_COLLAPSE_ROW = 49; + static final int TEST_EXPAND_ROW = 50; + static final int TOGGLED = 51; + static final int UNMAP = 52; + static final int UNMAP_EVENT = 53; + static final int UNREALIZE = 54; + static final int VALUE_CHANGED = 55; + static final int VISIBILITY_NOTIFY_EVENT = 56; + static final int WINDOW_STATE_EVENT = 57; + static final int LAST_SIGNAL = 58; /** * Prevents uninitialized instances from being created outside the package. @@ -1368,7 +1373,7 @@ int /*long*/ windowProc (int /*long*/ handle, int /*long*/ user_data) { int /*long*/ windowProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) { switch ((int)/*64*/user_data) { - case -EXPOSE_EVENT: { + case EXPOSE_EVENT_INVERSE: { GdkEventExpose gdkEvent = new GdkEventExpose (); OS.memmove (gdkEvent, arg0, GdkEventExpose.sizeof); int /*long*/ paintWindow = paintWindow(); @@ -1376,9 +1381,9 @@ int /*long*/ windowProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ us if (window != paintWindow) return 0; return (state & OBSCURED) != 0 ? 1 : 0; } - case -BUTTON_PRESS_EVENT: - case -BUTTON_RELEASE_EVENT: - case -MOTION_NOTIFY_EVENT: { + case BUTTON_PRESS_EVENT_INVERSE: + case BUTTON_RELEASE_EVENT_INVERSE: + case MOTION_NOTIFY_EVENT_INVERSE: { return 1; } case BUTTON_PRESS_EVENT: return gtk_button_press_event (handle, arg0); -- cgit