Skip to content
Snippets Groups Projects
js_uifc.c 34.5 KiB
Newer Older
		return JS_FALSE;
	if (!JS_ValueToInt32(cx, argv[argn++], &width))
		return JS_FALSE;
	if (!JS_ValueToInt32(cx, argv[argn++], &maxlen))
		return JS_FALSE;
	if (!JS_ValueToInt32(cx, argv[argn++], &mode))
		return JS_FALSE;
	if(argn<argc && JSVAL_IS_STRING(argv[argn])) {
		JSVALUE_TO_MSTRING(cx, argv[argn], org, NULL);
		argn++;
		if(JS_IsExceptionPending(cx)) {
			free(org);
			return JS_FALSE;
		if(org==NULL)
			return(JS_TRUE);
	}
	if(argn<argc && JSVAL_IS_OBJECT(argv[argn])) {
		if((objarg = JSVAL_TO_OBJECT(argv[argn]))==NULL) {
			free(org);
			return(JS_FALSE);
		}
		if(JS_GetClass(cx, objarg) == &js_uifc_getstrxy_ctx_class) {
			p = JS_GetPrivate(cx, objarg);
			if (p != NULL) {
				lastkey = &(p->lastkey);
			}
		}
	}
	if(maxlen < 1) {
		JS_ReportError(cx, "max length less than one");
		free(org);
		return JS_FALSE;
	}
	if((str=(char*)malloc(maxlen+1))==NULL) {
		free(org);
		return(JS_FALSE);
	}
	memset(str,0,maxlen+1);
	if(org) {
		strncpy(str,org,maxlen);
		free(org);
	}
	rc=JS_SUSPENDREQUEST(cx);
	if(uifc->getstrxy(left, top, width, str, maxlen, mode, lastkey)<0) {
		JS_RESUMEREQUEST(cx, rc);
		free(str);
		JS_SET_RVAL(cx, arglist, JSVAL_NULL);
		return(JS_TRUE);
	}
	JS_RESUMEREQUEST(cx, rc);
	JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(JS_NewStringCopyZ(cx,str)));
	if(str)
		free(str);
	return(JS_TRUE);
}
static JSBool
js_uifc_showbuf(JSContext *cx, uintN argc, jsval *arglist)
{
	JSObject *obj=JS_THIS_OBJECT(cx, arglist);
	jsval *argv=JS_ARGV(cx, arglist);
	char*		str;
	char*		title = NULL;
	int32		left=0;
	int32		top=0;
	int32		width=INT_MAX;
	int32		height=INT_MAX;
	int32		mode=0;
	int		*cur = NULL;
	int		*bar = NULL;
	uifcapi_t*	uifc;
	uintN		argn=0;
	jsrefcount	rc;
	JSObject*	objarg;
	struct showbuf_ctx_private *p;
	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
	if((uifc=get_uifc(cx,obj))==NULL)
		return(JS_FALSE);
	if (argc < 3) {
		JS_ReportError(cx, "showbuf requires at least three arguments");
		return JS_FALSE;
	}
	if (!JS_ValueToInt32(cx, argv[argn++], &mode))
		return JS_FALSE;
	JSVALUE_TO_MSTRING(cx, argv[argn++], title, NULL);
	if(JS_IsExceptionPending(cx)) {
		free(title);
		return JS_FALSE;
	if(title==NULL)
		return(JS_TRUE);
	JSVALUE_TO_MSTRING(cx, argv[argn++], str, NULL);
	if(JS_IsExceptionPending(cx)) {
		free(title);
		return JS_FALSE;
	}
	if(str==NULL) {
		free(title);
		return(JS_TRUE);
	}
	if(argn<argc && JSVAL_IS_OBJECT(argv[argn])) {
		if((objarg = JSVAL_TO_OBJECT(argv[argn]))==NULL) {
			free(title);
			free(str);
			return(JS_FALSE);
		}
Deucе's avatar
Deucе committed
		if(JS_GetClass(cx, objarg) == &js_uifc_showbuf_ctx_class) {
			p = JS_GetPrivate(cx, objarg);
			if (p != NULL) {
				cur = &(p->cur);
				bar = &(p->bar);
				left = p->left;
				top = p->top;
				width = p->width;
				height = p->height;
			}
		}
	}
	rc=JS_SUSPENDREQUEST(cx);
	uifc->showbuf(mode, left, top, width, height,title, str, cur, bar);
	JS_RESUMEREQUEST(cx, rc);
	free(title);
	free(str);
	return(JS_TRUE);
}
/* Destructor */
Deucе's avatar
Deucе committed
static void
js_finalize(JSContext *cx, JSObject *obj)
	if((p=(uifcapi_t*)JS_GetPrivate(cx,obj))==NULL)
		return;
	free(p);
	JS_SetPrivate(cx,obj,NULL);
}
static jsSyncMethodSpec js_functions[] = {
	{"init",            js_uifc_init,       1,	JSTYPE_BOOLEAN,	JSDOCSTR("string title [, string mode]")
	,JSDOCSTR("initialize.  <tt>mode</tt> is a string representing the desired conio mode... one of STDIO, AUTO, "
deuce's avatar
deuce committed
	"X, CURSES, ANSI, CONIO, or SDL.")
Deucе's avatar
Deucе committed
	},
	{"bail",			js_uifc_bail,		0,	JSTYPE_VOID,	JSDOCSTR("")
	,JSDOCSTR("uninitialize")
	},
	{"msg",				js_uifc_msg,		1,	JSTYPE_VOID,	JSDOCSTR("string text")
	,JSDOCSTR("print a message")
	},
	{"pop",				js_uifc_pop,		1,	JSTYPE_VOID,	JSDOCSTR("[string text]")
	,JSDOCSTR("popup (or down) a message")
	{"input",			js_uifc_input,		0,	JSTYPE_STRING,	JSDOCSTR("[number mode] [,number left] [,number top] [,string default] [,number maxlen] [,number kmode]")
	,JSDOCSTR("prompt for a string input")
	{"list",			js_uifc_list,		0,	JSTYPE_NUMBER,	JSDOCSTR("[number mode,] string title, array options [,uifc.list.CTX object]")
	,JSDOCSTR("select from a list of options.<br>"
		"The context object can be created using new uifc.list.CTX() and if the same object is passed, allows WIN_SAV to work correctly.<br>"
		"The context object has the following properties:<br>cur, bar, top, left, width"
	)
	{"showhelp",			js_uifc_showhelp,	0,	JSTYPE_VOID,	JSDOCSTR("")
deuce's avatar
deuce committed
	,JSDOCSTR("Shows the current help text")
	,317
	},
	{"scrn",			js_uifc_scrn,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("string text")
	,JSDOCSTR("Fill the screen with the appropriate background attribute.  string is the title for the application banner.")
	,31802
	},
	{"showbuf",			js_uifc_showbuf,	7,	JSTYPE_VOID,	JSDOCSTR("number mode, string title, string helpbuf [,uifc.showbuf.CTX object]")
	,JSDOCSTR("Shows a scrollable text buffer - optionally parsing \"help markup codes\"<br>"
		"The context object can be created using new uifc.showbuf.CTX() and if the same object is passed, allows WIN_SAV to work correctly.<br>"
Deucе's avatar
Deucе committed
		"The context object has the following properties: cur, bar, top, left, width, height")
	,31802
	},
	{"timedisplay",			js_uifc_timedisplay,	0,	JSTYPE_VOID,	JSDOCSTR("[bool force = false]")
	,JSDOCSTR("Updates time in upper left corner of screen with current time in ASCII/Unix format")
	,31802
	},
	{"bottomline",			js_uifc_bottomline,	1,	JSTYPE_VOID,	JSDOCSTR("number mode")
	,JSDOCSTR("Displays the bottom line using the WIN_* mode flags")
	,31802
	},
	{"getstrxy",			js_uifc_getstrxy,	7,	JSTYPE_STRING,	JSDOCSTR("number left, number top, number width, number max, number mode[, string original][, uifc.getstrxy.CTX object]")
	,JSDOCSTR("String input/exit box at a specified position"
		"The context object can be created using new uifc.showbuf.CTX() and if the same object is passed, allows WIN_SAV to work correctly.<br>"
		"The context object has the following properties: lastkey")
	,31802
	},
static JSBool js_uifc_resolve(JSContext *cx, JSObject *obj, jsid id)
{
	char*			name=NULL;
deuce's avatar
deuce committed
	JSBool			ret;
deuce's avatar
deuce committed
	if(id != JSID_VOID && id != JSID_EMPTY) {
		jsval idval;
		JS_IdToValue(cx, id, &idval);
deuce's avatar
deuce committed
		if(JSVAL_IS_STRING(idval)) {
			JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL);
			HANDLE_PENDING(cx, name);
deuce's avatar
deuce committed
	}
deuce's avatar
deuce committed
	ret=js_SyncResolve(cx, obj, name, js_properties, js_functions, NULL, 0);
	if (name == NULL || strcmp(name, "list") == 0) {
		if(JS_GetProperty(cx, obj, "list", &objval)) {
			tobj = JSVAL_TO_OBJECT(objval);
			if (tobj)
				JS_InitClass(cx, tobj, NULL, &js_uifc_list_ctx_class, js_list_ctx_constructor, 0, NULL, NULL, NULL, NULL);
		}
	}
	if (name == NULL || strcmp(name, "showbuf") == 0) {
		if(JS_GetProperty(cx, obj, "showbuf", &objval)) {
			tobj = JSVAL_TO_OBJECT(objval);
			if (tobj)
				JS_InitClass(cx, tobj, NULL, &js_uifc_showbuf_ctx_class, js_showbuf_ctx_constructor, 0, NULL, NULL, NULL, NULL);
		}
	}
	if (name == NULL || strcmp(name, "getstrxy") == 0) {
		if(JS_GetProperty(cx, obj, "getstrxy", &objval)) {
			tobj = JSVAL_TO_OBJECT(objval);
			if (tobj)
				JS_InitClass(cx, tobj, NULL, &js_uifc_getstrxy_ctx_class, js_getstrxy_ctx_constructor, 0, NULL, NULL, NULL, NULL);
		}
	}
deuce's avatar
deuce committed
	if(name)
		free(name);
	return ret;
}
static JSBool js_uifc_enumerate(JSContext *cx, JSObject *obj)
{
deuce's avatar
deuce committed
	return(js_uifc_resolve(cx, obj, JSID_VOID));
static JSClass js_uifc_class = {
     "UIFC"					/* name			*/
    ,JSCLASS_HAS_PRIVATE	/* flags		*/
	,JS_PropertyStub		/* addProperty	*/
	,JS_PropertyStub		/* delProperty	*/
	,js_get					/* getProperty	*/
	,js_set					/* setProperty	*/
deuce's avatar
deuce committed
	,js_uifc_enumerate		/* enumerate	*/
	,js_uifc_resolve		/* resolve		*/
	,JS_ConvertStub			/* convert		*/
	,js_finalize			/* finalize		*/
};
JSObject* js_CreateUifcObject(JSContext* cx, JSObject* parent)
{
	JSObject*	obj;
	uifcapi_t*	api;
	if((obj = JS_DefineObject(cx, parent, "uifc", &js_uifc_class, NULL
		,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
		return(NULL);
	if((api=(uifcapi_t*)malloc(sizeof(uifcapi_t)))==NULL)
		return(NULL);
	memset(api,0,sizeof(uifcapi_t));
	api->size=sizeof(uifcapi_t);
	api->esc_delay=25;
	if(!JS_SetPrivate(cx, obj, api))	/* Store a pointer to uifcapi_t */
		return(NULL);
deuce's avatar
deuce committed
#ifdef BUILD_JSDOCS
	js_DescribeSyncObject(cx,obj,"User InterFaCe object - used for jsexec menus" ,314);
deuce's avatar
deuce committed
	js_CreateArrayOfStrings(cx, obj, "_property_desc_list", uifc_prop_desc, JSPROP_READONLY);
#endif