summaryrefslogtreecommitdiff
path: root/sj2
diff options
context:
space:
mode:
authorKay Ramme <kr@openoffice.org>2001-08-10 14:56:46 +0000
committerKay Ramme <kr@openoffice.org>2001-08-10 14:56:46 +0000
commite6dd4c961019056d26f4a252b8ddd59cf0c642ad (patch)
treef8459609d2492c1951d9bc2aeebf4e6b4e3c10f9 /sj2
parentb64b3c25cfb577c89a2b0aa9dc3d6e78c6433977 (diff)
better swallow applets (#79689#)
Diffstat (limited to 'sj2')
-rw-r--r--sj2/source/jscpp/sjapplet_impl.cxx132
1 files changed, 121 insertions, 11 deletions
diff --git a/sj2/source/jscpp/sjapplet_impl.cxx b/sj2/source/jscpp/sjapplet_impl.cxx
index 4106d355e8..aafaf05e1c 100644
--- a/sj2/source/jscpp/sjapplet_impl.cxx
+++ b/sj2/source/jscpp/sjapplet_impl.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: sjapplet_impl.cxx,v $
*
- * $Revision: 1.5 $
+ * $Revision: 1.6 $
*
- * last change: $Author: kr $ $Date: 2001-08-08 16:33:43 $
+ * last change: $Author: kr $ $Date: 2001-08-10 15:56:46 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -59,6 +59,9 @@
*
************************************************************************/
+
+
+
#ifdef UNX
#include <cstdarg>
#include <jni.h>
@@ -143,6 +146,94 @@ struct EmbeddedWindow {
void dispose(JNIEnv * pEnv);
};
+static Atom getStateAtom(Display* pDisplay)
+{
+ static Atom nWM_State = XInternAtom (pDisplay, "WM_STATE", False);
+ return nWM_State;
+}
+
+static Widget getAppletWidget(Widget widget) {
+ sal_Bool found = sal_False;
+ Display* pDisplay = XtDisplay(widget);
+ Atom nState = getStateAtom( pDisplay );
+ do
+ {
+ XLIB_Window nWindow = XtWindow(widget);
+ int nCount;
+ Atom *pAtom = XListProperties(pDisplay, nWindow, &nCount);
+ for (int i = 0; i < nCount && !found; ++i)
+ found = (pAtom[i] == nState);
+
+ XFree(pAtom);
+
+ if(found)
+ break;
+
+ widget = XtParent(widget);
+ }
+ while (widget);
+
+ return widget;
+}
+
+#ifdef DEBUG
+
+static void spaces(int count) {
+ for(int i = 0; i < count; ++ i)
+ fprintf(stderr, " ");
+}
+
+static void displayTree(Display * display, XLIB_Window window, int dp) {
+ XLIB_Window root_return, parent_return, * children_return;
+ unsigned int nchildren_returnw;
+
+ XQueryTree(display, window,
+ &root_return, &parent_return, &children_return, &nchildren_returnw);
+
+ spaces(dp); fprintf(stderr, "RootWindow %x\n", root_return);
+ spaces(dp); fprintf(stderr, "ParentWindow %x\n", parent_return);
+ for(int i = 0; i < nchildren_returnw; ++ i) {
+ spaces(dp); fprintf(stderr, " child #%i %x\n", i, children_return[i]);
+
+ displayTree(display, children_return[i], dp + 1);
+ }
+}
+#endif
+
+extern "C" {
+ static Bool withdrawPredicate( Display* pDisplay, XEvent* pEvent, XPointer arg )
+ {
+ Bool bRet = False;
+ if( pEvent->type == PropertyNotify
+ && pEvent->xproperty.window == (XLIB_Window)arg
+ && pEvent->xproperty.atom == getStateAtom( pDisplay )
+ )
+ {
+ if( pEvent->xproperty.state == PropertyDelete )
+ bRet = True;
+ else
+ {
+ Atom aType;
+ int format;
+ unsigned long items, bytes;
+ unsigned char* prop = NULL;
+ if( XGetWindowProperty( pDisplay, (XLIB_Window)arg, getStateAtom(pDisplay),
+ 0, 1, False, getStateAtom(pDisplay),
+ &aType, &format, &items, &bytes, &prop ) == 0
+ && prop
+ && format == 32
+ && *(sal_uInt32*)prop == 0
+ )
+ {
+ bRet = True;
+ XFree( prop );
+ }
+ }
+ }
+ return bRet;
+ }
+}
+
EmbeddedWindow::EmbeddedWindow(JNIEnv * pEnv, SystemEnvData const * pEnvData) throw(com::sun::star::uno::RuntimeException)
{
// create a canvas
@@ -169,9 +260,11 @@ EmbeddedWindow::EmbeddedWindow(JNIEnv * pEnv, SystemEnvData const * pEnvData) th
jclass jcWindow = pEnv->FindClass("java/awt/Window"); testJavaException(pEnv);
jmethodID jmWindow_rinit = pEnv->GetMethodID(jcWindow, "<init>", "(Ljava/awt/Frame;)V" ); testJavaException(pEnv);
- jobject joWindow = pEnv->NewGlobalRef(pEnv->AllocObject(jcWindow)); testJavaException(pEnv);
+ jobject joWindow = pEnv->AllocObject(jcWindow); testJavaException(pEnv);
pEnv->CallVoidMethod(joWindow, jmWindow_rinit, joFrame); testJavaException(pEnv);
+// joWindow = joFrame;
+
jmethodID jmWindow_setLayout = pEnv->GetMethodID(jcWindow, "setLayout", "(Ljava/awt/LayoutManager;)V"); testJavaException(pEnv);
pEnv->CallVoidMethod(joWindow, jmWindow_setLayout, 0); testJavaException(pEnv);
@@ -224,14 +317,31 @@ EmbeddedWindow::EmbeddedWindow(JNIEnv * pEnv, SystemEnvData const * pEnvData) th
if (!widget)
throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("EmbeddedWindow::EmbeddedWindow - couldn't get DrawingSurface widget")), Reference<XInterface>());
- Widget parentWidget = widget;
- Widget axasxasxa = 0;
- while(XtParent(parentWidget)) {
- axasxasxa = parentWidget;
- parentWidget = XtParent(parentWidget);
- }
-
- XReparentWindow(dsi_x11->display, XtWindow(axasxasxa), pEnvData->aWindow, 0, 0);
+
+ Widget appletWidget = getAppletWidget(widget);
+ if(!appletWidget)
+ throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("EmbeddedWindow::EmbeddedWindow - can't find AppletWidget")), Reference<XInterface>());
+
+#ifdef DEBUG
+ fprintf(stderr, "+++++++++++++ the parent %x\n", pEnvData->aWindow);
+ displayTree(dsi_x11->display, pEnvData->aWindow, 0);
+
+ fprintf(stderr, "+++++++++++++ the child %x\n", XtWindow(appletWidget));
+ displayTree(dsi_x11->display, XtWindow(appletWidget), 0);
+#endif
+
+ XWithdrawWindow( dsi_x11->display, XtWindow(appletWidget), DefaultScreen( dsi_x11->display ) );
+ XEvent aEvent;
+ XIfEvent( dsi_x11->display, &aEvent, withdrawPredicate, (XPointer)XtWindow(appletWidget) );
+// XPutBackEvent( dsi_x11->display, &aEvent );
+
+ XReparentWindow(dsi_x11->display, XtWindow(appletWidget), pEnvData->aWindow, 0, 0);
+ XtMapWidget( appletWidget );
+
+#ifdef DEBUG
+ fprintf(stderr, "------------- the child %x\n", XtWindow(appletWidget));
+ displayTree(dsi_x11->display, XtWindow(appletWidget), 0);
+#endif
ds->FreeDrawingSurfaceInfo(dsi);
ds->Unlock(ds);