X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=3b3476afb55a8c8a159aeda03d2d558eba609d94;hb=dd705d43eb13493b682e214748d1810fc6254452;hp=2e9c38d2660f3168ae95875c27bcd71b7300b077;hpb=637902b452c723e8d5fdb714e8a38861e9c9f64e;p=surf.git diff --git a/surf.c b/surf.c index 2e9c38d..3b3476a 100644 --- a/surf.c +++ b/surf.c @@ -29,7 +29,7 @@ char *argv0; #define LENGTH(x) (sizeof x / sizeof x[0]) -#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK)) +#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK)) #define COOKIEJAR_TYPE (cookiejar_get_type ()) #define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar)) @@ -148,8 +148,9 @@ static void navigate(Client *c, const Arg *arg); static Client *newclient(void); static void newwindow(Client *c, const Arg *arg, gboolean noembed); 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 gboolean contextmenu(WebKitWebView *view, GtkWidget *menu, + WebKitHitTestResult *target, gboolean keyboard, Client *c); +static void menuactivate(GtkMenuItem *item, Client *c); static void print(Client *c, const Arg *arg); static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d); @@ -164,8 +165,7 @@ static void sigchld(int unused); static void source(Client *c, const Arg *arg); static void spawn(Client *c, const Arg *arg); static void stop(Client *c, const Arg *arg); -static void titlechange(WebKitWebView *v, WebKitWebFrame *frame, - const char *title, Client *c); +static void titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c); static void toggle(Client *c, const Arg *arg); static void togglecookiepolicy(Client *c, const Arg *arg); static void togglegeolocation(Client *c, const Arg *arg); @@ -749,7 +749,7 @@ newclient(void) { c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); g_signal_connect(G_OBJECT(c->view), - "title-changed", + "notify::title", G_CALLBACK(titlechange), c); g_signal_connect(G_OBJECT(c->view), "hovering-over-link", @@ -782,8 +782,8 @@ newclient(void) { "button-release-event", G_CALLBACK(buttonrelease), c); g_signal_connect(G_OBJECT(c->view), - "populate-popup", - G_CALLBACK(populatepopup), c); + "context-menu", + G_CALLBACK(contextmenu), c); g_signal_connect(G_OBJECT(c->view), "resource-request-starting", G_CALLBACK(beforerequest), c); @@ -848,6 +848,8 @@ newclient(void) { kioskmode ^ 1, NULL); g_object_set(G_OBJECT(settings), "default-font-size", defaultfontsize, NULL); + g_object_set(G_OBJECT(settings), "resizable-text-areas", + 1, NULL); /* * While stupid, CSS specifies that a pixel represents 1/96 of an inch. @@ -946,24 +948,27 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) { spawn(NULL, &a); } -static void -populatepopup(WebKitWebView *web, GtkMenu *menu, Client *c) { - GList *items = gtk_container_get_children(GTK_CONTAINER(menu)); +static gboolean +contextmenu(WebKitWebView *view, GtkWidget *menu, WebKitHitTestResult *target, + gboolean keyboard, Client *c) { + GList *items = gtk_container_get_children(GTK_CONTAINER(GTK_MENU(menu))); for(GList *l = items; l; l = l->next) { - g_signal_connect(l->data, "activate", G_CALLBACK(popupactivate), c); + g_signal_connect(l->data, "activate", G_CALLBACK(menuactivate), c); } g_list_free(items); + return FALSE; } static void -popupactivate(GtkMenuItem *menu, Client *c) { +menuactivate(GtkMenuItem *item, 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-7 copy image address * context-menu-action-13 reload * context-menu-action-10 back * context-menu-action-11 forward @@ -971,10 +976,10 @@ popupactivate(GtkMenuItem *menu, Client *c) { */ GtkAction *a = NULL; - const char *name; - GtkClipboard *prisel; + const char *name, *uri; + GtkClipboard *prisel, *clpbrd; - a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(menu)); + a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(item)); if(a == NULL) return; @@ -982,7 +987,13 @@ popupactivate(GtkMenuItem *menu, Client *c) { if(!g_strcmp0(name, "context-menu-action-3")) { prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY); gtk_clipboard_set_text(prisel, c->linkhover, -1); - } + } else if(!g_strcmp0(name, "context-menu-action-7")) { + prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY); + clpbrd = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); + uri = gtk_clipboard_wait_for_text(clpbrd); + if(uri) + gtk_clipboard_set_text(prisel, uri, -1); + } } static void @@ -1178,9 +1189,12 @@ stop(Client *c, const Arg *arg) { } static void -titlechange(WebKitWebView *v, WebKitWebFrame *f, const char *t, Client *c) { - c->title = copystr(&c->title, t); - updatetitle(c); +titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c) { + const gchar *t = webkit_web_view_get_title(view); + if (t) { + c->title = copystr(&c->title, t); + updatetitle(c); + } } static void