removing surf-stuff, distributing tabbed on its own.

This commit is contained in:
Enno Boland (tox) 2009-09-07 16:25:51 +02:00
parent 5af6007d6d
commit 6e9420683a
6 changed files with 18 additions and 791 deletions

View file

@ -1,15 +1,15 @@
# surf - simple browser
# tabbed - tabbing interface for surf
# See LICENSE file for copyright and license details.
include config.mk
SRC = surf.c tabbed.c
SRC = tabbed.c
OBJ = ${SRC:.c=.o}
all: options surf tabbed
all: options tabbed
options:
@echo surf build options:
@echo tabbed build options:
@echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}"
@ -24,41 +24,37 @@ config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
surf: surf.o
@echo CC -o $@
@${CC} -o $@ surf.o ${LDFLAGS}
tabbed: tabbed.o
@echo CC -o $@
@${CC} -o $@ tabbed.o ${LDFLAGS}
clean:
@echo cleaning
@rm -f surf ${OBJ} surf-${VERSION}.tar.gz
@rm -f tabbed ${OBJ} tabbed-${VERSION}.tar.gz
dist: clean
@echo creating dist tarball
@mkdir -p surf-${VERSION}
@mkdir -p tabbed-${VERSION}
@cp -R LICENSE Makefile README config.mk \
surf.1 ${SRC} surf-${VERSION}
@tar -cf surf-${VERSION}.tar surf-${VERSION}
@gzip surf-${VERSION}.tar
@rm -rf surf-${VERSION}
tabbed.1 ${SRC} tabbed-${VERSION}
@tar -cf tabbed-${VERSION}.tar tabbed-${VERSION}
@gzip tabbed-${VERSION}.tar
@rm -rf tabbed-${VERSION}
install: all
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f surf ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/surf
@cp -f tabbed ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/tabbed
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
@sed "s/VERSION/${VERSION}/g" < surf.1 > ${DESTDIR}${MANPREFIX}/man1/surf.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/surf.1
@sed "s/VERSION/${VERSION}/g" < tabbed.1 > ${DESTDIR}${MANPREFIX}/man1/tabbed.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/tabbed.1
uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/surf
@rm -f ${DESTDIR}${PREFIX}/bin/tabbed
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${MANPREFIX}/man1/surf.1
@rm -f ${DESTDIR}${MANPREFIX}/man1/tabbed.1
.PHONY: all options clean dist install uninstall

View file

@ -1,34 +1,3 @@
#ifdef SURF
/* modifier 0 means no modifier */
static GdkColor progress = { 65535,65535,0,0 };
static GdkColor progress_trust = { 65535,0,65535,0 };
#define MODKEY GDK_CONTROL_MASK
static Key keys[] = {
/* modifier keyval function arg Focus */
{ MODKEY, GDK_R, reload, {.b = TRUE}, ALWAYS },
{ MODKEY, GDK_r, reload, {.b = FALSE}, ALWAYS },
{ MODKEY, GDK_g, showurl, {0}, ALWAYS },
{ MODKEY, GDK_slash, showsearch, {0}, ALWAYS },
{ 0, GDK_Escape, hidesearch, {0}, ALWAYS },
{ 0, GDK_Escape, hideurl, {0}, ALWAYS },
{ MODKEY, GDK_P, print, {0}, ALWAYS },
{ MODKEY, GDK_p, clipboard, {.b = TRUE }, BROWSER },
{ MODKEY, GDK_y, clipboard, {.b = FALSE}, BROWSER },
{ MODKEY, GDK_j, zoom, {.i = +1 }, BROWSER },
{ MODKEY, GDK_k, zoom, {.i = -1 }, BROWSER },
{ MODKEY, GDK_i, zoom, {.i = 0 }, BROWSER },
{ MODKEY, GDK_l, navigate, {.i = +1}, BROWSER },
{ MODKEY, GDK_h, navigate, {.i = -1}, BROWSER },
{ 0, GDK_Escape, stop, {0}, BROWSER },
{ MODKEY, GDK_n, searchtext, {.b = TRUE}, BROWSER|SEARCHBAR },
{ MODKEY, GDK_N, searchtext, {.b = FALSE}, BROWSER|SEARCHBAR },
{ 0, GDK_Return, searchtext, {.b = TRUE}, SEARCHBAR },
{ GDK_SHIFT_MASK, GDK_Return, searchtext, {.b = FALSE}, SEARCHBAR },
{ 0, GDK_Return, loaduri, {.v = NULL}, URLBAR },
{ 0, GDK_Return, hideurl, {0}, URLBAR },
};
#else
static const char font[] = "-*-proggytiny-*-*-*-*-*-*-*-*-*-*-*-*";
static const char normbgcolor[] = "#202020";
static const char normfgcolor[] = "#c0c0c0";
@ -54,4 +23,3 @@ Key keys[] = { \
{ MODKEY, XK_9, move, { .i = 9 } },
{ MODKEY, XK_0, move, { .i = 10 } },
};
#endif

