X-Git-Url: https://git.danieliu.xyz/?p=surf.git;a=blobdiff_plain;f=surf.c;h=a9da587e47397b1455c52bfde1991272e1234eb0;hp=d48fbc98655248b3f25bced8f9f00ff01e04c3bc;hb=1007143bda871936e93925a6942c587de2f8939f;hpb=1901359efa10fe2e18794df34fc33b81da03a6f5 diff --git a/surf.c b/surf.c index d48fbc9..a9da587 100644 --- a/surf.c +++ b/surf.c @@ -128,6 +128,12 @@ typedef struct { unsigned int stopevent; } Button; + +typedef struct { + char *token; + char *uri; +} SearchEngine; + typedef struct { const char *uri; Parameter config[ParameterLast]; @@ -214,6 +220,7 @@ static void webprocessterminated(WebKitWebView *v, Client *c); static void closeview(WebKitWebView *v, Client *c); static void destroywin(GtkWidget* w, Client *c); +static gchar *parseuri(const gchar *uri); /* Hotkeys */ static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); @@ -559,7 +566,7 @@ loaduri(Client *c, const Arg *a) url = g_strdup_printf("file://%s", path); free(path); } else { - url = g_strdup_printf("http://%s", uri); + url = parseuri(uri); } if (apath != uri) free(apath); @@ -1209,20 +1216,22 @@ newview(Client *c, WebKitWebView *rv) static gboolean readpipe(GIOChannel *s, GIOCondition ioc, gpointer unused) { - char msg[MSGBUFSZ]; - gsize msgsz; + static char msg[MSGBUFSZ], msgsz; GError *gerr = NULL; - if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) != + if (g_io_channel_read_chars(s, msg, sizeof(msg), NULL, &gerr) != G_IO_STATUS_NORMAL) { fprintf(stderr, "surf: error reading pipe: %s\n", gerr->message); g_error_free(gerr); return TRUE; } - msg[msgsz] = '\0'; + if ((msgsz = msg[0]) < 3) { + fprintf(stderr, "surf: message too short: %d\n", msgsz); + return TRUE; + } - switch (msg[1]) { + switch (msg[2]) { case 'i': close(pipein[1]); close(pipeout[0]); @@ -1763,6 +1772,22 @@ destroywin(GtkWidget* w, Client *c) gtk_main_quit(); } +gchar * +parseuri(const gchar *uri) { + guint i; + + for (i = 0; i < LENGTH(searchengines); i++) { + if (searchengines[i].token == NULL || searchengines[i].uri == NULL || + *(uri + strlen(searchengines[i].token)) != ' ') + continue; + if (g_str_has_prefix(uri, searchengines[i].token)) + return g_strdup_printf(searchengines[i].uri, + uri + strlen(searchengines[i].token) + 1); + } + + return g_strdup_printf("http://%s", uri); +} + void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) { @@ -1843,12 +1868,18 @@ zoom(Client *c, const Arg *a) static void msgext(Client *c, char type, const Arg *a) { - char msg[MSGBUFSZ] = { c->pageid, type, a->i, '\0' }; + static char msg[MSGBUFSZ]; + int ret; - if (pipeout[1]) { - if (write(pipeout[1], msg, sizeof(msg)) < 0) - fprintf(stderr, "surf: error sending: %s\n", msg); + if ((ret = snprintf(msg, sizeof(msg), "%c%c%c%c", + 4, c->pageid, type, a->i)) + >= sizeof(msg)) { + fprintf(stderr, "surf: message too long: %d\n", ret); + return; } + + if (pipeout[1] && write(pipeout[1], msg, sizeof(msg)) < 0) + fprintf(stderr, "surf: error sending: %.*s\n", ret-2, msg+2); } void @@ -2103,7 +2134,11 @@ main(int argc, char *argv[]) if (argc > 0) arg.v = argv[0]; else +#ifdef HOMEPAGE + arg.v = HOMEPAGE; +#else arg.v = "about:blank"; +#endif setup(); c = newclient(NULL);