| .TH ACME 3 | 
 | .SH NAME | 
 | Event, Win, | 
 | eventfmt, | 
 | newwin, | 
 | pipetowin, | 
 | pipewinto, | 
 | sysrun, | 
 | winaddr, | 
 | winclosefiles, | 
 | winctl, | 
 | windel, | 
 | windeleteall, | 
 | windows, | 
 | wineventchan, | 
 | winfd, | 
 | winfree, | 
 | winmread, | 
 | winname, | 
 | winopenfd, | 
 | winprint, | 
 | winread, | 
 | winreadaddr, | 
 | winreadevent, | 
 | winseek, | 
 | winwrite, | 
 | winwriteevent \- acme client library | 
 | .SH SYNOPSIS | 
 | .ft L | 
 | .nf | 
 | #include <u.h> | 
 | #include <libc.h> | 
 | #include <thread.h> | 
 | #include <9pclient.h> | 
 | #include <acme.h> | 
 | .fi | 
 | .PP | 
 | .ft L | 
 | .ta +\w'\fLxxxx'u +\w'\fLxxxxx'u | 
 | .nf | 
 | struct Event | 
 | { | 
 | 	int	c1; | 
 | 	int	c2; | 
 | 	int	q0; | 
 | 	int	q1; | 
 | 	int	oq0; | 
 | 	int	oq1; | 
 | 	int	flag; | 
 | 	int	nb; | 
 | 	int	nr; | 
 | 	char	text[]; | 
 | 	char	arg[]; | 
 | 	char	loc[]; | 
 | }; | 
 | .PP | 
 | .ta +\w'\fLxxxxxxxxxx'u | 
 | .B | 
 | int	eventfmt(Fmt *fmt) | 
 | .PP | 
 | .B | 
 | Win*	newwin(void) | 
 | .PP | 
 | .B | 
 | Win*	openwin(int id, CFid *ctlfid) | 
 | .PP | 
 | .B | 
 | int	pipetowin(Win *w, char *file, int fderr, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | int	pipewinto(Win *w, char *file, int fdout, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | char*	sysrun(char *fmt, ...) | 
 | .PP | 
 | .B | 
 | int	winaddr(Win *w, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | void	winclosefiles(Win *w) | 
 | .PP | 
 | .B | 
 | int	winctl(Win *w, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | int	windel(Win *w, int sure) | 
 | .PP | 
 | .B | 
 | void	windeleteall(void) | 
 | .PP | 
 | .B | 
 | Channel*	wineventchan(Win *w) | 
 | .PP | 
 | .B | 
 | int	winfd(Win *w, char *name, int mode) | 
 | .PP | 
 | .B | 
 | void	winfree(Win *w) | 
 | .PP | 
 | .B | 
 | char*	winmread(Win *w, char *file) | 
 | .PP | 
 | .B | 
 | int	winname(Win *w, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | int	winopenfd(Win *w, char *name, int mode) | 
 | .PP | 
 | .B | 
 | int	winprint(Win *w, char *file, char *fmt, ...) | 
 | .PP | 
 | .B | 
 | int	winread(Win *w, char *file, void *a, int n) | 
 | .PP | 
 | .B | 
 | int	winreadaddr(Win *w, uint *q1) | 
 | .PP | 
 | .B | 
 | int	winreadevent(Win *w, Event *e) | 
 | .PP | 
 | .B | 
 | int	winseek(Win *w, char *file, int off, int type) | 
 | .PP | 
 | .B | 
 | int	winwrite(Win *w, char *file, void *a, int n) | 
 | .PP | 
 | .B | 
 | int	winwriteevent(Win *w, Event *e) | 
 | .PP | 
 | .B | 
 | void*	emalloc(uint n) | 
 | .PP | 
 | .B | 
 | void*	erealloc(void *v, uint n) | 
 | .PP | 
 | .B | 
 | char*	estrdup(char *s) | 
 | .PP | 
 | .B | 
 | char*	evsmprint(char *fmt, va_list arg) | 
 | .SH DESCRIPTION | 
 | .I Libacme | 
 | provides a simple C interface for interacting with | 
 | .IR acme (1) | 
 | windows. | 
 | .PP | 
 | A | 
 | .B Win | 
 | structure represents a single window and its control files. | 
 | The contents of the structure should not be accessed directly. | 
 | .I Newwin | 
 | creates a new window and returns a structure corresponding to that window. | 
 | .I Openwin | 
 | allocates a structure corresponding to the existing window with the given | 
 | .IR id . | 
 | If | 
 | .I ctlfid | 
 | is non-nil,  | 
 | .I openwin | 
 | assumes it is a file descriptor open for writing to the window's | 
 | .B ctl | 
 | file. | 
 | Ownership of | 
 | .I ctlfid | 
 | passes to the library. | 
 | .PP | 
 | Most of the library routines access files in the window's | 
 | .I acme | 
 | directory. | 
 | See | 
 | .IR acme (4) | 
 | for details. | 
 | Many library routines take a format string | 
 | .I fmt | 
 | followed by a variable list of arguments. | 
 | In the discussion below, the notation | 
 | .I fmt\fR, \fP... | 
 | denotes the result of formatting the string and arguments | 
 | using | 
 | .I smprint | 
 | (see | 
 | .IR print (3)). | 
 | .PP | 
 | .I Pipetowin | 
 | runs the | 
 | .IR rc (1) | 
 | command line | 
 | .I fmt\fR, \fP... | 
 | with  | 
 | .B /dev/null | 
 | on standard input and the window's | 
 | .I file | 
 | on standard output. | 
 | If | 
 | .I fderr | 
 | is non-zero (sic),  | 
 | it is used as standard error. | 
 | Otherwise the command inherits the caller's standard error. | 
 | .PP | 
 | .I Pipewinto | 
 | runs the  | 
 | .IR rc (1) | 
 | command line | 
 | .I fmt\fR, \fP... | 
 | with the window's | 
 | .I file | 
 | on standard input. | 
 | The command runs with | 
 | .I fdout  | 
 | as its standard output and standard error. | 
 | .PP | 
 | .I Sysrun | 
 | runs the | 
 | .I rc | 
 | command line | 
 | .I fmt\fR, \fP... | 
 | and returns a pointer to the first kilobyte of output, NUL-terminated. | 
 | The buffer holding the output is reused on each call. | 
 | .PP | 
 | .I Winaddr | 
 | writes | 
 | .I fmt\fR, \fP... | 
 | to the window's | 
 | .B addr | 
 | file. | 
 | .PP | 
 | .I Winclosefiles | 
 | closes all the open file descriptors associated with the window. | 
 | (These file descriptors are maintained from the library and  | 
 | cached across calls to  | 
 | .IR winctl , | 
 | .IR etc .) | 
 | .PP | 
 | .I Winctl | 
 | writes | 
 | .I fmt\fR, \fP... | 
 | to the window's | 
 | .B ctl | 
 | file. | 
 | .PP | 
 | .I Windel | 
 | deletes the window, | 
 | writing | 
 | .B del | 
 | (or, if | 
 | .I sure | 
 | is set, | 
 | .B delete) | 
 | to the window's | 
 | .B ctl | 
 | file. | 
 | .PP | 
 | .I Winfd | 
 | returns a file descriptor for the window's | 
 | .I file | 
 | opened for | 
 | .IR mode . | 
 | The caller is responsible for closing the file descriptor. | 
 | .PP | 
 | .I Winmread | 
 | reads the contents of the window's | 
 | .I file | 
 | into a dynamically allocated buffer | 
 | and returns it. | 
 | The caller is responsible for freeing the buffer. | 
 | .PP | 
 | .I Winname | 
 | sets the name of the window to | 
 | .I fmt\fR, \fP... | 
 | by writing to the | 
 | .B ctl | 
 | file. | 
 | .PP | 
 | .I Winprint | 
 | prints | 
 | .I fmt\fR, \fP... | 
 | to the window's | 
 | .IR file . | 
 | .PP | 
 | .I Winread | 
 | reads at most  | 
 | .I n | 
 | bytes from the window's | 
 | .IR file | 
 | into the buffer pointed at by | 
 | .IR a . | 
 | .PP | 
 | .I Winreadaddr | 
 | reads the window's | 
 | .B addr | 
 | file, which contains two integers. | 
 | It returns the first and stores the second in  | 
 | .BI * q1 \fR. | 
 | .PP | 
 | .I Winseek | 
 | seeks the file descriptor for the window's | 
 | .I file | 
 | to position | 
 | .I off | 
 | relative to | 
 | .I type | 
 | (see | 
 | .IR seek (3)). | 
 | .PP | 
 | .I Winwrite | 
 | writes the | 
 | .I n | 
 | bytes pointed at by | 
 | .I a | 
 | to the window's | 
 | .IR file . | 
 | .PP | 
 | An | 
 | .B Event | 
 | structure represents an event originating in a particular window. | 
 | The fields correspond to the fields in | 
 | .IR acme 's | 
 | event messages. | 
 | See  | 
 | .IR acme (4) | 
 | for detailed explanations. | 
 | The fields are: | 
 | .TP | 
 | .BR c1 ", " c2 | 
 | The two event characters, indicating origin and type of action. | 
 | .TP | 
 | .BR q0 ", " q1 | 
 | The character addresses of the action. | 
 | If the original event had an empty selection | 
 | .RB ( q0 = q1 ) | 
 | and was accompanied by an expansion | 
 | (the 2 bit is set in the flag), then  | 
 | .B q0 | 
 | and | 
 | .B q1 | 
 | will indicate the expansion rather than original event. | 
 | .TP | 
 | .BR oq0 ", " oq1 | 
 | The  | 
 | .B q0 | 
 | and | 
 | .B q1 | 
 | of the original event, even if it was expanded. | 
 | If there was no expansion, | 
 | .BR oq0 = q0 | 
 | and | 
 | .BR oq1 = q1 . | 
 | .TP | 
 | .B flag | 
 | The flag. | 
 | .TP | 
 | .B nr | 
 | The number of characters (UTF sequences) included in the optional text. | 
 | .TP | 
 | .B text | 
 | The optional text itself, encoded in UTF. | 
 | .TP | 
 | .B nb | 
 | The number of bytes included in the optional text. | 
 | .TP | 
 | .B arg | 
 | The chorded argument, if present | 
 | (the 8 bit is set in the flag). | 
 | .TP | 
 | .B loc | 
 | The chorded location, if present | 
 | (the 8 bit is set in the flag). | 
 | .PD | 
 | .PP | 
 | .I Winreadevent | 
 | reads the next event (q.v.) | 
 | from the window's | 
 | .B event | 
 | file. | 
 | .PP | 
 | .I Winwriteevent | 
 | writes an event back to the window's  | 
 | .B event | 
 | file, indicating to | 
 | .I acme | 
 | that it should be handled internally. | 
 | .PP | 
 | .I Wineventchan | 
 | returns a pointer to a | 
 | .B Channel | 
 | (see | 
 | .IR thread (3)) | 
 | on which event structures (not pointers) can be read. | 
 | The first call to | 
 | .I wineventchan | 
 | allocates a channel and | 
 | starts a new thread that loops calling | 
 | .I winreadevent | 
 | and copying the events into the channel. | 
 | Subsequent calls return the same channel. | 
 | Clients should not call | 
 | .I winreadevent | 
 | after calling | 
 | .IR wineventchan . | 
 | .PP | 
 | .IR Emalloc , | 
 | .IR erealloc , | 
 | .IR estrdup , | 
 | and | 
 | .I evsmprint | 
 | are like | 
 | .IR malloc (3), | 
 | .IR realloc , | 
 | .IR strdup | 
 | (see | 
 | .IR strcat (3)), | 
 | and | 
 | .IR vsmprint | 
 | (see | 
 | .IR print (3)), | 
 | but they call | 
 | .IR sysfatal (3) | 
 | on error rather than returning nil. | 
 | .SH SOURCE | 
 | .B \*9/src/libacme | 
 | .SH SEE ALSO | 
 | .IR acme (1), | 
 | .IR acme (4) |