Looking for **PAID** help with calling XSendEvent correctly
Sam Spilsbury
smspillaz at gmail.com
Fri Dec 23 01:58:15 PST 2011
On Thu, Dec 22, 2011 at 9:20 AM, Aryeh Friedman
<aryeh.friedman at gmail.com> wrote:
> 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;
I don't know AWT very well, but I would assume that if it were using
similar naming terminology to the rest of xlib, then I think that
dsi_win->visualID; is probably not the correct
> printf("dsi_win %p\n",win);
>
Have you tried using the result of this in xwininfo -id ?
> // 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);
Have you ensured that the receiving client has selected for
KeyPressMask and KeyReleaseMask ?
Check with xwininfo -id client_id -all
> XFlush(dpy);
> }
>
> XCloseDisplay(dpy);
> }
> _______________________________________________
> xorg at lists.freedesktop.org: X.Org support
> Archives: http://lists.freedesktop.org/archives/xorg
> Info: http://lists.freedesktop.org/mailman/listinfo/xorg
> Your subscription address: smspillaz at gmail.com
--
Sam Spilsbury
More information about the xorg
mailing list