applied history
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index aad863e..a4465d4 100644 (file)
--- 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];
@@ -175,6 +181,7 @@ static void spawn(Client *c, const Arg *a);
 static void msgext(Client *c, char type, const Arg *a);
 static void destroyclient(Client *c);
 static void cleanup(void);
+static void updatehistory(const char *u, const char *t);
 
 /* GTK/WebKit */
 static WebKitWebView *newview(Client *c, WebKitWebView *rv);
@@ -214,6 +221,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);
@@ -231,6 +239,7 @@ static void togglefullscreen(Client *c, const Arg *a);
 static void togglecookiepolicy(Client *c, const Arg *a);
 static void toggleinspector(Client *c, const Arg *a);
 static void find(Client *c, const Arg *a);
+static void playexternal(Client *c, const Arg *a);
 
 /* Buttons */
 static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
@@ -336,10 +345,11 @@ setup(void)
        curconfig = defconfig;
 
        /* dirs and files */
-       cookiefile = buildfile(cookiefile);
-       scriptfile = buildfile(scriptfile);
-       cachedir   = buildpath(cachedir);
-       certdir    = buildpath(certdir);
+       cookiefile  = buildfile(cookiefile);
+       historyfile = buildfile(historyfile);
+       scriptfile  = buildfile(scriptfile);
+       cachedir    = buildpath(cachedir);
+       certdir     = buildpath(certdir);
 
        gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy));
 
@@ -559,7 +569,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);
@@ -1076,12 +1086,28 @@ cleanup(void)
        close(pipein[0]);
        close(pipeout[1]);
        g_free(cookiefile);
+       g_free(historyfile);
        g_free(scriptfile);
        g_free(stylefile);
        g_free(cachedir);
        XCloseDisplay(dpy);
 }
 
+void
+updatehistory(const char *u, const char *t)
+{
+       FILE *f;
+       f = fopen(historyfile, "a+");
+
+       char b[20];
+       time_t now = time (0);
+       strftime (b, 20, "%Y-%m-%d %H:%M:%S", localtime (&now));
+       fputs(b, f);
+
+       fprintf(f, " %s %s\n", u, t);
+       fclose(f);
+}
+
 WebKitWebView *
 newview(Client *c, WebKitWebView *rv)
 {
@@ -1491,6 +1517,7 @@ loadfailedtls(WebKitWebView *v, gchar *uri, GTlsCertificate *cert,
        return TRUE;
 }
 
+
 void
 loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
 {
@@ -1519,6 +1546,7 @@ loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
                break;
        case WEBKIT_LOAD_FINISHED:
                seturiparameters(c, uri, loadfinished);
+               updatehistory(uri, c->title);
                /* Disabled until we write some WebKitWebExtension for
                 * manipulating the DOM directly.
                evalscript(c, "document.documentElement.style.overflow = '%s'",
@@ -1765,6 +1793,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)
 {
@@ -1971,6 +2015,15 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h)
        spawn(c, &arg);
 }
 
+void
+playexternal(Client *c, const Arg *a)
+{
+       Arg arg;
+
+       arg = (Arg)VIDEOPLAY(geturi(c));
+       spawn(c, &arg);
+}
+
 int
 main(int argc, char *argv[])
 {