#include "config.h"
+char* ARGV0;
Atom XA_REGISTRAR, XA_OPEN, XA_DONE;
int spawn(char* cmd) {
(const unsigned char *)value, strlen(value)+1);
}
-void edit_file(XConf* x, Window registrar, char* path, char* addr) {
+void edit_file(XConf* x, Window registrar, char* path, char* addr, int force) {
char* rpath = realpath(path, NULL);
prop_set(x, x->self, "FILE", (rpath ? rpath : path));
prop_set(x, x->self, "ADDR", addr);
XChangeProperty(
x->display, registrar, XA_OPEN, XA_WINDOW, 32, PropModeAppend,
(const unsigned char *)&(x->self), 1);
- /* wait for the "done" message */
- for (XEvent e;;) {
- XNextEvent(x->display, &e);
- if (e.type == ClientMessage) {
- if (e.xclient.message_type == XA_DONE) {
- break;
- } else if (e.xclient.message_type == XA_OPEN) {
- if (!fork()) {
- EditCmd[2] = addr, EditCmd[3] = path;
- exit(execvp(EditCmd[0], EditCmd));
+ EditCmd[2] = addr, EditCmd[3] = path;
+ if (force) {
+ if (!fork())
+ exit(execvp(EditCmd[0], EditCmd));
+ } else {
+ /* wait for the "done" message */
+ for (XEvent e;;) {
+ XNextEvent(x->display, &e);
+ if (e.type == ClientMessage) {
+ if (e.xclient.message_type == XA_DONE) {
+ break;
+ } else if (e.xclient.message_type == XA_OPEN) {
+ if (!fork())
+ exit(execvp(EditCmd[0], EditCmd));
+ break;
}
- break;
}
}
}
}
int main(int argc, char** argv) {
- XConf x = {0};
- x11_init(&x);
- x11_mkwin(&x, 1, 1, 0);
- XA_REGISTRAR = XInternAtom(x.display, "TIDE_REGISTRAR", PropertyChangeMask);
- XA_OPEN = XInternAtom(x.display, "OPEN", 0);
- XA_DONE = XInternAtom(x.display, "DONE", 0);
- Window registrar = start_registrar(&x);
- if (argc == 1) {
+ int force = 0;
+ OPTBEGIN { case 'f': force = 1; break; } OPTEND;
+ if (argc == 0) {
spawn("tide");
} else {
+ XConf x = {0};
+ x11_init(&x);
+ x11_mkwin(&x, 1, 1, 0);
+ XA_REGISTRAR = XInternAtom(x.display, "TIDE_REGISTRAR", PropertyChangeMask);
+ XA_OPEN = XInternAtom(x.display, "OPEN", 0);
+ XA_DONE = XInternAtom(x.display, "DONE", 0);
+ Window registrar = start_registrar(&x);
/* Loop over files and send an OPEN message for each one. */
- for (int i = 1; i < argc; i++) {
+ for (int i = 0; i < argc; i++) {
char* addr = strrchr(argv[i], ':');
if (addr) *addr = '\0', addr++;
- edit_file(&x, registrar, argv[i], (addr ? addr : "0"));
+ edit_file(&x, registrar, argv[i], (addr ? addr : "0"), force);
}
+ XSync(x.display, False);
}
- XSync(x.display, False);
return 0;
}