diff options
author | Sven Gothel <[email protected]> | 2010-07-17 03:45:19 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-07-17 03:45:19 +0200 |
commit | 7f1f12304f4c143b1656f79ee58311508fe00d1b (patch) | |
tree | 9a2585a6915320325e4c65cbe2f3ab4f52dbb3b7 /src/newt | |
parent | 15d3ad1cba7ffa37f283129fd6319c5469dad510 (diff) |
Newt: X11 ICC window properties ; Still bugs with composite manager and Newt reparenting
Set _NET_WM_WINDOW_TYPE to specify decoration etc.
On KDE4 having compositing enabled the reparent window is sometimes
made invisible (UnmapWindow happened). FIXME.
Diffstat (limited to 'src/newt')
-rw-r--r-- | src/newt/classes/com/jogamp/newt/Window.java | 15 | ||||
-rw-r--r-- | src/newt/native/X11Window.c | 53 |
2 files changed, 35 insertions, 33 deletions
diff --git a/src/newt/classes/com/jogamp/newt/Window.java b/src/newt/classes/com/jogamp/newt/Window.java index 9c724314e..0ec8a109b 100644 --- a/src/newt/classes/com/jogamp/newt/Window.java +++ b/src/newt/classes/com/jogamp/newt/Window.java @@ -674,12 +674,11 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer if( 0 != windowHandle ) { destroy(false); } - } else { - if(wasVisible) { - Window.this.visible = true; - setVisibleImpl(true); - getScreen().getDisplay().dispatchMessages(); // status up2date - } + } else if(wasVisible) { + Window.this.visible = true; + setVisibleImpl(true); + requestFocusImpl(); + getScreen().getDisplay().dispatchMessages(); // status up2date } } @@ -1461,7 +1460,9 @@ public abstract class Window implements NativeWindow, NEWTEventConsumer protected void visibleChanged(boolean visible) { if(DEBUG_IMPLEMENTATION) { - System.out.println("Window.visibleChanged: "+this.visible+" -> "+visible); + System.out.println("Window.visibleChanged ("+getThreadName()+"): "+this.visible+" -> "+visible+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); + // Exception e = new Exception("Window.visibleChanged ("+getThreadName()+"): "+this.visible+" -> "+visible+" - windowHandle "+toHexString(windowHandle)+" parentWindowHandle "+toHexString(parentWindowHandle)); + // e.printStackTrace(); } this.visible = visible ; } diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c index 60caab662..11c11915d 100644 --- a/src/newt/native/X11Window.c +++ b/src/newt/native/X11Window.c @@ -45,6 +45,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/keysym.h> +#include <X11/Xatom.h> #include "com_jogamp_newt_impl_x11_X11Window.h" @@ -441,14 +442,24 @@ static Bool NewtWindows_setOverrideRedirect1 (Display *dpy, Window w, Bool newVa #define MWM_HINTS_DECORATIONS (1L << 1) #define PROP_MWM_HINTS_ELEMENTS 5 -static void NewtWindows_setDecorations (Display *dpy, Window w, Bool val) { +static void NewtWindows_setDecorations (Display *dpy, Window w, Bool decorated) { unsigned long mwmhints[PROP_MWM_HINTS_ELEMENTS] = { 0, 0, 0, 0, 0 }; // flags, functions, decorations, input_mode, status - Atom prop; + Atom _MOTIF_WM_HINTS_DECORATIONS = XInternAtom( dpy, "_MOTIF_WM_HINTS", False ); + Atom _NET_WM_WINDOW_TYPE = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE", False ); + Atom types[3]={0}; + int ntypes=0; + if(True==decorated) { + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False ); + } else { + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_POPUP_MENU", False ); + types[ntypes++] = XInternAtom( dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False ); + } mwmhints[0] = MWM_HINTS_DECORATIONS; - mwmhints[2] = val ; - prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", False ); - XChangeProperty( dpy, w, prop, prop, 32, PropModeReplace, (unsigned char *)&mwmhints, PROP_MWM_HINTS_ELEMENTS); + mwmhints[2] = decorated ; + + XChangeProperty( dpy, w, _MOTIF_WM_HINTS_DECORATIONS, _MOTIF_WM_HINTS_DECORATIONS, 32, PropModeReplace, (unsigned char *)&mwmhints, PROP_MWM_HINTS_ELEMENTS); + XChangeProperty( dpy, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *)&types, ntypes); } /* @@ -612,12 +623,14 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Display_DispatchMessages break; case MapNotify: - DBG_PRINT( "X11: event . MapNotify call 0x%X\n", (unsigned int)evt.xunmap.window); + DBG_PRINT( "X11: event . MapNotify call Event 0x%X, Window 0x%X, override_redirect %d\n", + (unsigned int)evt.xmap.event, (unsigned int)evt.xmap.window, (int)evt.xmap.override_redirect); (*env)->CallVoidMethod(env, jwindow, visibleChangedID, JNI_TRUE); break; case UnmapNotify: - DBG_PRINT( "X11: event . UnmapNotify call 0x%X\n", (unsigned int)evt.xunmap.window); + DBG_PRINT( "X11: event . UnmapNotify call Event 0x%X, Window 0x%X, from_configure %d\n", + (unsigned int)evt.xunmap.event, (unsigned int)evt.xunmap.window, (int)evt.xunmap.from_configure); (*env)->CallVoidMethod(env, jwindow, visibleChangedID, JNI_FALSE); break; @@ -977,10 +990,10 @@ static void NewtWindows_reparentWindow DBG_PRINT( "X11: reparentWindow dpy %p, parent %p/%p, win %p, %d/%d undec %d\n", (void*)dpy, (void*) jparent, (void*)parent, (void*)w, x, y, undecorated); - // don't propagate events during reparenting - // long orig_xevent_mask = xwa->your_event_mask ; - /* XSelectInput(dpy, w, orig_xevent_mask & ~ ( StructureNotifyMask ) ); - XSync(dpy, False); */ + if(JNI_TRUE == isVisible) { + XUnmapWindow(dpy, w); + XSync(dpy, False); + } if(0 != jparent) { // move into parent .. @@ -990,35 +1003,22 @@ static void NewtWindows_reparentWindow XSync(dpy, False); } - if(JNI_TRUE == isVisible) { - XUnmapWindow(dpy, w); - XSync(dpy, False); - } - XReparentWindow( dpy, w, parent, x, y ); XSync(dpy, False); if(0 == jparent) { // move out of parent .. - NewtWindows_setOverrideRedirect0 (dpy, w, xwa, (0 == jparent) ? False : True); + NewtWindows_setOverrideRedirect0 (dpy, w, xwa, False); XSync(dpy, False); NewtWindows_setDecorations (dpy, w, (JNI_TRUE == undecorated) ? False : True); XSync(dpy, False); } if(JNI_TRUE == isVisible) { - XRaiseWindow(dpy, w); + XMapRaised(dpy, w); XSync(dpy, False); - XMapWindow(dpy, w); - XSync(dpy, False); - } - - /* XSelectInput(dpy, w, orig_xevent_mask); - XSync(dpy, False); */ - - if(JNI_TRUE == isVisible) { NewtWindows_requestFocus0 ( env, obj, dpy, w, xwa ); XSync(dpy, False); } @@ -1061,6 +1061,7 @@ JNIEXPORT void JNICALL Java_com_jogamp_newt_impl_x11_X11Window_setPosSizeDecor0 xwc.width=width; xwc.height=height; XConfigureWindow(dpy, w, CWX|CWY|CWWidth|CWHeight, &xwc); + XSync(dpy, False); } /* |