| 
#pragma	lib	"libomero.a"
#pragma src "/sys/src/libomero"
typedef struct Panel Panel;
typedef struct Oev Oev;
typedef struct Repl Repl;
enum {
	Npaths = 10,
	Fdata = 0,
	Fctl,
};
struct Repl{
	Repl*	next;	// in replica list
	char*	path;	// e.g., "/n/.../row:2/slider:volume"
	int	fd[2];	// data and ctl fds
};
struct Panel{
	QLock;		// name is WORM, so mostly for repl.
	Ref;		// One for user + one per event pointing to it.
	int	gone;	// true if the panel is gone.
	char*	name;	// e.g., "slider:volume"
	Panel*	next;	// in list of panels
	Repl*	repl;	// known replicas
	int	nrepl;
	Channel*evc;	// events here or through oeventchan(nil)
};
struct Oev {
	char*	path;	// to repl
	char*	ev;
	char*	arg;
	Panel*	panel;
};
/* User interface. because of
 * replication we have to provide many I/O functions, sic.
 */
Panel*		createpanel(char* name, char* type, char* omero);
Panel*		createsubpanel(Panel* g, char* name);
char*		panelpath(Panel*);
int		openpanel(Panel* g, int omode);
int		openpanelctl(Panel* g);
void		closepanel(Panel* g);
void		closepanelctl(Panel* g);
vlong		seekpanel(Panel*g, vlong pos, int type);
long		readpanel(Panel* g, void* buf, long len);
Dir*		dirstatpanel(Panel* g);
void*		readallpanel(Panel* g, long* l);
long		writepanel(Panel* g, void* buf, long len);
long		readpanelctl(Panel* g, void* buf, long len);
long		writepanelctl(Panel* g, void* buf, long len);
void		omeroterm(void);
Channel*	omeroeventchan(Panel* g);
void		clearoev(Oev* e);
void		removepanel(Panel* g);
int		panelctl(Panel* g, char* fmt, ...);
// Helpers
void		paneldump(int fd);
int		plumbexec(char* dir, char* arg);
int		plumblook(char* dir, char* arg);
void		evhistory(char* prg, char* ev, char* arg);
Channel*	createportproc(char* name);
int		createport(char* name);
// Implementation. Do not use
void		movepanel(char* from, char* to);
Repl*		findrepl(Panel* g, char* path, int mkit);
void		wpanelexcl(Panel* g, char* what, void* buf, long len, Repl* excl);
Panel*		findpanel(char* n, int mkit);
Panel*		mkpanel(char* path);
void		rpaneldata(Panel* g, Repl* r);
Panel*		newpanel(char* path, int mkit);
extern char*	appluiaddress;
extern int	omerodebug;
 |