GapBuf contents; /* underlying sequence data structure */
EditLog log; /* underlying log of edit operations */
Sel selection; /* the currently selected text */
+ Sel point; /* tracks external command I/O */
} Buf;
enum {
char* Matches[10];
Rule*** Rulesets = NULL;
size_t NumRulesets = 0;
+bool Launched = false;
static Rule*** BuiltinRules = (Rule**[]){
(Rule*[]){ /* Match URLS and open them with the browser */
int pid = fork();
if (pid > 0)
{
+ Launched = true;
ret = true;
}
else if (pid == 0)
static void check_ruleset(Rule** rule)
{
+ Launched = false;
for (; (*rule)->type != COMPLETE; rule++)
{
telem_send(" RULE(%s '%s' '%s')\n", type2str((*rule)->type), (*rule)->arg1, (*rule)->arg2);
}
}
- if ((*rule)->type == COMPLETE)
+ if (Launched && (*rule)->type == COMPLETE)
{
telem_send(" ACCEPT\n");
exit(0);
getcol(buf);
}
+static void putb(Buf* buf, char b, Sel* p_sel)
+{
+ if (p_sel->end < buf->point.beg)
+ {
+ buf->point.beg++;
+ }
+ if (p_sel->end <= buf->point.end)
+ {
+ buf->point.end++;
+ }
+ gapbuf_putb(&buf->contents, b, p_sel);
+}
+
static void putch(Buf* buf, char b, Sel* p_sel)
{
if (b != '\r')
{
if (b == '\n' && DosLineFeed)
{
- gapbuf_putb(&buf->contents, '\r', p_sel);
- gapbuf_putb(&buf->contents, '\n', p_sel);
+ putb(buf, '\r', p_sel);
+ putb(buf, '\n', p_sel);
}
else
{
- gapbuf_putb(&buf->contents, b, p_sel);
+ putb(buf, b, p_sel);
}
buf->status = MODIFIED;
}
char* str = buf_gets(buf);
gapbuf_del(&buf->contents, sel.beg, nbytes);
sel.end = sel.beg = (sel.beg < sel.end ? sel.beg : sel.end);
+ if (sel.end <= buf->point.beg)
+ {
+ buf->point.beg -= (buf->point.beg - sel.end);
+ }
+ if (sel.end <= buf->point.end)
+ {
+ buf->point.end -= (buf->point.end - sel.end);
+ }
buf->selection = sel;
editlog_add(buf, sel.beg, sel.end, str);
}
if (nread <= 0)
{
job->readfn = NULL;
- buf_logstop(&EditView->buffer);
Pty_Fd = -1;
EditView = NULL;
}
else if (nread > 0)
{
+// &while [ 1 ]; do sleep 1; echo foo; done
buffer[nread] = '\0';
- buf_logstart(&EditView->buffer);
+
+// printf("B1 - E: %lu P: %lu-%lu S: %lu-%lu\n",
+// buf_end(&(EditView->buffer)),
+// EditView->buffer.point.beg, EditView->buffer.point.end,
+// EditView->buffer.selection.beg, EditView->buffer.selection.end);
+
+ size_t start = EditView->buffer.point.beg;
+ Sel sel = EditView->buffer.selection;
+ EditView->buffer.selection.beg = EditView->buffer.point.beg;
+ EditView->buffer.selection.end = EditView->buffer.point.beg;
+ EditView->buffer.point = sel;
+
+// printf("B2 - E: %lu P: %lu-%lu S: %lu-%lu\n",
+// buf_end(&(EditView->buffer)),
+// EditView->buffer.point.beg, EditView->buffer.point.end,
+// EditView->buffer.selection.beg, EditView->buffer.selection.end);
+
view_putstr(EditView, buffer);
- }
-}
-static void xpty_write(Job* job)
-{
- job->writefn = NULL;
- shutdown(job->fd, SHUT_WR);
+ if (start <= sel.beg)
+ {
+ sel.beg += nread-1;
+ }
+ if (start <= sel.end)
+ {
+ sel.end += nread-1;
+ }
+ Sel point = EditView->buffer.selection;
+ EditView->buffer.selection = sel;
+ EditView->buffer.point = point;
+
+// printf("A - E: %lu P: %lu-%lu S: %lu-%lu\n",
+// buf_end(&(EditView->buffer)),
+// EditView->buffer.point.beg, EditView->buffer.point.end,
+// EditView->buffer.selection.beg, EditView->buffer.selection.end);
+ }
}
bool xpty_active(void)
{
Pty_Fd = fd;
EditView = view;
- job_spawn(Pty_Fd, xpty_read, xpty_write, NULL);
+ if (view_selsize(view))
+ {
+// puts("delete");
+ view_delete(view, LEFT, false);
+ }
+// printf("S - E: %lu P: %lu-%lu S: %lu-%lu\n",
+// buf_end(&(EditView->buffer)),
+// EditView->buffer.point.beg, EditView->buffer.point.end,
+// EditView->buffer.selection.beg, EditView->buffer.selection.end);
+ job_spawn(Pty_Fd, xpty_read, NULL, NULL);
}
}
return fd;
void xpty_send(uint32_t key)
{
- (void)key;
+ view_insert(EditView, key);
+// printf("%lu-%lu\n", EditView->buffer.point.beg, EditView->buffer.point.end);
}
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);
+ {
+ if (Focused == EDIT && xpty_active())
+ {
+ xpty_send(key);
+ }
+ else
+ {
+ view_insert(win_view(FOCUSED), key);
+ }
+ }
}
static void xmousebtn(XConf* x, XEvent* e)
execcmd[2] = cmd;
/* get the selection that the command will operate on */
- if (op && op != '<' && op != '!' && !view_selsize(win_view(EDIT)))
+ if (op && op != '<' && op != '!' && op != '&' && !view_selsize(win_view(EDIT)))
{
view_selectall(win_view(EDIT));
}