#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <webkit/webkit.h>
gint progress;
gboolean sslfailed;
struct Client *next;
- gboolean zoomed;
+ gboolean zoomed, fullscreen;
} Client;
typedef struct {
static GdkNativeWindow embed = 0;
static gboolean showxid = FALSE;
static char winid[64];
-static gboolean loadimage = 1, plugin = 1, script = 1, using_proxy = 0;
+static gboolean loadimages = 1, enableplugins = 1, enablescripts = 1,
+ usingproxy = 0;
+static char togglestat[5];
static char *buildpath(const char *path);
static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
static void drawindicator(Client *c);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static void find(Client *c, const Arg *arg);
+static void fullscreen(Client *c, const Arg *arg);
static const char *getatom(Client *c, int a);
static char *geturi(Client *c);
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
static void eval(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 toggle(Client *c, const Arg *arg);
+static void gettogglestat(Client *c);
static void update(Client *c);
static void updatewinid(Client *c);
static void usage(void);
width = c->progress * w->allocation.width / 100;
gc = gdk_gc_new(w->window);
if(strstr(uri, "https://") == uri) {
- if(using_proxy) {
+ if(usingproxy) {
colorname = c->sslfailed? progress_proxy_untrust : progress_proxy_trust;
} else {
colorname = c->sslfailed? progress_untrust : progress_trust;
}
} else {
- if(using_proxy) {
+ if(usingproxy) {
colorname = progress_proxy;
} else {
colorname = progress;
webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE);
}
+void
+fullscreen(Client *c, const Arg *arg) {
+ if(c->fullscreen) {
+ gtk_window_unfullscreen(GTK_WINDOW(c->win));
+ } else {
+ gtk_window_fullscreen(GTK_WINDOW(c->win));
+ }
+ c->fullscreen = !c->fullscreen;
+}
+
const char *
getatom(Client *c, int a) {
static char buf[BUFSIZ];
Arg arg;
updatewinid(c);
- arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o));
+ arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(c));
spawn(c, &arg);
return FALSE;
}
processed = TRUE;
}
}
+
return processed;
}
linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) {
if(l) {
c->linkhover = copystr(&c->linkhover, l);
- }
- else if(c->linkhover) {
+ } else if(c->linkhover) {
free(c->linkhover);
c->linkhover = NULL;
}
void
loaduri(Client *c, const Arg *arg) {
- char *u;
+ char *u, *rp;
const char *uri = (char *)arg->v;
Arg a = { .b = FALSE };
if(strcmp(uri, "") == 0)
return;
- u = g_strrstr(uri, "://") ? g_strdup(uri)
- : g_strdup_printf("http://%s", uri);
+
+ /* In case it's a file path. */
+ if(uri[0] == '/') {
+ rp = realpath(uri, NULL);
+ u = g_strdup_printf("file://%s", rp);
+ free(rp);
+ } else {
+ u = g_strrstr(uri, "://") ? g_strdup(uri)
+ : g_strdup_printf("http://%s", uri);
+ }
+
/* prevents endless loop */
if(c->uri && strcmp(u, c->uri) == 0) {
reload(c, &a);
- }
- else {
+ } else {
webkit_web_view_load_uri(c->view, u);
c->progress = 0;
c->title = copystr(&c->title, u);
if(!(c = calloc(1, sizeof(Client))))
die("Cannot malloc!\n");
+
/* Window */
if(embed) {
c->win = gtk_plug_new(embed);
- }
- else {
+ } else {
c->win = 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
gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK);
gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c);
webkit_web_view_set_full_content_zoom(c->view, TRUE);
+
frame = webkit_web_view_get_main_frame(c->view);
runscript(frame);
settings = webkit_web_view_get_settings(c->view);
g_object_set(G_OBJECT(settings), "user-agent", ua, NULL);
uri = g_strconcat("file://", stylefile, NULL);
g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL);
- g_object_set(G_OBJECT(settings), "auto-load-images", loadimage, NULL);
- g_object_set(G_OBJECT(settings), "enable-plugins", plugin, NULL);
- g_object_set(G_OBJECT(settings), "enable-scripts", script, NULL);
- g_object_set(G_OBJECT(settings), "enable-spatial-navigation", SPATIAL_BROWSING, NULL);
+ g_object_set(G_OBJECT(settings), "auto-load-images", loadimages, NULL);
+ g_object_set(G_OBJECT(settings), "enable-plugins", enableplugins, NULL);
+ g_object_set(G_OBJECT(settings), "enable-scripts", enablescripts, NULL);
+ g_object_set(G_OBJECT(settings), "enable-spatial-navigation",
+ spatialbrowsing, NULL);
g_free(uri);
setatom(c, AtomFind, "");
setatom(c, AtomUri, "about:blank");
- if(HIDE_BACKGROUND)
+ if(hidebackground)
webkit_web_view_set_transparent(c->view, TRUE);
c->title = NULL;
snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
cmd[i++] = tmp;
}
- if(!script)
+ if(!enablescripts)
cmd[i++] = "-s";
- if(!plugin)
+ if(!enableplugins)
cmd[i++] = "-p";
- if(!loadimage)
+ if(!loadimages)
cmd[i++] = "-i";
if(showxid)
cmd[i++] = "-x";
g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL);
soup_uri_free(puri);
g_free(new_proxy);
- using_proxy = 1;
+ usingproxy = 1;
}
}
update(c);
}
+void
+toggle(Client *c, const Arg *arg) {
+ WebKitWebSettings *settings;
+ char *name = (char *)arg->v;
+ gboolean value;
+ Arg a = { .b = FALSE };
+
+ settings = webkit_web_view_get_settings(c->view);
+ g_object_get(G_OBJECT(settings), name, &value, NULL);
+ g_object_set(G_OBJECT(settings), name, !value, NULL);
+
+ reload(c,&a);
+}
+
+void
+gettogglestat(Client *c){
+ gboolean value;
+ WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
+
+ g_object_get(G_OBJECT(settings), "enable-caret-browsing",
+ &value, NULL);
+ togglestat[0] = value? 'C': 'c';
+
+ g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL);
+ togglestat[1] = value? 'I': 'i';
+
+ g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL);
+ togglestat[2] = value? 'S': 's';
+
+ g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL);
+ togglestat[3] = value? 'V': 'v';
+
+ togglestat[4] = '\0';
+}
+
+
void
update(Client *c) {
char *t;
+ gettogglestat(c);
+
if(c->linkhover) {
- t = g_strdup(c->linkhover);
+ t = g_strdup_printf("%s| %s", togglestat, c->linkhover);
} else if(c->progress != 100) {
drawindicator(c);
gtk_widget_show(c->indicator);
- t = g_strdup_printf("[%i%%] %s", c->progress, c->title);
+ t = g_strdup_printf("[%i%%] %s| %s", c->progress, togglestat,
+ c->title);
} else {
gtk_widget_hide_all(c->indicator);
- t = g_strdup(c->title);
+ t = g_strdup_printf("%s| %s", togglestat, c->title);
}
+
gtk_window_set_title(GTK_WINDOW(c->win), t);
g_free(t);
}
void
zoom(Client *c, const Arg *arg) {
c->zoomed = TRUE;
- if(arg->i < 0) /* zoom out */
+ if(arg->i < 0) {
+ /* zoom out */
webkit_web_view_zoom_out(c->view);
- else if(arg->i > 0) /* zoom in */
+ } else if(arg->i > 0) {
+ /* zoom in */
webkit_web_view_zoom_in(c->view);
- else { /* reset */
+ } else {
+ /* reset */
c->zoomed = FALSE;
webkit_web_view_set_zoom_level(c->view, 1.0);
}
main(int argc, char *argv[]) {
Arg arg;
+ memset(&arg, 0, sizeof(arg));
+
/* command line args */
ARGBEGIN {
case 'c':
embed = strtol(EARGF(usage()), NULL, 0);
break;
case 'i':
- loadimage = 0;
+ loadimages = 0;
break;
case 'p':
- plugin = 0;
+ enableplugins = 0;
break;
case 'r':
scriptfile = EARGF(usage());
break;
case 's':
- script = 0;
+ enablescripts = 0;
break;
case 't':
stylefile = EARGF(usage());
newclient();
if(arg.v)
loaduri(clients, &arg);
+
gtk_main();
cleanup();