wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit a1416612fce3a0bdc017969f74859114fdc682e7
parent c1c58d9cb8108d548788411406f419e486787732
Author: garbeam <garbeam@localhost>
Date:   Tue, 10 Jan 2006 20:57:31 +0200

implemented exec heuristic for /wm/X/ctl, ie wmiir write /wm/2/ctl 'exec xterm'


Diffstat:
cmd/wm/event.c | 8++++++++
cmd/wm/page.c | 39+++++++++++++++++++++++++++++++++++++++
cmd/wm/wm.c | 1+
cmd/wm/wm.h | 7+++++++
4 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -225,6 +225,14 @@ handle_maprequest(XEvent * e) return; } + /* attach heuristic support */ + if(runinpage && (runinpage->page != selpage)) { + RunInPage *r = runinpage; + focus_page(r->page); + runinpage = runinpage->next; + free(r); + } + /* there're client which send map requests twice */ c = win_to_client(ev->window); if(!c) diff --git a/cmd/wm/page.c b/cmd/wm/page.c @@ -13,10 +13,12 @@ static void handle_after_write_page(IXPServer * s, File * file); static void toggle_area(void *obj, char *arg); +static void xexec(void *obj, char *arg); /* action table for /?/ namespace */ Action page_acttbl[] = { {"toggle", toggle_area}, + {"exec", xexec}, {0, 0} }; @@ -63,6 +65,27 @@ alloc_page() void destroy_page(Page * p) { + RunInPage *o, *n; + + while(runinpage->page == p) { + n = runinpage->next; + free(runinpage); + runinpage = n; + } + o = runinpage; + n = nil; + if(runinpage) + n = runinpage->next; + while(n) { + if(n->page == p) { + o->next = n->next; + free(n); + n = o->next; + } + else + n = n->next; + } + destroy_area(p->floating); destroy_area(p->managed); def[WM_SEL_PAGE]->content = 0; @@ -173,6 +196,22 @@ handle_after_write_page(IXPServer * s, File * file) } static void +xexec(void *obj, char *arg) +{ + RunInPage *r; + + if(!runinpage) + r = runinpage = cext_emallocz(sizeof(RunInPage)); + else { + for(r = runinpage; r && r->next; r = r->next); + r->next = cext_emallocz(sizeof(RunInPage)); + r = r->next; + } + r->page = obj; + wmii_spawn(dpy, arg); +} + +static void toggle_area(void *obj, char *arg) { Page *p = obj; diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -898,6 +898,7 @@ main(int argc, char *argv[]) ndetached = npages = 0; detached = nil; layouts = nil; + runinpage = nil; init_atoms(); init_cursors(); diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -89,11 +89,17 @@ enum { #define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask | EnterWindowMask) typedef struct Page Page; +typedef struct RunInPage RunInPage; typedef struct Layout Layout; typedef struct Area Area; typedef struct Frame Frame; typedef struct Client Client; +struct RunInPage { + Page *page; + RunInPage *next; +}; + struct Page { Area *managed; Area *floating; @@ -160,6 +166,7 @@ struct Client { /* global variables */ Page *pages; Page *selpage; +RunInPage *runinpage; size_t npages; Client *detached; size_t ndetached;