I have a Java program that calls the following code but somehow the events are not rebroadcasted... from my very limited knowledge of X (I have known C for years but never used it for GUI work) I highly suspect I some how got the second arg wrong (it seems that the JAWT window ID is not the same as the Xorg one)... since this is a high priority project my client is willing to pay for 1 to 2 hours of consulting on how to adjust the code to make it work... the final goal is we want to block all keystrokes not meant for the actual app (alt-f1:f9, ctl-alt-del, etc.)... namely the client is making a application to apply standardized tests to distance learning students and we need to enable a "kiosk" like mode (the user can not break out the app [or as much as is possible]... the reason is we want to prevent the test taker of using this as a work around the "closed book" restriction on a "closed book" test)... I can either have no event filtering (all events go their intended targets) or filtering and no forwarding (namely if a invert the test of which process to terminate on fork(2)). Note: I tried both InputFocus and PointerFocus for the target win of the event but that doesn't work nor does key->win. Also I can handle all the coding except the actual XLib/XCB calls. // src/c/KioskJNI.c /** * Any C needed to make Kiosk Mode work as expected * * Copyright (C) 2010-2011. Friedman-Nixon-Wong Enterprises, LLC. * * @author aryeh * @version Mon Dec 5 03:47:46 2011 */ #include <signal.h> #include <X11/Xlib.h> #include "jawt_md.h" #include "client_kiosk_core_KioskJNI.h" /** * Block all OS signals (param's ignored) */ JNIEXPORT void JNICALL Java_client_kiosk_core_KioskJNI_blockSigs(JNIEnv *env, jclass cls, jobject comp) { Display *dpy=XOpenDisplay(0); int i=0; for(i=0;i<256;i++) signal(i,SIG_IGN); JAWT awt; printf("fart\n"); // Get the AWT awt.version = JAWT_VERSION_1_4; jboolean result = JAWT_GetAWT(env, &awt); JAWT_DrawingSurface* ds=awt.GetDrawingSurface(env, comp); ds->Lock(ds); JAWT_DrawingSurfaceInfo* dsi=ds->GetDrawingSurfaceInfo(ds); JAWT_X11DrawingSurfaceInfo* dsi_win = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo; printf("dsi %p\n",dsi); printf("ds %p\n",ds); jlong win=dsi_win->visualID; printf("dsi_win %p\n",win); // Free the drawing surface info ds->FreeDrawingSurfaceInfo(dsi); // Unlock the drawing surface ds->Unlock(ds); // Free the drawing surface awt.FreeDrawingSurface(ds); XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync, CurrentTime); int pid=fork(); if(!pid) { return; } printf("%d\n",pid); XEvent ev; while(1) { XNextEvent(dpy,&ev); XKeyEvent *key=(XKeyEvent *) &ev; printf("You typed a %d\n",key->keycode); XSendEvent(dpy,win, True, (KeyPressMask | KeyReleaseMask), &ev); XFlush(dpy); } XCloseDisplay(dpy); } _______________________________________________ xorg@xxxxxxxxxxxxxxxxxxxxx: X.Org support Archives: http://lists.freedesktop.org/archives/xorg Info: http://lists.freedesktop.org/mailman/listinfo/xorg Your subscription address: list-xorg@xxxxxxxxxxx