attach libevent via an plugin command.
Signed-off-by: NeilBrown <neil@brown.name>
# May be distrubuted under terms of GPLv2 - see file:COPYING
#
-LDLIBS= -levent -ldl
+LDLIBS= -ldl
CPPFLAGS= -I.
CFLAGS=-g -Wall -Werror -Wstrict-prototypes -Wextra -Wno-unused-parameter
O/render-hex.o O/render-lines.o \
O/render-format.o O/render-complete.o \
O/lib-view.o O/lib-tile.o O/lib-popup.o O/lib-line-count.o O/lib-keymap.o \
- O/lib-search.o O/lib-messageline.o O/lib-input.o \
+ O/lib-search.o O/lib-messageline.o O/lib-input.o O/lib-libevent.o \
O/lang-python.o \
O/mode-emacs.o \
O/display-ncurses.o
LIBS-display-ncurses = -lncursesw
INC-display-ncurses = -I/usr/include/ncursesw
+LIBS-lib-libevent = -levent
+
SO = $(patsubst O/%.o,lib/edlib-%.so,$(SHOBJ))
H = list.h core.h misc.h
edlib: $(OBJ) lib/libedlib.so
struct editor {
struct pane root;
- struct event_base *base;
struct doc *docs; /* document containing all documents */
struct map *commands;
};
}
static inline int call_home(struct pane *home, char *key, struct pane *focus,
- int numeric, struct mark *m)
+ int numeric, struct mark *m, struct command *comm)
{
struct cmd_info ci = {0};
ci.home = home;
ci.numeric = numeric;
ci.mark = m;
+ ci.comm2 = comm;
return key_handle_focus(&ci);
}
#include <string.h>
#include <locale.h>
#include <ctype.h>
-#include <event.h>
#include <signal.h>
#include <sys/ioctl.h>
current_screen = scr;
}
-static void input_handle(int fd, short ev, void *P);
-
static void move_cursor(struct pane *p)
{
int ox;
}
}
+DEF_CMD(input_handle);
+DEF_CMD(handle_winch);
+
DEF_CMD(nc_misc)
{
struct pane *p = ci->home;
- struct editor *ed = pane2ed(p);
if (strcmp(ci->str, "exit") == 0)
- event_base_loopbreak(ed->base);
+ call3("event:deactivate", p, 0, NULL);
else if (strcmp(ci->str, "refresh") == 0) {
clear();
pane_damaged(p, DAMAGED_SIZE);
return 0;
}
-static void handle_winch(int sig, short ev, void *null);
static struct pane *ncurses_init(struct editor *ed)
{
WINDOW *w = initscr();
struct pane *p;
- struct event *l;
struct display_data *dd = malloc(sizeof(*dd));
start_color();
getmaxyx(stdscr, p->h, p->w); p->h-=1;
- l = event_new(ed->base, 0, EV_READ|EV_PERSIST, input_handle, p);
- event_add(l, NULL);
- l = event_new(ed->base, SIGWINCH, EV_SIGNAL|EV_PERSIST,
- handle_winch, p);
- event_add(l, NULL);
+ call_home(p, "event:read", p, 0, NULL, &input_handle);
+ call_home(p, "event:signal", p, SIGWINCH, NULL, &handle_winch);
pane_damaged(p, DAMAGED_SIZE);
return pane_attach(p, "input", NULL, NULL);
}
-static void handle_winch(int sig, short ev, void *vpane)
+REDEF_CMD(handle_winch)
{
- struct pane *p = vpane;
+ struct pane *p = ci->home;
struct winsize size;
ioctl(1, TIOCGWINSZ, &size);
resize_term(size.ws_row, size.ws_col);
clear();
pane_damaged(p, DAMAGED_SIZE);
pane_refresh(p);
+ return 1;
}
static void ncurses_clear(struct pane *p, int attr, int x, int y, int w, int h)
do_send_mouse(p, x, y, "MouseMove");
}
-static void input_handle(int fd, short ev, void *P)
+REDEF_CMD(input_handle)
{
- struct pane *p = P;
+ struct pane *p = ci->home;
wint_t c;
int is_keycode;
send_key(is_keycode, c, p);
}
pane_refresh(p);
+ return 1;
}
DEF_CMD(display_ncurses)
#include <stdlib.h>
#include <locale.h>
#include <fcntl.h>
-#include <event.h>
#include <wchar.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char *argv[])
{
- struct event_base *base;
struct pane *root, *global;
struct pane *b, *p= NULL;
struct cmd_info ci = {0};
ed = pane2ed(vroot);
setlocale(LC_ALL, "");
setlocale(LC_CTYPE, "enUS.UTF-8");
- base = event_base_new();
- event_base_priority_init(base, 2);
- ed->base = base;
editor_load_module(ed, "lib-line-count");
editor_load_module(ed, "lib-search");
+ editor_load_module(ed, "lib-libevent");
editor_load_module(ed, "display-ncurses");
+ call3("libevent:activate", vroot, 0, NULL);
ci.home = ci.focus = vroot;
ci.key = "display-ncurses";
cr.c = take_pane;
key_handle(&ci);
pane_refresh(&ed->root);
- event_base_dispatch(base);
+ call3("event:run", vroot, 0, NULL);
}
pane_close(&ed->root);
exit(0);
--- /dev/null
+/*
+ * Copyright Neil Brown ©2015 <neil@brown.name>
+ * May be distributed under terms of GPLv2 - see file:COPYING
+ *
+ * libevent support for edlib.
+ *
+ * Register command "libevent:activate".
+ * When that is called, register:
+ * "event:read"
+ * "event:signal"
+ * "event:run"
+ * "event:deactivate"
+ *
+ * When "event:deactivate" is called, cause event:run to abort.
+ */
+
+
+#include <stdlib.h>
+#include <event.h>
+#include "core.h"
+
+static struct event_base *base;
+static struct list_head event_list;
+
+struct evt {
+ struct event *l;
+ struct pane *home;
+ struct command *comm;
+ struct list_head lst;
+};
+
+static void call_event(int thing, short sev, void *evv)
+{
+ struct evt *ev = evv;
+ struct cmd_info ci = {0};
+
+ ci.key = "callback:event";
+ ci.home = ci.focus = ev->home;
+ ci.comm = ev->comm;
+ ci.numeric = thing;
+ ev->comm->func(&ci);
+}
+
+DEF_CMD(libevent_read)
+{
+ struct evt *ev = malloc(sizeof(*ev));
+ ev->l = event_new(base, ci->numeric, EV_READ|EV_PERSIST,
+ call_event, ev);
+ ev->home = ci->focus;
+ ev->comm = ci->comm2;
+ list_add(&ev->lst, &event_list);
+ event_add(ev->l, NULL);
+ return 1;
+}
+
+DEF_CMD(libevent_signal)
+{
+ struct evt *ev = malloc(sizeof(*ev));
+ ev->l = event_new(base, ci->numeric, EV_SIGNAL|EV_PERSIST,
+ call_event, ev);
+ ev->home = ci->focus;
+ ev->comm = ci->comm2;
+ list_add(&ev->lst, &event_list);
+ event_add(ev->l, NULL);
+ return 1;
+}
+
+DEF_CMD(libevent_run)
+{
+ struct event_base *b = base;
+ event_base_dispatch(b);
+ while (!list_empty(&event_list)) {
+ struct evt *ev = list_first_entry(&event_list, struct evt, lst);
+ list_del(&ev->lst);
+ event_del(ev->l);
+ event_free(ev->l);
+ }
+ event_base_free(b);
+ return 1;
+}
+
+DEF_CMD(libevent_deactivate)
+{
+ event_base_loopbreak(base);
+ base = NULL;
+ return 1;
+}
+
+DEF_CMD(libevent_activate)
+{
+ if (base)
+ return 1;
+ base = event_base_new();
+ INIT_LIST_HEAD(&event_list);
+
+ call_comm("global-set-command", ci->focus, 0, NULL, "event:read",
+ 0, &libevent_read);
+ call_comm("global-set-command", ci->focus, 0, NULL, "event:signal",
+ 0, &libevent_signal);
+ call_comm("global-set-command", ci->focus, 0, NULL, "event:run",
+ 0, &libevent_run);
+ call_comm("global-set-command", ci->focus, 0, NULL, "event:deactivate",
+ 0, &libevent_deactivate);
+
+ return 1;
+}
+
+void edlib_init(struct editor *ed)
+{
+ call_comm("global-set-command", &ed->root, 0, NULL, "libevent:activate",
+ 0, &libevent_activate);
+}