#ifndef GET_WINDOW_C #define GET_WINDOW_C static struct ntk_window * get_window (struct ntk *ntk, int id) { 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; } #endif /* GET_WINDOW_C */ #ifndef INSERT_WINDOW_C #define INSERT_WINDOW_C static int insert_window (struct ntk *ntk, struct ntk_window *win) { 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 (); } #endif /* INSERT_WINDOW_C */ #ifndef INTERP_DELETED_C #define INTERP_DELETED_C static void interp_deleted (ClientData cdata, Tcl_Interp *interp) { 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); } #endif /* INTERP_DELETED_C */ #ifndef NTK_CREATE_EVENT_HANDLER_C #define NTK_CREATE_EVENT_HANDLER_C int ntk_create_event_handler (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_CREATE_EVENT_HANDLER_C */ #ifndef NTK_CREATE_SYS_WINDOW_C #define NTK_CREATE_SYS_WINDOW_C int ntk_create_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_CREATE_SYS_WINDOW_C */ #ifndef NTK_DESTROY_SYS_WINDOW_C #define NTK_DESTROY_SYS_WINDOW_C int ntk_destroy_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_DESTROY_SYS_WINDOW_C */ #ifndef NTK_DISPATCH_BUTTONPRESS_C #define NTK_DISPATCH_BUTTONPRESS_C void ntk_dispatch_buttonpress (struct ntk_window *win, int button, int x, int y) { 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); } #endif /* NTK_DISPATCH_BUTTONPRESS_C */ #ifndef NTK_DISPATCH_BUTTONRELEASE_C #define NTK_DISPATCH_BUTTONRELEASE_C void ntk_dispatch_buttonrelease (struct ntk_window *win, int button, int x, int y) { 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); } #endif /* NTK_DISPATCH_BUTTONRELEASE_C */ #ifndef NTK_DISPATCH_CONFIGURE_C #define NTK_DISPATCH_CONFIGURE_C void ntk_dispatch_configure (struct ntk_window *win, int x, int y, int width, int height) { 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); } #endif /* NTK_DISPATCH_CONFIGURE_C */ #ifndef NTK_DISPATCH_KEYPRESS_C #define NTK_DISPATCH_KEYPRESS_C void ntk_dispatch_keypress (struct ntk_window *win, Tcl_Obj *s, Tcl_Obj *symobj, Tcl_Obj *keycode) { 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); } #endif /* NTK_DISPATCH_KEYPRESS_C */ #ifndef NTK_DISPATCH_MOTION_C #define NTK_DISPATCH_MOTION_C void ntk_dispatch_motion (struct ntk_window *win, int x, int y) { 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); } #endif /* NTK_DISPATCH_MOTION_C */ #ifndef NTK_DO_EVENT_C #define NTK_DO_EVENT_C int ntk_do_event (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_DO_EVENT_C */ #ifndef NTK_GET_CLIPBOARD_DATA_C #define NTK_GET_CLIPBOARD_DATA_C int ntk_get_clipboard_data (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_GET_CLIPBOARD_DATA_C */ #ifndef NTK_GET_TOTAL_WINDOWS_C #define NTK_GET_TOTAL_WINDOWS_C int ntk_get_total_windows (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_GET_TOTAL_WINDOWS_C */ #ifndef NTK_INIT_C #define NTK_INIT_C int Ntk_Init (Tcl_Interp *interp) { struct ntk *ntk; int i; if (NULL == Tcl_InitStubs (interp, TCL_VERSION, 0)) return TCL_ERROR; if (TCL_ERROR == Tcl_PkgProvide (interp, "ntk", "1.0")) return TCL_ERROR; ntk = (void *)Tcl_Alloc (sizeof *ntk); ntk->interp = interp; ntk->windows.total = 0; ntk->windows.allocated = 2; ntk->windows.table = (void *)Tcl_Alloc (sizeof (*(ntk->windows.table)) * ntk->windows.allocated); for (i = 0; i < ntk->windows.allocated; ++i) { ntk->windows.table[i] = NULL; } if (TCL_OK != ntk_init_platform (interp, ntk)) return TCL_ERROR; #undef defcmd #define defcmd(func,name) \ Tcl_CreateObjCommand (interp, name, func, (ClientData) ntk, (Tcl_CmdDeleteProc *) NULL) defcmd (ntk_create_event_handler, "ntk-create-event-handler"); defcmd (ntk_create_sys_window, "ntk-create-sys-window"); defcmd (ntk_destroy_sys_window, "ntk-destroy-sys-window"); defcmd (ntk_resize_sys_window, "ntk-resize-sys-window"); defcmd (ntk_map_sys_window, "ntk-map-sys-window"); defcmd (ntk_unmap_sys_window, "ntk-unmap-sys-window"); defcmd (ntk_move_sys_window, "ntk-move-sys-window"); defcmd (ntk_put_image, "ntk-put-image"); defcmd (ntk_set_title, "ntk-set-title"); defcmd (ntk_get_clipboard_data, "ntk-get-clipboard-data"); defcmd (ntk_set_clipboard_data, "ntk-set-clipboard-data"); defcmd (ntk_do_event, "ntk-do-event"); defcmd (ntk_set_focus, "ntk-set-focus"); defcmd (ntk_get_total_windows, "ntk-get-total-windows"); defcmd (ntk_main_loop, "ntk-main-loop"); Tcl_CallWhenDeleted (interp, interp_deleted, (ClientData) ntk); return TCL_OK; } #endif /* NTK_INIT_C */ #ifndef NTK_MAIN_LOOP_C #define NTK_MAIN_LOOP_C int ntk_main_loop (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_MAIN_LOOP_C */ #ifndef NTK_MAP_SYS_WINDOW_C #define NTK_MAP_SYS_WINDOW_C int ntk_map_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_MAP_SYS_WINDOW_C */ #ifndef NTK_MOVE_SYS_WINDOW_C #define NTK_MOVE_SYS_WINDOW_C int ntk_move_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_MOVE_SYS_WINDOW_C */ #ifndef NTK_PUT_IMAGE_C #define NTK_PUT_IMAGE_C int ntk_put_image (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_PUT_IMAGE_C */ #ifndef NTK_RESIZE_SYS_WINDOW_C #define NTK_RESIZE_SYS_WINDOW_C int ntk_resize_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_RESIZE_SYS_WINDOW_C */ #ifndef NTK_SET_CLIPBOARD_DATA_C #define NTK_SET_CLIPBOARD_DATA_C int ntk_set_clipboard_data (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_SET_CLIPBOARD_DATA_C */ #ifndef NTK_SET_FOCUS_C #define NTK_SET_FOCUS_C int ntk_set_focus (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_SET_FOCUS_C */ #ifndef NTK_SET_TITLE_C #define NTK_SET_TITLE_C int ntk_set_title (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_SET_TITLE_C */ #ifndef NTK_UNMAP_SYS_WINDOW_C #define NTK_UNMAP_SYS_WINDOW_C int ntk_unmap_sys_window (TCL_OBJ_CMD_ARGS) { 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; } #endif /* NTK_UNMAP_SYS_WINDOW_C */ #ifndef REMOVE_WINDOW_C #define REMOVE_WINDOW_C static void remove_window (struct ntk *ntk, int id) { if (id >= 0 && id < ntk->windows.allocated) { ntk->windows.table[id] = NULL; ntk->windows.total -= 1; } } #endif /* REMOVE_WINDOW_C */