summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2002-11-11 17:16:07 +0000
committerSilenio Quarti <silenio>2002-11-11 17:16:07 +0000
commitea10febb5ae3b0d1b19a13c89b6c7b27ab367f3a (patch)
tree03ae4c0bcace1c32dfbdf82895dc05a7e9c3f35b
parent4def951fc85e643080de398e85c25cb30ec79f91 (diff)
downloadeclipse.platform.swt-ea10febb5ae3b0d1b19a13c89b6c7b27ab367f3a.tar.gz
eclipse.platform.swt-ea10febb5ae3b0d1b19a13c89b6c7b27ab367f3a.tar.xz
eclipse.platform.swt-ea10febb5ae3b0d1b19a13c89b6c7b27ab367f3a.zip
callbacks restructure
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java27
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java22
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java75
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java158
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java493
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java81
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java19
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java145
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java38
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MenuItem.java98
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ProgressBar.java12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java80
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scale.java30
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java41
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java114
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java46
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TabFolder.java57
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java305
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java21
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java208
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java168
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java150
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java449
24 files changed, 1461 insertions, 1384 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 dadf945aa4..446e4c40d3 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
@@ -326,15 +326,13 @@ public String getText () {
return text;
}
-void hookEvents () {
- super.hookEvents();
- Display display = getDisplay ();
- int windowProc2 = display.windowProc2;
- OS.g_signal_connect (handle, OS.clicked, windowProc2, SWT.Selection);
+int gtk_clicked (int widget) {
+ postEvent (SWT.Selection);
+ return 0;
}
-int processFocusIn(int int0, int int1, int int2) {
- int result = super.processFocusIn (int0, int1, int2);
+int gtk_focus_in_event (int widget, int event) {
+ int result = super.gtk_focus_in_event (widget, event);
// widget could be disposed at this point
if (handle == 0) return 0;
if ((style & SWT.PUSH) != 0 && OS.GTK_WIDGET_HAS_DEFAULT (handle)) {
@@ -344,8 +342,8 @@ int processFocusIn(int int0, int int1, int int2) {
return result;
}
-int processFocusOut (int int0, int int1, int int2) {
- int result = super.processFocusOut (int0, int1, int2);
+int gtk_focus_out_event (int widget, int event) {
+ int result = super.gtk_focus_out_event (widget, event);
// widget could be disposed at this point
if (handle == 0) return 0;
if ((style & SWT.PUSH) != 0 && !OS.GTK_WIDGET_HAS_DEFAULT (handle)) {
@@ -357,9 +355,10 @@ int processFocusOut (int int0, int int1, int int2) {
return result;
}
-int processSelection (int int0, int int1, int int2) {
- postEvent(SWT.Selection);
- return 0;
+void hookEvents () {
+ super.hookEvents();
+ Display display = getDisplay ();
+ OS.g_signal_connect (handle, OS.clicked, display.windowProc2, CLICKED);
}
void register () {
@@ -536,9 +535,9 @@ public void setImage (Image image) {
public void setSelection (boolean selected) {
checkWidget();
if ((style & (SWT.CHECK | SWT.RADIO | SWT.TOGGLE)) == 0) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED);
OS.gtk_toggle_button_set_active (handle, selected);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED);
}
/**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
index d3c9a6dd56..37f0fce1a7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
@@ -89,23 +89,23 @@ public Caret getCaret () {
return caret;
}
-int processFocusIn (int int0, int int1, int int2) {
- int result = super.processFocusIn (int0, int1, int2);
- if (caret != null) caret.setFocus ();
+int gtk_expose_event (int widget, int event) {
+ boolean isFocus = caret != null && caret.isFocusCaret ();
+ if (isFocus) caret.killFocus ();
+ int result = super.gtk_expose_event (widget, event);
+ if (isFocus) caret.setFocus ();
return result;
}
-int processFocusOut(int int0, int int1, int int2) {
- int result = super.processFocusOut (int0, int1, int2);
- if (caret != null) caret.killFocus ();
+int gtk_focus_in_event (int widget, int event) {
+ int result = super.gtk_focus_in_event (widget, event);
+ if (caret != null) caret.setFocus ();
return result;
}
-int processPaint (int callData, int int1, int int2) {
- boolean isFocus = caret != null && caret.isFocusCaret ();
- if (isFocus) caret.killFocus ();
- int result = super.processPaint (callData, int1, int2);
- if (isFocus) caret.setFocus ();
+int gtk_focus_out_event (int widget, int event) {
+ int result = super.gtk_focus_out_event (widget, event);
+ if (caret != null) caret.killFocus ();
return result;
}
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 3a8743422e..94758d07e4 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
@@ -391,15 +391,14 @@ boolean hasFocus () {
}
void hookEvents () {
- // TO DO - expose, enter/exit, focus in/out
super.hookEvents ();
Display display = getDisplay ();
int windowProc2 = display.windowProc2;
int windowProc3 = display.windowProc3;
// TO DO - fix multiple selection events for one user action
- OS.g_signal_connect (listHandle, OS.select_child, windowProc3, SWT.Selection);
- OS.g_signal_connect_after (entryHandle, OS.changed, windowProc2, SWT.Modify);
- OS.g_signal_connect (entryHandle, OS.activate, windowProc2, SWT.DefaultSelection);
+ OS.g_signal_connect (listHandle, OS.select_child, windowProc3, SELECT_CHILD);
+ OS.g_signal_connect_after (entryHandle, OS.changed, windowProc2, CHANGED);
+ OS.g_signal_connect (entryHandle, OS.activate, windowProc2, ACTIVATE);
int mask =
OS.GDK_POINTER_MOTION_MASK |
OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK |
@@ -409,16 +408,22 @@ void hookEvents () {
for (int i=0; i<handles.length; i++) {
int handle = handles [i];
OS.gtk_widget_add_events (handle, mask);
- OS.g_signal_connect (handle, OS.button_press_event, windowProc3, SWT.MouseDown);
- OS.g_signal_connect (handle, OS.button_release_event, windowProc3, SWT.MouseUp);
- OS.g_signal_connect (handle, OS.key_press_event, windowProc3, SWT.KeyDown);
- OS.g_signal_connect (handle, OS.key_release_event, windowProc3, SWT.KeyUp);
- OS.g_signal_connect (handle, OS.motion_notify_event, windowProc3, SWT.MouseMove);
- OS.g_signal_connect_after (handle, OS.button_press_event, windowProc3, -SWT.MouseDown);
- OS.g_signal_connect_after (handle, OS.button_release_event, windowProc3, -SWT.MouseUp);
- OS.g_signal_connect_after (handle, OS.key_press_event, windowProc3, -SWT.KeyDown);
- OS.g_signal_connect_after (handle, OS.key_release_event, windowProc3, -SWT.KeyUp);
- OS.g_signal_connect_after (handle, OS.motion_notify_event, windowProc3, -SWT.MouseMove);
+ 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.motion_notify_event, windowProc3, MOTION_NOTIFY_EVENT);
+ OS.g_signal_connect (handle, OS.key_press_event, windowProc3, KEY_PRESS_EVENT);
+ OS.g_signal_connect (handle, OS.key_release_event, windowProc3, KEY_RELEASE_EVENT);
+
+ /*
+ * Feature in GTK. Events such as mouse move are propagate up
+ * the widget hierarchy and are seen by the parent. This is the
+ * correct GTK behavior but not correct for SWT. The fix is to
+ * hook a signal after and stop the propagation using a negative
+ * event number to distinguish this case.
+ */
+ OS.g_signal_connect_after (handle, OS.button_press_event, windowProc3, -BUTTON_PRESS_EVENT);
+ OS.g_signal_connect_after (handle, OS.button_release_event, windowProc3, -BUTTON_RELEASE_EVENT);
+ OS.g_signal_connect_after (handle, OS.motion_notify_event, windowProc3, -MOTION_NOTIFY_EVENT);
}
}
@@ -661,6 +666,21 @@ public int getTextLimit () {
return limit == 0 ? LIMIT : limit;
}
+int gtk_activate (int widget) {
+ postEvent (SWT.DefaultSelection);
+ return 0;
+}
+
+int gtk_changed (int widget) {
+ sendEvent (SWT.Modify);
+ return 0;
+}
+
+int gtk_select_child (int list, int widget) {
+ postEvent (SWT.Selection);
+ return 0;
+}
+
/**
* Searches the receiver's list starting at the first item
* (index 0) until an item is found that is equal to the
@@ -733,21 +753,6 @@ int parentingHandle() {
return fixedHandle;
}
-int processDefaultSelection (int int0, int int1, int int2) {
- postEvent (SWT.DefaultSelection);
- return 0;
-}
-
-int processModify (int arg0, int arg1, int int2) {
- sendEvent (SWT.Modify);
- return 0;
-}
-
-int processSelection (int int0, int int1, int int2) {
- postEvent (SWT.Selection);
- return 0;
-}
-
void register () {
super.register ();
WidgetTable.put (entryHandle, this);
@@ -1021,11 +1026,11 @@ void setItems (String [] items, boolean keepText, boolean keepSelection) {
OS.memmove (data, buffer, buffer.length);
glist = OS.g_list_append (glist, data);
}
- blockSignal (entryHandle, SWT.Modify);
- blockSignal (listHandle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SELECT_CHILD);
OS.gtk_combo_set_popdown_strings (handle, glist);
- unblockSignal (entryHandle, SWT.Modify);
- unblockSignal (listHandle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SELECT_CHILD);
if (glist != 0) {
int count = OS.g_list_length (glist);
for (int i=0; i<count; i++) {
@@ -1087,9 +1092,9 @@ public void setText (String string) {
checkWidget();
if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
byte [] buffer = Converter.wcsToMbcs (null, string, true);
- blockSignal (listHandle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SELECT_CHILD);
OS.gtk_entry_set_text (entryHandle, buffer);
- unblockSignal (listHandle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SELECT_CHILD);
}
/**
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 58ede2256d..c79100cbd6 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
@@ -282,6 +282,85 @@ public Control [] getTabList () {
return new Control [0];
}
+int gtk_button_press_event (int widget, int event) {
+ int result = super.gtk_button_press_event (widget, event);
+ if ((state & CANVAS) != 0) {
+ if ((style & SWT.NO_FOCUS) == 0) {
+ int count = 0;
+ int list = OS.gtk_container_get_children (handle);
+ if (list != 0) {
+ count = OS.g_list_length (list);
+ OS.g_list_free (list);
+ }
+ if (count == 0) OS.gtk_widget_grab_focus (handle);
+ }
+ }
+ return result;
+}
+
+int gtk_expose_event (int widget, int eventPtr) {
+ if ((state & CANVAS) == 0) {
+ return super.gtk_expose_event (widget, eventPtr);
+ }
+ if ((style & SWT.NO_BACKGROUND) == 0) {
+ int window = paintWindow ();
+ int gc = OS.gdk_gc_new (window);
+ OS.gdk_gc_set_foreground (gc, getBackgroundColor ());
+ GdkEventExpose gdkEvent = new GdkEventExpose ();
+ OS.memmove(gdkEvent, eventPtr, GdkEventExpose.sizeof);
+ int x = gdkEvent.area_x, y = gdkEvent.area_y;
+ int width = gdkEvent.area_width, height = gdkEvent.area_height;
+ OS.gdk_gc_set_clip_region (gc, gdkEvent.region);
+ OS.gdk_draw_rectangle (window, gc, 1, x, y, width, height);
+ OS.g_object_unref (gc);
+ }
+ if ((style & SWT.NO_MERGE_PAINTS) == 0) {
+ return super.gtk_expose_event (widget, eventPtr);
+ }
+ if (!hooks (SWT.Paint) && !filters (SWT.Paint)) return 0;
+ GdkEventExpose gdkEvent = new GdkEventExpose ();
+ OS.memmove(gdkEvent, eventPtr, GdkEventExpose.sizeof);
+ int [] rectangles = new int [1];
+ int [] n_rectangles = new int [1];
+ OS.gdk_region_get_rectangles (gdkEvent.region, rectangles, n_rectangles);
+ GdkRectangle rect = new GdkRectangle ();
+ for (int i=0; i<n_rectangles[0]; i++) {
+ Event event = new Event ();
+ OS.memmove (rect, rectangles [0] + i * GdkRectangle.sizeof, GdkRectangle.sizeof);
+ event.x = rect.x;
+ event.y = rect.y;
+ event.width = rect.width;
+ event.height = rect.height;
+ GC gc = event.gc = new GC (this);
+ gc.setClipping (event.x, event.y, event.width, event.height);
+ sendEvent (SWT.Paint, event);
+ gc.dispose ();
+ event.gc = null;
+ }
+ OS.g_free (rectangles [0]);
+ return 0;
+}
+
+int gtk_focus_in_event (int widget, int event) {
+ int result = super.gtk_focus_in_event (widget, event);
+ return (state & CANVAS) != 0 ? 1 : result;
+}
+
+int gtk_focus_out_event (int widget, int event) {
+ int result = super.gtk_focus_out_event (widget, event);
+ return (state & CANVAS) != 0 ? 1 : result;
+}
+
+int gtk_key_press_event (int widget, int event) {
+ int result = super.gtk_key_press_event (widget, event);
+ return (state & CANVAS) != 0 && result != 1 && hasFocus () ? 1 : result;
+}
+
+int gtk_key_release_event (int widget, int event) {
+ int result = super.gtk_key_release_event (widget, event);
+ return (state & CANVAS) != 0 && result != 1 && hasFocus () ? 1 : result;
+}
+
boolean hasBorder () {
return (style & SWT.BORDER) != 0;
}
@@ -427,85 +506,6 @@ int parentingHandle () {
return fixedHandle != 0 ? fixedHandle : handle;
}
-int processFocusIn(int int0, int int1, int int2) {
- int result = super.processFocusIn (int0, int1, int2);
- return (state & CANVAS) != 0 ? 1 : result;
-}
-
-int processFocusOut(int int0, int int1, int int2) {
- int result = super.processFocusOut (int0, int1, int2);
- return (state & CANVAS) != 0 ? 1 : result;
-}
-
-int processKeyDown (int int0, int int1, int int2) {
- int result = super.processKeyDown (int0, int1, int2);
- return (state & CANVAS) != 0 && result != 1 && hasFocus () ? 1 : result;
-}
-
-int processKeyUp (int int0, int int1, int int2) {
- int result = super.processKeyUp (int0, int1, int2);
- return (state & CANVAS) != 0 && result != 1 && hasFocus () ? 1 : result;
-}
-
-int processMouseDown (int callData, int arg1, int int2) {
- int result = super.processMouseDown (callData, arg1, int2);
- if ((state & CANVAS) != 0) {
- if ((style & SWT.NO_FOCUS) == 0) {
- int count = 0;
- int list = OS.gtk_container_get_children (handle);
- if (list != 0) {
- count = OS.g_list_length (list);
- OS.g_list_free (list);
- }
- if (count == 0) OS.gtk_widget_grab_focus (handle);
- }
- }
- return result;
-}
-
-int processPaint (int callData, int int1, int int2) {
- if ((state & CANVAS) == 0) {
- return super.processPaint (callData, int1, int2);
- }
- if ((style & SWT.NO_BACKGROUND) == 0) {
- int window = paintWindow ();
- int gc = OS.gdk_gc_new (window);
- OS.gdk_gc_set_foreground (gc, getBackgroundColor ());
- GdkEventExpose gdkEvent = new GdkEventExpose ();
- OS.memmove(gdkEvent, callData, GdkEventExpose.sizeof);
- int x = gdkEvent.area_x, y = gdkEvent.area_y;
- int width = gdkEvent.area_width, height = gdkEvent.area_height;
- OS.gdk_gc_set_clip_region (gc, gdkEvent.region);
- OS.gdk_draw_rectangle (window, gc, 1, x, y, width, height);
- OS.g_object_unref (gc);
- }
- if ((style & SWT.NO_MERGE_PAINTS) == 0) {
- return super.processPaint (callData, int1, int2);
- }
- if (!hooks (SWT.Paint) && !filters (SWT.Paint)) return 0;
- GdkEventExpose gdkEvent = new GdkEventExpose ();
- OS.memmove(gdkEvent, callData, GdkEventExpose.sizeof);
- int [] rectangles = new int [1];
- int [] n_rectangles = new int [1];
- OS.gdk_region_get_rectangles (gdkEvent.region, rectangles, n_rectangles);
- GdkRectangle rect = new GdkRectangle ();
- for (int i=0; i<n_rectangles[0]; i++) {
- Event event = new Event ();
- OS.memmove (rect, rectangles [0] + i * GdkRectangle.sizeof, GdkRectangle.sizeof);
- event.x = rect.x;
- event.y = rect.y;
- event.width = rect.width;
- event.height = rect.height;
- GC gc = event.gc = new GC (this);
- gc.setClipping (event.x, event.y, event.width, event.height);
- sendEvent (SWT.Paint, event);
- gc.dispose ();
- event.gc = null;
- }
- OS.g_free (rectangles [0]);
- return 0;
-}
-
int radioGroup() {
if (radioHandle == 0) {
radioHandle = OS.gtk_radio_button_new (0);
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 00ac714c54..7a9f45cfae 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
@@ -92,6 +92,7 @@ GdkColor defaultForeground () {
void deregister () {
super.deregister ();
if (fixedHandle != 0) WidgetTable.remove (fixedHandle);
+ if (imHandle != 0) WidgetTable.remove (imHandle);
}
int eventHandle () {
@@ -107,6 +108,7 @@ boolean hasFocus () {
}
void hookEvents () {
+ //TO DO - get rid of enter/exit for mouse crossing border
int eventHandle = eventHandle ();
int mask =
OS.GDK_EXPOSURE_MASK | OS.GDK_POINTER_MOTION_MASK |
@@ -118,21 +120,45 @@ void hookEvents () {
Display display = getDisplay ();
int windowProc2 = display.windowProc2;
int windowProc3 = display.windowProc3;
- OS.g_signal_connect (eventHandle, OS.popup_menu, windowProc2, SWT.Show);
- OS.g_signal_connect (eventHandle, OS.show_help, windowProc3, SWT.Help);
- OS.g_signal_connect (eventHandle, OS.button_press_event, windowProc3, SWT.MouseDown);
- OS.g_signal_connect (eventHandle, OS.button_release_event, windowProc3, SWT.MouseUp);
- OS.g_signal_connect (eventHandle, OS.key_press_event, windowProc3, SWT.KeyDown);
- OS.g_signal_connect (eventHandle, OS.key_release_event, windowProc3, SWT.KeyUp);
- OS.g_signal_connect (eventHandle, OS.motion_notify_event, windowProc3, SWT.MouseMove);
- OS.g_signal_connect (eventHandle, OS.focus_in_event, windowProc3, SWT.FocusIn);
- OS.g_signal_connect (eventHandle, OS.focus_out_event, windowProc3, SWT.FocusOut);
- OS.g_signal_connect_after (eventHandle, OS.button_press_event, windowProc3, -SWT.MouseDown);
- OS.g_signal_connect_after (eventHandle, OS.button_release_event, windowProc3, -SWT.MouseUp);
- OS.g_signal_connect_after (eventHandle, OS.motion_notify_event, windowProc3, -SWT.MouseMove);
- OS.g_signal_connect_after (eventHandle, OS.enter_notify_event, windowProc3, SWT.MouseEnter);
- OS.g_signal_connect_after (eventHandle, OS.leave_notify_event, windowProc3, SWT.MouseExit);
- OS.g_signal_connect_after (eventHandle, OS.expose_event, windowProc3, SWT.Paint);
+ OS.g_signal_connect (eventHandle, OS.popup_menu, windowProc2, POPUP_MENU);
+ OS.g_signal_connect (eventHandle, OS.show_help, windowProc3, SHOW_HELP);
+ 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.key_press_event, windowProc3, KEY_PRESS_EVENT);
+ OS.g_signal_connect (eventHandle, OS.key_release_event, windowProc3, KEY_RELEASE_EVENT);
+ OS.g_signal_connect (eventHandle, OS.focus_in_event, windowProc3, FOCUS_IN_EVENT);
+ OS.g_signal_connect (eventHandle, OS.focus_out_event, windowProc3, FOCUS_OUT_EVENT);
+ OS.g_signal_connect_after (eventHandle, OS.enter_notify_event, windowProc3, ENTER_NOTIFY_EVENT);
+ OS.g_signal_connect_after (eventHandle, OS.leave_notify_event, windowProc3, LEAVE_NOTIFY_EVENT);
+ OS.g_signal_connect_after (eventHandle, OS.expose_event, windowProc3, EXPOSE_EVENT);
+
+ /*
+ * Feature in GTK. Events such as mouse move are propagate up
+ * the widget hierarchy and are seen by the parent. This is the
+ * correct GTK behavior but not correct for SWT. The fix is to
+ * 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);
+}
+
+int hoverProc (int widget) {
+ Event event = new Event ();
+ int [] x = new int [1], y = new int [1], mask = new int [1];
+ OS.gdk_window_get_pointer (0, x, y, mask);
+ event.x = x [0];
+ event.y = y [0];
+ int eventHandle = eventHandle ();
+ int window = OS.GTK_WIDGET_WINDOW (eventHandle);
+ OS.gdk_window_get_origin (window, x, y);
+ event.x -= x [0];
+ event.y -= y [0];
+ setInputState (event, mask [0]);
+ postEvent (SWT.MouseHover, event);
+ return 0;
}
int topHandle() {
@@ -1481,6 +1507,214 @@ public boolean getVisible () {
return OS.GTK_WIDGET_VISIBLE (topHandle ());
}
+int gtk_button_press_event (int widget, int event) {
+ Shell shell = _getShell ();
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+ Display display = getDisplay ();
+ display.dragStartX = (int) gdkEvent.x;
+ display.dragStartY = (int) gdkEvent.y;
+ display.dragging = false;
+ int button = gdkEvent.button;
+ int type = gdkEvent.type != OS.GDK_2BUTTON_PRESS ? SWT.MouseDown : SWT.MouseDoubleClick;
+ sendMouseEvent (type, button, event);
+ if (button == 3 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
+ if (menu != null) menu.setVisible (true);
+ }
+
+ /*
+ * It is possible that the shell may be
+ * disposed at this point. If this happens
+ * don't send the activate and deactivate
+ * events.
+ */
+ if (!shell.isDisposed ()) {
+ shell.setActiveControl (this);
+ }
+ return 0;
+}
+
+int gtk_button_release_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+ sendMouseEvent (SWT.MouseUp, gdkEvent.button, event);
+ return 0;
+}
+
+int gtk_commit (int imcontext, int text) {
+ if (text == 0) return 0;
+ int length = OS.strlen (text);
+ if (length == 0) return 0;
+ byte [] buffer = new byte [length];
+ OS.memmove (buffer, text, length);
+ char [] result = Converter.mbcsToWcs (null, buffer);
+ int index = 0;
+ while (index < result.length) {
+ if (result [index] == 0) break;
+ Event event = new Event ();
+ event.character = result [index];
+ postEvent (SWT.KeyDown, event);
+ index++;
+ }
+ return 0;
+}
+
+int gtk_enter_notify_event (int widget, int event) {
+ GdkEventCrossing gdkEvent = new GdkEventCrossing ();
+ OS.memmove (gdkEvent, event, GdkEventCrossing.sizeof);
+ if (gdkEvent.mode != OS.GDK_CROSSING_NORMAL) return 0;
+ if (gdkEvent.subwindow != 0) return 0;
+ sendMouseEvent (SWT.MouseEnter, 0, event);
+ return 0;
+}
+
+int gtk_expose_event (int widget, int eventPtr) {
+ if (!hooks (SWT.Paint) && !filters (SWT.Paint)) return 0;
+ GdkEventExpose gdkEvent = new GdkEventExpose ();
+ OS.memmove(gdkEvent, eventPtr, GdkEventExpose.sizeof);
+ Event event = new Event ();
+ event.count = gdkEvent.count;
+ event.x = gdkEvent.area_x;
+ event.y = gdkEvent.area_y;
+ event.width = gdkEvent.area_width;
+ event.height = gdkEvent.area_height;
+ GC gc = event.gc = new GC (this);
+ Region region = Region.gtk_new (gdkEvent.region);
+ gc.setClipping (region);
+ sendEvent (SWT.Paint, event);
+ gc.dispose ();
+ event.gc = null;
+ return 0;
+}
+
+int gtk_focus_in_event (int widget, int event) {
+ sendEvent (SWT.FocusIn);
+ // widget could be disposed at this point
+ if (handle == 0) return 0;
+ if (hooks (SWT.KeyDown) || hooks (SWT.KeyUp)) {
+ int imHandle = imHandle ();
+ if (imHandle != 0) OS.gtk_im_context_focus_in (imHandle);
+ }
+
+ /*
+ * It is possible that the shell may be
+ * disposed at this point. If this happens
+ * don't send the activate and deactivate
+ * events.
+ */
+ Shell shell = _getShell ();
+ if (!shell.isDisposed ()) {
+ shell.setActiveControl (this);
+ }
+ return 0;
+}
+
+int gtk_focus_out_event (int widget, int event) {
+ sendEvent (SWT.FocusOut);
+ // widget could be disposed at this point
+ if (handle == 0) return 0;
+ if (hooks (SWT.KeyDown) || hooks (SWT.KeyUp)) {
+ int imHandle = imHandle ();
+ if (imHandle != 0) OS.gtk_im_context_focus_out (imHandle);
+ }
+
+ /*
+ * It is possible that the shell may be
+ * disposed at this point. If this happens
+ * don't send the activate and deactivate
+ * events.
+ */
+ Shell shell = _getShell ();
+ if (!shell.isDisposed ()) {
+ Display display = shell.getDisplay ();
+ Control control = display.getFocusControl ();
+ if (control == null || shell != control.getShell () ) {
+ shell.setActiveControl (null);
+ }
+ }
+ return 0;
+}
+
+int gtk_key_press_event (int widget, int event) {
+ if (!hasFocus ()) return 0;
+ if (imHandle != 0) {
+ if (OS.gtk_im_context_filter_keypress (imHandle, event)) return 0;
+ }
+ GdkEventKey gdkEvent = new GdkEventKey ();
+ OS.memmove (gdkEvent, event, GdkEventKey.sizeof);
+ if (translateTraversal (gdkEvent)) return 1;
+ // widget could be disposed at this point
+ if (isDisposed ()) return 0;
+ sendKeyEvent (SWT.KeyDown, gdkEvent);
+ return 0;
+}
+
+int gtk_key_release_event (int widget, int event) {
+ if (!hasFocus ()) return 0;
+ if (imHandle != 0) {
+ if (OS.gtk_im_context_filter_keypress (imHandle, event)) return 0;
+ }
+ GdkEventKey gdkEvent = new GdkEventKey ();
+ OS.memmove (gdkEvent, event, GdkEventKey.sizeof);
+ sendKeyEvent (SWT.KeyUp, gdkEvent);
+ return 0;
+}
+
+int gtk_leave_notify_event (int widget, int event) {
+ Display display = getDisplay ();
+ display.removeMouseHoverTimeout (handle);
+ GdkEventCrossing gdkEvent = new GdkEventCrossing ();
+ OS.memmove (gdkEvent, event, GdkEventCrossing.sizeof);
+ if (gdkEvent.mode != OS.GDK_CROSSING_NORMAL) return 0;
+ if (gdkEvent.subwindow != 0) return 0;
+ sendMouseEvent (SWT.MouseExit, 0, event);
+ return 0;
+}
+
+int gtk_motion_notify_event (int widget, int event) {
+ Display display = getDisplay ();
+ if (hooks (SWT.DragDetect)) {
+ if (!display.dragging) {
+ int [] state = new int [1];
+ OS.gdk_event_get_state (event, state);
+ if ((state [0] & OS.GDK_BUTTON1_MASK) != 0) {
+ double [] px = new double [1], py = new double [1];
+ OS.gdk_event_get_coords (event, px, py);
+ if (OS.gtk_drag_check_threshold (handle, display.dragStartX, display.dragStartY, (int) px [0], (int) py [0])){
+ display.dragging = true;
+ postEvent (SWT.DragDetect);
+ }
+ }
+ }
+ }
+ if (hooks (SWT.MouseHover) || filters (SWT.MouseHover)) {
+ display.addMouseHoverTimeout (handle);
+ }
+ sendMouseEvent (SWT.MouseMove, 0, event);
+ return 0;
+}
+
+int gtk_popup_menu (int widget) {
+ if (menu != null) menu.setVisible(true);
+ return 0;
+}
+
+int gtk_show_help (int widget, int helpType) {
+ sendHelpEvent (helpType);
+ return 0;
+}
+
+int imHandle () {
+ if (imHandle != 0) return imHandle;
+ imHandle = OS.gtk_im_multicontext_new ();
+ if (imHandle == 0) error (SWT.ERROR_NO_HANDLES);
+ OS.gtk_im_context_set_client_window (imHandle, paintWindow ());
+ WidgetTable.put (imHandle, this);
+ Display display = getDisplay ();
+ OS.g_signal_connect (imHandle, OS.commit, display.windowProc3, COMMIT);
+ return imHandle;
+}
+
/**
* Invokes platform specific functionality to allocate a new GC handle.
* <p>
@@ -1657,233 +1891,6 @@ Decorations menuShell () {
return parent.menuShell ();
}
-int processHelp (int int0, int int1, int int2) {
- sendHelpEvent (int0);
- return 0;
-}
-
-int processFocusIn (int int0, int int1, int int2) {
- sendEvent (SWT.FocusIn);
- // widget could be disposed at this point
- if (handle == 0) return 0;
- processIMEFocusIn ();
-
- /*
- * It is possible that the shell may be
- * disposed at this point. If this happens
- * don't send the activate and deactivate
- * events.
- */
- Shell shell = _getShell ();
- if (!shell.isDisposed ()) {
- shell.setActiveControl (this);
- }
- return 0;
-}
-
-int processFocusOut (int int0, int int1, int int2) {
- sendEvent (SWT.FocusOut);
- // widget could be disposed at this point
- if (handle == 0) return 0;
- processIMEFocusOut ();
-
- /*
- * It is possible that the shell may be
- * disposed at this point. If this happens
- * don't send the activate and deactivate
- * events.
- */
- Shell shell = _getShell ();
- if (!shell.isDisposed ()) {
- Display display = shell.getDisplay ();
- Control control = display.getFocusControl ();
- if (control == null || shell != control.getShell () ) {
- shell.setActiveControl (null);
- }
- }
- return 0;
-}
-
-int processIMEFocusIn () {
- if (!(hooks (SWT.KeyDown) || hooks (SWT.KeyUp))) return 0;
- if (imHandle == 0) {
- imHandle = OS.gtk_im_multicontext_new ();
- if (imHandle == 0) error (SWT.ERROR_NO_HANDLES);
- OS.gtk_im_context_set_client_window (imHandle, paintWindow ());
- Display display = getDisplay ();
- int keyProc = display.keyProc;
- OS.g_signal_connect (imHandle, OS.commit, keyProc, handle);
- }
- if (imHandle != 0) OS.gtk_im_context_focus_in (imHandle);
- return 0;
-}
-
-int processIMEFocusOut () {
- if (!(hooks (SWT.KeyDown) || hooks (SWT.KeyUp))) return 0;
- if (imHandle != 0) OS.gtk_im_context_focus_out (imHandle);
- return 0;
-}
-
-int processIMEKey (int str) {
- if (str == 0) return 0;
- int length = OS.strlen (str);
- if (length == 0) return 0;
- byte [] buffer = new byte [length];
- OS.memmove (buffer, str, length);
- char [] result = Converter.mbcsToWcs (null, buffer);
- int index = 0;
- while (index < result.length) {
- if (result [index] == 0) break;
- Event event = new Event ();
- event.character = result [index];
- postEvent (SWT.KeyDown, event);
- index++;
- }
- return 0;
-}
-
-int processKeyDown (int callData, int arg1, int int2) {
- if (!hasFocus ()) return 0;
- if (imHandle != 0) {
- if (OS.gtk_im_context_filter_keypress (imHandle, callData)) return 0;
- }
- GdkEventKey event = new GdkEventKey ();
- OS.memmove (event, callData, GdkEventKey.sizeof);
- if (translateTraversal (event)) return 1;
- // widget could be disposed at this point
- if (isDisposed ()) return 0;
- sendKeyEvent (SWT.KeyDown, event);
- return 0;
-}
-
-int processKeyUp (int callData, int arg1, int int2) {
- if (!hasFocus ()) return 0;
- if (imHandle != 0) {
- if (OS.gtk_im_context_filter_keypress (imHandle, callData)) return 0;
- }
- GdkEventKey event = new GdkEventKey ();
- OS.memmove (event, callData, GdkEventKey.sizeof);
- sendKeyEvent (SWT.KeyUp, event);
- return 0;
-}
-
-int processMouseDown (int callData, int arg1, int int2) {
- Shell shell = _getShell ();
- GdkEventButton gdkEvent = new GdkEventButton ();
- OS.memmove (gdkEvent, callData, GdkEventButton.sizeof);
- Display display = getDisplay ();
- display.dragStartX = (int) gdkEvent.x;
- display.dragStartY = (int) gdkEvent.y;
- display.dragging = false;
- int button = gdkEvent.button;
- int type = gdkEvent.type != OS.GDK_2BUTTON_PRESS ? SWT.MouseDown : SWT.MouseDoubleClick;
- sendMouseEvent (type, button, callData);
- if (button == 3 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
- if (menu != null) menu.setVisible (true);
- }
-
- /*
- * It is possible that the shell may be
- * disposed at this point. If this happens
- * don't send the activate and deactivate
- * events.
- */
- if (!shell.isDisposed ()) {
- shell.setActiveControl (this);
- }
- return 0;
-}
-
-int processMouseEnter (int callData, int arg1, int int2) {
- GdkEventCrossing gdkEvent = new GdkEventCrossing ();
- OS.memmove (gdkEvent, callData, GdkEventCrossing.sizeof);
- if (gdkEvent.mode != OS.GDK_CROSSING_NORMAL) return 0;
- if (gdkEvent.subwindow != 0) return 0;
- sendMouseEvent (SWT.MouseEnter, 0, callData);
- return 0;
-}
-
-int processMouseExit (int callData, int arg1, int int2) {
- Display display = getDisplay ();
- display.removeMouseHoverTimeout (handle);
- GdkEventCrossing gdkEvent = new GdkEventCrossing ();
- OS.memmove (gdkEvent, callData, GdkEventCrossing.sizeof);
- if (gdkEvent.mode != OS.GDK_CROSSING_NORMAL) return 0;
- if (gdkEvent.subwindow != 0) return 0;
- sendMouseEvent (SWT.MouseExit, 0, callData);
- return 0;
-}
-
-int processMouseHover (int id) {
- Event event = new Event ();
- int [] x = new int [1], y = new int [1], mask = new int [1];
- OS.gdk_window_get_pointer (0, x, y, mask);
- event.x = x [0];
- event.y = y [0];
- int eventHandle = eventHandle ();
- int window = OS.GTK_WIDGET_WINDOW (eventHandle);
- OS.gdk_window_get_origin (window, x, y);
- event.x -= x [0];
- event.y -= y [0];
- setInputState (event, mask [0]);
- postEvent (SWT.MouseHover, event);
- return 0;
-}
-
-int processMouseUp (int callData, int arg1, int int2) {
- GdkEventButton gdkEvent = new GdkEventButton ();
- OS.memmove (gdkEvent, callData, GdkEventButton.sizeof);
- sendMouseEvent (SWT.MouseUp, gdkEvent.button, callData);
- return 0;
-}
-
-int processMouseMove (int callData, int arg1, int int2) {
- Display display = getDisplay ();
- if (hooks (SWT.DragDetect)) {
- if (!display.dragging) {
- int [] state = new int [1];
- OS.gdk_event_get_state (callData, state);
- if ((state [0] & OS.GDK_BUTTON1_MASK) != 0) {
- double [] px = new double [1], py = new double [1];
- OS.gdk_event_get_coords (callData, px, py);
- if (OS.gtk_drag_check_threshold (handle, display.dragStartX, display.dragStartY, (int) px [0], (int) py [0])){
- display.dragging = true;
- postEvent (SWT.DragDetect);
- }
- }
- }
- }
- if (hooks (SWT.MouseHover) || filters (SWT.MouseHover)) {
- display.addMouseHoverTimeout (handle);
- }
- sendMouseEvent (SWT.MouseMove, 0, callData);
- return 0;
-}
-
-int processPaint (int callData, int int2, int int3) {
- if (!hooks (SWT.Paint) && !filters (SWT.Paint)) return 0;
- GdkEventExpose gdkEvent = new GdkEventExpose ();
- OS.memmove(gdkEvent, callData, GdkEventExpose.sizeof);
- Event event = new Event ();
- event.count = gdkEvent.count;
- event.x = gdkEvent.area_x;
- event.y = gdkEvent.area_y;
- event.width = gdkEvent.area_width;
- event.height = gdkEvent.area_height;
- GC gc = event.gc = new GC (this);
- Region region = Region.gtk_new (gdkEvent.region);
- gc.setClipping (region);
- sendEvent (SWT.Paint, event);
- gc.dispose ();
- event.gc = null;
- return 0;
-}
-
-int processShow (int int0, int int1, int int2) {
- if (menu != null) menu.setVisible(true);
- return 0;
-}
-
void register () {
super.register ();
if (fixedHandle != 0) WidgetTable.put (fixedHandle, this);
@@ -1955,9 +1962,9 @@ void releaseHandle () {
void releaseWidget () {
Display display = getDisplay ();
display.removeMouseHoverTimeout (handle);
+ super.releaseWidget ();
if (imHandle != 0) OS.g_object_unref (imHandle);
imHandle = 0;
- super.releaseWidget ();
toolTipText = null;
parent = null;
menu = null;
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 88686e6372..4c1063dc79 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
@@ -91,8 +91,8 @@ public class Display extends Device {
/* Events Dispatching and Callback */
Event [] eventQueue;
- int windowProc2, windowProc3, windowProc4, windowProc5, keyProc;
- Callback windowCallback2, windowCallback3, windowCallback4, windowCallback5, keyCallback;
+ int windowProc2, windowProc3, windowProc4, windowProc5;
+ Callback windowCallback2, windowCallback3, windowCallback4, windowCallback5;
EventTable eventTable, filterTable;
/* Sync/Async Widget Communication */
@@ -122,8 +122,8 @@ public class Display extends Device {
/* GtkTreeView callbacks */
int[] treeSelection;
int treeSelectionLength;
- int treeSelectionProc, treeColumnSelectionProc, treeToggleProc;
- Callback treeSelectionCallback, treeColumnSelectionCallback, treeToggleCallback;
+ int treeSelectionProc;
+ Callback treeSelectionCallback;
/* Drag Detect */
int dragStartX,dragStartY;
@@ -1115,10 +1115,6 @@ protected void init () {
}
void initializeCallbacks () {
- keyCallback = new Callback (this, "keyProc", 3);
- keyProc = keyCallback.getAddress ();
- if (keyProc == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-
windowCallback2 = new Callback (this, "windowProc", 2);
windowProc2 = windowCallback2.getAddress ();
if (windowProc2 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
@@ -1135,33 +1131,25 @@ void initializeCallbacks () {
windowProc5 = windowCallback5.getAddress ();
if (windowProc5 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
- timerCallback = new Callback (this, "timerProc", 2);
+ timerCallback = new Callback (this, "timerProc", 1);
timerProc = timerCallback.getAddress ();
if (timerProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
- windowTimerCallback = new Callback (this, "windowTimerProc", 2);
+ windowTimerCallback = new Callback (this, "windowTimerProc", 1);
windowTimerProc = windowTimerCallback.getAddress ();
if (windowTimerProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
- mouseHoverCallback = new Callback (this, "mouseHoverProc", 2);
+ mouseHoverCallback = new Callback (this, "mouseHoverProc", 1);
mouseHoverProc = mouseHoverCallback.getAddress ();
if (mouseHoverProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
- caretCallback = new Callback(this, "caretProc", 2);
+ caretCallback = new Callback(this, "caretProc", 1);
caretProc = caretCallback.getAddress();
if (caretProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
treeSelectionCallback = new Callback(this, "treeSelectionProc", 4);
treeSelectionProc = treeSelectionCallback.getAddress();
if (treeSelectionProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
-
- treeColumnSelectionCallback = new Callback(this, "treeColumnSelectionProc", 2);
- treeColumnSelectionProc = treeColumnSelectionCallback.getAddress();
- if (treeColumnSelectionProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
-
- treeToggleCallback = new Callback(this, "treeToggleProc", 3);
- treeToggleProc = treeToggleCallback.getAddress();
- if (treeToggleProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
}
/**
@@ -1215,10 +1203,10 @@ boolean isValidThread () {
return thread == Thread.currentThread ();
}
-int mouseHoverProc (int handle, int id) {
+int mouseHoverProc (int handle) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processMouseHover (id);
+ return widget.hoverProc (handle);
}
void postEvent (Event event) {
@@ -1322,7 +1310,6 @@ protected void release () {
}
void releaseDisplay () {
- keyCallback.dispose (); keyCallback = null;
windowCallback2.dispose (); windowCallback2 = null;
windowCallback3.dispose (); windowCallback3 = null;
windowCallback4.dispose (); windowCallback4 = null;
@@ -1331,10 +1318,6 @@ void releaseDisplay () {
/* Dispose GtkTreeView callbacks */
treeSelectionCallback.dispose (); treeSelectionCallback = null;
treeSelectionProc = 0;
- treeColumnSelectionCallback.dispose (); treeColumnSelectionCallback = null;
- treeColumnSelectionProc = 0;
- treeToggleCallback.dispose (); treeToggleCallback = null;
- treeToggleProc = 0;
/* Dispose the caret callback */
if (caretId != 0) OS.gtk_timeout_remove (caretId);
@@ -1364,7 +1347,7 @@ void releaseDisplay () {
mouseHoverCallback = null;
thread = null;
- windowProc2 = windowProc3 = windowProc4 = windowProc5 = keyProc = 0;
+ windowProc2 = windowProc3 = windowProc4 = windowProc5 = 0;
/* Dispose the default font */
if (defaultFont != 0) OS.pango_font_description_free (defaultFont);
@@ -1706,7 +1689,7 @@ public void timerExec (int milliseconds, Runnable runnable) {
}
}
-int timerProc (int index, int id) {
+int timerProc (int index) {
if (timerList == null) return 0;
if (0 <= index && index < timerList.length) {
Runnable runnable = timerList [index];
@@ -1717,7 +1700,7 @@ int timerProc (int index, int id) {
return 0;
}
-int caretProc (int clientData, int id) {
+int caretProc (int clientData) {
caretId = 0;
if (currentCaret == null) {
return 0;
@@ -1731,22 +1714,10 @@ int caretProc (int clientData, int id) {
return 0;
}
-int treeColumnSelectionProc (int column, int data) {
- Widget widget = WidgetTable.get (data);
- if (widget == null) return 0;
- return widget.processTreeColumnSelection (column);
-}
-
int treeSelectionProc (int model, int path, int iter, int data) {
Widget widget = WidgetTable.get (data);
if (widget == null) return 0;
- return widget.processTreeSelection (model, path, iter, treeSelection, treeSelectionLength++);
-}
-
-int treeToggleProc (int renderer, int arg1, int data) {
- Widget widget = WidgetTable.get (data);
- if (widget == null) return 0;
- return widget.processTreeToggle (renderer, arg1);
+ return widget.treeSelectionProc (model, path, iter, treeSelection, treeSelectionLength++);
}
void sendEvent (int eventType, Event event) {
@@ -1832,40 +1803,34 @@ public void wake () {
if (thread == Thread.currentThread ()) return;
}
-int keyProc (int handle, int int0, int user_data) {
- Widget widget = WidgetTable.get (user_data);
- if (widget == null) return 0;
- return widget.processIMEKey (int0);
-}
-
int windowProc (int handle, int user_data) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processEvent (user_data, 0, 0, 0);
+ return widget.windowProc (handle, user_data);
}
-int windowProc (int handle, int int0, int user_data) {
+int windowProc (int handle, int arg0, int user_data) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processEvent (user_data, int0, 0, 0);
+ return widget.windowProc (handle, arg0, user_data);
}
-int windowProc (int handle, int int0, int int1, int user_data) {
+int windowProc (int handle, int arg0, int arg1, int user_data) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processEvent (user_data, int0, int1, 0);
+ return widget.windowProc (handle, arg0, arg1, user_data);
}
-int windowProc (int handle, int int0, int int1, int int2, int user_data) {
+int windowProc (int handle, int arg0, int arg1, int arg2, int user_data) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processEvent (user_data, int0, int1, int2);
+ return widget.windowProc (handle, arg0, arg1, arg2, user_data);
}
-int windowTimerProc (int handle, int id) {
+int windowTimerProc (int handle) {
Widget widget = WidgetTable.get (handle);
if (widget == null) return 0;
- return widget.processTimer (id);
+ return widget.timerProc (handle);
}
}
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 19a94798ce..3703f3ce83 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
@@ -259,16 +259,7 @@ public String getText () {
return text;
}
-void hookEvents () {
- super.hookEvents();
- if (labelHandle != 0) {
- Display display = getDisplay ();
- int windowProc3 = display.windowProc3;
- OS.g_signal_connect (labelHandle, OS.mnemonic_activate, windowProc3, SWT.Activate);
- }
-}
-
-int processActivate (int int0, int int1, int int2) {
+int gtk_mnemonic_activate (int widget, int arg1) {
Composite control = this.parent;
while (control != null) {
Control [] children = control._getChildren ();
@@ -286,6 +277,14 @@ int processActivate (int int0, int int1, int int2) {
return 1;
}
+void hookEvents () {
+ super.hookEvents();
+ if (labelHandle != 0) {
+ Display display = getDisplay ();
+ OS.g_signal_connect (labelHandle, OS.mnemonic_activate, display.windowProc3, MNEMONIC_ACTIVATE);
+ }
+}
+
void register () {
super.register ();
if (frameHandle != 0) WidgetTable.put (frameHandle, this);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java
index f5f9291a2b..1fe952e393 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java
@@ -252,11 +252,11 @@ public void deselect (int index) {
checkWidget();
if (!(0 <= index && index < OS.gtk_tree_model_iter_n_children (modelHandle, 0))) return;
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_unselect_iter (selection, iter);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -281,13 +281,13 @@ public void deselect (int start, int end) {
start = Math.min (count - 1, Math.max (0, start));
end = Math.min (count - 1, Math.max (0, end));
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int index=start; index<=end; index++) {
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_unselect_iter (selection, iter);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -313,7 +313,7 @@ public void deselect (int [] indices) {
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
int count = OS.gtk_tree_model_iter_n_children (modelHandle, 0);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int i=0; i<indices.length; i++) {
int index = indices [i];
@@ -321,7 +321,7 @@ public void deselect (int [] indices) {
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_unselect_iter (selection, iter);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -335,10 +335,10 @@ public void deselect (int [] indices) {
*/
public void deselectAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_unselect_all (selection);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
GdkColor getBackgroundColor () {
@@ -627,13 +627,44 @@ public int getTopIndex () {
return index [0];
}
+int gtk_changed (int widget) {
+ postEvent (SWT.Selection);
+ return 0;
+}
+
+int gtk_key_press_event (int widget, int eventPtr) {
+ int result = super.gtk_key_press_event (widget, eventPtr);
+ if (result != 0) return result;
+
+ /*
+ * Feature in GTK. When an item is default selected using
+ * the return key, GTK does not issue notification. The fix is
+ * to issue this notification when the return key is pressed.
+ */
+ GdkEventKey keyEvent = new GdkEventKey ();
+ OS.memmove (keyEvent, eventPtr, GdkEventKey.sizeof);
+ int key = keyEvent.keyval;
+ switch (key) {
+ case OS.GDK_Return:
+ case OS.GDK_KP_Enter: {
+ postEvent (SWT.DefaultSelection);
+ break;
+ }
+ }
+ return result;
+}
+
+int gtk_row_activated (int tree, int path, int column) {
+ postEvent (SWT.DefaultSelection);
+ return 0;
+}
+
void hookEvents () {
- //TO DO - get rid of enter/exit for mouse crossing border
super.hookEvents();
Display display = getDisplay ();
int selection = OS.gtk_tree_view_get_selection(handle);
- OS.g_signal_connect (selection, OS.changed, display.windowProc2, SWT.Selection);
- OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, SWT.DefaultSelection);
+ OS.g_signal_connect (selection, OS.changed, display.windowProc2, CHANGED);
+ OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, ROW_ACTIVATED);
}
/**
@@ -720,50 +751,6 @@ int paintWindow () {
return OS.gtk_tree_view_get_bin_window (handle);
}
-int processDefaultSelection (int int0, int int1, int int2) {
- postEvent (SWT.DefaultSelection);
- return 0;
-}
-
-int processKeyDown (int callData, int arg1, int int2) {
- int result = super.processKeyDown (callData, arg1, int2);
- if (result != 0) return result;
-
- /*
- * Feature in GTK. When an item is default selected using
- * the return key, GTK does not issue notification. The fix is
- * to issue this notification when the return key is pressed.
- */
- GdkEventKey keyEvent = new GdkEventKey ();
- OS.memmove (keyEvent, callData, GdkEventKey.sizeof);
- int key = keyEvent.keyval;
- switch (key) {
- case OS.GDK_Return:
- case OS.GDK_KP_Enter: {
- postEvent (SWT.DefaultSelection);
- break;
- }
- }
- return result;
-}
-
-int processSelection (int int0, int int1, int int2) {
- postEvent (SWT.Selection);
- return 0;
-}
-
-int processTreeSelection (int model, int path, int iter, int[] selection, int length) {
- if (selection != null) {
- int indices = OS.gtk_tree_path_get_indices (path);
- if (indices != 0) {
- int [] index = new int [1];
- OS.memmove (index, indices, 4);
- selection [length] = index [0];
- }
- }
- return 0;
-}
-
void register () {
super.register ();
WidgetTable.put (OS.gtk_tree_view_get_selection (handle), this);
@@ -799,9 +786,9 @@ public void remove (int index) {
}
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_list_store_remove (modelHandle, iter);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -831,12 +818,12 @@ public void remove (int start, int end) {
error (SWT.ERROR_INVALID_RANGE);
}
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
for (int index=start; index<=end; index++) {
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_list_store_remove (modelHandle, iter);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -890,7 +877,7 @@ public void remove (int [] indices) {
System.arraycopy (indices, 0, newIndices, 0, indices.length);
sort (newIndices);
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int last = -1;
for (int i=0; i<newIndices.length; i++) {
int index = newIndices [i];
@@ -900,7 +887,7 @@ public void remove (int [] indices) {
last = index;
}
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -914,9 +901,9 @@ public void remove (int [] indices) {
*/
public void removeAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_list_store_clear (modelHandle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -960,11 +947,11 @@ public void select (int index) {
checkWidget();
if (!(0 <= index && index < OS.gtk_tree_model_iter_n_children (modelHandle, 0))) return;
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_select_iter (selection, iter);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -988,13 +975,13 @@ public void select (int start, int end) {
start = Math.min (count - 1, Math.max (0, start));
end = Math.min (count - 1, Math.max (0, end));
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int index=start; index<=end; index++) {
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_select_iter (selection, iter);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -1020,7 +1007,7 @@ public void select (int [] indices) {
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
int count = OS.gtk_tree_model_iter_n_children (modelHandle, 0);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int i=0; i<indices.length; i++) {
int index = indices [i];
@@ -1028,7 +1015,7 @@ public void select (int [] indices) {
OS.gtk_tree_model_iter_nth_child (modelHandle, iter, 0, index);
OS.gtk_tree_selection_select_iter (selection, iter);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (iter);
}
@@ -1042,10 +1029,10 @@ public void select (int [] indices) {
*/
public void selectAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_select_all (selection);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
void setBackgroundColor (GdkColor color) {
@@ -1109,9 +1096,9 @@ public void setItem (int index, String string) {
public void setItems (String [] items) {
checkWidget();
if (items == null) error (SWT.ERROR_NULL_ARGUMENT);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_list_store_clear (modelHandle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
if (iter == 0) error (SWT.ERROR_ITEM_NOT_ADDED);
for (int i=0; i<items.length; i++) {
@@ -1285,4 +1272,16 @@ public void showSelection () {
OS.g_free (iter);
}
+int treeSelectionProc (int model, int path, int iter, int[] selection, int length) {
+ if (selection != null) {
+ int indices = OS.gtk_tree_path_get_indices (path);
+ if (indices != 0) {
+ int [] index = new int [1];
+ OS.memmove (index, indices, 4);
+ selection [length] = index [0];
+ }
+ }
+ return 0;
+}
+
}
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 8c6885dc71..3eb997483e 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
@@ -450,14 +450,30 @@ int GtkMenuPositionFunc (int menu, int x, int y, int push_in, int user_data) {
return 0;
}
+int gtk_hide (int widget) {
+ sendEvent (SWT.Hide);
+ return 0;
+}
+
+int gtk_show (int widget) {
+ if ((style & SWT.POP_UP) != 0) return 0;
+ sendEvent (SWT.Show);
+ return 0;
+}
+
+int gtk_show_help (int widget, int helpType) {
+ if (sendHelpEvent (helpType)) OS.gtk_menu_shell_deactivate (handle);
+ return 0;
+}
+
void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
int windowProc2 = display.windowProc2;
int windowProc3 = display.windowProc3;
- OS.g_signal_connect (handle, OS.show, windowProc2, SWT.Show);
- OS.g_signal_connect (handle, OS.hide, windowProc2, SWT.Hide);
- OS.g_signal_connect (handle, OS.show_help, windowProc3, SWT.Help);
+ OS.g_signal_connect (handle, OS.show, windowProc2, SHOW);
+ OS.g_signal_connect (handle, OS.hide, windowProc2, HIDE);
+ OS.g_signal_connect (handle, OS.show_help, windowProc3, SHOW_HELP);
}
/**
@@ -526,22 +542,6 @@ public boolean isVisible () {
return getVisible ();
}
-int processHelp (int int0, int int1, int int2) {
- if (sendHelpEvent (int0)) OS.gtk_menu_shell_deactivate (handle);
- return 0;
-}
-
-int processHide (int int0, int int1, int int2) {
- sendEvent (SWT.Hide);
- return 0;
-}
-
-int processShow (int int0, int int1, int int2) {
- if ((style & SWT.POP_UP) != 0) return 0;
- sendEvent (SWT.Show);
- return 0;
-}
-
void releaseChild () {
super.releaseChild ();
if (cascade != null) cascade.setMenu (null);
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 545d2bd911..4b69ad15a2 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
@@ -348,53 +348,7 @@ public boolean getSelection () {
return OS.gtk_check_menu_item_get_active(handle);
}
-void hookEvents () {
- super.hookEvents ();
- Display display = getDisplay ();
- int windowProc2 = display.windowProc2;
- int windowProc3 = display.windowProc3;
- OS.g_signal_connect (handle, OS.activate, windowProc2, SWT.Selection);
- OS.g_signal_connect (handle, OS.select, windowProc2, SWT.Arm);
- OS.g_signal_connect (handle, OS.show_help, windowProc3, SWT.Help);
-}
-
-/**
- * Returns <code>true</code> if the receiver is enabled and all
- * of the receiver's ancestors are enabled, and <code>false</code>
- * otherwise. A disabled control is typically not selectable from the
- * user interface and draws with an inactive or "grayed" look.
- *
- * @return the receiver's enabled state
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see #getEnabled
- */
-public boolean isEnabled () {
- return getEnabled ();
-}
-
-int processArm (int int0, int int1, int int2) {
- parent.selectedItem = this;
- postEvent (SWT.Arm);
- return 0;
-}
-
-int processHelp (int int0, int int1, int int2) {
- boolean hooks = hooks (SWT.Help);
- if (hooks) {
- postEvent (SWT.Help);
- } else {
- hooks = parent.sendHelpEvent (int0);
- }
- if (hooks) OS.gtk_menu_shell_deactivate (parent.handle);
- return 0;
-}
-
-int processSelection (int int0, int int1, int int2) {
+int gtk_activate (int widget) {
if ((style & SWT.CASCADE) != 0 && menu != null) return 0;
Event event = new Event ();
int ptr = OS.gtk_get_current_event ();
@@ -424,6 +378,52 @@ int processSelection (int int0, int int1, int int2) {
return 0;
}
+int gtk_select (int item) {
+ parent.selectedItem = this;
+ postEvent (SWT.Arm);
+ return 0;
+}
+
+int gtk_show_help (int widget, int helpType) {
+ boolean hooks = hooks (SWT.Help);
+ if (hooks) {
+ postEvent (SWT.Help);
+ } else {
+ hooks = parent.sendHelpEvent (helpType);
+ }
+ if (hooks) OS.gtk_menu_shell_deactivate (parent.handle);
+ return 0;
+}
+
+void hookEvents () {
+ super.hookEvents ();
+ Display display = getDisplay ();
+ int windowProc2 = display.windowProc2;
+ int windowProc3 = display.windowProc3;
+ OS.g_signal_connect (handle, OS.activate, windowProc2, ACTIVATE);
+ OS.g_signal_connect (handle, OS.select, windowProc2, SELECT);
+ OS.g_signal_connect (handle, OS.show_help, windowProc3, SHOW_HELP);
+}
+
+/**
+ * Returns <code>true</code> if the receiver is enabled and all
+ * of the receiver's ancestors are enabled, and <code>false</code>
+ * otherwise. A disabled control is typically not selectable from the
+ * user interface and draws with an inactive or "grayed" look.
+ *
+ * @return the receiver's enabled state
+ *
+ * @exception SWTException <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see #getEnabled
+ */
+public boolean isEnabled () {
+ return getEnabled ();
+}
+
void releaseChild () {
super.releaseChild ();
if (menu != null) {
@@ -683,9 +683,9 @@ boolean setRadioSelection (boolean value) {
public void setSelection (boolean selected) {
checkWidget();
if ((style & (SWT.CHECK | SWT.RADIO)) == 0) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ACTIVATE);
OS.gtk_check_menu_item_set_active (handle, selected);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ACTIVATE);
}
public void setText (String string) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ProgressBar.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ProgressBar.java
index 4ead9346de..b40ee9116a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ProgressBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ProgressBar.java
@@ -134,13 +134,6 @@ public int getSelection () {
return value;
}
-int processTimer (int id) {
- OS.gtk_progress_bar_pulse (handle);
- Display display = getDisplay ();
- timerId = OS.gtk_timeout_add (DELAY, display.windowTimerProc, handle);
- return 0;
-}
-
void releaseWidget () {
super.releaseWidget ();
if (timerId != 0) OS.gtk_timeout_remove (timerId);
@@ -210,6 +203,11 @@ public void setSelection (int x) {
updateBar (value, min, max);
}
+int timerProc (int widget) {
+ OS.gtk_progress_bar_pulse (handle);
+ return 1;
+}
+
void updateBar (int selection, int minimum, int maximum) {
double fraction = minimum == maximum ? 1 : (double)(selection - minimum) / (maximum - minimum);
OS.gtk_progress_bar_set_fraction (handle, fraction);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java
index 936b9098cb..e45c8c6def 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java
@@ -151,27 +151,29 @@ void drawBand (int x, int y, int width, int height) {
OS.g_object_unref (gc);
}
-int processMouseDown (int callData, int int1, int int2) {
- super.processMouseDown (callData, int1, int2);
+int gtk_button_press_event (int widget, int eventPtr) {
+ int result = super.gtk_button_press_event (widget, eventPtr);
GdkEventButton gdkEvent = new GdkEventButton ();
- OS.memmove (gdkEvent, callData, GdkEventButton.sizeof);
+ OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof);
int button = gdkEvent.button;
if (button != 1) return 0;
- double[] px = new double [1], py = new double [1];
- OS.gdk_event_get_coords (callData, px, py);
- startX = (int)px [0]; startY = (int) py [0];
+ startX = (int) gdkEvent.x;
+ startY = (int) gdkEvent.y;
int border = 0;
int x = OS.GTK_WIDGET_X (handle);
int y = OS.GTK_WIDGET_Y (handle);
int width = OS.GTK_WIDGET_WIDTH (handle);
int height = OS.GTK_WIDGET_HEIGHT (handle);
- lastX = x - border; lastY = y - border;
+ lastX = x - border;
+ lastY = y - border;
/* The event must be sent because its doit flag is used. */
Event event = new Event ();
event.detail = SWT.DRAG;
- event.time = OS.gdk_event_get_time (callData);
- event.x = lastX; event.y = lastY;
- event.width = width; event.height = height;
+ event.time = gdkEvent.time;
+ event.x = lastX;
+ event.y = lastY;
+ event.width = width;
+ event.height = height;
/*
* It is possible (but unlikely) that client code could have disposed
* the widget in the selection event. If this happens end the processing
@@ -184,13 +186,36 @@ int processMouseDown (int callData, int int1, int int2) {
// OS.XmUpdateDisplay (handle);
drawBand (lastX = event.x, lastY = event.y, width, height);
}
- return 0;
+ return result;
+}
+
+int gtk_button_release_event (int widget, int eventPtr) {
+ int result = super.gtk_button_release_event (widget, eventPtr);
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof);
+ int button = gdkEvent.button;
+ if (button != 1) return 0;
+ if (!dragging) return 0;
+ dragging = false;
+ int width = OS.GTK_WIDGET_WIDTH (handle);
+ int height = OS.GTK_WIDGET_HEIGHT (handle);
+ /* The event must be sent because its doit flag is used. */
+ Event event = new Event ();
+ event.time = gdkEvent.time;
+ event.x = lastX;
+ event.y = lastY;
+ event.width = width;
+ event.height = height;
+ drawBand (lastX, lastY, width, height);
+ sendEvent (SWT.Selection, event);
+ /* widget could be disposed here */
+ return result;
}
-int processMouseMove (int callData, int int1, int int2) {
- super.processMouseMove (callData, int1, int2);
+int gtk_motion_notify_event (int widget, int eventPtr) {
+ int result = super.gtk_motion_notify_event (widget, eventPtr);
int [] state = new int [1];
- OS.gdk_event_get_state (callData, state);
+ OS.gdk_event_get_state (eventPtr, state);
if (!dragging || (state [0] & OS.GDK_BUTTON1_MASK) == 0) return 0;
int x = OS.GTK_WIDGET_X (handle);
int y = OS.GTK_WIDGET_Y (handle);
@@ -200,7 +225,7 @@ int processMouseMove (int callData, int int1, int int2) {
int parentWidth = OS.GTK_WIDGET_WIDTH (parent.handle);
int parentHeight = OS.GTK_WIDGET_WIDTH (parent.handle);
double[] px = new double [1], py = new double [1];
- OS.gdk_event_get_coords (callData, px, py);
+ OS.gdk_event_get_coords (eventPtr, px, py);
int newX = lastX, newY = lastY;
if ((style & SWT.VERTICAL) != 0) {
newX = Math.min (Math.max (0, (int)px [0] + x - startX - parentBorder), parentWidth - width);
@@ -212,7 +237,7 @@ int processMouseMove (int callData, int int1, int int2) {
/* The event must be sent because its doit flag is used. */
Event event = new Event ();
event.detail = SWT.DRAG;
- event.time = OS.gdk_event_get_time (callData);
+ event.time = OS.gdk_event_get_time (eventPtr);
event.x = newX; event.y = newY;
event.width = width; event.height = height;
/*
@@ -227,28 +252,7 @@ int processMouseMove (int callData, int int1, int int2) {
// OS.XmUpdateDisplay (handle);
drawBand (lastX, lastY, width, height);
}
- return 0;
-}
-
-int processMouseUp (int callData, int int1, int int2) {
- super.processMouseUp (callData, int1, int2);
- GdkEventButton gdkEvent = new GdkEventButton ();
- OS.memmove (gdkEvent, callData, GdkEventButton.sizeof);
- int button = gdkEvent.button;
- if (button != 1) return 0;
- if (!dragging) return 0;
- dragging = false;
- int width = OS.GTK_WIDGET_WIDTH (handle);
- int height = OS.GTK_WIDGET_HEIGHT (handle);
- /* The event must be sent because its doit flag is used. */
- Event event = new Event ();
- event.time = OS.gdk_event_get_time (callData);
- event.x = lastX; event.y = lastY;
- event.width = width; event.height = height;
- drawBand (lastX, lastY, width, height);
- sendEvent (SWT.Selection, event);
- /* widget could be disposed here */
- return 0;
+ return result;
}
void releaseWidget () {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scale.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scale.java
index c179dc40d5..13c111406d 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scale.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scale.java
@@ -132,9 +132,8 @@ void createHandle (int index) {
void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
- int windowProc2 = display.windowProc2;
int hAdjustment = OS.gtk_range_get_adjustment (handle);
- OS.g_signal_connect (hAdjustment, OS.value_changed, windowProc2, SWT.Selection);
+ OS.g_signal_connect (hAdjustment, OS.value_changed, display.windowProc2, VALUE_CHANGED);
}
void register () {
@@ -147,11 +146,6 @@ void deregister () {
super.deregister ();
int hAdjustment = OS.gtk_range_get_adjustment (handle);
WidgetTable.remove (hAdjustment);
- /*
- * This code is intentionally commented.
- */
-// OS.gtk_object_unref (hAdjustment);
-// OS.gtk_object_destroy (hAdjustment);
}
/**
@@ -248,7 +242,7 @@ public int getSelection () {
return (int) adjustment.value;
}
-int processSelection (int int0, int int1, int int2) {
+int gtk_value_changed (int adjustment) {
postEvent (SWT.Selection);
return 0;
}
@@ -299,9 +293,9 @@ public void setIncrement (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.step_increment = (float) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -324,9 +318,9 @@ public void setMaximum (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.upper = (float) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -349,9 +343,9 @@ public void setMinimum (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.lower = (float) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -375,9 +369,9 @@ public void setPageIncrement (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.page_increment = (float) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -396,9 +390,9 @@ public void setSelection (int value) {
checkWidget();
if (value < 0) return;
int hAdjustment = OS.gtk_range_get_adjustment (handle);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_set_value (hAdjustment, value);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
}
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 07d126c27d..b49ec2d0e6 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
@@ -346,11 +346,15 @@ public boolean getVisible () {
}
}
+int gtk_value_changed (int adjustment) {
+ postEvent (SWT.Selection);
+ return 0;
+}
+
void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
- int windowProc2 = display.windowProc2;
- OS.g_signal_connect (handle, OS.value_changed, windowProc2, SWT.Selection);
+ OS.g_signal_connect (handle, OS.value_changed, display.windowProc2, VALUE_CHANGED);
}
/**
@@ -392,11 +396,6 @@ public boolean isVisible () {
return getVisible () && getParent ().isVisible ();
}
-int processSelection (int int0, int int1, int int2) {
- postEvent (SWT.Selection);
- return 0;
-}
-
void releaseChild () {
super.releaseChild ();
if (parent.horizontalBar == this) parent.horizontalBar = null;
@@ -477,9 +476,9 @@ public void setIncrement (int value) {
OS.memmove (adjustment, handle);
adjustment.step_increment = (float) value;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -501,9 +500,9 @@ public void setMaximum (int value) {
OS.memmove (adjustment, handle);
adjustment.upper = (float) value;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -525,9 +524,9 @@ public void setMinimum (int value) {
OS.memmove (adjustment, handle);
adjustment.lower = (float) value;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -550,9 +549,9 @@ public void setPageIncrement (int value) {
OS.memmove (adjustment, handle);
adjustment.page_increment = (float) value;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -570,9 +569,9 @@ public void setPageIncrement (int value) {
public void setSelection (int value) {
checkWidget ();
if (value < 0) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_set_value (handle, value);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -596,9 +595,9 @@ public void setThumb (int value) {
OS.memmove (adjustment, handle);
adjustment.page_size = (float) value;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -640,10 +639,10 @@ public void setValues (int selection, int minimum, int maximum, int thumb, int i
adjustment.page_size = thumb;
adjustment.value = selection;
OS.memmove (handle, adjustment);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (handle);
OS.gtk_adjustment_value_changed (handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
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 4be8b0f803..f79c88641a 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
@@ -495,12 +495,12 @@ void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
int windowProc3 = display.windowProc3;
- OS.g_signal_connect (shellHandle, OS.map_event, windowProc3, SWT.Deiconify);
- OS.g_signal_connect (shellHandle, OS.unmap_event, windowProc3, SWT.Iconify);
- OS.g_signal_connect (shellHandle, OS.size_allocate, windowProc3, SWT.Resize);
- OS.g_signal_connect (shellHandle, OS.configure_event, windowProc3, SWT.Move);
- OS.g_signal_connect (shellHandle, OS.delete_event, windowProc3, SWT.Dispose);
- OS.g_signal_connect (shellHandle, OS.event_after, windowProc3, SWT.Activate);
+ 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.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.event_after, windowProc3, EVENT_AFTER);
}
public boolean isVisible () {
@@ -619,76 +619,41 @@ public Shell [] getShells () {
return result;
}
-/**
- * Moves the receiver to the top of the drawing order for
- * the display on which it was created (so that all other
- * shells on that display, which are not the receiver's
- * children will be drawn behind it), marks it visible,
- * and sets focus to its default button (if it has one)
- * and asks the window manager to make the shell active.
- *
- * @exception SWTException <ul>
- * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
- * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @see Control#moveAbove
- * @see Control#setFocus
- * @see Control#setVisible
- * @see Display#getActiveShell
- * @see Decorations#setDefaultButton
- * @see Shell#setActive
- * @see Shell#forceActive
-*/
-public void open () {
- checkWidget ();
- setVisible (true);
- bringToTop (false);
- int focusHandle = OS.gtk_window_get_focus (shellHandle);
- if (focusHandle == 0 || focusHandle == handle) traverseGroup (true);
-}
-
-int processDeiconify (int int0, int int1, int int2) {
- minimized = false;
- sendEvent (SWT.Deiconify);
+int gtk_configure_event (int widget, int event) {
+ int [] x = new int [1], y = new int [1];
+ OS.gtk_window_get_position (shellHandle, x, y);
+ if (oldX != x [0] || oldY != y [0]) {
+ oldX = x [0];
+ oldY = y [0];
+ sendEvent (SWT.Move);
+ }
return 0;
}
-int processDispose (int int0, int int1, int int2) {
+int gtk_delete_event (int widget, int event) {
closeWidget ();
return 1;
}
-int processActivate (int int0, int int1, int int2) {
+int gtk_event_after (int widget, int event) {
GdkEvent gdkEvent = new GdkEvent ();
- OS.memmove (gdkEvent, int0, GdkEvent.sizeof);
+ OS.memmove (gdkEvent, event, GdkEvent.sizeof);
if (gdkEvent.type == OS.GDK_FOCUS_CHANGE) {
GdkEventFocus focusEvent = new GdkEventFocus ();
- OS.memmove (focusEvent, int0, GdkEventFocus.sizeof);
+ OS.memmove (focusEvent, event, GdkEventFocus.sizeof);
hasFocus = focusEvent.in != 0;
postEvent (hasFocus ? SWT.Activate : SWT.Deactivate);
}
return 0;
}
-int processIconify (int int0, int int1, int int2) {
- minimized = true;
- sendEvent (SWT.Iconify);
- return 0;
-}
-
-int processMove (int int0, int int1, int int2) {
- int [] x = new int [1], y = new int [1];
- OS.gtk_window_get_position (shellHandle, x, y);
- if (oldX != x [0] || oldY != y [0]) {
- oldX = x [0];
- oldY = y [0];
- sendEvent (SWT.Move);
- }
+int gtk_map_event (int widget, int event) {
+ minimized = false;
+ sendEvent (SWT.Deiconify);
return 0;
}
-int processResize (int int0, int int1, int int2) {
+int gtk_size_allocate (int widget, int allocation) {
int [] width = new int [1], height = new int [1];
OS.gtk_window_get_size (shellHandle, width, height);
if (oldWidth != width [0] || oldHeight != height [0]) {
@@ -699,6 +664,41 @@ int processResize (int int0, int int1, int int2) {
return 0;
}
+int gtk_unmap_event (int widget, int event) {
+ minimized = true;
+ sendEvent (SWT.Iconify);
+ return 0;
+}
+
+/**
+ * Moves the receiver to the top of the drawing order for
+ * the display on which it was created (so that all other
+ * shells on that display, which are not the receiver's
+ * children will be drawn behind it), marks it visible,
+ * and sets focus to its default button (if it has one)
+ * and asks the window manager to make the shell active.
+ *
+ * @exception SWTException <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Control#moveAbove
+ * @see Control#setFocus
+ * @see Control#setVisible
+ * @see Display#getActiveShell
+ * @see Decorations#setDefaultButton
+ * @see Shell#setActive
+ * @see Shell#forceActive
+*/
+public void open () {
+ checkWidget ();
+ setVisible (true);
+ bringToTop (false);
+ int focusHandle = OS.gtk_window_get_focus (shellHandle);
+ if (focusHandle == 0 || focusHandle == handle) traverseGroup (true);
+}
+
/**
* Removes the listener from the collection of listeners who will
* be notified when operations are performed on the receiver.
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 5cea91393c..dc7634fa0b 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
@@ -159,12 +159,16 @@ void createHandle (int index) {
OS.gtk_widget_show (handle);
}
+int gtk_value_changed (int adjustment) {
+ postEvent (SWT.Selection);
+ return 0;
+}
+
void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
- int windowProc2 = display.windowProc2;
int hAdjustment = OS.gtk_range_get_adjustment (handle);
- OS.g_signal_connect (hAdjustment, OS.value_changed, windowProc2, SWT.Selection);
+ OS.g_signal_connect (hAdjustment, OS.value_changed, display.windowProc2, VALUE_CHANGED);
}
void register () {
@@ -177,11 +181,6 @@ void deregister () {
super.deregister ();
int hAdjustment = OS.gtk_range_get_adjustment (handle);
WidgetTable.remove (hAdjustment);
- /*
- * This code is intentionally commented.
- */
-// OS.gtk_object_unref (hAdjustment);
-// OS.gtk_object_destroy (hAdjustment);
}
public Point computeSize (int wHint, int hHint, boolean changed) {
@@ -308,11 +307,6 @@ public int getThumb () {
return (int) adjustment.page_size;
}
-int processSelection (int int0, int int1, int int2) {
- postEvent (SWT.Selection);
- return 0;
-}
-
/**
* Removes the listener from the collection of listeners who will
* be notified when the receiver's value changes.
@@ -359,9 +353,9 @@ public void setIncrement (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.step_increment = (double) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -384,9 +378,9 @@ public void setMaximum (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.upper = (double) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -409,9 +403,9 @@ public void setMinimum (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.lower = (double) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -435,9 +429,9 @@ public void setPageIncrement (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.page_increment = (double) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -456,9 +450,9 @@ public void setSelection (int value) {
checkWidget ();
if (value < 0) return;
int hAdjustment = OS.gtk_range_get_adjustment (handle);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_set_value (hAdjustment, value);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -483,9 +477,9 @@ public void setThumb (int value) {
OS.memmove (adjustment, hAdjustment);
adjustment.page_size = (double) value;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
/**
@@ -528,10 +522,10 @@ public void setValues (int selection, int minimum, int maximum, int thumb, int i
adjustment.step_increment = (double) increment;
adjustment.page_increment = (double) pageIncrement;
OS.memmove (hAdjustment, adjustment);
- blockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_block_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
OS.gtk_adjustment_changed (hAdjustment);
OS.gtk_adjustment_value_changed (hAdjustment);
- unblockSignal (hAdjustment, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (hAdjustment, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, VALUE_CHANGED);
}
}
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 5c6debd284..eae8d622cb 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
@@ -208,9 +208,9 @@ void createItem (TabItem item, int index) {
OS.gtk_container_add (boxHandle, labelHandle);
int pageHandle = OS.gtk_fixed_new ();
if (pageHandle == 0) error (SWT.ERROR_NO_HANDLES);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
OS.gtk_notebook_insert_page (handle, pageHandle, boxHandle, index);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
OS.gtk_widget_show (boxHandle);
OS.gtk_widget_show (labelHandle);
OS.gtk_widget_show (pageHandle);
@@ -241,7 +241,7 @@ void fixPage () {
*/
// int index = OS.gtk_notebook_get_current_page (handle);
// if (index != -1) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
int flags = OS.GTK_WIDGET_FLAGS (handle);
OS.GTK_WIDGET_SET_FLAGS(handle, OS.GTK_VISIBLE);
GtkRequisition requisition = new GtkRequisition ();
@@ -250,7 +250,7 @@ void fixPage () {
if ((flags & OS.GTK_VISIBLE) == 0) {
OS.GTK_WIDGET_UNSET_FLAGS(handle, OS.GTK_VISIBLE);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
}
void destroyItem (TabItem item) {
@@ -262,9 +262,9 @@ void destroyItem (TabItem item) {
}
if (index == itemCount) error (SWT.ERROR_ITEM_NOT_REMOVED);
int oldIndex = OS.gtk_notebook_get_current_page (handle);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
OS.gtk_notebook_remove_page (handle, index);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
System.arraycopy (items, index + 1, items, index, --itemCount - index);
items [itemCount] = null;
item.handle = 0;
@@ -396,11 +396,29 @@ public int getSelectionIndex () {
return OS.gtk_notebook_get_current_page (handle);
}
+int gtk_switch_page (int widget, int page, int page_num) {
+ int index = OS.gtk_notebook_get_current_page (handle);
+ if (index != -1) {
+ Control control = items [index].getControl ();
+ if (control != null && !control.isDisposed ()) {
+ control.setVisible (false);
+ }
+ }
+ Control control = items [page_num].getControl ();
+ if (control != null && !control.isDisposed ()) {
+ control.setBounds(getClientArea());
+ control.setVisible (true);
+ }
+ Event event = new Event();
+ event.item = items[page_num];
+ postEvent(SWT.Selection, event);
+ return 0;
+}
+
void hookEvents () {
super.hookEvents ();
Display display = getDisplay ();
- int windowProc4 = display.windowProc4;
- OS.g_signal_connect (handle, OS.switch_page, windowProc4, SWT.Selection);
+ OS.g_signal_connect (handle, OS.switch_page, display.windowProc4, SWITCH_PAGE);
}
/**
@@ -433,25 +451,6 @@ public int indexOf (TabItem item) {
return -1;
}
-int processSelection (int int0, int int1, int int2) {
- int index = OS.gtk_notebook_get_current_page (handle);
- if (index != -1) {
- Control control = items [index].getControl ();
- if (control != null && !control.isDisposed ()) {
- control.setVisible (false);
- }
- }
- Control control = items [int1].getControl ();
- if (control != null && !control.isDisposed ()) {
- control.setBounds(getClientArea());
- control.setVisible (true);
- }
- Event event = new Event();
- event.item = items[int1];
- postEvent(SWT.Selection, event);
- return 0;
-}
-
void releaseWidget () {
int count = getItemCount ();
for (int i=0; i<count; i++) {
@@ -550,9 +549,9 @@ void setSelection (int index, boolean notify) {
control.setVisible (false);
}
}
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
OS.gtk_notebook_set_current_page (handle, index);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE);
int newIndex = OS.gtk_notebook_get_current_page (handle);
if (newIndex != -1) {
TabItem item = items [newIndex];
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 9a239e474e..546503be1e 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
@@ -38,7 +38,7 @@ import org.eclipse.swt.events.*;
* </p>
*/
public class Table extends Composite {
- int modelHandle;
+ int modelHandle, checkRenderer;
int itemCount, columnCount;
TableItem [] items;
TableColumn [] columns;
@@ -155,6 +155,11 @@ void createHandle (int index) {
if (modelHandle == 0) error (SWT.ERROR_NO_HANDLES);
handle = OS.gtk_tree_view_new_with_model (modelHandle);
if (handle == 0) error (SWT.ERROR_NO_HANDLES);
+ if ((style & SWT.CHECK) != 0) {
+ checkRenderer = OS.gtk_cell_renderer_toggle_new ();
+ if (checkRenderer == 0) error (SWT.ERROR_NO_HANDLES);
+ OS.g_object_ref (checkRenderer);
+ }
createColumn (null, 0);
int parentHandle = parent.parentingHandle ();
OS.gtk_container_add (parentHandle, fixedHandle);
@@ -220,8 +225,6 @@ void createColumn (TableColumn column, int index) {
createRenderers (checkColumn.handle, checkColumn.modelIndex, false);
}
createRenderers (columnHandle, modelIndex, index == 0);
- Display display = getDisplay ();
- OS.g_signal_connect (columnHandle, OS.clicked, display.treeColumnSelectionProc, handle);
OS.gtk_tree_view_column_set_resizable (columnHandle, true);
OS.gtk_tree_view_column_set_clickable (columnHandle, true);
OS.gtk_tree_view_insert_column (handle, columnHandle, index);
@@ -234,12 +237,8 @@ void createColumn (TableColumn column, int index) {
void createRenderers (int columnHandle, int modelIndex, boolean check) {
OS.gtk_tree_view_column_clear (columnHandle);
if ((style & SWT.CHECK) != 0 && check) {
- int checkRenderer = OS.gtk_cell_renderer_toggle_new ();
- if (checkRenderer == 0) error (SWT.ERROR_NO_HANDLES);
OS.gtk_tree_view_column_pack_start (columnHandle, checkRenderer, false);
OS.gtk_tree_view_column_add_attribute (columnHandle, checkRenderer, "active", 0);
- Display display = getDisplay ();
- OS.g_signal_connect (checkRenderer, OS.toggled, display.treeToggleProc, handle);
}
int pixbufRenderer = OS.gtk_cell_renderer_pixbuf_new ();
if (pixbufRenderer == 0) error (SWT.ERROR_NO_HANDLES);
@@ -304,6 +303,7 @@ GdkColor defaultForeground () {
void deregister() {
super.deregister ();
WidgetTable.remove (OS.gtk_tree_view_get_selection (handle));
+ if (checkRenderer != 0) WidgetTable.remove (checkRenderer);
}
/**
@@ -321,10 +321,10 @@ void deregister() {
public void deselect (int index) {
checkWidget();
if (index < 0 || index >= itemCount) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_unselect_iter (selection, items [index].handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -345,12 +345,12 @@ public void deselect (int index) {
public void deselect (int start, int end) {
checkWidget();
int selection = OS.gtk_tree_view_get_selection (handle);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
for (int index=start; index<=end; index++) {
if (index < 0 || index >= itemCount) continue;
OS.gtk_tree_selection_unselect_iter (selection, items [index].handle);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -374,13 +374,13 @@ public void deselect (int [] indices) {
checkWidget();
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
int selection = OS.gtk_tree_view_get_selection (handle);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
for (int i=0; i<indices.length; i++) {
int index = indices[i];
if (index < 0 || index >= itemCount) continue;
OS.gtk_tree_selection_unselect_iter (selection, items [index].handle);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -393,10 +393,10 @@ public void deselect (int [] indices) {
*/
public void deselectAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_unselect_all (selection);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
void destroyItem (TableColumn column) {
@@ -461,12 +461,12 @@ void destroyItem (TableItem item) {
index++;
}
if (index == itemCount) return;
- blockSignal (handle, SWT.Selection);
int itemHandle = item.handle;
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_list_store_remove (modelHandle, itemHandle);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.g_free (itemHandle);
item.handle = 0;
- unblockSignal (handle, SWT.Selection);
System.arraycopy (items, index + 1, items, index, --itemCount - index);
items [itemCount] = null;
}
@@ -901,13 +901,120 @@ public int getTopIndex () {
return index [0];
}
+int gtk_button_press_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+ if (gdkEvent.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
+ int headerHeight = getHeaderHeight ();
+ gdkEvent.y += headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ int result = super.gtk_button_press_event (widget, event);
+ gdkEvent.y -= headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ return result;
+}
+
+int gtk_button_release_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+ if (gdkEvent.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
+ int headerHeight = getHeaderHeight ();
+ gdkEvent.y += headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ int result = super.gtk_button_release_event (widget, event);
+ gdkEvent.y -= headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ return result;
+}
+
+int gtk_changed (int widget) {
+ TableItem item = getFocusItem ();
+ if (item != null) {
+ Event event = new Event ();
+ event.item = item;
+ postEvent (SWT.Selection, event);
+ }
+ return 0;
+}
+
+int gtk_key_press_event (int widget, int eventPtr) {
+ int result = super.gtk_key_press_event (widget, eventPtr);
+ if (result != 0) return result;
+
+ /*
+ * Feature in GTK. When an item is default selected using
+ * the return key, GTK does not issue notification. The fix is
+ * to issue this notification when the return key is pressed.
+ */
+ GdkEventKey keyEvent = new GdkEventKey ();
+ OS.memmove (keyEvent, eventPtr, GdkEventKey.sizeof);
+ int key = keyEvent.keyval;
+ switch (key) {
+ case OS.GDK_Return:
+ case OS.GDK_KP_Enter: {
+ Event event = new Event ();
+ event.item = getFocusItem ();
+ postEvent (SWT.DefaultSelection, event);
+ break;
+ }
+ }
+ return result;
+}
+
+int gtk_motion_notify_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton ();
+ OS.memmove (gdkEvent, event, GdkEventButton.sizeof);
+ if (gdkEvent.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
+ int headerHeight = getHeaderHeight ();
+ gdkEvent.y += headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ int result = super.gtk_motion_notify_event (widget, event);
+ gdkEvent.y -= headerHeight;
+ OS.memmove (event, gdkEvent, GdkEventButton.sizeof);
+ return result;
+}
+
+int gtk_row_activated (int tree, int path, int column) {
+ TableItem item = null;
+ int indices = OS.gtk_tree_path_get_indices (path);
+ if (indices != 0) {
+ int [] index = new int []{-1};
+ OS.memmove (index, indices, 4);
+ item = items [index [0]];
+ }
+ Event event = new Event ();
+ event.item = item;
+ postEvent (SWT.DefaultSelection, event);
+ return 0;
+}
+
+int gtk_toggled (int renderer, int pathStr) {
+ int path = OS.gtk_tree_path_new_from_string (pathStr);
+ if (path == 0) return 0;
+ int indices = OS.gtk_tree_path_get_indices (path);
+ if (indices != 0) {
+ int [] index = new int [1];
+ OS.memmove (index, indices, 4);
+ TableItem item = items [index [0]];
+ item.setChecked (!item.getChecked ());
+ Event event = new Event ();
+ event.detail = SWT.CHECK;
+ event.item = item;
+ postEvent (SWT.Selection, event);
+ }
+ OS.gtk_tree_path_free (path);
+ return 0;
+}
+
void hookEvents () {
- //TO DO - get rid of enter/exit for mouse crossing border
super.hookEvents ();
Display display = getDisplay ();
int selection = OS.gtk_tree_view_get_selection(handle);
- OS.g_signal_connect (selection, OS.changed, display.windowProc2, SWT.Selection);
- OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, SWT.DefaultSelection);
+ OS.g_signal_connect (selection, OS.changed, display.windowProc2, CHANGED);
+ OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, ROW_ACTIVATED);
+ if (checkRenderer != 0) {
+ OS.g_signal_connect (checkRenderer, OS.toggled, display.windowProc3, TOGGLED);
+ }
}
/**
@@ -990,133 +1097,6 @@ int paintWindow () {
return OS.gtk_tree_view_get_bin_window (handle);
}
-int processDefaultSelection (int int0, int int1, int int2) {
- TableItem item = null;
- int indices = OS.gtk_tree_path_get_indices (int0);
- if (indices != 0) {
- int [] index = new int []{-1};
- OS.memmove (index, indices, 4);
- item = items [index [0]];
- }
- Event event = new Event ();
- event.item = item;
- postEvent (SWT.DefaultSelection, event);
- return 0;
-}
-
-int processMouseDown (int int0, int int1, int int2) {
- GdkEventButton e = new GdkEventButton ();
- OS.memmove (e, int0, GdkEventButton.sizeof);
- if (e.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
- int headerHeight = getHeaderHeight ();
- e.y += headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- int result = super.processMouseDown (int0, int1, int2);
- e.y -= headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- return result;
-}
-
-int processMouseMove (int int0, int int1, int int2) {
- GdkEventButton e = new GdkEventButton ();
- OS.memmove (e, int0, GdkEventButton.sizeof);
- if (e.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
- int headerHeight = getHeaderHeight ();
- e.y += headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- int result = super.processMouseMove (int0, int1, int2);
- e.y -= headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- return result;
-}
-
-int processMouseUp (int int0, int int1, int int2) {
- GdkEventButton e = new GdkEventButton ();
- OS.memmove (e, int0, GdkEventButton.sizeof);
- if (e.window != OS.gtk_tree_view_get_bin_window (handle)) return 0;
- int headerHeight = getHeaderHeight ();
- e.y += headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- int result = super.processMouseUp (int0, int1, int2);
- e.y -= headerHeight;
- OS.memmove (int0, e, GdkEventButton.sizeof);
- return result;
-}
-
-int processKeyDown (int callData, int arg1, int int2) {
- int result = super.processKeyDown (callData, arg1, int2);
- if (result != 0) return result;
-
- /*
- * Feature in GTK. When an item is default selected using
- * the return key, GTK does not issue notification. The fix is
- * to issue this notification when the return key is pressed.
- */
- GdkEventKey keyEvent = new GdkEventKey ();
- OS.memmove (keyEvent, callData, GdkEventKey.sizeof);
- int key = keyEvent.keyval;
- switch (key) {
- case OS.GDK_Return:
- case OS.GDK_KP_Enter: {
- Event event = new Event ();
- event.item = getFocusItem ();
- postEvent (SWT.DefaultSelection, event);
- break;
- }
- }
- return result;
-}
-
-int processSelection (int int0, int int1, int int2) {
- TableItem item = getFocusItem ();
- if (item != null) {
- Event event = new Event ();
- event.item = item;
- postEvent (SWT.Selection, event);
- }
- return 0;
-}
-
-int processTreeColumnSelection (int column) {
- for (int i=0; i<columnCount; i++) {
- if (column == columns [i].handle) {
- columns [i].postEvent (SWT.Selection);
- break;
- }
- }
- return 0;
-}
-
-int processTreeSelection (int model, int path, int iter, int[] selection, int length) {
- if (selection != null) {
- int indices = OS.gtk_tree_path_get_indices (path);
- if (indices != 0) {
- int [] index = new int [1];
- OS.memmove (index, indices, 4);
- selection [length] = index [0];
- }
- }
- return 0;
-}
-
-int processTreeToggle (int renderer, int arg1) {
- int path = OS.gtk_tree_path_new_from_string (arg1);
- if (path == 0) return 0;
- int indices = OS.gtk_tree_path_get_indices (path);
- if (indices != 0) {
- int [] index = new int [1];
- OS.memmove (index, indices, 4);
- TableItem item = items [index [0]];
- item.setChecked (!item.getChecked ());
- Event event = new Event ();
- event.detail = SWT.CHECK;
- event.item = item;
- postEvent (SWT.Selection, event);
- }
- OS.gtk_tree_path_free (path);
- return 0;
-}
-
void releaseWidget () {
for (int i=0; i<columnCount; i++) {
TableColumn column = columns [i];
@@ -1131,6 +1111,8 @@ void releaseWidget () {
super.releaseWidget ();
if (modelHandle != 0) OS.g_object_unref (modelHandle);
modelHandle = 0;
+ if (checkRenderer != 0) OS.g_object_unref (checkRenderer);
+ checkRenderer = 0;
if (imageList != null) {
imageList.dispose ();
imageList = null;
@@ -1140,6 +1122,7 @@ void releaseWidget () {
void register () {
super.register ();
WidgetTable.put (OS.gtk_tree_view_get_selection (handle), this);
+ if (checkRenderer != 0) WidgetTable.put (checkRenderer, this);
}
/**
@@ -1304,10 +1287,10 @@ public void removeSelectionListener(SelectionListener listener) {
public void select (int index) {
checkWidget();
if (index <0 || index >= itemCount) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_select_iter (selection, items [index].handle);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -1326,13 +1309,13 @@ public void select (int index) {
*/
public void select (int start, int end) {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int index=start; index<=end; index++) {
if (index < 0 || index >= itemCount) continue;
OS.gtk_tree_selection_select_iter (selection, items [index].handle);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -1355,14 +1338,14 @@ public void select (int start, int end) {
public void select (int [] indices) {
checkWidget();
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
for (int i=0; i<indices.length; i++) {
int index = indices [i];
if (index < 0 || index >= itemCount) continue;
OS.gtk_tree_selection_select_iter (selection, items [index].handle);
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
/**
@@ -1375,10 +1358,10 @@ public void select (int [] indices) {
*/
public void selectAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_select_all (selection);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
void setBackgroundColor (GdkColor color) {
@@ -1598,4 +1581,16 @@ public void showSelection () {
OS.gtk_tree_path_free (path);
}
+int treeSelectionProc (int model, int path, int iter, int[] selection, int length) {
+ if (selection != null) {
+ int indices = OS.gtk_tree_path_get_indices (path);
+ if (indices != 0) {
+ int [] index = new int [1];
+ OS.memmove (index, indices, 4);
+ selection [length] = index [0];
+ }
+ }
+ return 0;
+}
+
}
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 94387727b9..68213d847f 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
@@ -175,6 +175,11 @@ void createWidget (int index) {
text = "";
}
+void deregister() {
+ super.deregister ();
+ WidgetTable.remove (handle);
+}
+
/**
* Returns a value which describes the position of the
* text or image in the receiver. The value will be one of
@@ -248,6 +253,17 @@ public int getWidth () {
return OS.gtk_tree_view_column_get_width (handle);
}
+int gtk_clicked (int widget) {
+ postEvent (SWT.Selection);
+ return 0;
+}
+
+void hookEvents () {
+ super.hookEvents ();
+ Display display = getDisplay ();
+ OS.g_signal_connect (handle, OS.clicked, display.windowProc2, CLICKED);
+}
+
/**
* Causes the receiver to be resized to its preferred size.
* For a composite, this involves computing the preferred size
@@ -264,6 +280,11 @@ public void pack () {
OS.gtk_tree_view_column_set_sizing (handle, OS.GTK_TREE_VIEW_COLUMN_AUTOSIZE);
}
+void register () {
+ super.register ();
+ WidgetTable.put (handle, this);
+}
+
void releaseChild () {
super.releaseChild ();
parent.destroyItem (this);
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 c0c91062a3..df16232f12 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
@@ -789,25 +789,119 @@ public int getTopPixel () {
return lineTop [0];
}
+int gtk_activate (int widget) {
+ postEvent (SWT.DefaultSelection);
+ return 0;
+}
+
+int gtk_changed (int widget) {
+ sendEvent (SWT.Modify);
+ return 0;
+}
+
+int gtk_delete_range (int widget, int iter1, int iter2) {
+ if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
+ byte [] startIter = new byte [ITER_SIZEOF];
+ byte [] endIter = new byte [ITER_SIZEOF];
+ OS.memmove (startIter, iter1, startIter.length);
+ OS.memmove (endIter, iter2, endIter.length);
+ int start = OS.gtk_text_iter_get_offset (startIter);
+ int end = OS.gtk_text_iter_get_offset (endIter);
+ int address = OS.gtk_text_buffer_get_text (bufferHandle, startIter, endIter, true);
+ byte [] buffer = new byte [end - start];
+ OS.memmove (buffer, address, buffer.length);
+ String oldText = new String (Converter.mbcsToWcs (null, buffer));
+ String newText = verifyText (oldText, start, end);
+ if (newText == null) {
+ OS.g_signal_stop_emission_by_name (bufferHandle, OS.delete_range);
+ }
+ return 0;
+}
+
+int gtk_delete_text (int widget, int start_pos, int end_pos) {
+ if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
+ int address = OS.gtk_editable_get_chars (handle, start_pos, end_pos);
+ int length = OS.strlen (address);
+ byte [] buffer = new byte [length];
+ OS.memmove (buffer, address, length);
+ OS.g_free (address);
+ String oldText = new String (Converter.mbcsToWcs (null, buffer));
+ String newText = verifyText (oldText, start_pos, end_pos);
+ if (newText == null) {
+ OS.g_signal_stop_emission_by_name (handle, OS.delete_text);
+ }
+ return 0;
+}
+
+int gtk_insert_text (int widget, int int0, int int1, int int2) {
+ if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
+ if ((style & SWT.SINGLE) != 0) {
+ if (int0 == 0 || int1==0) return 0;
+ byte [] buffer = new byte [int1];
+ OS.memmove (buffer, int0, buffer.length);
+ String oldText = new String (Converter.mbcsToWcs (null, buffer));
+ int [] position = new int [1];
+ OS.memmove (position, int2, 4);
+ if (position [0] == -1) position [0] = getCharCount ();
+ String newText = verifyText (oldText, position [0], position [0]); //WRONG POSITION
+ if (newText == null) {
+ OS.g_signal_stop_emission_by_name (handle, OS.insert_text);
+ return 0;
+ }
+ if (newText != oldText) {
+ byte [] buffer3 = Converter.wcsToMbcs (null, newText, false);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT);
+ OS.gtk_editable_insert_text (handle, buffer3, buffer3.length, position);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT);
+ OS.g_signal_stop_emission_by_name (handle, OS.insert_text);
+ return 0;
+ }
+ } else {
+ byte [] iter = new byte [ITER_SIZEOF];
+ OS.memmove (iter, int0, iter.length);
+ int start = OS.gtk_text_iter_get_offset (iter);
+ byte [] buffer = new byte [int2];
+ OS.memmove (buffer, int1, buffer.length);
+ String oldText = new String (Converter.mbcsToWcs (null, buffer));
+ String newText = verifyText (oldText, start, start);
+ if (newText == null) {
+ OS.g_signal_stop_emission_by_name (bufferHandle, OS.insert_text);
+ return 0;
+ }
+ if (newText != oldText) {
+ byte [] buffer1 = Converter.wcsToMbcs (null, newText, false);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT);
+ OS.gtk_text_buffer_insert (bufferHandle, iter, buffer1, buffer1.length);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT);
+ OS.g_signal_stop_emission_by_name (bufferHandle, OS.insert_text);
+ return 0;
+ }
+ }
+ return 0;
+}
+
void hookEvents () {
- //TO DO - get rid of enter/exit for mouse crossing border
super.hookEvents();
Display display = getDisplay ();
int windowProc2 = display.windowProc2;
int windowProc4 = display.windowProc4;
int windowProc5 = display.windowProc5;
if ((style & SWT.SINGLE) != 0) {
- OS.g_signal_connect_after (handle, OS.changed, windowProc2, SWT.Modify);
- OS.g_signal_connect (handle, OS.insert_text, windowProc5, SWT.Verify);
- OS.g_signal_connect (handle, OS.delete_text, windowProc4, SWT.Dispose); // BAD NAMING
- OS.g_signal_connect (handle, OS.activate, windowProc2, SWT.DefaultSelection);
+ 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);
} else {
- OS.g_signal_connect (bufferHandle, OS.changed, windowProc2, SWT.Modify);
- OS.g_signal_connect (bufferHandle, OS.insert_text, windowProc5, SWT.Verify);
- OS.g_signal_connect (bufferHandle, OS.delete_range, windowProc4, SWT.Dispose); // BAD NAMING
+ 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);
}
}
+int imHandle () {
+ return 0;
+}
+
/**
* Inserts a string.
* <p>
@@ -869,104 +963,6 @@ public void paste () {
}
}
-int processDefaultSelection (int int0, int int1, int int2) {
- postEvent (SWT.DefaultSelection);
- return 0;
-}
-
-int processDispose (int int0, int int1, int int2) {
- if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
- if ((style & SWT.SINGLE) != 0) {
- int address = OS.gtk_editable_get_chars (handle, int0, int1);
- int length = OS.strlen (address);
- byte [] buffer = new byte [length];
- OS.memmove (buffer, address, length);
- OS.g_free (address);
- String oldText = new String (Converter.mbcsToWcs (null, buffer));
- String newText = verifyText (oldText, int0, int1);
- if (newText == null) {
- OS.g_signal_stop_emission_by_name (handle, OS.delete_text);
- return 0;
- }
- } else {
- byte [] startIter = new byte [ITER_SIZEOF];
- byte [] endIter = new byte [ITER_SIZEOF];
- OS.memmove (startIter, int0, startIter.length);
- OS.memmove (endIter, int1, endIter.length);
- int start = OS.gtk_text_iter_get_offset (startIter);
- int end = OS.gtk_text_iter_get_offset (endIter);
- int address = OS.gtk_text_buffer_get_text (bufferHandle, startIter, endIter, true);
- byte [] buffer = new byte [end - start];
- OS.memmove (buffer, address, buffer.length);
- String oldText = new String (Converter.mbcsToWcs (null, buffer));
- String newText = verifyText (oldText, start, end);
- if (newText == null) {
- OS.g_signal_stop_emission_by_name (bufferHandle, OS.delete_range);
- return 0;
- }
- }
- return 0;
-}
-
-int processIMEFocusIn () {
- return 0;
-}
-int processIMEFocusOut () {
- return 0;
-}
-
-int processModify (int arg0, int arg1, int int2) {
- sendEvent (SWT.Modify);
- return 0;
-}
-
-int processVerify (int int0, int int1, int int2) {
- if (!hooks (SWT.Verify) && !filters (SWT.Verify)) return 0;
- if ((style & SWT.SINGLE) != 0) {
- if (int0 == 0 || int1==0) return 0;
- byte [] buffer = new byte [int1];
- OS.memmove (buffer, int0, buffer.length);
- String oldText = new String (Converter.mbcsToWcs (null, buffer));
- int [] position = new int [1];
- OS.memmove (position, int2, 4);
- if (position [0] == -1) position [0] = getCharCount ();
- String newText = verifyText (oldText, position [0], position [0]); //WRONG POSITION
- if (newText == null) {
- OS.g_signal_stop_emission_by_name (handle, OS.insert_text);
- return 0;
- }
- if (newText != oldText) {
- byte [] buffer3 = Converter.wcsToMbcs (null, newText, false);
- blockSignal (bufferHandle, SWT.Verify);
- OS.gtk_editable_insert_text (handle, buffer3, buffer3.length, position);
- unblockSignal (bufferHandle, SWT.Verify);
- OS.g_signal_stop_emission_by_name (handle, OS.insert_text);
- return 0;
- }
- } else {
- byte [] iter = new byte [ITER_SIZEOF];
- OS.memmove (iter, int0, iter.length);
- int start = OS.gtk_text_iter_get_offset (iter);
- byte [] buffer = new byte [int2];
- OS.memmove (buffer, int1, buffer.length);
- String oldText = new String (Converter.mbcsToWcs (null, buffer));
- String newText = verifyText (oldText, start, start);
- if (newText == null) {
- OS.g_signal_stop_emission_by_name (bufferHandle, OS.insert_text);
- return 0;
- }
- if (newText != oldText) {
- byte [] buffer1 = Converter.wcsToMbcs (null, newText, false);
- blockSignal (bufferHandle, SWT.Verify);
- OS.gtk_text_buffer_insert (bufferHandle, iter, buffer1, buffer1.length);
- unblockSignal (bufferHandle, SWT.Verify);
- OS.g_signal_stop_emission_by_name (bufferHandle, OS.insert_text);
- return 0;
- }
- }
- return 0;
-}
-
void register () {
super.register ();
if (bufferHandle != 0) WidgetTable.put (bufferHandle, this);
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 a169658ea2..3e545ae247 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
@@ -403,15 +403,95 @@ public int getWidth () {
return OS.GTK_WIDGET_WIDTH (topHandle);
}
+int gtk_button_press_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton();
+ OS.memmove(gdkEvent, event, GdkEventButton.sizeof);
+ double x = gdkEvent.x;
+ gdkEvent.x += OS.GTK_WIDGET_X(handle);
+ double y = gdkEvent.y;
+ gdkEvent.y += OS.GTK_WIDGET_Y(handle);
+ OS.memmove(event, gdkEvent, GdkEventButton.sizeof);
+ parent.gtk_button_press_event (widget, event);
+ gdkEvent.x = x;
+ gdkEvent.y = y;
+ OS.memmove(event, gdkEvent, GdkEventButton.sizeof);
+ return 0;
+}
+
+int gtk_button_release_event (int widget, int event) {
+ GdkEventButton gdkEvent = new GdkEventButton();
+ OS.memmove(gdkEvent, event, GdkEventButton.sizeof);
+ double x = gdkEvent.x;
+ gdkEvent.x += OS.GTK_WIDGET_X(handle);
+ double y = gdkEvent.y;
+ gdkEvent.y += OS.GTK_WIDGET_Y(handle);
+ OS.memmove(event, gdkEvent, GdkEventButton.sizeof);
+ parent.gtk_button_release_event (widget, event);
+ gdkEvent.x = x;
+ gdkEvent.y = y;
+ OS.memmove(event, gdkEvent, GdkEventButton.sizeof);
+ return 0;
+}
+
+int gtk_clicked (int widget) {
+ Event event = new Event ();
+ if ((style & SWT.DROP_DOWN) != 0) {
+ int eventPtr = OS.gtk_get_current_event ();
+ if (eventPtr != 0) {
+ GdkEvent gdkEvent = new GdkEvent ();
+ OS.memmove (gdkEvent, eventPtr, GdkEvent.sizeof);
+ switch (gdkEvent.type) {
+ case OS.GDK_BUTTON_PRESS:
+ case OS.GDK_2BUTTON_PRESS:
+ case OS.GDK_BUTTON_RELEASE: {
+ double [] x_win = new double [1];
+ double [] y_win = new double [1];
+ OS.gdk_event_get_coords (eventPtr, x_win, y_win);
+ if ((int) x_win [0] > OS.GTK_WIDGET_WIDTH (boxHandle)) {
+ event.detail = SWT.ARROW;
+ }
+ break;
+ }
+ }
+ OS.gdk_event_free (eventPtr);
+ }
+ }
+ if ((style & SWT.RADIO) != 0) {
+ if ((parent.getStyle () & SWT.NO_RADIO_GROUP) == 0) {
+ selectRadio ();
+ }
+ }
+ postEvent (SWT.Selection, event);
+ return 0;
+}
+
+int gtk_enter_notify_event (int widget, int event) {
+ drawHotImage = (parent.style & SWT.FLAT) != 0 && hotImage != null;
+ if (drawHotImage && imageHandle != 0) {
+ OS.gtk_image_set_from_pixmap (imageHandle, hotImage.pixmap, hotImage.mask);
+ }
+ return 0;
+}
+
+int gtk_leave_notify_event (int widget, int event) {
+ if (drawHotImage) {
+ drawHotImage = false;
+ if (imageHandle != 0 && image != null) {
+ OS.gtk_image_set_from_pixmap (imageHandle, image.pixmap, image.mask);
+ }
+ }
+ return 0;
+}
+
void hookEvents () {
super.hookEvents ();
if ((style & SWT.SEPARATOR) != 0) return;
Display display = getDisplay ();
int windowProc2 = display.windowProc2;
int windowProc3 = display.windowProc3;
- OS.g_signal_connect (handle, OS.clicked, windowProc2, SWT.Selection);
- OS.g_signal_connect (handle, OS.enter_notify_event, windowProc3, SWT.MouseEnter);
- OS.g_signal_connect (handle, OS.leave_notify_event, windowProc3, SWT.MouseExit);
+ 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);
/*
* Feature in GTK.
@@ -428,8 +508,8 @@ 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, SWT.MouseDown);
- OS.g_signal_connect (handle, OS.button_release_event, windowProc3, SWT.MouseUp);
+ 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);
}
/**
@@ -452,80 +532,6 @@ public boolean isEnabled () {
return getEnabled () && parent.isEnabled ();
}
-int processMouseDown (int callData, int arg1, int int2) {
- GdkEventButton e = new GdkEventButton();
- OS.memmove(e, callData, GdkEventButton.sizeof);
- double x_back = e.x; e.x += OS.GTK_WIDGET_X(handle);
- double y_back = e.y; e.y += OS.GTK_WIDGET_Y(handle);
- OS.memmove(callData, e, GdkEventButton.sizeof);
- parent.processMouseDown (callData, arg1, int2);
- e.x = x_back; e.y = y_back;
- OS.memmove(callData, e, GdkEventButton.sizeof);
- return 0;
-}
-
-int processMouseUp (int callData, int arg1, int int2) {
- GdkEventButton e = new GdkEventButton();
- OS.memmove(e, callData, GdkEventButton.sizeof);
- double x_back = e.x; e.x += OS.GTK_WIDGET_X(handle);
- double y_back = e.y; e.y += OS.GTK_WIDGET_Y(handle);
- OS.memmove(callData, e, GdkEventButton.sizeof);
- parent.processMouseUp (callData, arg1, int2);
- e.x = x_back; e.y = y_back;
- OS.memmove(callData, e, GdkEventButton.sizeof);
- return 0;
-}
-
-int processMouseEnter (int int0, int int1, int int2) {
- drawHotImage = (parent.style & SWT.FLAT) != 0 && hotImage != null;
- if (drawHotImage && imageHandle != 0) {
- OS.gtk_image_set_from_pixmap (imageHandle, hotImage.pixmap, hotImage.mask);
- }
- return 0;
-}
-
-int processMouseExit (int int0, int int1, int int2) {
- if (drawHotImage) {
- drawHotImage = false;
- if (imageHandle != 0 && image != null) {
- OS.gtk_image_set_from_pixmap (imageHandle, image.pixmap, image.mask);
- }
- }
- return 0;
-}
-
-int processSelection (int int0, int int1, int int2) {
- Event event = new Event ();
- if ((style & SWT.DROP_DOWN) != 0) {
- int eventPtr = OS.gtk_get_current_event ();
- if (eventPtr != 0) {
- GdkEvent gdkEvent = new GdkEvent ();
- OS.memmove (gdkEvent, eventPtr, GdkEvent.sizeof);
- switch (gdkEvent.type) {
- case OS.GDK_BUTTON_PRESS:
- case OS.GDK_2BUTTON_PRESS:
- case OS.GDK_BUTTON_RELEASE: {
- double [] x_win = new double [1];
- double [] y_win = new double [1];
- OS.gdk_event_get_coords (eventPtr, x_win, y_win);
- if ((int) x_win [0] > OS.GTK_WIDGET_WIDTH (boxHandle)) {
- event.detail = SWT.ARROW;
- }
- break;
- }
- }
- OS.gdk_event_free (eventPtr);
- }
- }
- if ((style & SWT.RADIO) != 0) {
- if ((parent.getStyle () & SWT.NO_RADIO_GROUP) == 0) {
- selectRadio ();
- }
- }
- postEvent (SWT.Selection, event);
- return 0;
-}
-
void releaseHandle () {
super.releaseHandle ();
boxHandle = arrowHandle = separatorHandle = labelHandle = imageHandle = 0;
@@ -740,9 +746,9 @@ public void setSelection (boolean selected) {
if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
if (!isValidWidget ()) error (SWT.ERROR_WIDGET_DISPOSED);
if ((style & (SWT.CHECK | SWT.RADIO)) == 0) return;
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED);
OS.gtk_toggle_button_set_active (handle, selected);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED);
}
public void setText (String string) {
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 08cfa14669..791503d2ca 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
@@ -37,7 +37,7 @@ import org.eclipse.swt.events.*;
* </p>
*/
public class Tree extends Composite {
- int modelHandle;
+ int modelHandle, checkRenderer;
TreeItem[] items;
ImageList imageList;
@@ -181,12 +181,10 @@ void createHandle (int index) {
int columnHandle = OS.gtk_tree_view_column_new ();
if (columnHandle == 0) error (SWT.ERROR_NO_HANDLES);
if ((style & SWT.CHECK) != 0) {
- int checkRenderer = OS.gtk_cell_renderer_toggle_new ();
+ checkRenderer = OS.gtk_cell_renderer_toggle_new ();
if (checkRenderer == 0) error (SWT.ERROR_NO_HANDLES);
OS.gtk_tree_view_column_pack_start (columnHandle, checkRenderer, false);
OS.gtk_tree_view_column_add_attribute (columnHandle, checkRenderer, "active", 5);
- Display display = getDisplay ();
- OS.g_signal_connect (checkRenderer, OS.toggled, display.treeToggleProc, handle);
}
int pixbufRenderer = OS.gtk_cell_renderer_pixbuf_new ();
if (pixbufRenderer == 0) error (SWT.ERROR_NO_HANDLES);
@@ -254,6 +252,7 @@ GdkColor defaultForeground () {
void deregister () {
super.deregister ();
WidgetTable.remove (OS.gtk_tree_view_get_selection (handle));
+ if (checkRenderer != 0) WidgetTable.remove (checkRenderer);
}
/**
@@ -266,10 +265,10 @@ void deregister () {
*/
public void deselectAll() {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
int selection = OS.gtk_tree_view_get_selection (handle);
OS.gtk_tree_selection_unselect_all (selection);
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
void destroyItem (TreeItem item) {
@@ -505,57 +504,18 @@ public int getSelectionCount () {
return display.treeSelectionLength;
}
-void hookEvents () {
- //TO DO - get rid of enter/exit for mouse crossing border
- super.hookEvents ();
- Display display = getDisplay ();
- int selection = OS.gtk_tree_view_get_selection(handle);
- OS.g_signal_connect_after (selection, OS.changed, display.windowProc2, SWT.Selection);
- OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, SWT.DefaultSelection);
- OS.g_signal_connect (handle, OS.row_expanded, display.windowProc4, SWT.Expand);
- OS.g_signal_connect (handle, OS.row_collapsed, display.windowProc4, SWT.Collapse);
-}
-
-int paintWindow () {
- OS.gtk_widget_realize (handle);
- return OS.gtk_tree_view_get_bin_window (handle);
-}
-
-int processCollapse (int iter, int path, int data) {
- int [] index = new int [1];
- OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
- Event event = new Event ();
- event.item = items [index [0]];
- sendEvent (SWT.Collapse, event);
- return 0;
-}
-
-int processExpand (int iter, int path, int data) {
- int [] index = new int [1];
- OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
- Event event = new Event ();
- event.item = items [index [0]];
- sendEvent (SWT.Expand, event);
- blockSignal (handle, SWT.Expand);
- OS.gtk_tree_view_expand_row (handle, path, false);
- unblockSignal (handle, SWT.Expand);
- return 0;
-}
-
-int processDefaultSelection (int int0, int int1, int int2) {
- int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
- OS.gtk_tree_model_get_iter (modelHandle, iter, int0);
- int [] index = new int [1];
- OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
- OS.g_free (iter);
- Event event = new Event ();
- event.item = items [index [0]];
- postEvent (SWT.DefaultSelection, event);
+int gtk_changed (int widget) {
+ TreeItem item = getFocusItem ();
+ if (item != null) {
+ Event event = new Event ();
+ event.item = item;
+ postEvent (SWT.Selection, event);
+ }
return 0;
}
-int processKeyDown (int callData, int arg1, int int2) {
- int result = super.processKeyDown (callData, arg1, int2);
+int gtk_key_press_event (int widget, int eventPtr) {
+ int result = super.gtk_key_press_event (widget, eventPtr);
if (result != 0) return result;
/*
@@ -564,7 +524,7 @@ int processKeyDown (int callData, int arg1, int int2) {
* to issue this notification when the return key is pressed.
*/
GdkEventKey keyEvent = new GdkEventKey ();
- OS.memmove (keyEvent, callData, GdkEventKey.sizeof);
+ OS.memmove (keyEvent, eventPtr, GdkEventKey.sizeof);
int key = keyEvent.keyval;
switch (key) {
case OS.GDK_Return:
@@ -578,27 +538,41 @@ int processKeyDown (int callData, int arg1, int int2) {
return result;
}
-int processSelection (int int0, int int1, int int2) {
- TreeItem item = getFocusItem ();
- if (item != null) {
- Event event = new Event ();
- event.item = item;
- postEvent (SWT.Selection, event);
- }
+int gtk_row_activated (int tree, int path, int column) {
+ int iter = OS.g_malloc (OS.GtkTreeIter_sizeof ());
+ OS.gtk_tree_model_get_iter (modelHandle, iter, path);
+ int [] index = new int [1];
+ OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
+ OS.g_free (iter);
+ Event event = new Event ();
+ event.item = items [index [0]];
+ postEvent (SWT.DefaultSelection, event);
return 0;
}
-int processTreeSelection (int model, int path, int iter, int[] selection, int length) {
- if (selection != null) {
- int [] index = new int [1];
- OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
- selection [length] = index [0];
- }
+int gtk_row_collapsed (int tree, int iter, int path) {
+ int [] index = new int [1];
+ OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
+ Event event = new Event ();
+ event.item = items [index [0]];
+ sendEvent (SWT.Collapse, event);
return 0;
}
-int processTreeToggle (int renderer, int arg1) {
- int path = OS.gtk_tree_path_new_from_string (arg1);
+int gtk_row_expanded (int tree, int iter, int path) {
+ int [] index = new int [1];
+ OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
+ Event event = new Event ();
+ event.item = items [index [0]];
+ sendEvent (SWT.Expand, event);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
+ OS.gtk_tree_view_expand_row (handle, path, false);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
+ return 0;
+}
+
+int gtk_toggled (int renderer, int pathStr) {
+ int path = OS.gtk_tree_path_new_from_string (pathStr);
if (path == 0) return 0;
int iter = OS.g_malloc (OS.GtkTreeIter_sizeof());
OS.gtk_tree_model_get_iter (modelHandle, iter, path);
@@ -615,9 +589,28 @@ int processTreeToggle (int renderer, int arg1) {
return 0;
}
+void hookEvents () {
+ super.hookEvents ();
+ Display display = getDisplay ();
+ int selection = OS.gtk_tree_view_get_selection(handle);
+ OS.g_signal_connect_after (selection, OS.changed, display.windowProc2, CHANGED);
+ OS.g_signal_connect (handle, OS.row_activated, display.windowProc4, ROW_ACTIVATED);
+ OS.g_signal_connect (handle, OS.row_expanded, display.windowProc4, ROW_EXPANDED);
+ OS.g_signal_connect (handle, OS.row_collapsed, display.windowProc4, ROW_COLLAPSED);
+ if (checkRenderer != 0) {
+ OS.g_signal_connect (checkRenderer, OS.toggled, display.windowProc3, TOGGLED);
+ }
+}
+
+int paintWindow () {
+ OS.gtk_widget_realize (handle);
+ return OS.gtk_tree_view_get_bin_window (handle);
+}
+
void register () {
super.register ();
WidgetTable.put (OS.gtk_tree_view_get_selection (handle), this);
+ if (checkRenderer != 0) WidgetTable.put (checkRenderer, this);
}
boolean releaseItem (TreeItem item, int [] index) {
@@ -737,9 +730,9 @@ public void setInsertMark (TreeItem item, boolean set) {
*/
public void selectAll () {
checkWidget();
- blockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_tree_selection_select_all (OS.gtk_tree_view_get_selection (handle));
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
}
void setBackgroundColor (GdkColor color) {
@@ -774,7 +767,7 @@ public void setSelection (TreeItem [] items) {
checkWidget();
if (items == null) error (SWT.ERROR_NULL_ARGUMENT);
int selection = OS.gtk_tree_view_get_selection (handle);
- blockSignal(handle, SWT.Selection);
+ OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
OS.gtk_tree_selection_unselect_all (selection);
int i = 0;
boolean first = true;
@@ -792,7 +785,7 @@ public void setSelection (TreeItem [] items) {
OS.gtk_tree_selection_select_iter (selection, item.handle);
i++;
}
- unblockSignal (handle, SWT.Selection);
+ OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED);
if (i < items.length) error (SWT.ERROR_INVALID_ARGUMENT);
}
@@ -860,5 +853,14 @@ public void showItem (TreeItem item) {
OS.gtk_tree_path_free (path);
}
+int treeSelectionProc (int model, int path, int iter, int[] selection, int length) {
+ if (selection != null) {
+ int [] index = new int [1];
+ OS.gtk_tree_model_get (modelHandle, iter, 4, index, -1);
+ selection [length] = index [0];
+ }
+ return 0;
+}
+
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
index 6dba24e2da..d94b5dbfee 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
@@ -485,13 +485,13 @@ public void setExpanded (boolean expanded) {
checkWidget();
int path = OS.gtk_tree_model_get_path (parent.modelHandle, handle);
if (expanded) {
- blockSignal (parent.handle, SWT.Expand);
+ OS.g_signal_handlers_block_matched (parent.handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ROW_EXPANDED);
OS.gtk_tree_view_expand_row (parent.handle, path, false);
- unblockSignal (parent.handle, SWT.Expand);
+ OS.g_signal_handlers_unblock_matched (parent.handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ROW_EXPANDED);
} else {
- blockSignal (parent.handle, SWT.Collapse);
+ OS.g_signal_handlers_block_matched (parent.handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ROW_COLLAPSED);
OS.gtk_tree_view_collapse_row (parent.handle, path);
- unblockSignal (parent.handle, SWT.Collapse);
+ OS.g_signal_handlers_unblock_matched (parent.handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, ROW_COLLAPSED);
}
OS.gtk_tree_path_free (path);
}
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 4c4d894b2a..1ed083969f 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
@@ -64,6 +64,45 @@ public abstract class Widget {
/* Default widths for widgets */
static final int DEFAULT_WIDTH = 64;
static final int DEFAULT_HEIGHT = 64;
+
+ /* 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 CLICKED = 5;
+ static final int COMMIT = 6;
+ static final int CONFIGURE_EVENT = 7;
+ static final int DELETE_EVENT = 8;
+ static final int DELETE_RANGE = 9;
+ static final int DELETE_TEXT = 10;
+ static final int ENTER_NOTIFY_EVENT = 11;
+ static final int EVENT = 12;
+ static final int EVENT_AFTER = 13;
+ static final int EXPOSE_EVENT = 14;
+ static final int FOCUS_IN_EVENT = 15;
+ static final int FOCUS_OUT_EVENT = 16;
+ static final int HIDE = 17;
+ static final int INSERT_TEXT = 18;
+ static final int KEY_PRESS_EVENT = 19;
+ static final int KEY_RELEASE_EVENT = 20;
+ static final int LEAVE_NOTIFY_EVENT = 21;
+ static final int MAP_EVENT = 22;
+ static final int MNEMONIC_ACTIVATE = 23;
+ static final int MOTION_NOTIFY_EVENT = 24;
+ static final int POPUP_MENU = 25;
+ static final int ROW_ACTIVATED = 26;
+ static final int ROW_COLLAPSED = 27;
+ static final int ROW_EXPANDED = 28;
+ static final int SELECT = 29;
+ static final int SELECT_CHILD = 30;
+ static final int SHOW = 31;
+ static final int SHOW_HELP = 32;
+ static final int SIZE_ALLOCATE = 33;
+ static final int SWITCH_PAGE = 34;
+ static final int TOGGLED = 35;
+ static final int UNMAP_EVENT = 38;
+ static final int VALUE_CHANGED = 39;
/**
* Prevents uninitialized instances from being created outside the package.
@@ -131,10 +170,6 @@ public void addListener (int eventType, Listener handler) {
eventTable.hook (eventType, handler);
}
-void blockSignal (int instance, int data) {
- OS.g_signal_handlers_block_matched (instance, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, data);
-}
-
/**
* Adds the listener to the collection of listeners who will
* be notifed when the widget is disposed. When the widget is
@@ -411,6 +446,159 @@ public int getStyle () {
return style;
}
+
+int gtk_activate (int widget) {
+ return 0;
+}
+
+int gtk_button_press_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_button_release_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_changed (int widget) {
+ return 0;
+}
+
+int gtk_clicked (int widget) {
+ return 0;
+}
+
+int gtk_commit (int imcontext, int text) {
+ return 0;
+}
+
+int gtk_configure_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_delete_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_delete_range (int widget, int iter1, int iter2) {
+ return 0;
+}
+
+int gtk_delete_text (int widget, int start_pos, int end_pos) {
+ return 0;
+}
+
+int gtk_enter_notify_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_event_after (int widget, int event) {
+ return 0;
+}
+
+int gtk_expose_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_focus_in_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_focus_out_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_hide (int widget) {
+ return 0;
+}
+
+int gtk_insert_text (int widget, int new_text, int new_text_length, int position) {
+ return 0;
+}
+
+int gtk_key_press_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_key_release_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_leave_notify_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_map_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_mnemonic_activate (int widget, int arg1) {
+ return 0;
+}
+
+int gtk_motion_notify_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_popup_menu (int widget) {
+ return 0;
+}
+
+int gtk_row_activated (int tree, int path, int column) {
+ return 0;
+}
+
+int gtk_row_collapsed (int tree, int iter, int path) {
+ return 0;
+}
+
+int gtk_row_expanded (int tree, int iter, int path) {
+ return 0;
+}
+
+int gtk_select (int item) {
+ return 0;
+}
+
+int gtk_select_child (int list, int widget) {
+ return 0;
+}
+
+int gtk_show (int widget) {
+ return 0;
+}
+
+int gtk_show_help (int widget, int helpType) {
+ return 0;
+}
+
+int gtk_size_allocate (int widget, int allocation) {
+ return 0;
+}
+
+int gtk_switch_page (int widget, int page, int page_num) {
+ return 0;
+}
+
+int gtk_timer () {
+ return 0;
+}
+
+int gtk_toggled (int renderer, int pathStr) {
+ return 0;
+}
+
+int gtk_unmap_event (int widget, int event) {
+ return 0;
+}
+
+int gtk_value_changed (int adjustment) {
+ return 0;
+}
+
int fontHeight (int font, int widgetHandle) {
int context = OS.gtk_widget_get_pango_context (widgetHandle);
int lang = OS.pango_context_get_language (context);
@@ -512,6 +700,10 @@ boolean hooks (int eventType) {
return eventTable.hooks (eventType);
}
+int hoverProc (int widget) {
+ return 0;
+}
+
char mbcsToWcs (char ch) {
int key = ch & 0xFFFF;
if (key <= 0x7F) return ch;
@@ -556,175 +748,7 @@ void postEvent (int eventType) {
}
void postEvent (int eventType, Event event) {
- sendEvent (eventType, event, false);}
-
-int processEvent (int eventNumber, int int0, int int1, int int2) {
- /*
- * Feature in GTK. Events such as mouse move are propagate up
- * the widget hierarchy and are seen by the parent. This is the
- * correct GTK behavior but not correct for SWT. The fix is to
- * hook a signal after and stop the propagation using a negative
- * event number to distinguish this case.
- */
- if (eventNumber < 0) return 1;
- switch (eventNumber) {
- case SWT.Activate: return processActivate (int0, int1, int2);
- case SWT.Arm: return processArm (int0, int1, int2);
- case SWT.Collapse: return processCollapse (int0, int1, int2);
- case SWT.Expand: return processExpand (int0, int1, int2);
- case SWT.Dispose: return processDispose (int0, int1, int2);
- case SWT.DefaultSelection: return processDefaultSelection (int0, int1, int2);
- case SWT.Deiconify: return processDeiconify (int0, int1, int2);
- case SWT.FocusIn: return processFocusIn (int0, int1, int2);
- case SWT.FocusOut: return processFocusOut (int0, int1, int2);
- case SWT.Help: return processHelp (int0, int1, int2);
- case SWT.Hide: return processHide (int0, int1, int2);
- case SWT.KeyDown: return processKeyDown (int0, int1, int2);
- case SWT.KeyUp: return processKeyUp (int0, int1, int2);
- case SWT.Iconify: return processIconify (int0, int1, int2);
- case SWT.Modify: return processModify (int0, int1, int2);
- case SWT.MouseDown: return processMouseDown (int0, int1, int2);
- case SWT.MouseEnter: return processMouseEnter (int0, int1, int2);
- case SWT.MouseExit: return processMouseExit (int0, int1, int2);
- case SWT.MouseMove: return processMouseMove (int0, int1, int2);
- case SWT.MouseUp: return processMouseUp (int0, int1, int2);
- case SWT.Move: return processMove (int0, int1, int2);
- case SWT.Paint: return processPaint (int0, int1, int2);
- case SWT.Resize: return processResize (int0, int1, int2);
- case SWT.Show: return processShow (int0, int1, int2);
- case SWT.Selection: return processSelection (int0, int1, int2);
- case SWT.Verify: return processVerify (int0, int1, int2);
- }
- return 0;
-}
-
-int processActivate (int int0, int int1, int int2) {
- return 0;
-}
-
-int processArm (int int0, int int1, int int2) {
- return 0;
-}
-
-int processCollapse (int int0, int int1, int int2) {
- return 0;
-}
-
-int processExpand (int int0, int int1, int int2) {
- return 0;
-}
-
-int processDispose (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processDefaultSelection (int int0, int int1, int int2) {
- return 0;
-}
-
-int processDeiconify (int int0, int int1, int int2) {
- return 0;
-}
-
-int processFocusIn(int int0, int int1, int int2) {
- return 0;
-}
-
-int processFocusOut(int int0, int int1, int int2) {
- return 0;
-}
-
-int processHelp (int int0, int int1, int int2) {
- return 0;
-}
-
-int processHide (int int0, int int1, int int2) {
- return 0;
-}
-
-int processIconify (int int0, int int1, int int2) {
- return 0;
-}
-
-int processIMEKey (int str) {
- return 0;
-}
-
-int processKeyDown (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processKeyUp (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processModify (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMouseDown (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMouseEnter (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMouseExit (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMouseHover (int id) {
- return 0;
-}
-
-int processMouseMove (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMouseUp (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processMove (int arg0, int arg1, int int2) {
- return 0;
-}
-
-int processPaint (int int0, int int1, int int2) {
- return 0;
-}
-
-int processResize (int int0, int int1, int int2) {
- return 0;
-}
-
-int processSelection (int int0, int int1, int int2) {
- return 0;
-}
-
-int processShow (int int0, int int1, int int2) {
- return 0;
-}
-
-int processTimer (int id) {
- return 0;
-}
-
-int processTreeColumnSelection (int column) {
- return 0;
-}
-
-int processTreeSelection (int model, int path, int iter, int[] selection, int length) {
- return 0;
-}
-
-int processTreeToggle (int renderer, int arg1) {
- return 0;
-}
-
-int processVerify (int int0, int int1, int int2) {
- sendEvent (SWT.Verify);
- return 0;
+ sendEvent (eventType, event, false);
}
void register () {
@@ -1024,12 +1048,16 @@ int topHandle () {
return handle;
}
-boolean translateTraversal (int event) {
- return false;
+int timerProc (int widget) {
+ return 0;
}
-void unblockSignal (int instance, int data) {
- OS.g_signal_handlers_unblock_matched (instance, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, data);
+int treeSelectionProc (int model, int path, int iter, int[] selection, int length) {
+ return 0;
+}
+
+boolean translateTraversal (int event) {
+ return false;
}
char wcsToMbcs (char ch) {
@@ -1043,4 +1071,71 @@ char wcsToMbcs (char ch) {
return 0;
}
+int windowProc (int handle, int user_data) {
+ switch (user_data) {
+ case ACTIVATE: return gtk_activate (handle);
+ case CHANGED: return gtk_changed (handle);
+ case CLICKED: return gtk_clicked (handle);
+ case HIDE: return gtk_hide (handle);
+ case POPUP_MENU: return gtk_popup_menu (handle);
+ case SELECT: return gtk_select (handle);
+ case SHOW: return gtk_show (handle);
+ case VALUE_CHANGED: return gtk_value_changed (handle);
+ default: return 0;
+ }
+}
+
+int windowProc (int handle, int arg0, int user_data) {
+ switch (user_data) {
+ case -BUTTON_PRESS_EVENT:
+ case -BUTTON_RELEASE_EVENT:
+ case -MOTION_NOTIFY_EVENT: {
+ return 1;
+ }
+ case BUTTON_PRESS_EVENT: return gtk_button_press_event (handle, arg0);
+ case BUTTON_RELEASE_EVENT: return gtk_button_release_event (handle, arg0);
+ case COMMIT: return gtk_commit (handle, arg0);
+ case CONFIGURE_EVENT: return gtk_configure_event (handle, arg0);
+ case DELETE_EVENT: return gtk_delete_event (handle, arg0);
+ case ENTER_NOTIFY_EVENT: return gtk_enter_notify_event (handle, arg0);
+ case EVENT: return gtk_event (handle, arg0);
+ case EVENT_AFTER: return gtk_event_after (handle, arg0);
+ case EXPOSE_EVENT: return gtk_expose_event (handle, arg0);
+ case FOCUS_IN_EVENT: return gtk_focus_in_event (handle, arg0);
+ case FOCUS_OUT_EVENT: return gtk_focus_out_event (handle, arg0);
+ case KEY_PRESS_EVENT: return gtk_key_press_event (handle, arg0);
+ case KEY_RELEASE_EVENT: return gtk_key_release_event (handle, arg0);
+ case LEAVE_NOTIFY_EVENT: return gtk_leave_notify_event (handle, arg0);
+ case MAP_EVENT: return gtk_map_event (handle, arg0);
+ case MNEMONIC_ACTIVATE: return gtk_mnemonic_activate (handle, arg0);
+ case MOTION_NOTIFY_EVENT: return gtk_motion_notify_event (handle, arg0);
+ case SELECT_CHILD: return gtk_select_child (handle, arg0);
+ case SHOW_HELP: return gtk_show_help (handle, arg0);
+ case SIZE_ALLOCATE: return gtk_size_allocate (handle, arg0);
+ case TOGGLED: return gtk_toggled (handle, arg0);
+ case UNMAP_EVENT: return gtk_unmap_event (handle, arg0);
+ default: return 0;
+ }
+}
+
+int windowProc (int handle, int arg0, int arg1, int user_data) {
+ switch (user_data) {
+ case DELETE_RANGE: return gtk_delete_range (handle, arg0, arg1);
+ case DELETE_TEXT: return gtk_delete_text (handle, arg0, arg1);
+ case ROW_ACTIVATED: return gtk_row_activated (handle, arg0, arg1);
+ case ROW_COLLAPSED: return gtk_row_collapsed (handle, arg0, arg1);
+ case ROW_EXPANDED: return gtk_row_expanded(handle, arg0, arg1);
+ case SWITCH_PAGE: return gtk_switch_page (handle, arg0, arg1);
+ default: return 0;
+ }
+}
+
+int windowProc (int handle, int arg0, int arg1, int arg2, int user_data) {
+ switch (user_data) {
+ case INSERT_TEXT: return gtk_insert_text (handle, arg0, arg1, arg2);
+ default: return 0;
+ }
+}
+
+
}