Reverting the cleanmask change.
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index f7cba3e..56051e9 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -65,6 +65,7 @@ static char *progname;
 static gboolean loadimage = 1, plugin = 1, script = 1;
 
 static char *buildpath(const char *path);
+static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
 static void cleanup(void);
 static void clipboard(Client *c, const Arg *arg);
 static char *copystr(char **str, const char *src);
@@ -88,9 +89,11 @@ static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
 static void loaduri(Client *c, const Arg *arg);
 static void navigate(Client *c, const Arg *arg);
 static Client *newclient(void);
-static void newwindow(Client *c, const Arg *arg);
+static void newwindow(Client *c, const Arg *arg, gboolean noembed);
 static void newrequest(SoupSession *s, SoupMessage *msg, gpointer v);
 static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
+static void populatepopup(WebKitWebView *web, GtkMenu *menu, Client *c);
+static void popupactivate(GtkMenuItem *menu, Client *);
 static void print(Client *c, const Arg *arg);
 static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d);
 static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
@@ -140,6 +143,23 @@ buildpath(const char *path) {
        return apath;
 }
 
+static gboolean
+buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl) {
+       WebKitHitTestResultContext context;
+       WebKitHitTestResult *result = webkit_web_view_get_hit_test_result(web, e);
+       Arg arg;
+
+       g_object_get(result, "context", &context, NULL);
+       if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) {
+               if(e->button == 2) {
+                       g_object_get(result, "link-uri", &arg.v, NULL);
+                       newwindow(NULL, &arg, e->state & GDK_CONTROL_MASK);
+                       return true;
+               }
+       }
+       return false;
+}
+
 void
 cleanup(void) {
        while(clients)
@@ -215,7 +235,7 @@ decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, We
        if(webkit_web_navigation_action_get_reason(n) == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
                webkit_web_policy_decision_ignore(p);
                arg.v = (void *)webkit_network_request_get_uri(r);
-               newwindow(NULL, &arg);
+               newwindow(NULL, &arg, 0);
                return TRUE;
        }
        return FALSE;
@@ -403,7 +423,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
                setatom(c, AtomUri, uri);
                break;
        case WEBKIT_LOAD_FINISHED:
-               c->progress = 0;
+               c->progress = 100;
                update(c);
                break;
        default:
@@ -493,6 +513,8 @@ newclient(void) {
        g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c);
        g_signal_connect(G_OBJECT(c->view), "notify::progress", G_CALLBACK(progresschange), c);
        g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
+       g_signal_connect(G_OBJECT(c->view), "button-release-event", G_CALLBACK(buttonrelease), c);
+       g_signal_connect(G_OBJECT(c->view), "populate-popup", G_CALLBACK(populatepopup), c);
 
        /* Indicator */
        c->indicator = gtk_drawing_area_new();
@@ -567,14 +589,14 @@ newrequest(SoupSession *s, SoupMessage *msg, gpointer v) {
 }
 
 void
-newwindow(Client *c, const Arg *arg) {
+newwindow(Client *c, const Arg *arg, gboolean noembed) {
        guint i = 0;
        const char *cmd[10], *uri;
        const Arg a = { .v = (void *)cmd };
        char tmp[64];
 
        cmd[i++] = progname;
-       if(embed) {
+       if(embed && !noembed) {
                cmd[i++] = "-e";
                snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
                cmd[i++] = tmp;
@@ -595,6 +617,45 @@ newwindow(Client *c, const Arg *arg) {
        spawn(NULL, &a);
 }
 
+static void
+populatepopup(WebKitWebView *web, GtkMenu *menu, Client *c) {
+       GList *items = gtk_container_get_children(GTK_CONTAINER(menu));
+
+       for(GList *l = items; l; l = l->next) {
+               g_signal_connect(l->data, "activate", G_CALLBACK(popupactivate), c);
+       }
+
+       g_list_free(items);
+}
+
+static void
+popupactivate(GtkMenuItem *menu, Client *c) {
+       /*
+        * context-menu-action-2000     open link
+        * context-menu-action-1        open link in window
+        * context-menu-action-2        download linked file
+        * context-menu-action-3        copy link location
+        * context-menu-action-13       reload
+        * context-menu-action-10       back
+        * context-menu-action-11       forward
+        * context-menu-action-12       stop
+        */
+
+       GtkAction *a = NULL;
+       const char *name;
+       GtkClipboard *prisel;
+
+       a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(menu));
+       if(a == NULL)
+               return;
+
+       name = gtk_action_get_name(a);
+       if(!g_strcmp0(name, "context-menu-action-3")) {
+               prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+               gtk_clipboard_set_text(prisel, c->linkhover, -1);
+       }
+}
+
 void
 pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) {
        Arg arg = {.v = text };
@@ -648,31 +709,37 @@ reload(Client *c, const Arg *arg) {
 
 void
 scroll_h(Client *c, const Arg *arg) {
- scroll(gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(c->scroll)), arg);
+       scroll(gtk_scrolled_window_get_hadjustment(
+                               GTK_SCROLLED_WINDOW(c->scroll)), arg);
 }
 
 void
 scroll_v(Client *c, const Arg *arg) {
- scroll(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(c->scroll)), arg);
+       scroll(gtk_scrolled_window_get_vadjustment(
+                               GTK_SCROLLED_WINDOW(c->scroll)), arg);
 }
 
 void
 scroll(GtkAdjustment *a, const Arg *arg) {
- gdouble v;
+       gdouble v;
+
+       v = gtk_adjustment_get_value(a);
+       switch (arg->i){
+       case +10000:
+       case -10000:
+               v += gtk_adjustment_get_page_increment(a) *
+                       (arg->i / 10000);
+               break;
+       case +20000:
+       case -20000:
+       default:
+               v += gtk_adjustment_get_step_increment(a) * arg->i;
+       }
 
- v = gtk_adjustment_get_value(a);
- switch (arg->i){
- case +10000:
- case -10000:
- v += gtk_adjustment_get_page_increment(a) * (arg->i / 10000); break;
- case +20000:
- case -20000:
- default:
- v += gtk_adjustment_get_step_increment(a) * arg->i;
- }
- v = MAX(v, 0.0);
- v = MIN(v, gtk_adjustment_get_upper(a) - gtk_adjustment_get_page_size(a));
- gtk_adjustment_set_value(a, v);
+       v = MAX(v, 0.0);
+       v = MIN(v, gtk_adjustment_get_upper(a) -
+                       gtk_adjustment_get_page_size(a));
+       gtk_adjustment_set_value(a, v);
 }
 
 void
@@ -782,7 +849,8 @@ spawn(Client *c, const Arg *arg) {
 void
 eval(Client *c, const Arg *arg) {
        WebKitWebFrame *frame = webkit_web_view_get_main_frame(c->view);
-       evalscript(webkit_web_frame_get_global_context(frame), ((char **)arg->v)[0], "");
+       evalscript(webkit_web_frame_get_global_context(frame),
+                       ((char **)arg->v)[0], "");
 }
 
 void
@@ -857,7 +925,7 @@ main(int argc, char *argv[]) {
                switch(argv[i][1]) {
                case 'e':
                        if(++i < argc)
-                               embed = atoi(argv[i]);
+                               embed = strtol(argv[i], NULL, 0);
                        else
                                usage();
                        break;