ntk_dispatch_buttonrelease,include {} ntk_dispatch_buttonrelease,arguments {struct ntk_window *win, int button, int x, int y} ntk_set_clipboard_text,include {} ntk_resize_sys_window,include {} insert_window,plan {} ntk_get_clipboard_text,return_type int insert_window,include {} ntk_create_sys_window,plan {take 4 args: cmdname width height naked Result is an id that refers to an ntk_window.} ntk_set_clipboard_data,return_type int insert_window,arguments {struct ntk *ntk, struct ntk_window *win} ntk_get_clipboard_data,body { struct ntk *ntk = (void *)clientData; struct ntk_window *win; Tcl_Obj *data, *type; Tcl_Obj *list[2]; int id; if (2 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; if (TCL_ERROR == ntk->get_clipboard_data (ntk, win, &type, &data)) return TCL_ERROR; list[0] = type; list[1] = data; Tcl_SetObjResult (interp, Tcl_NewListObj (2, list)); return TCL_OK;} ntk_dispatch_configure,arguments {struct ntk_window *win, int x, int y, int width, int height} Ntk_Init,include {} ntk_create_event_handler,arguments TCL_OBJ_CMD_ARGS ntk_get_total_windows,include {} interp_deleted_callback,return_type {static void} ntk_get_clipboard_text,arguments TCL_OBJ_CMD_ARGS ntk_unmap_sys_window,include {} Ntk_Init,arguments {Tcl_Interp *interp} ntk_create_sys_window,return_type int ntk_get_clipboard_data,plan {} ntk_get_total_windows,body { struct ntk *ntk = (void *)clientData; if (1 != objc) { Tcl_WrongNumArgs (interp, 1, objv, ""); return TCL_ERROR; } Tcl_SetObjResult (interp, Tcl_NewIntObj (ntk->windows.total)); return TCL_OK;} ntk_get_clipboard_data,include {} get_window,return_type {static struct ntk_window *} ntk_dispatch_buttonrelease,return_type void ntk_get_clipboard_data,arguments TCL_OBJ_CMD_ARGS remove_window,body { if (id >= 0 && id < ntk->windows.allocated) { ntk->windows.table[id] = NULL; ntk->windows.total -= 1; } } __list__ {get_window insert_window ntk_create_event_handler ntk_create_sys_window ntk_destroy_sys_window ntk_dispatch_buttonpress ntk_dispatch_buttonrelease ntk_dispatch_configure ntk_dispatch_keypress ntk_dispatch_motion ntk_do_event Ntk_Init ntk_map_sys_window ntk_move_sys_window ntk_put_image ntk_resize_sys_window ntk_set_focus ntk_set_title ntk_unmap_sys_window remove_window interp_deleted ntk_get_total_windows ntk_main_loop ntk_get_clipboard_data ntk_set_clipboard_data} ntk_get_total_windows,plan {} ntk_destroy_sys_window,return_type int insert_window,return_type {static int} get_window,arguments {struct ntk *ntk, int id} get_window,body { if (id >= 0 && id < ntk->windows.allocated && ntk->windows.table[id]) { return ntk->windows.table[id]; } Tcl_SetResult (ntk->interp, "invalid window id", TCL_STATIC); return NULL;} ntk_dispatch_motion,include {} ntk_set_clipboard_data,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (3 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "win-id text"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; //ntk->set_clipboard_text (ntk, win, objv[2]); return TCL_OK;} ntk_dispatch_motion,body { Tcl_Obj *cmd, *xobj, *yobj; if (NULL == win->event.motion) return; cmd = Tcl_DuplicateObj (win->event.motion); Tcl_IncrRefCount (cmd); xobj = Tcl_NewIntObj (x); Tcl_IncrRefCount (xobj); yobj = Tcl_NewIntObj (y); Tcl_IncrRefCount (yobj); if ((TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, xobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, yobj)) || (TCL_ERROR == Tcl_EvalObjEx (win->interp, cmd, TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL))) { Tcl_BackgroundError (win->interp); } Tcl_DecrRefCount (cmd); Tcl_DecrRefCount (xobj); Tcl_DecrRefCount (yobj); } ntk_main_loop,arguments TCL_OBJ_CMD_ARGS remove_window,plan {} ntk_resize_sys_window,body { struct ntk *ntk = (void *)clientData; int id, width, height; struct ntk_window *win; if (4 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id width height"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[2], &width)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[3], &height)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->resize_window (ntk, win, width, height); return TCL_OK;} Ntk_Init,return_type int ntk_destroy_sys_window,arguments TCL_OBJ_CMD_ARGS ntk_set_title,return_type int get_window,plan {} ntk_dispatch_keypress,return_type void ntk_set_clipboard_data,plan {take 3 args: cmdname win text} ntk_unmap_sys_window,return_type int ntk_get_clipboard_text,include {} ntk_dispatch_configure,body { Tcl_Obj *cmd, *xobj, *yobj, *widthobj, *heightobj; if (NULL == win->event.configure) return; cmd = Tcl_DuplicateObj (win->event.configure); Tcl_IncrRefCount (cmd); xobj = Tcl_NewIntObj (x); Tcl_IncrRefCount (xobj); yobj = Tcl_NewIntObj (y); Tcl_IncrRefCount (yobj); widthobj = Tcl_NewIntObj (width); Tcl_IncrRefCount (widthobj); heightobj = Tcl_NewIntObj (height); Tcl_IncrRefCount (heightobj); if ((TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, xobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, yobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, widthobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, heightobj)) || (TCL_ERROR == Tcl_EvalObjEx (win->interp, cmd, TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL))) { Tcl_BackgroundError (win->interp); } Tcl_DecrRefCount (cmd); Tcl_DecrRefCount (xobj); Tcl_DecrRefCount (yobj); Tcl_DecrRefCount (widthobj); Tcl_DecrRefCount (heightobj); } ntk_dispatch_motion,plan {} ntk_get_clipboard_data,return_type int remove_window,return_type {static void} ,body {} ntk_resize_sys_window,plan {take 4 args: cmdname id width height} ntk_dispatch_buttonrelease,body { Tcl_Obj *cmd, *xobj, *yobj, *buttonobj; if (NULL == win->event.buttonrelease) return; cmd = Tcl_DuplicateObj (win->event.buttonrelease); Tcl_IncrRefCount (cmd); buttonobj = Tcl_NewIntObj (button); Tcl_IncrRefCount (buttonobj); xobj = Tcl_NewIntObj (x); Tcl_IncrRefCount (xobj); yobj = Tcl_NewIntObj (y); Tcl_IncrRefCount (yobj); if ((TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, buttonobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, xobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, yobj)) || (TCL_ERROR == Tcl_EvalObjEx (win->interp, cmd, TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL))) { Tcl_BackgroundError (win->interp); } Tcl_DecrRefCount (cmd); Tcl_DecrRefCount (buttonobj); Tcl_DecrRefCount (xobj); Tcl_DecrRefCount (yobj);} ntk_get_total_windows,arguments TCL_OBJ_CMD_ARGS ntk_main_loop,body { struct ntk *ntk = (void *)clientData; if (1 != objc) { Tcl_WrongNumArgs (interp, 1, objv, ""); return TCL_ERROR; } while (ntk->windows.total > 0) { Tcl_DoOneEvent (TCL_ALL_EVENTS); } return TCL_OK;} ntk_map_sys_window,return_type int ntk_set_focus,return_type int ntk_dispatch_configure,plan {} ntk_create_sys_window,include {} get_window,include {} ntk_dispatch_buttonrelease,plan {} ,plan {} interp_deleted,include {} ntk_move_sys_window,include {} ntk_do_event,include {} ntk_main_loop,plan {take 1 args: cmdname} ntk_set_focus,arguments TCL_OBJ_CMD_ARGS ntk_set_focus,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (2 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->set_focus (ntk, win); return TCL_OK;} ntk_map_sys_window,arguments TCL_OBJ_CMD_ARGS ntk_map_sys_window,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (2 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->map_window (ntk, win); return TCL_OK;} interp_deleted,arguments {ClientData cdata, Tcl_Interp *interp} ntk_move_sys_window,arguments TCL_OBJ_CMD_ARGS Ntk_Init,body \tstruct\ ntk\ *ntk\;\n\tint\ i\;\n\t\t\n\tif\ (NULL\ ==\ Tcl_InitStubs\ (interp,\ TCL_VERSION,\ 0))\n\t\treturn\ TCL_ERROR\;\n\n\tif\ (TCL_ERROR\ ==\ Tcl_PkgProvide\ (interp,\ \"ntk\",\ \"1.0\"))\n\t\treturn\ TCL_ERROR\;\n\n\tntk\ =\ (void\ *)Tcl_Alloc\ (sizeof\ *ntk)\;\n\tntk->interp\ =\ interp\;\n\tntk->windows.total\ =\ 0\;\n\tntk->windows.allocated\ =\ 2\;\n\tntk->windows.table\ =\ (void\ *)Tcl_Alloc\ (sizeof\ (*(ntk->windows.table))\ *\ ntk->windows.allocated)\;\n\n\tfor\ (i\ =\ 0\;\ i\ <\ ntk->windows.allocated\;\ ++i)\ \{\n\t\tntk->windows.table\[i\]\ =\ NULL\;\n\t\}\n\n\tif\ (TCL_OK\ !=\ ntk_init_platform\ (interp,\ ntk))\n\t\treturn\ TCL_ERROR\;\n\t\n#undef\ defcmd\ \ \n#define\ defcmd(func,name)\ \\\n\tTcl_CreateObjCommand\ (interp,\ name,\ func,\ (ClientData)\ ntk,\ (Tcl_CmdDeleteProc\ *)\ NULL)\n\n\tdefcmd\ (ntk_create_event_handler,\ \"ntk-create-event-handler\")\;\n\tdefcmd\ (ntk_create_sys_window,\ \"ntk-create-sys-window\")\;\n\tdefcmd\ (ntk_destroy_sys_window,\ \"ntk-destroy-sys-window\")\;\n\tdefcmd\ (ntk_resize_sys_window,\ \"ntk-resize-sys-window\")\;\n\tdefcmd\ (ntk_map_sys_window,\ \"ntk-map-sys-window\")\;\n\tdefcmd\ (ntk_unmap_sys_window,\ \"ntk-unmap-sys-window\")\;\n\tdefcmd\ (ntk_move_sys_window,\ \"ntk-move-sys-window\")\;\n\tdefcmd\ (ntk_put_image,\ \"ntk-put-image\")\;\n\tdefcmd\ (ntk_set_title,\ \"ntk-set-title\")\;\n\tdefcmd\ (ntk_get_clipboard_data,\ \"ntk-get-clipboard-data\")\;\n\tdefcmd\ (ntk_set_clipboard_data,\ \"ntk-set-clipboard-data\")\;\n\tdefcmd\ (ntk_do_event,\ \"ntk-do-event\")\;\n\tdefcmd\ (ntk_set_focus,\ \"ntk-set-focus\")\;\n\tdefcmd\ (ntk_get_total_windows,\ \"ntk-get-total-windows\")\;\n\tdefcmd\ (ntk_main_loop,\ \"ntk-main-loop\")\;\n\n\tTcl_CallWhenDeleted\ (interp,\ interp_deleted,\ (ClientData)\ ntk)\;\n\n\treturn\ TCL_OK\; ntk_do_event,arguments TCL_OBJ_CMD_ARGS ntk_dispatch_configure,return_type void ntk_dispatch_motion,arguments {struct ntk_window *win, int x, int y} ntk_destroy_sys_window,include {} ntk_set_focus,plan {take 2 args: cmdname id} ntk_map_sys_window,plan {take 2 args: cmdname id} ntk_create_event_handler,include {} ntk_dispatch_buttonpress,body { Tcl_Obj *cmd, *xobj, *yobj, *buttonobj; if (NULL == win->event.buttonpress) return; cmd = Tcl_DuplicateObj (win->event.buttonpress); Tcl_IncrRefCount (cmd); buttonobj = Tcl_NewIntObj (button); Tcl_IncrRefCount (buttonobj); xobj = Tcl_NewIntObj (x); Tcl_IncrRefCount (xobj); yobj = Tcl_NewIntObj (y); Tcl_IncrRefCount (yobj); if ((TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, buttonobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, xobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, yobj)) || (TCL_ERROR == Tcl_EvalObjEx (win->interp, cmd, TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL))) { Tcl_BackgroundError (win->interp); } Tcl_DecrRefCount (cmd); Tcl_DecrRefCount (buttonobj); Tcl_DecrRefCount (xobj); Tcl_DecrRefCount (yobj);} Ntk_Init,plan {This leaks the ntk struct. We need to have it cleanup with Tcl_CallWhenDeleted().} ntk_set_title,include {} ntk_dispatch_keypress,include {} ntk_set_title,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (3 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id title"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->set_title (ntk, win, objv[2]); return TCL_OK;} ntk_dispatch_buttonpress,plan {} ntk_dispatch_keypress,body { Tcl_Obj *cmd; if (NULL == win->event.keypress) return; cmd = Tcl_DuplicateObj (win->event.keypress); Tcl_IncrRefCount (cmd); if ((TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, s)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, symobj)) || (TCL_OK != Tcl_ListObjAppendElement (win->interp, cmd, keycode)) || (TCL_ERROR == Tcl_EvalObjEx (win->interp, cmd, TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL))) { Tcl_BackgroundError (win->interp); } Tcl_DecrRefCount (cmd);} ntk_unmap_sys_window,arguments TCL_OBJ_CMD_ARGS ntk_put_image,return_type int ntk_dispatch_buttonpress,include {} interp_deleted,return_type {static void} remove_window,include {} ntk_move_sys_window,return_type int ntk_do_event,return_type int ntk_dispatch_buttonpress,arguments {struct ntk_window *win, int button, int x, int y} ntk_set_focus,include {} ntk_map_sys_window,include {} ntk_create_sys_window,arguments TCL_OBJ_CMD_ARGS ntk_set_title,plan {take 3 args: cmdname id title} ntk_set_clipboard_text,return_type int ntk_resize_sys_window,return_type int ntk_create_event_handler,body { struct ntk *ntk = (void *)clientData; struct ntk_window *win; int id; if (8 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "win-id keypress keyrelease motion buttonpress buttonrelease configure"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->create_event_handler (ntk, win, objv[2], objv[3], objv[4], objv[5], objv[6], objv[7]); return TCL_OK;} ntk_dispatch_keypress,plan {s is the string symobj is the name of the symbol keycode is an integer} ntk_put_image,arguments TCL_OBJ_CMD_ARGS ntk_put_image,body { struct ntk *ntk = (void *)clientData; struct megaimage *img; struct megaimage_info info; int id; struct ntk_window *win; if (3 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "win-id megaimage"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; img = megaimage_find (interp, Tcl_GetString (objv[2])); if (NULL == img) return TCL_ERROR; info.version = MEGAIMAGE_INFO_VERSION; info.width = img->width; info.height = img->height; info.imagesize = img->imagesize; if (ntk->put_image (ntk, win, &info, img->bytes)) return TCL_ERROR; return TCL_OK;} ntk_main_loop,include {} ntk_create_event_handler,return_type int ntk_unmap_sys_window,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (2 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->unmap_window (ntk, win); return TCL_OK;} ntk_set_clipboard_text,arguments TCL_OBJ_CMD_ARGS ntk_resize_sys_window,arguments TCL_OBJ_CMD_ARGS ntk_create_event_handler,plan {take 8 args: cmdname win-id keypress keyrelease motion buttonpress buttonrelease configure} ntk_destroy_sys_window,body { struct ntk *ntk = (void *)clientData; int id; struct ntk_window *win; if (2 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->destroy_window (ntk, win); remove_window (ntk, id); return TCL_OK;} ntk_dispatch_configure,include {} ntk_put_image,plan {take 2 args: cmdname megaimage} ntk_get_total_windows,return_type int ntk_set_clipboard_data,include {} ntk_unmap_sys_window,plan {} ntk_dispatch_buttonpress,return_type void ntk_set_clipboard_data,arguments TCL_OBJ_CMD_ARGS interp_deleted,body { struct ntk *ntk = (void *)cdata; struct ntk_window *win; int i; for (i = 0; i < ntk->windows.allocated; ++i) { win = ntk->windows.table[i]; if (win) { destroy_window(ntk, win); ntk->windows.table[i] = NULL; ntk->windows.total -= 1; } } /* *This does per-platform cleanup */ ntk->platform.cleanup (ntk); Tcl_Free ((void *)ntk->windows.table); ntk->windows.table = NULL; Tcl_Free ((void *)ntk); } ntk_move_sys_window,body { struct ntk *ntk = (void *)clientData; int id, x, y; struct ntk_window *win; if (4 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "id x y"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &id)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[2], &x)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[3], &y)) return TCL_ERROR; win = get_window (ntk, id); if (NULL == win) return TCL_ERROR; ntk->move_window (ntk, win, x, y); return TCL_OK;} ntk_do_event,body { int flags = TCL_DONT_WAIT; int i, forever = 0; char *s; if (objc < 2) { Tcl_WrongNumArgs (interp, 1, objv, "flags ..."); return TCL_ERROR; } for (i = 1; i < objc; ++i) { s = Tcl_GetString (objv[i]); if (!strcmp (s, "wait")) { flags &= ~TCL_DONT_WAIT; } else if (!strcmp (s, "all")) { flags |= TCL_ALL_EVENTS; } else if (!strcmp (s, "forever")) { forever = 1; } else if (!strcmp (s, "file")) { flags |= TCL_FILE_EVENTS; } else if (!strcmp (s, "timer")) { flags |= TCL_TIMER_EVENTS; } else if (!strcmp (s, "idle")) { flags |= TCL_IDLE_EVENTS; } else { Tcl_SetResult (interp, "invalid flag", TCL_STATIC); Tcl_AddErrorInfo (interp, s); return TCL_ERROR; } } if (forever) { for (;;) { Tcl_DoOneEvent (flags); } } else { Tcl_SetObjResult (interp, Tcl_NewIntObj (Tcl_DoOneEvent (flags))); } return TCL_OK;} ntk_destroy_sys_window,plan {take 2 args: cmdname id} ntk_set_title,arguments TCL_OBJ_CMD_ARGS ntk_dispatch_keypress,arguments {struct ntk_window *win, Tcl_Obj *s, Tcl_Obj *symobj, Tcl_Obj *keycode} interp_deleted_callback,include {} interp_deleted_callback,arguments {ClientData cdata, Tcl_Interp *interp} ntk_dispatch_motion,return_type void insert_window,body { int i; int newallocated; ntk->windows.total++; if (ntk->windows.total < ntk->windows.allocated) { for (i = 0; i < ntk->windows.allocated; ++i) { if (NULL == ntk->windows.table[i]) { ntk->windows.table[i] = win; return i; } } } newallocated = ntk->windows.allocated * 2; ntk->windows.table = (void *)Tcl_Realloc ((void *)ntk->windows.table, sizeof (*(ntk->windows.table)) * newallocated); /* Initialize the new table */ for (i = ntk->windows.allocated; i < newallocated; ++i) { ntk->windows.table[i] = NULL; } ntk->windows.allocated = newallocated; /* iterate and get the id (we could have done this above I think, but oh well) */ for (i = 0; i < ntk->windows.allocated; ++i) { if (NULL == ntk->windows.table[i]) { ntk->windows.table[i] = win; return i; } } /* NOTREACHED */ abort ();} ntk_main_loop,return_type int interp_deleted,plan {This is called when an interp is deleted.} remove_window,arguments {struct ntk *ntk, int id} ntk_put_image,include {} ntk_move_sys_window,plan {take 4 args: cmdname id x y} ntk_do_event,plan {} ntk_create_sys_window,body { struct ntk *ntk = (void *)clientData; struct ntk_window *win; int width, height, naked, id; if (4 != objc) { Tcl_WrongNumArgs (interp, 1, objv, "width height naked"); return TCL_ERROR; } if (TCL_OK != Tcl_GetIntFromObj (interp, objv[1], &width)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[2], &height)) return TCL_ERROR; if (TCL_OK != Tcl_GetIntFromObj (interp, objv[3], &naked)) return TCL_ERROR; win = ntk->create_window (ntk, interp, width, height, naked); if (NULL == win) return TCL_ERROR; id = insert_window (ntk, win); win->id = id; Tcl_SetObjResult (interp, Tcl_NewIntObj (id)); return TCL_OK;}