home *** CD-ROM | disk | FTP | other *** search
/ Practical Programming in Tcl & Tk (4th Edition) / TCLBOOK4.BIN / mac / exsource.old / 47_4.c < prev    next >
C/C++ Source or Header  |  2003-04-15  |  3KB  |  110 lines

  1. /*
  2.  * Example 47-4
  3.  * The ClockObjCmd command procedure.
  4.  */
  5.  
  6. int
  7. ClockObjCmd(clientData, interp, objc, objv)
  8.     ClientData clientData;                        /* Main window of the app */
  9.     Tcl_Interp *interp;                        /* Current interpreter. */
  10.     int objc;                        /* Number of arguments. */
  11.     Tcl_Obj **objv;                        /* Argument values. */
  12. {
  13.     Tk_OptionTable optionTable;
  14.     Clock *clockPtr;
  15.     Tk_Window tkwin;
  16.  
  17.     if (objc < 2) {
  18.         Tcl_WrongNumArgs(interp, 1, objv, "pathName ?options?");
  19.         return TCL_ERROR;
  20.     }
  21.     optionTable = (Tk_OptionTable) clientData;
  22.     if (optionTable == NULL) {
  23.         Tcl_CmdInfo info;
  24.         char *name;
  25.  
  26.         /*
  27.          * Initialize the option table for this widget the
  28.          * first time a clock widget is created. The option
  29.          * table is saved as our client data.
  30.          */
  31.         
  32.         optionTable = Tk_CreateOptionTable(interp, optionSpecs);
  33.         name = Tcl_GetString(objv[0]);
  34.         Tcl_GetCommandInfo(interp, name, &info);
  35.         info.objClientData = (ClientData) optionTable;
  36.         Tcl_SetCommandInfo(interp, name, &info);
  37.     }
  38.     tkwin = Tk_CreateWindowFromPath(interp,
  39.             Tk_MainWindow(interp),
  40.             Tcl_GetString(objv[1]), (char *) NULL);
  41.     if (tkwin == NULL) {
  42.         return TCL_ERROR;
  43.     }
  44.     /*
  45.      * Set resource class.
  46.      */
  47.     Tk_SetClass(tkwin, "Clock");
  48.     /*
  49.      * Allocate and initialize the widget record.
  50.      */
  51.     clockPtr = (Clock *) ckalloc(sizeof(Clock));
  52.     clockPtr->tkwin = tkwin;
  53.     clockPtr->display = Tk_Display(tkwin);
  54.     clockPtr->interp = interp;
  55.     clockPtr->optionTable = optionTable;
  56.     clockPtr->borderWidth = 0;
  57.     clockPtr->borderWidthPtr = NULL;
  58.     clockPtr->highlightWidth = 0;
  59.     clockPtr->highlightWidthPtr = NULL;
  60.     clockPtr->relief = TK_RELIEF_FLAT;
  61.     clockPtr->background = NULL;
  62.     clockPtr->foreground = NULL;
  63.     clockPtr->highlight = NULL;
  64.     clockPtr->highlightBg = NULL;
  65.     clockPtr->tkfont = NULL;
  66.     clockPtr->textGC = None;
  67.     clockPtr->token = NULL;
  68.     clockPtr->clock = NULL;
  69.     clockPtr->format = NULL;
  70.     clockPtr->numChars = 0;
  71.     clockPtr->textWidth = 0;
  72.     clockPtr->widthPtr = NULL;
  73.     clockPtr->textHeight = 0;
  74.     clockPtr->heightPtr = NULL;
  75.     clockPtr->padX = 0;
  76.     clockPtr->padXPtr = NULL;
  77.     clockPtr->padY = 0;
  78.     clockPtr->padYPtr = NULL;
  79.     clockPtr->flags = 0;
  80.     /*
  81.      * Register a handler for when the window is
  82.      * exposed or resized.
  83.      */
  84.     Tk_CreateEventHandler(clockPtr->tkwin,
  85.         ExposureMask|StructureNotifyMask|FocusChangeMask,
  86.         ClockEventProc, (ClientData) clockPtr);
  87.     /*
  88.      * Create a Tcl command that operates on the widget.
  89.      */
  90.     clockPtr->widgetCmd = Tcl_CreateObjCommand(interp,
  91.         Tk_PathName(clockPtr->tkwin),
  92.         ClockInstanceObjCmd,
  93.         (ClientData) clockPtr, (void (*)()) NULL);
  94.     /*
  95.      * Parse the command line arguments.
  96.      */
  97.     if ((Tk_InitOptions(interp, (char *)clockPtr, 
  98.             optionTable, tkwin) != TCL_OK) ||
  99.         (ClockObjConfigure(interp, clockPtr,
  100.              objc-2, objv+2, 0) != TCL_OK)) {
  101.         Tk_DestroyWindow(clockPtr->tkwin);
  102.         return TCL_ERROR;
  103.     }
  104.     Tcl_SetStringObj(Tcl_GetObjResult(interp),
  105.         Tk_PathName(clockPtr->tkwin), -1);
  106.     return TCL_OK;
  107. }
  108.  
  109.  
  110.