summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrant Gayed <ggayed>2007-05-23 19:22:15 +0000
committerGrant Gayed <ggayed>2007-05-23 19:22:15 +0000
commit41acd10ceebece3466a430c500d8003c98a28198 (patch)
tree86f5196d068446af220fd43c8d08ec0be639e942
parent8a021d89105adb15defec05f4bb294256be0d2ff (diff)
downloadeclipse.platform.swt-41acd10ceebece3466a430c500d8003c98a28198.tar.gz
eclipse.platform.swt-41acd10ceebece3466a430c500d8003c98a28198.tar.xz
eclipse.platform.swt-41acd10ceebece3466a430c500d8003c98a28198.zip
188273
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/carbon/org/eclipse/swt/browser/MozillaDelegate.java3
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java7
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/gtk/org/eclipse/swt/browser/MozillaDelegate.java89
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/motif/org/eclipse/swt/browser/MozillaDelegate.java3
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java3
5 files changed, 58 insertions, 47 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/carbon/org/eclipse/swt/browser/MozillaDelegate.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/carbon/org/eclipse/swt/browser/MozillaDelegate.java
index e7f7cb440f..ad36699fc7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/carbon/org/eclipse/swt/browser/MozillaDelegate.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/carbon/org/eclipse/swt/browser/MozillaDelegate.java
@@ -165,6 +165,9 @@ void handleFocus () {
browser.getShell ().addListener (SWT.Deactivate, listener);
}
+void init () {
+}
+
void onDispose (int embedHandle) {
handles.remove (new LONG (embedHandle));
if (callback3 != null) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
index 3f3e92e2ae..7c1743e279 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java
@@ -955,6 +955,8 @@ public void create (Composite parent, int style) {
error (rc);
}
+ delegate.init ();
+
listener = new Listener () {
public void handleEvent (Event event) {
switch (event.type) {
@@ -1312,7 +1314,6 @@ void onDispose (Display display) {
if (rc != XPCOM.NS_OK) error (rc);
unhookDOMListeners ();
-
if (listener != null) {
int[] folderEvents = new int[] {
SWT.Dispose,
@@ -1338,7 +1339,7 @@ void onDispose (Display display) {
rc = baseWindow.Destroy ();
if (rc != XPCOM.NS_OK) error (rc);
baseWindow.Release ();
-
+
Release ();
webBrowser.Release ();
webBrowser = null;
@@ -1355,7 +1356,7 @@ void onDispose (Display display) {
new nsISupports (ptrObject.value).Release ();
}
unhookedDOMWindows = null;
-
+
delegate.onDispose (embedHandle);
delegate = null;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/gtk/org/eclipse/swt/browser/MozillaDelegate.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/gtk/org/eclipse/swt/browser/MozillaDelegate.java
index ab8ff7505f..65a8b03c93 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/gtk/org/eclipse/swt/browser/MozillaDelegate.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/gtk/org/eclipse/swt/browser/MozillaDelegate.java
@@ -18,13 +18,12 @@ import org.eclipse.swt.widgets.*;
class MozillaDelegate {
Browser browser;
- int /*long*/ mozillaHandle;
+ int /*long*/ mozillaHandle, embedHandle;
boolean hasFocus;
Listener listener;
static Callback eventCallback;
static int /*long*/ eventProc;
static final int STOP_PROPOGATE = 1;
- static final String ADD_WIDGET_KEY = "org.eclipse.swt.internal.addWidget"; //$NON-NLS-1$
static boolean IsLinux;
static {
@@ -42,7 +41,10 @@ MozillaDelegate (Browser browser) {
}
static int /*long*/ eventProc (int /*long*/ handle, int /*long*/ gdkEvent, int /*long*/ pointer) {
- Widget widget = Display.getCurrent ().findWidget (handle);
+ int /*long*/ parent = OS.gtk_widget_get_parent (handle);
+ parent = OS.gtk_widget_get_parent (parent);
+ if (parent == 0) return 0;
+ Widget widget = Display.getCurrent ().findWidget (parent);
if (widget != null && widget instanceof Browser) {
return ((Mozilla)((Browser)widget).webBrowser).delegate.gtk_event (handle, gdkEvent, pointer);
}
@@ -68,15 +70,6 @@ static byte[] wcsToMbcs (String codePage, String string, boolean terminate) {
}
int /*long*/ getHandle () {
- if (eventCallback == null) {
- eventCallback = new Callback (getClass (), "eventProc", 3); //$NON-NLS-1$
- eventProc = eventCallback.getAddress ();
- if (eventProc == 0) {
- browser.dispose ();
- Mozilla.error (SWT.ERROR_NO_MORE_CALLBACKS);
- }
- }
-
/*
* Bug in Mozilla Linux GTK. Embedding Mozilla into a GtkFixed
* handle causes problems with some Mozilla plug-ins. For some
@@ -87,39 +80,9 @@ int /*long*/ getHandle () {
* causing the child of the GtkFixed handle to be resized to 1.
* The workaround is to embed Mozilla into a GtkHBox handle.
*/
- int /*long*/ embedHandle = OS.gtk_hbox_new (false, 0);
+ embedHandle = OS.gtk_hbox_new (false, 0);
OS.gtk_container_add (browser.handle, embedHandle);
OS.gtk_widget_show (embedHandle);
-
- /*
- * Feature in Mozilla. GtkEvents such as key down, key pressed may be consumed
- * by Mozilla and never be received by the parent embedder. The workaround
- * is to find the top Mozilla gtk widget that receives all the Mozilla GtkEvents,
- * i.e. the first child of the parent embedder. Then hook event callbacks and
- * forward the event to the parent embedder before Mozilla received and consumed
- * them.
- */
- int /*long*/ list = OS.gtk_container_get_children (embedHandle);
- if (list != 0) {
- mozillaHandle = OS.g_list_data (list);
- OS.g_list_free (list);
-
- if (mozillaHandle != 0) {
- browser.getDisplay ().setData (ADD_WIDGET_KEY, new Object[] {new LONG (mozillaHandle), browser});
-
- /* Note. Callback to get events before Mozilla receives and consumes them. */
- OS.g_signal_connect (mozillaHandle, OS.event, eventProc, 0);
-
- /*
- * Note. Callback to get the events not consumed by Mozilla - and to block
- * them so that they don't get propagated to the parent handle twice.
- * This hook is set after Mozilla and is therefore called after Mozilla's
- * handler because GTK dispatches events in their order of registration.
- */
- OS.g_signal_connect (mozillaHandle, OS.key_press_event, eventProc, STOP_PROPOGATE);
- OS.g_signal_connect (mozillaHandle, OS.key_release_event, eventProc, STOP_PROPOGATE);
- }
- }
return embedHandle;
}
@@ -169,8 +132,46 @@ void handleFocus () {
browser.getShell ().addListener (SWT.Deactivate, listener);
}
+void init () {
+ if (eventCallback == null) {
+ eventCallback = new Callback (getClass (), "eventProc", 3); //$NON-NLS-1$
+ eventProc = eventCallback.getAddress ();
+ if (eventProc == 0) {
+ browser.dispose ();
+ Mozilla.error (SWT.ERROR_NO_MORE_CALLBACKS);
+ }
+ }
+
+ /*
+ * Feature in Mozilla. GtkEvents such as key down, key pressed may be consumed
+ * by Mozilla and never be received by the parent embedder. The workaround
+ * is to find the top Mozilla gtk widget that receives all the Mozilla GtkEvents,
+ * i.e. the first child of the parent embedder. Then hook event callbacks and
+ * forward the event to the parent embedder before Mozilla received and consumed
+ * them.
+ */
+ int /*long*/ list = OS.gtk_container_get_children (embedHandle);
+ if (list != 0) {
+ mozillaHandle = OS.g_list_data (list);
+ OS.g_list_free (list);
+
+ if (mozillaHandle != 0) {
+ /* Note. Callback to get events before Mozilla receives and consumes them. */
+ OS.g_signal_connect (mozillaHandle, OS.event, eventProc, 0);
+
+ /*
+ * Note. Callback to get the events not consumed by Mozilla - and to block
+ * them so that they don't get propagated to the parent handle twice.
+ * This hook is set after Mozilla and is therefore called after Mozilla's
+ * handler because GTK dispatches events in their order of registration.
+ */
+ OS.g_signal_connect (mozillaHandle, OS.key_press_event, eventProc, STOP_PROPOGATE);
+ OS.g_signal_connect (mozillaHandle, OS.key_release_event, eventProc, STOP_PROPOGATE);
+ }
+ }
+}
+
void onDispose (int /*long*/ embedHandle) {
- browser.getDisplay ().setData (ADD_WIDGET_KEY, new Object[] {new LONG (mozillaHandle), null});
if (listener != null) {
browser.getDisplay ().removeFilter (SWT.FocusIn, listener);
browser.getShell ().removeListener (SWT.Deactivate, listener);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/motif/org/eclipse/swt/browser/MozillaDelegate.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/motif/org/eclipse/swt/browser/MozillaDelegate.java
index ee384f56b8..150192613b 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/motif/org/eclipse/swt/browser/MozillaDelegate.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/motif/org/eclipse/swt/browser/MozillaDelegate.java
@@ -126,6 +126,9 @@ void handleFocus () {
browser.getShell ().addListener (SWT.Deactivate, listener);
}
+void init () {
+}
+
void onDispose (int embedHandle) {
if (listener != null) {
browser.getDisplay ().removeFilter (SWT.FocusIn, listener);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
index 1a85bf64a9..1498fe63e4 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/win32/org/eclipse/swt/browser/MozillaDelegate.java
@@ -55,6 +55,9 @@ String getLibraryName () {
void handleFocus () {
}
+void init () {
+}
+
void onDispose (int /*long*/ embedHandle) {
browser = null;
}