changing xprops

This commit is contained in:
Enno Boland (tox) 2010-05-17 11:45:28 +02:00
parent 0a6eafe077
commit 36129338cf
2 changed files with 35 additions and 32 deletions

View File

@ -8,10 +8,10 @@ static char *cookiefile = ".surf/cookies.txt";
static time_t sessiontime = 0; static time_t sessiontime = 0;
#define NOBACKGROUND 0 #define NOBACKGROUND 0
#define SETPROP(p) { .v = (char *[]){ "/bin/sh", "-c", \ #define SETPROP(p, q) { .v = (char *[]){ "/bin/sh", "-c", \
"prop=\"`xprop -id $1 $0 | cut -d '\"' -f 2 | dmenu`\" &&" \ "prop=\"`xprop -id $2 $0 | cut -d '\"' -f 2 | dmenu`\" &&" \
"xprop -id $1 -f $0 8s -set $0 \"$prop\"", \ "xprop -id $2 -f $1 8s -set $1 \"$prop\"", \
p, winid, NULL } } p, q, winid, NULL } }
#define MODKEY GDK_CONTROL_MASK #define MODKEY GDK_CONTROL_MASK
static Key keys[] = { static Key keys[] = {
/* modifier keyval function arg Focus */ /* modifier keyval function arg Focus */
@ -29,8 +29,8 @@ static Key keys[] = {
{ MODKEY, GDK_k, scroll, { .i = -1 } }, { MODKEY, GDK_k, scroll, { .i = -1 } },
{ 0, GDK_Escape, stop, { 0 } }, { 0, GDK_Escape, stop, { 0 } },
{ MODKEY, GDK_o, source, { 0 } }, { MODKEY, GDK_o, source, { 0 } },
{ MODKEY, GDK_g, spawn, SETPROP("_SURF_URI") }, { MODKEY, GDK_g, spawn, SETPROP("_SURF_URI", "_SURF_GO") },
{ MODKEY, GDK_slash, spawn, SETPROP("_SURF_FIND") }, { MODKEY, GDK_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },
{ MODKEY, GDK_n, find, { .b = TRUE } }, { MODKEY, GDK_n, find, { .b = TRUE } },
{ MODKEY|GDK_SHIFT_MASK,GDK_n, find, { .b = FALSE } }, { MODKEY|GDK_SHIFT_MASK,GDK_n, find, { .b = FALSE } },
}; };

55
surf.c
View File

@ -23,6 +23,8 @@
#define LENGTH(x) (sizeof x / sizeof x[0]) #define LENGTH(x) (sizeof x / sizeof x[0])
#define CLEANMASK(mask) (mask & ~(GDK_MOD2_MASK)) #define CLEANMASK(mask) (mask & ~(GDK_MOD2_MASK))
enum { AtomFind, AtomGo, AtomUri, AtomHiLight, AtomLast };
typedef union Arg Arg; typedef union Arg Arg;
union Arg { union Arg {
gboolean b; gboolean b;
@ -54,11 +56,10 @@ typedef struct {
} Key; } Key;
static Display *dpy; static Display *dpy;
static Atom uriprop, findprop; static Atom atoms[AtomLast];
static Client *clients = NULL; static Client *clients = NULL;
static GdkNativeWindow embed = 0; static GdkNativeWindow embed = 0;
static gboolean showxid = FALSE; static gboolean showxid = FALSE;
static int ignorexprop = 0;
static char winid[64]; static char winid[64];
static char *progname; static char *progname;
static gboolean loadimage = 1, plugin = 1, script = 1; static gboolean loadimage = 1, plugin = 1, script = 1;
@ -76,7 +77,7 @@ static void die(char *str);
static void drawindicator(Client *c); static void drawindicator(Client *c);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c); static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static void find(Client *c, const Arg *arg); static void find(Client *c, const Arg *arg);
static const char *getatom(Client *c, Atom a); static const char *getatom(Client *c, int a);
static const char *getcookies(SoupURI *uri); static const char *getcookies(SoupURI *uri);
static char *geturi(Client *c); static char *geturi(Client *c);
void gotheaders(SoupMessage *msg, gpointer user_data); void gotheaders(SoupMessage *msg, gpointer user_data);
@ -95,7 +96,7 @@ static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
static void reload(Client *c, const Arg *arg); static void reload(Client *c, const Arg *arg);
static void resize(GtkWidget *w, GtkAllocation *a, Client *c); static void resize(GtkWidget *w, GtkAllocation *a, Client *c);
static void scroll(Client *c, const Arg *arg); static void scroll(Client *c, const Arg *arg);
static void setatom(Client *c, Atom a, const char *v); static void setatom(Client *c, int a, const char *v);
static void setcookie(SoupCookie *c); static void setcookie(SoupCookie *c);
static void setup(void); static void setup(void);
static void sigchld(int unused); static void sigchld(int unused);
@ -247,7 +248,7 @@ drawindicator(Client *c) {
GdkGC *gc; GdkGC *gc;
GdkColor fg; GdkColor fg;
uri = getatom(c, uriprop); uri = geturi(c);
w = c->indicator; w = c->indicator;
width = c->progress * w->allocation.width / 100; width = c->progress * w->allocation.width / 100;
gc = gdk_gc_new(w->window); gc = gdk_gc_new(w->window);
@ -272,7 +273,7 @@ void
find(Client *c, const Arg *arg) { find(Client *c, const Arg *arg) {
const char *s; const char *s;
s = getatom(c, findprop); s = getatom(c, AtomFind);
gboolean forward = *(gboolean *)arg; gboolean forward = *(gboolean *)arg;
webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE); webkit_web_view_search_text(c->view, s, FALSE, forward, TRUE);
} }
@ -287,7 +288,7 @@ getcookies(SoupURI *uri) {
} }
const char * const char *
getatom(Client *c, Atom a) { getatom(Client *c, int a) {
static char buf[BUFSIZ]; static char buf[BUFSIZ];
Atom adummy; Atom adummy;
int idummy; int idummy;
@ -295,7 +296,7 @@ getatom(Client *c, Atom a) {
unsigned char *p = NULL; unsigned char *p = NULL;
XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window),
a, 0L, BUFSIZ, False, XA_STRING, atoms[a], 0L, BUFSIZ, False, XA_STRING,
&adummy, &idummy, &ldummy, &ldummy, &p); &adummy, &idummy, &ldummy, &ldummy, &p);
if(p) if(p)
strncpy(buf, (char *)p, LENGTH(buf)-1); strncpy(buf, (char *)p, LENGTH(buf)-1);
@ -360,7 +361,7 @@ void
loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
switch(webkit_web_view_get_load_status (c->view)) { switch(webkit_web_view_get_load_status (c->view)) {
case WEBKIT_LOAD_COMMITTED: case WEBKIT_LOAD_COMMITTED:
setatom(c, uriprop, geturi(c)); setatom(c, AtomUri, geturi(c));
break; break;
case WEBKIT_LOAD_FINISHED: case WEBKIT_LOAD_FINISHED:
c->progress = 0; c->progress = 0;
@ -491,8 +492,9 @@ newclient(void) {
g_object_set(G_OBJECT(settings), "enable-plugins", plugin, 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-scripts", script, NULL);
g_free(uri); g_free(uri);
setatom(c, findprop, "");
setatom(c, uriprop, ""); setatom(c, AtomFind, "");
setatom(c, AtomUri, "about:blank");
if(NOBACKGROUND) if(NOBACKGROUND)
webkit_web_view_set_transparent(c->view, TRUE); webkit_web_view_set_transparent(c->view, TRUE);
@ -569,19 +571,18 @@ processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
if(((XEvent *)e)->type == PropertyNotify) { if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty; ev = &((XEvent *)e)->xproperty;
if(ignorexprop) if(ev->state == PropertyNewValue) {
ignorexprop--; if(ev->atom == atoms[AtomFind]) {
else if(ev->state == PropertyNewValue) {
if(ev->atom == uriprop) {
arg.v = getatom(c, uriprop);
loaduri(c, &arg);
}
else if(ev->atom == findprop) {
arg.b = TRUE; arg.b = TRUE;
find(c, &arg); find(c, &arg);
}
return GDK_FILTER_REMOVE; return GDK_FILTER_REMOVE;
} }
else if(ev->atom == atoms[AtomGo]) {
arg.v = getatom(c, AtomGo);
loaduri(c, &arg);
return GDK_FILTER_REMOVE;
}
}
} }
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
} }
@ -647,10 +648,9 @@ setcookie(SoupCookie *c) {
} }
void void
setatom(Client *c, Atom a, const char *v) { setatom(Client *c, int a, const char *v) {
XSync(dpy, False); XSync(dpy, False);
ignorexprop++; XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), atoms[a],
XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), a,
XA_STRING, 8, PropModeReplace, (unsigned char *)v, XA_STRING, 8, PropModeReplace, (unsigned char *)v,
strlen(v) + 1); strlen(v) + 1);
} }
@ -670,8 +670,12 @@ setup(void) {
dpy = GDK_DISPLAY(); dpy = GDK_DISPLAY();
s = webkit_get_default_session(); s = webkit_get_default_session();
uriprop = XInternAtom(dpy, "_SURF_URI", False);
findprop = XInternAtom(dpy, "_SURF_FIND", False); /* atoms */
atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False);
atoms[AtomGo] = XInternAtom(dpy, "_SURF_GO", False);
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
atoms[AtomHiLight] = XInternAtom(dpy, "_SURF_HILIGHT", False);
/* dirs and files */ /* dirs and files */
cookiefile = buildpath(cookiefile); cookiefile = buildpath(cookiefile);
@ -688,7 +692,6 @@ setup(void) {
if((proxy = getenv("http_proxy")) && strcmp(proxy, "")) { if((proxy = getenv("http_proxy")) && strcmp(proxy, "")) {
new_proxy = g_strrstr(proxy, "http://") ? g_strdup(proxy) : new_proxy = g_strrstr(proxy, "http://") ? g_strdup(proxy) :
g_strdup_printf("http://%s", proxy); g_strdup_printf("http://%s", proxy);
puri = soup_uri_new(new_proxy); puri = soup_uri_new(new_proxy);
g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL); g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL);
soup_uri_free(puri); soup_uri_free(puri);