Looking for **PAID** help with calling XSendEvent correctly

Aryeh Friedman aryeh.friedman at gmail.com
Thu Dec 22 14:01:13 PST 2011


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);
}



More information about the xorg mailing list