📄 wnd.c
字号:
jint x, jint y, jint width, jint height, jint jCursor, jint clrBack ){ Window owner = UNVEIL_WND(nowner); jobject w = createWindow( env, clazz, X->root, owner, NULL, x, y, width, height, jCursor, clrBack, JNI_TRUE); DBG( AWT_WND, printf("createWindow( %p, %d,%d,%d,%d,..) -> %lx\n", owner,x,y,width,height, w)); if ( w ) registerSource( X, UNVEIL_WND(w), owner, WND_WINDOW); return w;}jobjectJava_java_awt_Toolkit_wndCreateDialog ( JNIEnv* env, jclass clazz, jobject nowner, jstring jTitle, jint x, jint y, jint width, jint height, jint jCursor, jint clrBack, jboolean isResizable ){ Window owner = UNVEIL_WND(nowner); jobject w = createWindow( env, clazz, DefaultRootWindow( X->dsp), owner, jTitle, x, y, width, height, jCursor, clrBack, isResizable); DBG( AWT_WND, printf("createDialog( %p,%p, %d,%d,%d,%d,..) -> %lx\n", owner,jTitle,x,y,width,height,w)); if ( w ) registerSource( X, UNVEIL_WND(w), owner, WND_DIALOG); return w;}voidJava_java_awt_Toolkit_wndDestroyWindow ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd ){ Window wnd = UNVEIL_WND(nwnd); int i = getSourceIdx( X, wnd); DBG( AWT_WND, printf("destroy window: %p (%d)\n", wnd, i)); if ( (i >= 0) && !(X->windows[i].flags & WND_DESTROYED) ) { if ( wnd == X->focusFwd ) { /* * reset focus forwading NOW, we can't do it from a clientMessage, since any * real focusLost notification would be scrubbed by the subsequent XDestroyWindow */ resetFocusForwarding( X); if ( X->windows[i].owner && (X->windows[i].owner == X->focus) ) { /* * This was a explicit dispose(), and the owner still is the real focus window. * Let's make it think it got back the focus */ forwardFocus( FWD_REVERT, X->windows[i].owner); } } X->windows[i].flags |= WND_DESTROYED; X->windows[i].flags &= ~WND_MAPPED; XSync( X->dsp, False); /* maybe we still have pending requests for wnd */ XDestroyWindow( X->dsp, wnd); }}voidJava_java_awt_Toolkit_wndRequestFocus ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd ){ Window wnd = UNVEIL_WND(nwnd); int i = getSourceIdx( X, wnd); DBG( AWT_WND, printf("request focus: %p (%d)\n", wnd, i)); if ( (i < 0) || (X->windows[i].flags & WND_DESTROYED) ) return; if ( (X->windows[i].owner) && (X->windows[i].flags & WND_WINDOW) ) { if ( X->focus != X->windows[i].owner ) { /* if our owner doesn't have it yet, make him the focus window */ XSetInputFocus( X->dsp, X->windows[i].owner, RevertToParent, CurrentTime); } /* * This marks the beginning of a focus forward to a owned window * (which isn't allowed to get the real focus because it would * "shade" the titlebar of the owner) */ forwardFocus( FWD_SET, wnd); } else { if ( (X->windows[i].flags & WND_MAPPED) == 0 ){ /* If it's not mapped yet, try again later. Somebody might * have been too fast with requesting the focus of a not yet visible * window, resulting in BadMatch errors */ retryFocus( wnd, X->windows[i].owner, 5); } else if ( (X->focusFwd) && (wnd == X->focus) ) { /* We still have it in real life, but we have to pretend we re-gained it * from our ownee. Reset forwarding here (instead of in the ClientMessage), * because a subsequent destroy of the ownee otherwise might cause another * revert (with the Java keyTgtRequest already eaten up by this FWD_REVERT) */ resetFocusForwarding( X); forwardFocus( FWD_REVERT, wnd); } else { /* we don't reset X->focusFwd here, that's done in the event handler */ XSetInputFocus( X->dsp, wnd, RevertToParent, CurrentTime); } }}/* * We shift possible Frame / Dialog deco adaptions back to Java, because (in * order to get more compatible with JDK behavior) we not only have to apply * offsets in wndSetWindowBounds, but also when getting back via ComponentEvents * (ConfigureNotify), and during recursive child painting (to adapt the toplevel Graphics). * Since we don't have the window type info (frame / dialog / window) * in the native lib, this has to be done in the Java layer. In order to do it * all on one side, this means to shift the size adaption out of wndSetWindowBounds, too. * * Therefor Default frame/dialog Insets become the pivotal info, being passed into * the native lib as a (configurable 'Defaults') guess, turned into exact values * (of Frame.frameInsets, Dialog.dialogInsets) by means of native-to-Java callbacks, * computed during initial Frame/Dialog creation */voidJava_java_awt_Toolkit_wndSetFrameInsets ( JNIEnv* env UNUSED, jclass clazz UNUSED, jint top, jint left, jint bottom, jint right ){ X->frameInsets.top = top; X->frameInsets.left = left; X->frameInsets.bottom = bottom; X->frameInsets.right = right; X->frameInsets.guess = 1;}voidJava_java_awt_Toolkit_wndSetDialogInsets ( JNIEnv* env UNUSED, jclass clazz UNUSED, jint top, jint left, jint bottom, jint right ){ X->dialogInsets.top = top; X->dialogInsets.left = left; X->dialogInsets.bottom = bottom; X->dialogInsets.right = right; X->dialogInsets.guess = 1;}voidJava_java_awt_Toolkit_wndSetBounds ( JNIEnv* env, jclass clazz, jobject nwnd, jint x, jint y, jint width, jint height, jboolean isResizable ){ Window wnd = UNVEIL_WND(nwnd); DBG( AWT_WND, printf("setBounds: %p %d,%d,%d,%d\n", wnd, x, y, width, height)); if ( width < 0 ) width = 1; if ( height < 0 ) height = 1; XMoveResizeWindow( X->dsp, wnd, x, y, width, height); /* * Our perspective of 'isResizable' is somewhat relaxed: we just disable * "user-resizing" (like it is stated in the spec), i.e. a program is * allowed to do setBounds on non-resizable Frames/Dialogs. This makes * initial decoration size compensation easy, but it requires that we update * the "lock" after a resize operation */ if ( !isResizable ) { Java_java_awt_Toolkit_wndSetResizable( env, clazz, nwnd, False, x, y, width, height); }}voidJava_java_awt_Toolkit_wndRepaint ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd, jint x, jint y, jint width, jint height ){ Window wnd = UNVEIL_WND(nwnd); DBG( AWT_WND, printf("wndRepaint: %p %d,%d,%d,%d\n", wnd, x, y, width, height)); XClearArea( X->dsp, wnd, x, y, width, height, True);}voidJava_java_awt_Toolkit_wndSetIcon ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd UNUSED, jobject nimg UNUSED ){}voidJava_java_awt_Toolkit_wndSetVisible ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd, jboolean showIt ){ Window wnd = UNVEIL_WND(nwnd); int i = getSourceIdx( X, wnd); Window owner; DBG( AWT_WND, printf("setVisible: %p (%d) %d\n", wnd, i, showIt)); if ( (i < 0) || (X->windows[i].flags & WND_DESTROYED) ) return; owner = X->windows[i].owner; if ( showIt ){ X->windows[i].flags |= WND_MAPPED; XMapRaised( X->dsp, wnd); XSync( X->dsp, False); /* * Don't automatically forward the focus for owned popups, the standard JDK behavior * is NOT to set the focus on them unless explicitly requested. It would break * Swing heavyweight popups (JWindowPopup, both keyboard input and the famous * "first on Solaris" jitter) */ } else { if ( wnd == X->focusFwd ) { forwardFocus( FWD_CLEAR, owner); forwardFocus( FWD_REVERT, owner); } X->windows[i].flags &= ~WND_MAPPED; XUnmapWindow( X->dsp, wnd); XSync( X->dsp, False); }}voidJava_java_awt_Toolkit_wndToBack ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd ){ Window wnd = UNVEIL_WND(nwnd); DBG( AWT_WND, printf("toBack: %p\n", wnd)); XLowerWindow( X->dsp, wnd);}voidJava_java_awt_Toolkit_wndToFront ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd ){ Window wnd = UNVEIL_WND(nwnd); DBG( AWT_WND, printf("toFront: %p\n", wnd)); XRaiseWindow( X->dsp, wnd);}voidJava_java_awt_Toolkit_wndSetCursor ( JNIEnv* env UNUSED, jclass clazz UNUSED, jobject nwnd, jint jCursor ){ Window wnd = UNVEIL_WND(nwnd); DBG( AWT_WND, printf("setCursor: %p, %d\n", wnd, jCursor)); XDefineCursor( X->dsp, wnd, getCursor( jCursor));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -