mike@aleytys.UU.NET (Michael Kent) (05/01/89)
Can someone give me some tips... Environment: X11R2 toolkit and Athena widgets, UNIX/386 SYS5 rel. 3.2 I need to do character-by-character input from stdin while at the same time handling events. I see two ways of doing this: 1. Don't use XtMainLoop, use 'handle-a-char/XtNextEvent/XtDispatchEvent'. 2. Use XtAddInput. Which has the better efficiency? And regarding XtAddInput: the second parameter (condition) is documented as 'specifies the mask that indicates either a read, write, or exception condition or some operating system dependend condition.' Can someone translate this for me and let me know what I'm supposed to do for this parameter? -- Michael Kent INTERNET: mike@aleytys.UU.NET Center for M.C.E. UUCP: ...!{uflorida, uunet}!aleytys!mike 2521 NW 57th Pl. VOICE: +1-904-335-1573 Gainesville, Fl 32606 "These are MY opinions, get your own!"
bw@hpcvlx.HP.COM (Bill Wilhelmi) (05/03/89)
I am reposting an example Scott Bolte posted some time ago on this subject. It demonstrates both XtAddTimeOut and XtAddInput. Good luck! Bill Wilhelmi Hewlett-Packard Company /******************************************* * XtAddInput() demo program. * * By Scott Bolte of Cray Research, Inc. * * Posted to comp.windows.x on Jan. 26, 1989 *******************************************/ #include <stdio.h> #include <sys/time.h> #include <X11/StringDefs.h> #include <X11/Xatom.h> #include <X11/Xlib.h> #include <X11/Intrinsic.h> main(argc, argv) int argc; char *argv[]; { int pipes[2], read_fd(); void time_out(); pipe(pipes); fprintf(stderr, "read pipe is %d and write pipe is %d\n", pipes[0], pipes[1]); (void) XtInitialize("master", "crayperf", NULL, 0, &argc, argv); (void) XtAddTimeOut(5000, time_out, pipes[1]); (void) XtAddInput(pipes[0], XtInputReadMask, read_fd, NULL); XtMainLoop(); } void time_out(fd, id) int fd; XtIntervalId *id; { int i; fprintf(stderr, "time_out() was called with fd %d.\n", fd); i = write(fd, "X", 1); fprintf(stderr, "time_out() wrote %d %s to fd %d\n", i ,i > 1 ? "bytes" : "byte", fd); /*** The timeout is automatically removed, so let's add it again ***/ XtAddTimeOut(5000, time_out, fd); } read_fd(junk, socket, InId) caddr_t junk; /* Client data for X callbacks */ int *socket; caddr_t InId; /* XtInputId if we were to use it */ { long t; char c; int i; t = time(0); fprintf(stderr, "read_fd() called at %ld.\n", t); if (read_check(*socket) <= 0) { fprintf(stderr, " ****** I do not agree that there is data.\n"); return; } i = read(*socket, &c, 1); switch (i) { case -1: perror("read returned an error. "); break; case 0: fprintf(stderr, "read returned zero bytes.\n"); break; case 1: fprintf(stderr, "read returned the '%c' character.\n", c); break; default: fprintf(stderr, "read returned more than a single character!\n"); break; } } read_check(fd) int fd; { int status; int rmask; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; rmask = (1 << fd); status = select(fd + 1, &rmask, 0, 0, &tv); return (status); }