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:
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;