View file

@ -1,5 +1,5 @@
# surf version
VERSION = 0.1
# tabbed version
VERSION = 0.0
# Customize below to fit your system

57
surf.1
View file

@ -1,57 +0,0 @@
.TH SURF 1 surf\-VERSION
.SH NAME
surf \- simple webkit-based browser
.SH SYNOPSIS
.B surf
.RB [ \-ehvx ]
.RB "URI"
.SH DESCRIPTION
surf is a simple Web browser based on WebKit/GTK+. It is able
to display websites and follow links. It supports the XEmbed protocol
which makes it possible to embed it in another application. Furthermore,
one can point surf to another URI by setting its XProperties.
.SH OPTIONS
.TP
.B \-e
Prints xid to standard output and waits until an application reparents the
window.
.TP
.B \-h
Prints usage information to standard output, then exits.
.TP
.B \-v
Prints version information to standard output, then exits.
.TP
.B \-x
Prints xid to standard output. This can be used to script the browser by using
.BR xprop(1).
.SH USAGE
.TP
.B Ctrl\-h
Walks back the history.
.TP
.B Ctrl\-l
Walks forward the history.
.TP
.B Ctrl\-/
Opens the search-bar.
.TP
.B Ctrl\-g
Opens the URL-bar.
.TP
.B Ctrl\-p
Loads URI from primary selection.
.TP
.B Ctrl\-r
Reloads the website.
.TP
.B Ctrl\-Shift\-r
Reloads the website without using cache.
.TP
.B Ctrl\-y
Copies current URI to primary selection.
.SH SEE ALSO
.BR dmenu(1)
.BR xprop(1)
.SH BUGS
Please report them!

679
surf.c
View file

