Fix clickexternplayer(), no need to test the target again
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 1f3b7db..a5cfdd0 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -70,7 +70,7 @@ typedef struct Client {
        GTlsCertificateFlags tlsflags;
        Window xid;
        int progress, fullscreen;
-       const char *title, *targeturi;
+       const char *title, *overtitle, *targeturi;
        const char *needle;
        struct Client *next;
 } Client;
@@ -105,7 +105,6 @@ static void sigchld(int unused);
 static char *buildfile(const char *path);
 static char *buildpath(const char *path);
 static Client *newclient(Client *c);
-static void addaccelgroup(Client *c);
 static void loaduri(Client *c, const Arg *a);
 static const char *geturi(Client *c);
 static void setatom(Client *c, int a, const char *v);
@@ -131,8 +130,6 @@ static WebKitWebView *newview(Client *c, WebKitWebView *rv);
 static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a,
                              Client *c);
 static gboolean buttonreleased(GtkWidget *w, GdkEvent *e, Client *c);
-static gboolean keypress(GtkAccelGroup *group, GObject *obj, guint key,
-                         GdkModifierType mods, Client *c);
 static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event,
                                 gpointer d);
 static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c);
@@ -343,21 +340,6 @@ newclient(Client *rc)
        return c;
 }
 
-void
-addaccelgroup(Client *c)
-{
-       int i;
-       GtkAccelGroup *group = gtk_accel_group_new();
-       GClosure *closure;
-
-       for (i = 0; i < LENGTH(keys); i++) {
-               closure = g_cclosure_new(G_CALLBACK(keypress), c, NULL);
-               gtk_accel_group_connect(group, keys[i].keyval, keys[i].mod, 0,
-                                       closure);
-       }
-       gtk_window_add_accel_group(GTK_WINDOW(c->win), group);
-}
-
 void
 loaduri(Client *c, const Arg *a)
 {
@@ -433,7 +415,7 @@ void
 updatetitle(Client *c)
 {
        char *title;
-       const char *name = c->targeturi ? c->targeturi :
+       const char *name = c->overtitle ? c->overtitle :
                           c->title ? c->title : "";
 
        if (showindicators) {
@@ -744,6 +726,13 @@ newview(Client *c, WebKitWebView *rv)
                webkit_cookie_manager_set_accept_policy(
                    webkit_web_context_get_cookie_manager(context),
                    cookiepolicy_get());
+               /* languages */
+               webkit_web_context_set_preferred_languages(context,
+                                                          preferedlanguages);
+               webkit_web_context_set_spell_checking_languages(context,
+                   spellinglanguages);
+               webkit_web_context_set_spell_checking_enabled(context,
+                   enablespellchecking);
 
                g_signal_connect(G_OBJECT(context), "download-started",
                                 G_CALLBACK(downloadstarted), c);
@@ -828,28 +817,6 @@ buttonreleased(GtkWidget *w, GdkEvent *e, Client *c)
        return FALSE;
 }
 
-gboolean
-keypress(GtkAccelGroup *group, GObject *obj, guint key, GdkModifierType mods,
-         Client *c)
-{
-       guint i;
-       gboolean processed = FALSE;
-
-       mods = CLEANMASK(mods);
-       key = gdk_keyval_to_lower(key);
-       updatewinid(c);
-       for (i = 0; i < LENGTH(keys); i++) {
-               if (key == keys[i].keyval
-                   && mods == keys[i].mod
-                   && keys[i].func) {
-                       keys[i].func(c, &(keys[i].arg));
-                       processed = TRUE;
-               }
-       }
-
-       return processed;
-}
-
 GdkFilterReturn
 processx(GdkXEvent *e, GdkEvent *event, gpointer d)
 {
@@ -878,23 +845,41 @@ processx(GdkXEvent *e, GdkEvent *event, gpointer d)
 gboolean
 winevent(GtkWidget *w, GdkEvent *e, Client *c)
 {
+       int i;
+
        switch (e->type) {
+       case GDK_ENTER_NOTIFY:
+               c->overtitle = c->targeturi;
+               updatetitle(c);
+               break;
+       case GDK_KEY_PRESS:
+               if (!kioskmode) {
+                       for (i = 0; i < LENGTH(keys); ++i) {
+                               if (gdk_keyval_to_lower(e->key.keyval) ==
+                                   keys[i].keyval &&
+                                   CLEANMASK(e->key.state) == keys[i].mod &&
+                                   keys[i].func) {
+                                       updatewinid(c);
+                                       keys[i].func(c, &(keys[i].arg));
+                                       return TRUE;
+                               }
+                       }
+               }
        case GDK_LEAVE_NOTIFY:
-               c->targeturi = NULL;
+               c->overtitle = NULL;
                updatetitle(c);
                break;
-       case GDK_WINDOW_STATE: /* fallthrough */
+       case GDK_WINDOW_STATE:
                if (e->window_state.changed_mask ==
-                   GDK_WINDOW_STATE_FULLSCREEN) {
+                   GDK_WINDOW_STATE_FULLSCREEN)
                        c->fullscreen = e->window_state.new_window_state &
                                        GDK_WINDOW_STATE_FULLSCREEN;
-                       break;
-               }
+               break;
        default:
-               return FALSE;
+               break;
        }
 
-       return TRUE;
+       return FALSE;
 }
 
 void
@@ -925,7 +910,6 @@ showview(WebKitWebView *v, Client *c)
                webkit_web_view_set_background_color(c->view, &bgcolor);
 
        if (!kioskmode) {
-               addaccelgroup(c);
                gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK);
                gdk_window_add_filter(gwin, processx, c);
        }
@@ -965,6 +949,10 @@ createwindow(Client *c)
 
        g_signal_connect(G_OBJECT(w), "destroy",
                         G_CALLBACK(destroywin), c);
+       g_signal_connect(G_OBJECT(w), "enter-notify-event",
+                        G_CALLBACK(winevent), c);
+       g_signal_connect(G_OBJECT(w), "key-press-event",
+                        G_CALLBACK(winevent), c);
        g_signal_connect(G_OBJECT(w), "leave-notify-event",
                         G_CALLBACK(winevent), c);
        g_signal_connect(G_OBJECT(w), "window-state-event",
@@ -1037,6 +1025,8 @@ mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, guint modifiers,
                c->targeturi = webkit_hit_test_result_get_media_uri(h);
        else
                c->targeturi = NULL;
+
+       c->overtitle = c->targeturi;
        updatetitle(c);
 }
 
@@ -1143,10 +1133,10 @@ decideresource(WebKitPolicyDecision *d, Client *c)
            webkit_response_policy_decision_get_response(r);
        const gchar *uri = webkit_uri_response_get_uri(res);
 
-       if (g_str_has_suffix(uri, "/favicon.ico"))
-               webkit_uri_request_set_uri(
-                   webkit_response_policy_decision_get_request(r),
-                   "about:blank");
+       if (g_str_has_suffix(uri, "/favicon.ico")) {
+               webkit_policy_decision_ignore(d);
+               return;
+       }
 
        if (!g_str_has_prefix(uri, "http://")
            && !g_str_has_prefix(uri, "https://")
@@ -1164,6 +1154,7 @@ decideresource(WebKitPolicyDecision *d, Client *c)
                if (isascii) {
                        handleplumb(c, uri);
                        webkit_policy_decision_ignore(d);
+                       return;
                }
        }
 
@@ -1367,7 +1358,12 @@ void
 togglestyle(Client *c, const Arg *a)
 {
        enablestyle = !enablestyle;
-       setstyle(c, enablestyle ? getstyle(geturi(c)) : "");
+
+       if (enablestyle)
+               setstyle(c, getstyle(geturi(c)));
+       else
+               webkit_user_content_manager_remove_all_style_sheets(
+                   webkit_web_view_get_user_content_manager(c->view));
 
        updatetitle(c);
 }
@@ -1429,10 +1425,8 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h)
 {
        Arg arg;
 
-       if (webkit_hit_test_result_get_context(h) & OnMedia) {
-               arg = (Arg)VIDEOPLAY(webkit_hit_test_result_get_media_uri(h));
-               spawn(c, &arg);
-       }
+       arg = (Arg)VIDEOPLAY(webkit_hit_test_result_get_media_uri(h));
+       spawn(c, &arg);
 }
 
 int
@@ -1521,7 +1515,7 @@ main(int argc, char *argv[])
                stylefile = EARGF(usage());
                break;
        case 'u':
-               useragent = EARGF(usage());
+               fulluseragent = EARGF(usage());
                break;
        case 'v':
                die("surf-"VERSION", ©2009-2015 surf engineers, "