Introduction
Introduction Statistics Contact Development Disclaimer Help
treplacing gtk-textentrys with dmenu - surf - customized build of surf, the suc…
git clone git://src.adamsgaard.dk/surf
Log
Files
Refs
README
LICENSE
---
commit 50192577ee0941c5a3fa38c0aaf9a67ce8f11ecb
parent 60dd7545d3ff693d159eef10d0645245c494c35f
Author: Enno Boland (tox) <[email protected]>
Date: Tue, 20 Oct 2009 23:46:54 +0200
replacing gtk-textentrys with dmenu
Diffstat:
M surf.c | 184 ++++++++++-------------------…
1 file changed, 58 insertions(+), 126 deletions(-)
---
diff --git a/surf.c b/surf.c
t@@ -24,17 +24,18 @@
typedef union Arg Arg;
union Arg {
- const gboolean b;
- const gint i;
+ gboolean b;
+ gint i;
const void *v;
};
typedef struct Client {
- GtkWidget *win, *scroll, *vbox, *uribar, *searchbar, *indicator;
+ GtkWidget *win, *scroll, *vbox, *indicator;
GtkWidget **items;
WebKitWebView *view;
WebKitDownload *download;
char *title, *linkhover;
+ const char *uri, *needle;
gint progress;
struct Client *next;
gboolean zoomed;
t@@ -46,23 +47,15 @@ typedef struct {
const Arg arg;
} Item;
-typedef enum {
- Browser = 0x0001,
- SearchBar = 0x0010,
- UriBar = 0x0100,
- Any = ~0,
-} KeyFocus;
-
typedef struct {
guint mod;
guint keyval;
void (*func)(Client *c, const Arg *arg);
const Arg arg;
- KeyFocus focus;
} Key;
static Display *dpy;
-static Atom uriprop;
+static Atom uriprop, findprop;
static SoupCookieJar *cookies;
static SoupSession *session;
static Client *clients = NULL;
t@@ -73,7 +66,6 @@ static char winid[64];
static char *progname;
static gboolean lockcookie = FALSE;
-static const char *autouri(Client *c);
static char *buildpath(const char *path);
static void changecookie(SoupCookieJar *jar, SoupCookie *o, SoupCookie *n, gpo…
static void cleanup(void);
t@@ -87,10 +79,8 @@ 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 const char *getatom(Client *c, Atom a);
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
-static char *geturi(Client *c);
-static void hidesearch(Client *c, const Arg *arg);
-static void hideuri(Client *c, const Arg *arg);
static void itemclick(GtkMenuItem *mi, Client *c);
static gboolean keypress(GtkWidget *w, GdkEventKey *ev, Client *c);
static void linkhover(WebKitWebView *v, const char* t, const char* l, Client *…
t@@ -109,16 +99,14 @@ static void reloadcookies();
static void reload(Client *c, const Arg *arg);
static void resize(GtkWidget *w, GtkAllocation *a, Client *c);
static void sigchld(int unused);
+static void setatom(Client *c, Atom a, const char *v);
static void setup(void);
static void spawn(Client *c, const Arg *arg);
static void scroll(Client *c, const Arg *arg);
-static void searchtext(Client *c, const Arg *arg);
+static void find(Client *c, const Arg *arg);
static void source(Client *c, const Arg *arg);
-static void showsearch(Client *c, const Arg *arg);
-static void showuri(Client *c, const Arg *arg);
static void stop(Client *c, const Arg *arg);
static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* t…
-static gboolean focusview(GtkWidget *w, GdkEventFocus *e, Client *c);
static void usage(void);
static void update(Client *c);
static void updatewinid(Client *c);
t@@ -128,15 +116,6 @@ static void zoom(Client *c, const Arg *arg);
/* configuration, allows nested code to access above variables */
#include "config.h"
-const char *
-autouri(Client *c) {
- if(GTK_WIDGET_HAS_FOCUS(c->uribar))
- return gtk_entry_get_text(GTK_ENTRY(c->uribar));
- else if(c->linkhover)
- return c->linkhover;
- return NULL;
-}
-
char *
buildpath(const char *path) {
char *apath, *p;
t@@ -234,8 +213,6 @@ destroyclient(Client *c) {
gtk_widget_destroy(GTK_WIDGET(c->view));
gtk_widget_destroy(c->scroll);
- gtk_widget_destroy(c->uribar);
- gtk_widget_destroy(c->searchbar);
gtk_widget_destroy(c->vbox);
gtk_widget_destroy(c->indicator);
gtk_widget_destroy(c->win);
t@@ -279,12 +256,12 @@ die(char *str) {
void
drawindicator(Client *c) {
gint width;
- char *uri;
+ const char *uri;
GtkWidget *w;
GdkGC *gc;
GdkColor fg;
- uri = geturi(c);
+ uri = getatom(c, uriprop);
w = c->indicator;
width = c->progress * w->allocation.width / 100;
gc = gdk_gc_new(w->window);
t@@ -316,6 +293,25 @@ download(WebKitDownload *o, GParamSpec *pspec, Client *c)…
update(c);
}
+const char *
+getatom(Client *c, Atom a) {
+ static char buf[BUFSIZ];
+ Atom adummy;
+ int idummy;
+ unsigned long ldummy;
+ unsigned char *p = NULL;
+
+ XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window),
+ a, 0L, BUFSIZ, False, XA_STRING,
+ &adummy, &idummy, &ldummy, &ldummy, &p);
+ if(p)
+ strncpy(buf, (char *)p, LENGTH(buf)-1);
+ else
+ buf[0] = '\0';
+ XFree(p);
+ return buf;
+}
+
gboolean
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) {
const char *filename;
t@@ -351,18 +347,6 @@ geturi(Client *c) {
}
void
-hidesearch(Client *c, const Arg *arg) {
- gtk_widget_hide(c->searchbar);
- gtk_widget_grab_focus(GTK_WIDGET(c->view));
-}
-
-void
-hideuri(Client *c, const Arg *arg) {
- gtk_widget_hide(c->uribar);
- gtk_widget_grab_focus(GTK_WIDGET(c->view));
-}
-
-void
itemclick(GtkMenuItem *mi, Client *c) {
int i;
const char *label;
t@@ -375,21 +359,12 @@ itemclick(GtkMenuItem *mi, Client *c) {
gboolean
keypress(GtkWidget* w, GdkEventKey *ev, Client *c) {
- guint i, focus;
+ guint i;
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->uribar))
- focus = UriBar;
- else
- focus = Browser;
updatewinid(c);
for(i = 0; i < LENGTH(keys); i++) {
- if(focus & keys[i].focus
- && gdk_keyval_to_lower(ev->keyval) == keys[i].…
+ if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval
&& CLEANMASK(ev->state) == keys[i].mod
&& keys[i].func) {
keys[i].func(c, &(keys[i].arg));
t@@ -412,14 +387,7 @@ linkhover(WebKitWebView *v, const char* t, const char* l,…
void
loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
- char *uri;
-
- ignore_once = TRUE;
- uri = geturi(c);
- XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), uripr…
- XA_STRING, 8, PropModeReplace, (unsigned char *)uri,
- strlen(uri) + 1);
-
+ setatom(c, uriprop, webkit_web_view_get_uri(c->view));
reloadcookies();
}
t@@ -434,10 +402,6 @@ loaduri(Client *c, const Arg *arg) {
char *u;
const char *uri = (char *)arg->v;
- if(!uri)
- uri = autouri(c);
- if(!uri)
- return;
u = g_strrstr(uri, "://") ? g_strdup(uri)
: g_strdup_printf("http://%s", uri);
webkit_web_view_load_uri(c->view, u);
t@@ -504,17 +468,8 @@ newclient(void) {
g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-reques…
g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(i…
g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBAC…
- g_signal_connect(G_OBJECT(c->view), "focus-in-event", G_CALLBACK(focus…
g_signal_connect(G_OBJECT(c->view), "populate-popup", G_CALLBACK(conte…
- /* uribar */
- c->uribar = gtk_entry_new();
- gtk_entry_set_has_frame(GTK_ENTRY(c->uribar), 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);
t@@ -525,18 +480,12 @@ newclient(void) {
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->uribar);
gtk_container_add(GTK_CONTAINER(c->vbox), c->indicator);
/* Setup */
- gtk_box_set_child_packing(GTK_BOX(c->vbox), c->uribar, FALSE, FALSE, 0…
- gtk_box_set_child_packing(GTK_BOX(c->vbox), c->searchbar, FALSE, FALSE…
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->indicator, FALSE, FALSE…
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE, TRUE, 0, …
gtk_widget_grab_focus(GTK_WIDGET(c->view));
- gtk_widget_hide_all(c->searchbar);
- gtk_widget_hide_all(c->uribar);
gtk_widget_show(c->vbox);
gtk_widget_show(c->indicator);
gtk_widget_show(c->scroll);
t@@ -550,6 +499,7 @@ newclient(void) {
uri = g_strconcat("file://", stylefile, NULL);
g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL);
g_free(uri);
+ setatom(c, findprop, "");
c->download = NULL;
c->title = NULL;
t@@ -580,7 +530,7 @@ newwindow(Client *c, const Arg *arg) {
cmd[i++] = "-x";
}
cmd[i++] = "--";
- uri = arg->v ? (char *)arg->v : autouri(c);
+ uri = arg->v ? (char *)arg->v : c->linkhover;
if(uri)
cmd[i++] = uri;
cmd[i++] = NULL;
t@@ -604,23 +554,20 @@ GdkFilterReturn
processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
Client *c = (Client *)d;
XPropertyEvent *ev;
- Atom adummy;
- gint idummy;
- unsigned long ldummy;
- unsigned char *buf = NULL;
Arg arg;
if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty;
- if(ev->atom == uriprop && ev->state == PropertyNewValue) {
- if(ignore_once)
- ignore_once = FALSE;
- else {
- XGetWindowProperty(dpy, ev->window, uriprop, 0…
- &adummy, &idummy, &ldummy, &ldummy, &b…
- arg.v = buf;
+ if(ignore_once)
+ ignore_once = FALSE;
+ else if(ev->state == PropertyNewValue) {
+ if(ev->atom == uriprop) {
+ arg.v = getatom(c, uriprop);
loaduri(c, &arg);
- XFree(buf);
+ }
+ else if(ev->atom == findprop) {
+ arg.b = TRUE;
+ find(c, &arg);
}
return GDK_FILTER_REMOVE;
}
t@@ -699,6 +646,15 @@ sigchld(int unused) {
}
void
+setatom(Client *c, Atom a, const char *v) {
+ XSync(dpy, False);
+ ignore_once = TRUE;
+ XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), a,
+ XA_STRING, 8, PropModeReplace, (unsigned char *)v,
+ strlen(v) + 1);
+}
+
+void
setup(void) {
SoupSession *s;
t@@ -711,6 +667,7 @@ setup(void) {
dpy = GDK_DISPLAY();
session = webkit_get_default_session();
uriprop = XInternAtom(dpy, "_SURF_URI", False);
+ findprop = XInternAtom(dpy, "_SURF_FIND", False);
/* create dirs and files */
cookiefile = buildpath(cookiefile);
t@@ -727,13 +684,6 @@ setup(void) {
}
void
-showsearch(Client *c, const Arg *arg) {
- hideuri(c, NULL);
- gtk_widget_show(c->searchbar);
- gtk_widget_grab_focus(c->searchbar);
-}
-
-void
source(Client *c, const Arg *arg) {
Arg a = { .b = FALSE };
gboolean s;
t@@ -744,23 +694,12 @@ source(Client *c, const Arg *arg) {
}
void
-searchtext(Client *c, const Arg *arg) {
- const char *text;
- gboolean forward = *(gboolean *)arg;
- text = gtk_entry_get_text(GTK_ENTRY(c->searchbar));
- webkit_web_view_search_text(c->view, text, FALSE, forward, TRUE);
- webkit_web_view_mark_text_matches(c->view, text, FALSE, 0);
-}
-
-void
-showuri(Client *c, const Arg *arg) {
- char *uri;
+find(Client *c, const Arg *arg) {
+ const char *s;
- hidesearch(c, NULL);
- uri = geturi(c);
- gtk_entry_set_text(GTK_ENTRY(c->uribar), uri);
- gtk_widget_show(c->uribar);
- gtk_widget_grab_focus(c->uribar);
+ s = getatom(c, findprop);
+ gboolean forward = *(gboolean *)arg;
+ webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE);
}
void
t@@ -791,13 +730,6 @@ titlechange(WebKitWebView *v, WebKitWebFrame *f, const ch…
update(c);
}
-gboolean
-focusview(GtkWidget *w, GdkEventFocus *e, Client *c) {
- hidesearch(c, NULL);
- hideuri(c, NULL);
- return FALSE;
-}
-
void
usage(void) {
fputs("surf - simple browser\n", stderr);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.