@ -1,679 +0,0 @@
/* See LICENSE file for copyright and license details.
*
* To understand surf, start reading main().
*/
#include <X11/X.h>
#include <X11/Xatom.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include <stdlib.h>
#include <stdio.h>
#include <webkit/webkit.h>
#include <glib/gstdio.h>
#define LENGTH(x) (sizeof x / sizeof x[0])
Display *dpy;
Atom urlprop;
typedef union Arg Arg;
union Arg {
const gboolean b;
const int i;
const unsigned int ui;
const void *v;
} ;
typedef struct Client {
GtkWidget *win, *scroll, *vbox, *urlbar, *searchbar, *indicator;
WebKitWebView *view;
WebKitDownload *download;
gchar *title;
gint progress;
struct Client *next;
} Client;
typedef struct Cookie {
char *name;
char *value;
char *domain;
char *path;
struct Cookie *next;
} Cookie;
typedef enum {
BROWSER = 0x0001,
SEARCHBAR = 0x0010,
URLBAR = 0x0100,
ALWAYS = ~0,
} KeyFocus;
typedef struct {
guint mod;
guint keyval;
void (*func)(Client *c, const Arg *arg);
const Arg arg;
KeyFocus focus;
} Key;
SoupCookieJar *cookiejar;
SoupSession *session;
Client *clients = NULL;
Cookie *cookies = NULL;
gboolean embed = FALSE;
gboolean showxid = FALSE;
gboolean ignore_once = FALSE;
extern char *optarg;
extern int optind;
static void cleanup(void);
static void proccookies(SoupMessage *m, Client *c);
static void clipboard(Client *c, const Arg *arg);
static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(char *str);
static void download(WebKitDownload *o, GParamSpec *pspec, Client *c);
static void drawindicator(Client *c);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static gboolean initdownload(WebKitWebView *view, WebKitDownload *o, Client *c);
static gchar *geturi(Client *c);
static void hidesearch(Client *c, const Arg *arg);
static void hideurl(Client *c, const Arg *arg);
static gboolean keypress(GtkWidget* w, GdkEventKey *ev, Client *c);
static void linkhover(WebKitWebView* page, const gchar* t, const gchar* l, Client *c);
static void loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c);
static void loadstart(WebKitWebView *view, WebKitWebFrame *f, Client *c);
static void loadfile(Client *c, const gchar *f);
static void loaduri(Client *c, const Arg *arg);
static void navigate(Client *c, const Arg *arg);
static Client *newclient();
static WebKitWebView *newwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c);
static void pasteurl(GtkClipboard *clipboard, const gchar *text, gpointer d);
static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d);
static void print(Client *c, const Arg *arg);
static void progresschange(WebKitWebView *view, gint p, Client *c);
static void request(SoupSession *s, SoupMessage *m, Client *c);
static void reload(Client *c, const Arg *arg);
static void rereadcookies();
static void setcookie(char *name, char *val, char *dom, char *path, long exp);
static void setup();
static void titlechange(WebKitWebView* view, WebKitWebFrame* frame,
const gchar* title, Client *c);
static void searchtext(Client *c, const Arg *arg);
static void showsearch(Client *c, const Arg *arg);
static void showurl(Client *c, const Arg *arg);
static void stop(Client *c, const Arg *arg);
static void titlechange(WebKitWebView* view, WebKitWebFrame* frame, const gchar* title, Client *c);
static void usage();
static void update(Client *c, const gchar *title);
static void zoom(Client *c, const Arg *arg);
#define SURF
#include "config.h"
void
cleanup(void) {
while(clients)
destroyclient(clients);
}
void
proccookies(SoupMessage *m, Client *c) {
GSList *l;
SoupCookie *co;
long t;
rereadcookies();
for (l = soup_cookies_from_response(m); l; l = l->next){
co = (SoupCookie *)l->data;
t = co->expires ? soup_date_to_time_t(co->expires) : 0;
setcookie(co->name, co->value, co->domain, co->value, t);
}
g_slist_free(l);
}
void
clipboard(Client *c, const Arg *arg) {
gboolean paste = *(gboolean *)arg;
if(paste)
gtk_clipboard_request_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), pasteurl, c);
else
gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), webkit_web_view_get_uri(c->view), -1);
}
void
destroyclient(Client *c) {
Client *p;
gtk_widget_destroy(GTK_WIDGET(webkit_web_view_new()));
gtk_widget_destroy(c->scroll);
gtk_widget_destroy(c->urlbar);
gtk_widget_destroy(c->searchbar);
gtk_widget_destroy(c->vbox);
gtk_widget_destroy(c->win);
for(p = clients; p && p->next != c; p = p->next);
if(p)
p->next = c->next;
else
clients = c->next;
free(c);
if(clients == NULL)
gtk_main_quit();
}
void
destroywin(GtkWidget* w, Client *c) {
destroyclient(c);
}
void
die(char *str) {
fputs(str, stderr);
exit(EXIT_FAILURE);
}
void
drawindicator(Client *c) {
GtkWidget *w;
gint width;
GdkGC *gc;
gchar *uri;
uri = geturi(c);
w = c->indicator;
width = c->progress * w->allocation.width / 100;
gc = gdk_gc_new(w->window);
if(strstr(uri, "https://") == uri)
gdk_gc_set_rgb_fg_color(gc, &progress_trust);
else
gdk_gc_set_rgb_fg_color(gc, &progress);
gdk_draw_rectangle(w->window,
w->style->bg_gc[GTK_WIDGET_STATE(w)],
TRUE,
0, 0, w->allocation.width, w->allocation.height);
gdk_draw_rectangle(w->window,
gc,
TRUE,
0, 0, width, w->allocation.height);
g_object_unref(gc);/*g_free(gc);*/
}
gboolean
exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c) {
drawindicator(c);
return TRUE;
}
void
download(WebKitDownload *o, GParamSpec *pspec, Client *c) {
WebKitDownloadStatus status;
status = webkit_download_get_status(c->download);
if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLOAD_STATUS_CREATED) {
c->progress = (int)(webkit_download_get_progress(c->download)*100);
}
update(c, NULL);
}
gboolean
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
const gchar *home, *filename;
gchar *uri, *path, *html;
stop(c, NULL);
c->download = o;
home = g_get_home_dir();
filename = webkit_download_get_suggested_filename(o);
path = g_build_filename(home, ".surf", "dl",
filename, NULL);
uri = g_strconcat("file://", path, NULL);
webkit_download_set_destination_uri(c->download, uri);
c->progress = 0;
g_free(uri);
html = g_strdup_printf("Download <b>%s</b>...", filename);
webkit_web_view_load_html_string(c->view, html,
webkit_download_get_uri(c->download));
g_signal_connect(c->download, "notify::progress", G_CALLBACK(download), c);
g_signal_connect(c->download, "notify::status", G_CALLBACK(download), c);
webkit_download_start(c->download);
update(c, filename);
g_free(html);
return TRUE;
}
gchar *
geturi(Client *c) {
gchar *uri;
if(!(uri = (gchar *)webkit_web_view_get_uri(c->view)))
uri = g_strdup("about:blank");
return uri;
}
void
hidesearch(Client *c, const Arg *arg) {
gtk_widget_hide(c->searchbar);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
}
void
hideurl(Client *c, const Arg *arg) {
gtk_widget_hide(c->urlbar);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
}
gboolean
keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
unsigned int i, focus;
gboolean processed = FALSE;
if(ev->type != GDK_KEY_PRESS)
return FALSE;
if(GTK_WIDGET_HAS_FOCUS(c->searchbar))
focus = SEARCHBAR;
else if(GTK_WIDGET_HAS_FOCUS(c->urlbar))
focus = URLBAR;
else
focus = BROWSER;
for(i = 0; i < LENGTH(keys); i++) {
if(focus & keys[i].focus && ev->keyval == keys[i].keyval &&
(ev->state == keys[i].mod || ev->state & keys[i].mod)
&& keys[i].func) {
keys[i].func(c, &(keys[i].arg));
processed = TRUE;
}
}
return processed;
}
void
linkhover(WebKitWebView* page, const gchar* t, const gchar* l, Client *c) {
if(l)
gtk_window_set_title(GTK_WINDOW(c->win), l);
else
update(c, NULL);
}
void
loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
gchar *uri;
ignore_once = TRUE;
uri = geturi(c);
XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), urlprop,
XA_STRING, 8, PropModeReplace, (unsigned char *)uri,
strlen(uri) + 1);
}
void
loadstart(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
c->progress = 0;
update(c, NULL);
}
void
loadfile(Client *c, const gchar *f) {
GIOChannel *chan = NULL;
GError *e = NULL;
GString *code;
gchar *line, *uri;
Arg arg;
if(strcmp(f, "-") == 0) {
chan = g_io_channel_unix_new(STDIN_FILENO);
if (chan) {
code = g_string_new("");
while(g_io_channel_read_line(chan, &line, NULL, NULL,
&e) == G_IO_STATUS_NORMAL) {
g_string_append(code, line);
g_free(line);
}
webkit_web_view_load_html_string(c->view, code->str,
"file://.");
g_io_channel_shutdown(chan, FALSE, NULL);
g_string_free(code, TRUE);
}
arg.v = uri = g_strdup("stdin");
}
else {
arg.v = uri = g_strdup_printf("file://%s", f);
loaduri(c, &arg);
}
update(c, uri);
g_free(uri);
}
void
loaduri(Client *c, const Arg *arg) {
gchar *u;
const gchar *uri = (gchar *)arg->v;
if(!uri)
uri = gtk_entry_get_text(GTK_ENTRY(c->urlbar));
u = g_strrstr(uri, "://") ? g_strdup(uri)
: g_strdup_printf("http://%s", uri);
webkit_web_view_load_uri(c->view, u);
c->progress = 0;
update(c, u);
g_free(u);
}
void
navigate(Client *c, const Arg *arg) {
gint steps = *(gint *)arg;
webkit_web_view_go_back_or_forward(c->view, steps);
}
Client *
newclient(void) {
Client *c;
if(!(c = calloc(1, sizeof(Client))))
die("Cannot malloc!\n");
/* Window */
if(embed) {
c->win = gtk_plug_new(0);
}
else {
c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "surf");
}
gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600);
g_signal_connect(G_OBJECT(c->win), "destroy", G_CALLBACK(destroywin), c);
g_signal_connect(G_OBJECT(c->win), "key-press-event", G_CALLBACK(keypress), c);
/* VBox */
c->vbox = gtk_vbox_new(FALSE, 0);
/* scrolled window */
c->scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll),
GTK_POLICY_NEVER, GTK_POLICY_NEVER);
/* webview */
c->view = WEBKIT_WEB_VIEW(webkit_web_view_new());
g_signal_connect(G_OBJECT(c->view), "title-changed", G_CALLBACK(titlechange), c);
g_signal_connect(G_OBJECT(c->view), "load-progress-changed", G_CALLBACK(progresschange), c);
g_signal_connect(G_OBJECT(c->view), "load-committed", G_CALLBACK(loadcommit), c);
g_signal_connect(G_OBJECT(c->view), "load-started", G_CALLBACK(loadstart), c);
g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c);
g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(newwindow), c);
g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
g_signal_connect_after(session, "request-started", G_CALLBACK(request), c);
/* urlbar */
c->urlbar = gtk_entry_new();
gtk_entry_set_has_frame(GTK_ENTRY(c->urlbar), FALSE);
/* searchbar */
c->searchbar = gtk_entry_new();
gtk_entry_set_has_frame(GTK_ENTRY(c->searchbar), FALSE);
/* indicator */
c->indicator = gtk_drawing_area_new();
gtk_widget_set_size_request(c->indicator, 0, 2);
g_signal_connect (G_OBJECT (c->indicator), "expose_event",
G_CALLBACK (exposeindicator), c);
/* downloadbar */
/* Arranging */
gtk_container_add(GTK_CONTAINER(c->scroll), GTK_WIDGET(c->view));
gtk_container_add(GTK_CONTAINER(c->win), c->vbox);
gtk_container_add(GTK_CONTAINER(c->vbox), c->scroll);
gtk_container_add(GTK_CONTAINER(c->vbox), c->searchbar);
gtk_container_add(GTK_CONTAINER(c->vbox), c->urlbar);
gtk_container_add(GTK_CONTAINER(c->vbox), c->indicator);
/* Setup */
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->urlbar, FALSE, FALSE, 0, GTK_PACK_START);
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->searchbar, FALSE, FALSE, 0, GTK_PACK_START);
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->indicator, FALSE, FALSE, 0, GTK_PACK_START);
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE, TRUE, 0, GTK_PACK_START);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
gtk_widget_hide_all(c->searchbar);
gtk_widget_hide_all(c->urlbar);
gtk_widget_show(c->vbox);
gtk_widget_show(c->indicator);
gtk_widget_show(c->scroll);
gtk_widget_show(GTK_WIDGET(c->view));
gtk_widget_show(c->win);
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);
c->download = NULL;
c->title = NULL;
c->next = clients;
clients = c;
if(showxid)
printf("%u\n", (unsigned int)GDK_WINDOW_XID(GTK_WIDGET(c->win)->window));
return c;
}
WebKitWebView *
newwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c) {
Client *n = newclient();
return n->view;
}
void
pasteurl(GtkClipboard *clipboard, const gchar *text, gpointer d) {
Arg arg = {.v = text };
if(text != NULL)
loaduri((Client *) d, &arg);
}
GdkFilterReturn
processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
Client *c = (Client *)d;
XPropertyEvent *ev;
Atom adummy;
int idummy;
unsigned long ldummy;
unsigned char *buf = NULL;
Arg arg;
if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty;
if(ev->atom == urlprop && ev->state == PropertyNewValue) {
if(ignore_once)
ignore_once = FALSE;
else {
XGetWindowProperty(dpy, ev->window, urlprop, 0L, BUFSIZ, False, XA_STRING,
&adummy, &idummy, &ldummy, &ldummy, &buf);
arg.v = buf;
loaduri(c, &arg);
XFree(buf);
}
return GDK_FILTER_REMOVE;
}
}
return GDK_FILTER_CONTINUE;
}
void
print(Client *c, const Arg *arg) {
webkit_web_frame_print(webkit_web_view_get_main_frame(c->view));
}
void
progresschange(WebKitWebView* view, gint p, Client *c) {
c->progress = p;
update(c, NULL);
}
void
request(SoupSession *s, SoupMessage *m, Client *c) {
soup_message_add_header_handler(m, "got-headers", "Set-Cookie",
G_CALLBACK(proccookies), c);
}
void
reload(Client *c, const Arg *arg) {
gboolean nocache = *(gboolean *)arg;
if(nocache)
webkit_web_view_reload_bypass_cache(c->view);
else
webkit_web_view_reload(c->view);
}
void
rereadcookies() {
const gchar *filename, *home;
home = g_get_home_dir();
filename = g_build_filename(home, ".surf", "cookies", NULL);
}
void
setcookie(char *name, char *val, char *dom, char *path, long exp) {
}
void
setup() {
dpy = GDK_DISPLAY();
session = webkit_get_default_session();
urlprop = XInternAtom(dpy, "_SURF_URL", False);
}
void
showsearch(Client *c, const Arg *arg) {
hideurl(c, NULL);
gtk_widget_show(c->searchbar);
gtk_widget_grab_focus(c->searchbar);
}
void
searchtext(Client *c, const Arg *arg) {
gboolean forward = *(gboolean *)arg;
webkit_web_view_search_text(c->view,
gtk_entry_get_text(GTK_ENTRY(c->searchbar)),
FALSE,
forward,
TRUE);
}
void
showurl(Client *c, const Arg *arg) {
gchar *uri;
hidesearch(c, NULL);
uri = geturi(c);
gtk_entry_set_text(GTK_ENTRY(c->urlbar), uri);
gtk_widget_show(c->urlbar);
gtk_widget_grab_focus(c->urlbar);
}
void
stop(Client *c, const Arg *arg) {
if(c->download)
webkit_download_cancel(c->download);
else
webkit_web_view_stop_loading(c->view);
c->download = NULL;
}
void
titlechange(WebKitWebView *v, WebKitWebFrame *f, const gchar *t, Client *c) {
update(c, t);
}
void
usage() {
fputs("surf - simple browser\n", stderr);
die("usage: surf [-e] [-x] [uri]\n");
}
void
update(Client *c, const char *title) {
gchar *t;
if(title) {
if(c->title)
g_free(c->title);
c->title = g_strdup(title);
}
if(c->progress == 100)
t = g_strdup(c->title);
else
t = g_strdup_printf("%s [%i%%]", c->title, c->progress);
drawindicator(c);
gtk_window_set_title(GTK_WINDOW(c->win), t);
g_free(t);
}
void
zoom(Client *c, const Arg *arg) {
if(arg->i < 0) /* zoom out */
webkit_web_view_zoom_out(c->view);
else if(arg->i > 0) /* zoom in */
webkit_web_view_zoom_in(c->view);
else /* reset */
webkit_web_view_set_zoom_level(c->view, 1.0);
}
int main(int argc, char *argv[]) {
SoupSession *s;
Client *c;
int o;
const gchar *home, *filename;
Arg arg;
gtk_init(NULL, NULL);
if (!g_thread_supported())
g_thread_init(NULL);
setup();
while((o = getopt(argc, argv, "vhxeu:f:")) != -1)
switch(o) {
case 'x':
showxid = TRUE;
break;
case 'e':
showxid = TRUE;
embed = TRUE;
break;
case 'v':
die("surf-"VERSION", © 2009 surf engineers, see LICENSE for details\n");
break;
default:
usage();
}
if(optind + 1 == argc) {
c = newclient();
arg.v = argv[optind];
if(strchr("./", argv[optind][0]) || strcmp("-", argv[optind]) == 0)
loadfile(c, argv[optind]);
else
loaduri(c, &arg);
}
else if(optind != argc)
usage();
if(!clients)
newclient();
/* make dirs */
home = g_get_home_dir();
filename = g_build_filename(home, ".surf", NULL);
g_mkdir_with_parents(filename, 0711);
filename = g_build_filename(home, ".surf", "dl", NULL);
g_mkdir_with_parents(filename, 0755);
/* cookie persistance */
s = webkit_get_default_session();
filename = g_build_filename(home, ".surf", "cookies.jar", NULL);
cookiejar = soup_cookie_jar_text_new(filename, FALSE);
soup_session_add_feature(s, SOUP_SESSION_FEATURE(cookiejar));
gtk_main();
cleanup();
return EXIT_SUCCESS;
}

View file

@ -93,7 +93,6 @@ static Window root, win;
static Bool running = True;
static unsigned int numlockmask = 0;
/* configuration, allows nested code to access above variables */
#define TABBED
#include "config.h"
void