From 21fcbc004e16a9de46424fb21ad9c32270779a0d Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sun, 10 Feb 2019 19:48:59 +0100 Subject: Makefile: rework how webextensions are handled --- Makefile | 42 +++++++++--------- config.mk | 2 +- libsurf-webext.c | 128 ------------------------------------------------------- webext-surf.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 148 deletions(-) delete mode 100644 libsurf-webext.c create mode 100644 webext-surf.c diff --git a/Makefile b/Makefile index 4f5253a..c3a87c5 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,13 @@ include config.mk SRC = surf.c CSRC = common.c -WEBEXTSRC = libsurf-webext.c +WSRC = webext-surf.c OBJ = $(SRC:.c=.o) COBJ = $(CSRC:.c=.o) -WEBEXTOBJ = $(WEBEXTSRC:.c=.o) +WOBJ = $(WSRC:.c=.o) +WLIB = $(WSRC:.c=.so) -all: options libsurf-webext.so surf +all: options surf $(WLIB) options: @echo surf build options: @@ -23,26 +24,25 @@ options: .c.o: $(CC) $(SURFCFLAGS) $(CFLAGS) -c $< +.o.so: + $(CC) -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ \ + $< $(COBJ) $(WEBEXTLIBS) + config.h: cp config.def.h $@ -$(OBJ): config.h common.h config.mk -$(COBJ): config.h common.h config.mk -$(WEBEXTOBJ): config.h common.h config.mk - -$(WEBEXTOBJ): $(WEBEXTSRC) - $(CC) $(WEBEXTCFLAGS) $(CFLAGS) -c $(WEBEXTSRC) - -libsurf-webext.so: $(WEBEXTOBJ) $(COBJ) - $(CC) -shared -Wl,-soname,$@ $(LDFLAGS) -o $@ \ - $(WEBEXTOBJ) $(COBJ) $(WEBEXTLIBS) +$(OBJ) $(COBJ) $(WOBJ): config.h common.h config.mk +$(WLIB): $(COBJ) surf: $(OBJ) $(COBJ) $(CC) $(SURFLDFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(COBJ) $(LIBS) +$(WOBJ): + $(CC) $(WEBEXTCFLAGS) $(CFLAGS) -c $(@:.o=.c) + clean: rm -f surf $(OBJ) $(COBJ) - rm -f libsurf-webext.so $(WEBEXTOBJ) + rm -f $(WLIB) $(WOBJ) distclean: clean rm -f config.h surf-$(VERSION).tar.gz @@ -51,7 +51,7 @@ dist: distclean mkdir -p surf-$(VERSION) cp -R LICENSE Makefile config.mk config.def.h README \ surf-open.sh arg.h TODO.md surf.png \ - surf.1 $(SRC) $(WEBEXTSRC) surf-$(VERSION) + surf.1 $(SRC) $(CSRC) $(WSRC) surf-$(VERSION) tar -cf surf-$(VERSION).tar surf-$(VERSION) gzip surf-$(VERSION).tar rm -rf surf-$(VERSION) @@ -61,8 +61,10 @@ install: all cp -f surf $(DESTDIR)$(PREFIX)/bin chmod 755 $(DESTDIR)$(PREFIX)/bin/surf mkdir -p $(DESTDIR)$(LIBDIR) - cp -f libsurf-webext.so $(DESTDIR)$(LIBDIR) - chmod 644 $(DESTDIR)$(LIBDIR)/libsurf-webext.so + cp -f $(WLIB) $(DESTDIR)$(LIBDIR) + for wlib in $(WLIB); do \ + chmod 644 $(DESTDIR)$(LIBDIR)/$$wlib; \ + done mkdir -p $(DESTDIR)$(MANPREFIX)/man1 sed "s/VERSION/$(VERSION)/g" < surf.1 > $(DESTDIR)$(MANPREFIX)/man1/surf.1 chmod 644 $(DESTDIR)$(MANPREFIX)/man1/surf.1 @@ -70,8 +72,10 @@ install: all uninstall: rm -f $(DESTDIR)$(PREFIX)/bin/surf rm -f $(DESTDIR)$(MANPREFIX)/man1/surf.1 - rm -f $(DESTDIR)$(LIBDIR)/libsurf-webext.so + for wlib in $(WLIB); do \ + rm -f $(DESTDIR)$(LIBDIR)/$$wlib; \ + done - rmdir $(DESTDIR)$(LIBDIR) .SUFFIXES: .so .o .c -.PHONY: all options clean-dist clean dist install uninstall +.PHONY: all options distclean clean dist install uninstall diff --git a/config.mk b/config.mk index 5e68e38..7450b5d 100644 --- a/config.mk +++ b/config.mk @@ -24,7 +24,7 @@ LIBS = $(X11LIB) $(GTKLIB) -lgthread-2.0 # flags CPPFLAGS = -DVERSION=\"$(VERSION)\" -DWEBEXTDIR=\"$(LIBDIR)\" \ -D_DEFAULT_SOURCE -DGCR_API_SUBJECT_TO_CHANGE -SURFCFLAGS = $(INCS) $(CPPFLAGS) -fPIC +SURFCFLAGS = -fPIC $(INCS) $(CPPFLAGS) WEBEXTCFLAGS = -fPIC $(WEBEXTINC) # compiler diff --git a/libsurf-webext.c b/libsurf-webext.c deleted file mode 100644 index ec9a235..0000000 --- a/libsurf-webext.c +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "common.h" - -#define LENGTH(x) (sizeof(x) / sizeof(x[0])) - -typedef struct Page { - guint64 id; - WebKitWebPage *webpage; - struct Page *next; -} Page; - -static int pipein, pipeout; -static Page *pages; - -Page * -newpage(WebKitWebPage *page) -{ - Page *p; - - if (!(p = calloc(1, sizeof(Page)))) - die("Cannot malloc!\n"); - - p->next = pages; - pages = p; - - p->id = webkit_web_page_get_id(page); - p->webpage = page; - - return p; -} - -static void -msgsurf(Page *p, const char *s) -{ - static char msg[MSGBUFSZ]; - size_t sln = strlen(s); - int ret; - - if ((ret = snprintf(msg, sizeof(msg), "%c%c%s", - 2 + sln, p ? p->id : 0, s)) - >= sizeof(msg)) { - fprintf(stderr, "webext: message too long: %d\n", ret); - return; - } - - if (pipeout && write(pipeout, msg, sizeof(msg)) < 0) - fprintf(stderr, "webext: error sending: %.*s\n", ret-2, msg+2); -} - -static gboolean -readpipe(GIOChannel *s, GIOCondition c, gpointer unused) -{ - static char msg[MSGBUFSZ], msgsz; - WebKitDOMDOMWindow *view; - GError *gerr = NULL; - glong wh, ww; - Page *p; - - if (g_io_channel_read_chars(s, msg, LENGTH(msg), NULL, &gerr) != - G_IO_STATUS_NORMAL) { - fprintf(stderr, "webext: error reading pipe: %s\n", - gerr->message); - g_error_free(gerr); - return TRUE; - } - if ((msgsz = msg[0]) < 3) { - fprintf(stderr, "webext: message too short: %d\n", msgsz); - return TRUE; - } - - for (p = pages; p; p = p->next) { - if (p->id == msg[1]) - break; - } - if (!p || !(view = webkit_dom_document_get_default_view( - webkit_web_page_get_dom_document(p->webpage)))) - return TRUE; - - switch (msg[2]) { - case 'h': - if (msgsz != 4) - return TRUE; - ww = webkit_dom_dom_window_get_inner_width(view); - webkit_dom_dom_window_scroll_by(view, - (ww / 100) * msg[3], 0); - break; - case 'v': - if (msgsz != 4) - return TRUE; - wh = webkit_dom_dom_window_get_inner_height(view); - webkit_dom_dom_window_scroll_by(view, - 0, (wh / 100) * msg[3]); - break; - } - - return TRUE; -} - -static void -webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused) -{ - Page *p = newpage(wp); -} - -G_MODULE_EXPORT void -webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, GVariant *gv) -{ - GIOChannel *gchanpipe; - - g_signal_connect(e, "page-created", G_CALLBACK(webpagecreated), NULL); - - g_variant_get(gv, "(ii)", &pipein, &pipeout); - msgsurf(NULL, "i"); - - gchanpipe = g_io_channel_unix_new(pipein); - g_io_channel_set_encoding(gchanpipe, NULL, NULL); - g_io_channel_set_close_on_unref(gchanpipe, TRUE); - g_io_add_watch(gchanpipe, G_IO_IN, readpipe, NULL); -} diff --git a/webext-surf.c b/webext-surf.c new file mode 100644 index 0000000..ec9a235 --- /dev/null +++ b/webext-surf.c @@ -0,0 +1,128 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "common.h" + +#define LENGTH(x) (sizeof(x) / sizeof(x[0])) + +typedef struct Page { + guint64 id; + WebKitWebPage *webpage; + struct Page *next; +} Page; + +static int pipein, pipeout; +static Page *pages; + +Page * +newpage(WebKitWebPage *page) +{ + Page *p; + + if (!(p = calloc(1, sizeof(Page)))) + die("Cannot malloc!\n"); + + p->next = pages; + pages = p; + + p->id = webkit_web_page_get_id(page); + p->webpage = page; + + return p; +} + +static void +msgsurf(Page *p, const char *s) +{ + static char msg[MSGBUFSZ]; + size_t sln = strlen(s); + int ret; + + if ((ret = snprintf(msg, sizeof(msg), "%c%c%s", + 2 + sln, p ? p->id : 0, s)) + >= sizeof(msg)) { + fprintf(stderr, "webext: message too long: %d\n", ret); + return; + } + + if (pipeout && write(pipeout, msg, sizeof(msg)) < 0) + fprintf(stderr, "webext: error sending: %.*s\n", ret-2, msg+2); +} + +static gboolean +readpipe(GIOChannel *s, GIOCondition c, gpointer unused) +{ + static char msg[MSGBUFSZ], msgsz; + WebKitDOMDOMWindow *view; + GError *gerr = NULL; + glong wh, ww; + Page *p; + + if (g_io_channel_read_chars(s, msg, LENGTH(msg), NULL, &gerr) != + G_IO_STATUS_NORMAL) { + fprintf(stderr, "webext: error reading pipe: %s\n", + gerr->message); + g_error_free(gerr); + return TRUE; + } + if ((msgsz = msg[0]) < 3) { + fprintf(stderr, "webext: message too short: %d\n", msgsz); + return TRUE; + } + + for (p = pages; p; p = p->next) { + if (p->id == msg[1]) + break; + } + if (!p || !(view = webkit_dom_document_get_default_view( + webkit_web_page_get_dom_document(p->webpage)))) + return TRUE; + + switch (msg[2]) { + case 'h': + if (msgsz != 4) + return TRUE; + ww = webkit_dom_dom_window_get_inner_width(view); + webkit_dom_dom_window_scroll_by(view, + (ww / 100) * msg[3], 0); + break; + case 'v': + if (msgsz != 4) + return TRUE; + wh = webkit_dom_dom_window_get_inner_height(view); + webkit_dom_dom_window_scroll_by(view, + 0, (wh / 100) * msg[3]); + break; + } + + return TRUE; +} + +static void +webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused) +{ + Page *p = newpage(wp); +} + +G_MODULE_EXPORT void +webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, GVariant *gv) +{ + GIOChannel *gchanpipe; + + g_signal_connect(e, "page-created", G_CALLBACK(webpagecreated), NULL); + + g_variant_get(gv, "(ii)", &pipein, &pipeout); + msgsurf(NULL, "i"); + + gchanpipe = g_io_channel_unix_new(pipein); + g_io_channel_set_encoding(gchanpipe, NULL, NULL); + g_io_channel_set_close_on_unref(gchanpipe, TRUE); + g_io_add_watch(gchanpipe, G_IO_IN, readpipe, NULL); +} -- cgit v1.2.3