+/* Debug Telemetry
+ *****************************************************************************/
+void telem_send(char* fmt, ...);
+
/* Buffer management functions
*****************************************************************************/
/* undo/redo list item */
while (job && job->fd != fd)
job = job->next;
if (!job || !events) return;
+ telem_send("JOB(fd: %d, events: 0x%x)\n", fd, events);
if (job->readfn && (events & POLLIN))
+ {
+ telem_send("JOB_READ(fd: %d)\n", job->fd);
job->readfn(job);
+ }
if (job->writefn && (events & POLLOUT))
+ {
+ telem_send("JOB_WRITE(fd: %d)\n", job->fd);
job->writefn(job);
+ }
if ((events & (POLLHUP|POLLERR) && !job->readfn) || (!job->readfn && !job->writefn))
+ {
+ telem_send("JOB_FINISH(fd: %d)\n", job->fd);
job_finish(job);
+ }
}
static int job_exec(char** cmd, int* p_pid)
}
/* Poll until a job is ready, call the functions based on events */
long ret = poll(JobFds, njobs, ms);
+ telem_send("POLL(njobs: %d, ms: %d, ret: %d)\n", njobs, ms, ret);
if (ret < 0)
{
perror("poll() failed: ");
--- /dev/null
+#include <stdc.h>
+#include <time.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+static int TelemFd = -1;
+static char TelemBuf[16384];
+
+static long writefd(int fd, char* data, long towrite)
+{
+ long nwrite = 0;
+ while (towrite && ((nwrite = write(fd, data, towrite)) > 0))
+ {
+ data += nwrite;
+ towrite -= nwrite;
+ }
+ return nwrite;
+}
+
+static int open_telem(char* path)
+{
+ static unsigned long prev = 0;
+ unsigned long curr = time(NULL);
+ if ((TelemFd < 0) && ((curr - prev) >= 1))
+ {
+ TelemFd = open(path, O_WRONLY|O_NONBLOCK, 0);
+ prev = curr;
+ }
+ return TelemFd;
+}
+
+static void close_telem(void)
+{
+ close(TelemFd);
+ TelemFd = -1;
+}
+
+static char* advance(char* buf, size_t* p_len, long nwrite)
+{
+ if (nwrite >= 0)
+ {
+ *p_len -= nwrite;
+ buf = (buf + nwrite);
+ }
+ return buf;
+}
+
+static char* add_timestamp(char* buf, size_t* p_len)
+{
+ time_t rawtime;
+ time(&rawtime);
+ struct tm* timeinfo = localtime(&rawtime);
+ long nwrite = strftime(buf, *p_len, "[%F %T] ", timeinfo);
+ return advance(buf, p_len, nwrite);
+}
+
+static char* add_pid(char* buf, size_t* p_len)
+{
+ long nwrite = snprintf(buf, *p_len, "%s(%d) ", ARGV0, getpid());
+ return advance(buf, p_len, nwrite);
+}
+
+static char* add_message(char* buf, size_t* p_len, char* fmt, va_list args)
+{
+ long nwrite = vsnprintf(buf, *p_len, fmt, args);
+ return advance(buf, p_len, nwrite);
+}
+
+static char* get_fifo_path(void)
+{
+ static char path[1024] = {0};
+ if (!path[0])
+ {
+ snprintf(path, sizeof(path)-1,"%s/tide-telem", getpwuid(getuid())->pw_dir);
+ }
+ return path;
+}
+
+void telem_send(char* fmt, ...)
+{
+ char* str = TelemBuf;
+ size_t nleft = sizeof(TelemBuf);
+ int fd = open_telem(get_fifo_path());
+ if (fd >= 0)
+ {
+ void (*sigfn)(int) = signal(SIGPIPE, SIG_IGN);
+ va_list args;
+ va_start(args, fmt);
+ str = add_timestamp(str, &nleft);
+ str = add_pid(str, &nleft);
+ str = add_message(str, &nleft, fmt, args);
+ va_end(args);
+ if (writefd(fd, TelemBuf, str - TelemBuf) < 0)
+ {
+ close_telem();
+ }
+ signal(SIGPIPE, sigfn);
+ }
+}
void cut(char* arg);
void paste(char* arg);
-typedef struct
-{
+typedef struct {
char* tag;
void (*action)(char*);
} Tag;
{
Focused = (e->xkey.y <= Divider ? TAGS : EDIT);
uint32_t key = x11_process_key(x, e, Bindings);
+ telem_send("KEY(reg: %d, key: 0x%x)\n", Focused, key);
if (key != RUNE_ERR)
view_insert(win_view(FOCUSED), key);
}
size_t row, col;
Focused = (e->xbutton.y <= Divider ? TAGS : EDIT);
get_position(Focused, e->xbutton.x, e->xbutton.y, &row, &col);
- switch (process_mouse(e->xbutton.button, (e->type == ButtonPress)))
+ int action = process_mouse(e->xbutton.button, (e->type == ButtonPress));
+ telem_send("BTNPRESS(reg: %d, btn: %d, press: %d, act: %d)\n",
+ Focused, e->xbutton.button, (e->type == ButtonPress), action);
+ switch (action)
{
case MouseActNone:
break;
size_t row, col;
int xpos = e->xbutton.x, ypos = e->xbutton.y;
get_position(Focused, xpos, ypos, &row, &col);
+ telem_send("BTNMOVE(reg: %d, btn: 0x%x, x: %d, y: %d, r: %d, c: %d)\n",
+ Focused, e->xbutton.state, xpos, ypos, row, col);
if (PRESSED(e->xbutton.state, MouseLeft))
view_setcursor(win_view(Focused), row, col, true);
}
void xresize(XConf* x, XEvent* e)
{
+ telem_send("RESIZE(w: %d, h: %d)\n", e->xconfigure.width, e->xconfigure.height);
if (e->xconfigure.width != x->width || e->xconfigure.height != x->height)
view_sync(win_view(EDIT));
x11_resize(x, e);
size_t tagrows = view_limitrows(win_view(TAGS), maxtagrows);
size_t tagregsz = (tagrows * x->tagfont->height) + 7;
size_t editrows = (height - tagregsz) / x->font->height ;
+ telem_send("REDRAW(tagrows: %d, editrows: %d)\n", tagrows, editrows);
/* draw the regions to the window */
int olddiv = Divider;