tclXtTest.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclXtTest.c --
  3.  *
  4.  * Contains commands for Xt notifier specific tests on Unix.
  5.  *
  6.  * Copyright (c) 1997 by Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tclXtTest.c,v 1.5 2002/08/05 03:24:41 dgp Exp $
  12.  */
  13. #include <X11/Intrinsic.h>
  14. #include "tcl.h"
  15. static int TesteventloopCmd _ANSI_ARGS_((ClientData clientData,
  16.     Tcl_Interp *interp, int argc, CONST char **argv));
  17. extern void InitNotifier _ANSI_ARGS_((void));
  18. /*
  19.  *----------------------------------------------------------------------
  20.  *
  21.  * Tclxttest_Init --
  22.  *
  23.  * This procedure performs application-specific initialization.
  24.  * Most applications, especially those that incorporate additional
  25.  * packages, will have their own version of this procedure.
  26.  *
  27.  * Results:
  28.  * Returns a standard Tcl completion code, and leaves an error
  29.  * message in the interp's result if an error occurs.
  30.  *
  31.  * Side effects:
  32.  * Depends on the startup script.
  33.  *
  34.  *----------------------------------------------------------------------
  35.  */
  36. int
  37. Tclxttest_Init(interp)
  38.     Tcl_Interp *interp; /* Interpreter for application. */
  39. {
  40.     if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) {
  41. return TCL_ERROR;
  42.     }
  43.     XtToolkitInitialize();
  44.     InitNotifier();
  45.     Tcl_CreateCommand(interp, "testeventloop", TesteventloopCmd,
  46.             (ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
  47.     return TCL_OK;
  48. }
  49. /*
  50.  *----------------------------------------------------------------------
  51.  *
  52.  * TesteventloopCmd --
  53.  *
  54.  * This procedure implements the "testeventloop" command. It is
  55.  * used to test the Tcl notifier from an "external" event loop
  56.  * (i.e. not Tcl_DoOneEvent()).
  57.  *
  58.  * Results:
  59.  * A standard Tcl result.
  60.  *
  61.  * Side effects:
  62.  * None.
  63.  *
  64.  *----------------------------------------------------------------------
  65.  */
  66. static int
  67. TesteventloopCmd(clientData, interp, argc, argv)
  68.     ClientData clientData; /* Not used. */
  69.     Tcl_Interp *interp; /* Current interpreter. */
  70.     int argc; /* Number of arguments. */
  71.     CONST char **argv; /* Argument strings. */
  72. {
  73.     static int *framePtr = NULL; /* Pointer to integer on stack frame of
  74.   * innermost invocation of the "wait"
  75.   * subcommand. */
  76.    if (argc < 2) {
  77. Tcl_AppendResult(interp, "wrong # arguments: should be "", argv[0],
  78.                 " option ... "", (char *) NULL);
  79.         return TCL_ERROR;
  80.     }
  81.     if (strcmp(argv[1], "done") == 0) {
  82. *framePtr = 1;
  83.     } else if (strcmp(argv[1], "wait") == 0) {
  84. int *oldFramePtr;
  85. int done;
  86. int oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
  87. /*
  88.  * Save the old stack frame pointer and set up the current frame.
  89.  */
  90. oldFramePtr = framePtr;
  91. framePtr = &done;
  92. /*
  93.  * Enter an Xt event loop until the flag changes.
  94.  * Note that we do not explicitly call Tcl_ServiceEvent().
  95.  */
  96. done = 0;
  97. while (!done) {
  98.     XtAppProcessEvent(TclSetAppContext(NULL), XtIMAll);
  99. }
  100. (void) Tcl_SetServiceMode(oldMode);
  101. framePtr = oldFramePtr;
  102.     } else {
  103. Tcl_AppendResult(interp, "bad option "", argv[1],
  104. "": must be done or wait", (char *) NULL);
  105. return TCL_ERROR;
  106.     }
  107.     return TCL_OK;
  108. }