| .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) |