Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: JavaXPCOM threading/events issues

0 views
Skip to first unread message

Artem Ananiev

unread,
Sep 28, 2006, 10:43:49 AM9/28/06
to Javier Pedemonte, dev-em...@lists.mozilla.org
Hi Javier,

there is another question about JavaXPCOM events handling. On Windows
there is an SWT message loop, which is roughly

while (::GetMessage) {
::TranslateMessage
::DispatchMessage
}

As each native window (be it an SWT widget or embedded Mozilla browser)
has its own WindowProc, this loop dispatches any message to the proper
WindowProc, that's fine.

Another situation is on Linux. There are no WindowProcs in X Window
systems, and I need to call to XNextEvent(display) and get all the
events (all the selected events to be more precise) for those windows
that were created using 'display'. Embedded browser opens a separate
connection to X server (XtOpenDisplay) and creates all its windows using
this connection. Thus, all the events for these windows (event if they
were created on the same thread as my own ones) will not be caught with
XNextEvent, so I have to use nsIAppShell.run() method and proxy objects.
I tried proxy objects but without any success: I always get 'Xlib:
unexpected async reply' messages.

I have noticed that AbstractMozillaBrowser doesn't call
nsIAppShell.run() method, on Linux. I have also tried to launch a simple
SWT application with embedded browser, on Linux, but it doesn't displays
too. The source is below. Are there any thought how to handle events on
Linux?

Thanks,

Artem

----

import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.browser.*;

import org.mozilla.xpcom.*;

public class MozTest
{
public static void main(String[] args)
{
System.setProperty("GRE_HOME", "/export/art/xulrunner-bin");

Display display = new Display();
Shell shell = new Shell(display);
shell.setBounds(300, 300, 300, 300);
shell.setLayout(new GridLayout());

Composite comp = new Composite(shell, SWT.EMBEDDED);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
comp.setLayout(layout);

MozillaBrowser mb = new MozillaBrowser(comp, SWT.EMBEDDED);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.horizontalSpan = 1;
data.verticalSpan = 1;
mb.setLayoutData(data);
mb.setText("<html>aaa</html>");
mb.setFocus();

/*
MozillaBrowser mb2 = new MozillaBrowser(comp, SWT.EMBEDDED);
data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.horizontalSpan = 1;
data.verticalSpan = 1;
mb2.setLayoutData(data);
mb2.setText("<html>bbb</html>");
*/

Button swtButton2 = new Button(shell, SWT.PUSH);
swtButton2.setText("SWT Button2");
swtButton2.setLayoutData(new
GridData(GridData.HORIZONTAL_ALIGN_CENTER));

shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
}
}

----

Javier Pedemonte wrote:

> On 8/11/06, *Artem Ananiev* <Artem....@sun.com
> <mailto:Artem....@sun.com>> wrote:
>
> I have also noticed that the whole application is frozen if I don't call
> run() method of nsIAppStartup service.
>
>
> Correct, you need a way to dispatch Mozilla events, and you can do that
> by calling nsIAppShell.run (). However, this means that once you call
> run(), you can no longer do anything on that thread.
>
> Under the covers, run() starts the native message loop.
>
> This method is blocking and
> starts a native messages loop, but I haven't found it being called in
> SWT or ATF. It seems that there is another way to get browser's messages
> dispatched.
>
>
> SWT has its own message loop, which also calls the native message loop
> under the covers. This makes an embedded Mozilla function fine without
> calling nsIAppShell.run().
>
> At last, I can't make my application to exit gracefully. I try to call
> to destroy() method of nsIBaseWindow and/or Mozilla.termEmbedding() but
> my application hangs or crashes. The only way to terminate it is to call
> to System.exit().
>
>
> Hmm, that sounds right. In the SWT widget, we call
> nsIBaseWindow.destroy(), followed by nsIAppShell.spindown() and
> Mozilla.termEmbedding(). What is the error you get?
>
> I have attached this app to the letter, it's quite small.
>
>
> I imported your test app code into Eclipse. It shows that getPeer() is
> deprecated and should no longer be used. Also, there is no getHwnd()
> method on WComponentPeer.
>
>
> javier

0 new messages