X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=bcb3a7b5525c4fdd30a7c72f1311909182a44c63;hb=f8f0c30f3ef60c024520cea5179ca2ddeb1de000;hp=ba0195825c139be07b40141723ae6a56d898a954;hpb=4b623bd28ae1ffdecdbc62f68b90340311ad5adc;p=surf.git diff --git a/surf.c b/surf.c index ba01958..bcb3a7b 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); @@ -656,7 +656,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { static void loaduri(Client *c, const Arg *arg) { - char *u, *rp; + char *u = NULL, *rp; const char *uri = (char *)arg->v; Arg a = { .b = FALSE }; struct stat st; @@ -683,9 +683,9 @@ loaduri(Client *c, const Arg *arg) { webkit_web_view_load_uri(c->view, u); c->progress = 0; c->title = copystr(&c->title, u); - g_free(u); updatetitle(c); } + g_free(u); } static void @@ -707,6 +707,9 @@ newclient(void) { if(!(c = calloc(1, sizeof(Client)))) die("Cannot malloc!\n"); + c->title = NULL; + c->progress = 100; + /* Window */ if(embed) { c->win = gtk_plug_new(embed); @@ -746,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", @@ -779,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); @@ -845,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. @@ -890,7 +895,6 @@ newclient(void) { if(hidebackground) webkit_web_view_set_transparent(c->view, TRUE); - c->title = NULL; c->next = clients; clients = c; @@ -944,19 +948,21 @@ 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 @@ -972,7 +978,7 @@ popupactivate(GtkMenuItem *menu, Client *c) { const char *name; GtkClipboard *prisel; - a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(menu)); + a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(item)); if(a == NULL) return; @@ -1176,9 +1182,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 @@ -1335,16 +1344,18 @@ updatetitle(Client *c) { pagestat, c->linkhover); } else if(c->progress != 100) { t = g_strdup_printf("[%i%%] %s:%s | %s", c->progress, - togglestat, pagestat, c->title); + togglestat, pagestat, + (c->title == NULL)? "" : c->title); } else { t = g_strdup_printf("%s:%s | %s", togglestat, pagestat, - c->title); + (c->title == NULL)? "" : c->title); } gtk_window_set_title(GTK_WINDOW(c->win), t); g_free(t); } else { - gtk_window_set_title(GTK_WINDOW(c->win), c->title); + gtk_window_set_title(GTK_WINDOW(c->win), + (c->title == NULL)? "" : c->title); } } @@ -1388,6 +1399,7 @@ zoom(Client *c, const Arg *arg) { int main(int argc, char *argv[]) { Arg arg; + Client *c; memset(&arg, 0, sizeof(arg)); @@ -1460,7 +1472,7 @@ main(int argc, char *argv[]) { useragent = EARGF(usage()); break; case 'v': - die("surf-"VERSION", ©2009-2012 surf engineers, " + die("surf-"VERSION", ©2009-2014 surf engineers, " "see LICENSE for details\n"); case 'x': showxid = TRUE; @@ -1475,9 +1487,12 @@ main(int argc, char *argv[]) { arg.v = argv[0]; setup(); - newclient(); - if(arg.v) + c = newclient(); + if(arg.v) { loaduri(clients, &arg); + } else { + updatetitle(c); + } gtk_main(); cleanup();