GTlsCertificateFlags tlsflags;
Window xid;
int progress, fullscreen;
- const char *title, *targeturi;
+ const char *title, *overtitle, *targeturi;
const char *needle;
struct Client *next;
} Client;
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);
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);
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_end(ap);
- exit(EXIT_FAILURE);
+ exit(1);
}
void
{
if (signal(SIGCHLD, sigchld) == SIG_ERR)
die("Can't install SIGCHLD handler");
- while (0 < waitpid(-1, NULL, WNOHANG));
+ while (waitpid(-1, NULL, WNOHANG) > 0)
+ ;
}
char *
if (!(c = calloc(1, sizeof(Client))))
die("Cannot malloc!\n");
- c->title = NULL;
- c->progress = 100;
-
c->next = clients;
clients = c;
- c->view = newview(c, rc ? rc->view : NULL);
+ c->progress = 100;
c->tlsflags = G_TLS_CERTIFICATE_VALIDATE_ALL + 1;
+ c->view = newview(c, rc ? rc->view : NULL);
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)
{
const char *
geturi(Client *c)
{
- char *uri;
+ const char *uri;
- if (!(uri = (char *)webkit_web_view_get_uri(c->view)))
+ if (!(uri = webkit_web_view_get_uri(c->view)))
uri = "about:blank";
return uri;
}
{
XSync(dpy, False);
XChangeProperty(dpy, c->xid,
- atoms[a], XA_STRING, 8, PropModeReplace,
- (unsigned char *)v, strlen(v) + 1);
+ atoms[a], XA_STRING, 8, PropModeReplace,
+ (unsigned char *)v, strlen(v) + 1);
}
const char *
updatetitle(Client *c)
{
char *title;
+ const char *name = c->overtitle ? c->overtitle :
+ c->title ? c->title : "";
if (showindicators) {
gettogglestats(c);
getpagestats(c);
- if (c->progress != 100) {
+ if (c->progress != 100)
title = g_strdup_printf("[%i%%] %s:%s | %s",
- c->progress, togglestats, pagestats,
- c->targeturi ? c->targeturi : c->title);
- } else {
+ c->progress, togglestats, pagestats, name);
+ else
title = g_strdup_printf("%s:%s | %s",
- togglestats, pagestats,
- c->targeturi ? c->targeturi : c->title);
- }
+ togglestats, pagestats, name);
gtk_window_set_title(GTK_WINDOW(c->win), title);
g_free(title);
} else {
- gtk_window_set_title(GTK_WINDOW(c->win), c->title ?
- c->title : "");
+ gtk_window_set_title(GTK_WINDOW(c->win), name);
}
}
return WEBKIT_COOKIE_POLICY_ACCEPT_NEVER;
case '@':
return WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY;
+ default: /* fallthrough */
case 'A':
- default:
- break;
+ return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
}
- return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
}
char
return 'a';
case WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY:
return '@';
+ default: /* fallthrough */
case WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS:
- default:
- break;
+ return 'A';
}
- return 'A';
}
const char *
close(ConnectionNumber(dpy));
setsid();
execvp(((char **)a->v)[0], (char **)a->v);
- fprintf(stderr, "surf: execvp %s", ((char **)a->v)[0]);
+ fprintf(stderr, "%s: execvp %s", argv0, ((char **)a->v)[0]);
perror(" failed");
- exit(0);
+ exit(1);
}
}
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);
NULL);
}
+ g_signal_connect(G_OBJECT(v), "notify::estimated-load-progress",
+ G_CALLBACK(progresschanged), c);
g_signal_connect(G_OBJECT(v), "notify::title",
G_CALLBACK(titlechanged), c);
- g_signal_connect(G_OBJECT(v), "mouse-target-changed",
- G_CALLBACK(mousetargetchanged), c);
- g_signal_connect(G_OBJECT(v), "permission-request",
- G_CALLBACK(permissionrequested), c);
+ g_signal_connect(G_OBJECT(v), "button-release-event",
+ G_CALLBACK(buttonreleased), c);
+ g_signal_connect(G_OBJECT(v), "close",
+ G_CALLBACK(closeview), c);
g_signal_connect(G_OBJECT(v), "create",
G_CALLBACK(createview), c);
- g_signal_connect(G_OBJECT(v), "ready-to-show",
- G_CALLBACK(showview), c);
g_signal_connect(G_OBJECT(v), "decide-policy",
G_CALLBACK(decidepolicy), c);
g_signal_connect(G_OBJECT(v), "load-changed",
G_CALLBACK(loadchanged), c);
- g_signal_connect(G_OBJECT(v), "notify::estimated-load-progress",
- G_CALLBACK(progresschanged), c);
- g_signal_connect(G_OBJECT(v), "button-release-event",
- G_CALLBACK(buttonreleased), c);
- g_signal_connect(G_OBJECT(v), "close",
- G_CALLBACK(closeview), c);
+ g_signal_connect(G_OBJECT(v), "mouse-target-changed",
+ G_CALLBACK(mousetargetchanged), c);
+ g_signal_connect(G_OBJECT(v), "permission-request",
+ G_CALLBACK(permissionrequested), c);
+ g_signal_connect(G_OBJECT(v), "ready-to-show",
+ G_CALLBACK(showview), c);
return v;
}
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)
{
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
showview(WebKitWebView *v, Client *c)
{
- GdkGeometry hints = { 1, 1 };
GdkRGBA bgcolor = { 0 };
GdkWindow *gwin;
c->win = createwindow(c);
gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view));
- gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints,
- GDK_HINT_MIN_SIZE);
gtk_widget_show_all(c->win);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
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);
}
GtkWidget *
createwindow(Client *c)
{
+ char *wmstr;
GtkWidget *w;
if (embed) {
} else {
w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- /* TA: 20091214: Despite what the GNOME docs say, the ICCCM
- * is always correct, so we should still call this function.
- * But when doing so, we *must* differentiate between a
- * WM_CLASS and a resource on the window. By convention, the
- * window class (WM_CLASS) is capped, while the resource is in
- * lowercase. Both these values come as a pair.
- */
- gtk_window_set_wmclass(GTK_WINDOW(w), "surf", "Surf");
+ wmstr = g_path_get_basename(argv0);
+ gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf");
+ g_free(wmstr);
- /* TA: 20091214: And set the role here as well -- so that
- * sessions can pick this up.
- */
- gtk_window_set_role(GTK_WINDOW(w), "Surf");
+ wmstr = g_strdup_printf("%s[%lu]", "Surf",
+ webkit_web_view_get_page_id(c->view));
+ gtk_window_set_role(GTK_WINDOW(w), wmstr);
+ g_free(wmstr);
gtk_window_set_default_size(GTK_WINDOW(w), 800, 600);
}
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",
c->targeturi = webkit_hit_test_result_get_media_uri(h);
else
c->targeturi = NULL;
+
+ c->overtitle = c->targeturi;
updatetitle(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://")
if (isascii) {
handleplumb(c, uri);
webkit_policy_decision_ignore(d);
+ return;
}
}
pasteuri(GtkClipboard *clipboard, const char *text, gpointer d)
{
Arg a = {.v = text };
- if (!text)
+ if (text)
loaduri((Client *) d, &a);
}
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);
}
} ARGEND;
if (argc > 0)
arg.v = argv[0];
+ else
+ arg.v = "about:blank";
setup();
c = newclient(NULL);
showview(NULL, c);
- if (arg.v)
- loaduri(clients, &arg);
- else
- updatetitle(c);
+ loaduri(c, &arg);
+ updatetitle(c);
gtk_main();
cleanup();
- return EXIT_SUCCESS;
+ return 0;
}