typedef struct Edit Edit;
typedef struct Cmd Cmd;
typedef struct Xcmd Xcmd;
typedef struct Evh Evh;
typedef struct Sts Sts;
enum {
Sclean, // file is loaded and clean
Sdirty, // file is dirty
Stemp, // temporary panel (for errors)
// Edit fonts
FR = 0,
FT = 1,
// Clean policy constants
Dnrun = 10, // start cleanup when more than Dnrun are used.
Dnwins = 6, // clean until we get less than Dnwins used.
Dtime = 15*60,// keep Sclean edits younger than Dtime secs.
Tagmax = 4*1024,
};
/* Status for each editing panel
*/
struct Sts {
int sts; // Sclean, Sdirty, Stemp
int ss, se; // selection
int mark; // insertion point
int font; // FR or FT
};
/* Editing panel
*/
struct Edit{
Sts;
char* name; // path of file or edit name.
char* dir; // of file
Qid qid; // of file
long atime; // time() as of last use.
char* text; // being sent to/from omero
char* lastev;
int pid; // of associated user process
Panel* gcol; // column containing...
Panel* gtag; // tag line
Panel* gtext; // text edition panel
char* gcolname;//name of directory for gcol
};
/* Event handler
*/
struct Evh {
char* name;
void (*f)(Edit*, Oev*);
};
/* Builtin command
*/
struct Cmd {
char* name;
int (*f)(Edit*, int, char*[], int);
};
/* External command
*/
struct Xcmd {
long when; // time() when launched.
int pid; // of the external process
char* name; // for the file shown in the edit buffer
char* dir; // starting cwd for process
char* cmd; // cmd line(s)
char* ox; // path to ox column
int infd[2]; // pipe for stdin
int outfd[2]; // pipe for stdout
int errfd; // stderr. when -1, use outfd.
char* tag; // tag line
Channel*pidc; // to learn its pid
int scroll; // put omero panel in scrolling mode
};
// |sort -bd +1
int addr2ln(Edit* e, char* addr);
Xcmd* allocxcmd(char* path, char* dir, char* cmd, char* ox);
int cdone(Edit* e, int argc, char* argv[], int force);
void cleanedit(Edit* e, Dir* d);
char* cleanpath(char* file, char* dir);
void cmdinit(void);
void deledit(Edit* e);
void dumpedits(void);
void editcmd(Panel* gtext, char* ecmd, char* path);
Edit* editfile(char* path, int temp);
int editrun(Panel* t, char* dir, char* arg, char* path);
void externrunevent(char* path, char* ev, char* arg);
char* filedir(char* file);
void freexcmd(Xcmd* c);
int getsts(Panel* gtext, Sts* e);
char* gettagpath(Edit* e);
void inittagcmds(void);
int loadfile(Edit* e, char* file);
void look(Edit* e, char* arg, char* path);
void msgprint(Edit* e, char* fmt, ...);
void musthaveedits(void);
Edit* musthavemsgs(char* msgs);
void plumbinit(void);
void regerror(char* msg);
void run(Edit* e, char* arg, int, char* path);
void tagcmds(char* fn, char* buf, int max);
void threadmain(int argc, char* argv[]);
void updatetag(Edit* e, int keep);
void updatetext(Edit* e);
void wctl(char* path, char* ctl);
void xcmd(char* path, char* dir, char* arg, char* in, char* out, char* ox);
void xcmdproc(void* a);
int mustplumb(char* fn);
#define dprint if(debug)print
extern int debug;
extern Edit** edits;
extern int nedits;
|