changeset: 2232:b6315bae8a5d
user: Kris Maglione <jg_AT_suckless.org>
date: Wed Jan 16 01:01:04 2008 -0500
summary: Account for window groups. Better focus semantics. Check size against iounit on dir reads. Misc. changes.
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/area.c
--- a/cmd/wmii/area.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/area.c Wed Jan 16 01:01:04 2008 -0500
@@ -175,6 +175,17 @@ area_moveto(Area *to, Frame *f) {
}
void
+area_setsel(Area *a, Frame *f) {
+ View *v;
+
+ v = a->view;
+ if(a == v->sel && f)
+ frame_focus(f);
+ else
+ a->sel = f;
+}
+
+void
area_attach(Area *a, Frame *f) {
uint n_frame;
Frame *ft;
@@ -202,12 +213,8 @@ area_attach(Area *a, Frame *f) {
client_resize(f->client, f->r);
}
- if(!a->sel) {
- if(a == a->view->sel)
- frame_focus(f);
- else
- a->sel = f;
- }
+ if(!a->sel)
+ area_setsel(a, f);
view_restack(a->view);
if(!a->floating)
@@ -220,7 +227,7 @@ void
void
area_detach(Frame *f) {
Frame *pr;
- Client *c, *cp;
+ Client *c;
Area *a;
View *v;
@@ -234,10 +241,8 @@ area_detach(Frame *f) {
if(a->sel == f) {
if(!pr)
pr = a->frame;
- if(pr && (v->sel == a))
- frame_focus(pr);
- else
- a->sel = pr;
+ if(pr)
+ area_setsel(a, pr);
}
if(!a->floating) {
@@ -248,20 +253,14 @@ area_detach(Frame *f) {
area_destroy(a);
else if((a->frame == nil) && (v->area->frame))
area_focus(v->area);
-
view_arrange(v);
}
}else if(!a->frame) {
- if(c->trans) {
- cp = win2client(c->trans);
- if(cp && cp->frame) {
- a = cp->sel->area;
- if(a->view == v) {
- area_focus(a);
- return;
- }
+ if(c->trans || (c->w.ewmh.type & (TypeDialog|TypeSplash)))
+ if(v->oldsel) {
+ area_focus(v->oldsel);
+ return;
}
- }
if(v->area->next->frame)
area_focus(v->area->next);
}else
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/client.c
--- a/cmd/wmii/client.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/client.c Wed Jan 16 01:01:04 2008 -0500
@@ -3,6 +3,7 @@
* See LICENSE file for license details.
*/
#include "dat.h"
+#include <assert.h>
#include <ctype.h>
#include <X11/Xatom.h>
#include "fns.h"
@@ -22,10 +23,74 @@ enum {
| ButtonReleaseMask
};
+static Group* group;
+
+static void
+group_init(Client *c) {
+ Group *g;
+ long *ret;
+ XWindow w;
+ long n;
+
+ n = getprop_long(&c->w, "WM_CLIENT_LEADER", "WINDOW", 0L, &ret, 1L);
+ if(n == 0)
+ return;
+ w = *ret;
+
+ for(g=group; g; g=g->next)
+ if(g->leader == w)
+ break;
+ if(g == nil) {
+ g = emallocz(sizeof *g);
+ g->leader = w;
+ g->next = group;
+ group = g;
+ }
+ c->group = g;
+ g->ref++;
+}
+
+static void
+group_remove(Client *c) {
+ Group **gp;
+ Group *g;
+
+ g = c->group;
+ if(g == nil)
+ return;
+ if(g->client == c)
+ g->client = nil;
+ g->ref--;
+ if(g->ref == 0) {
+ for(gp=&group; *gp; gp=&gp[0]->next)
+ if(*gp == g)
+ break;
+ assert(*gp == g);
+ gp[0] = gp[0]->next;
+ }
+}
+
+static Client*
+group_leader(Group *g) {
+ Client *c;
+
+ c = win2client(g->leader);
+ if(c)
+ return c;
+ if(g->client)
+ return g->client;
+ /* Could do better. */
+ for(c=client; c; c=c->next)
+ if(c->frame && c->group == g)
+ break;
+ return c;
+}
+
Client*
client_create(XWindow w, XWindowAttributes *wa) {
Client **t, *c;
WinAttr fwa;
+ Point p;
c = emallocz(sizeof(Client));
c->border = wa->border_width;
@@ -68,7 +133,12 @@ client_create(XWindow w, XWindowAttribut
sethandler(c->framewin, &framehandler);
sethandler(&c->w, &handlers);
+ p.x = def.border;
+ p.y = labelh(def.font);
+ reparentwindow(&c->w, c->framewin, p);
+
ewmh_initclient(c);
+ group_init(c);
grab_button(c->framewin->w, AnyButton, AnyModifier);
@@ -86,7 +156,6 @@ client_create(XWindow w, XWindowAttribut
void
client_manage(Client *c) {
- Point p;
Client *trans;
char *tags;
@@ -94,17 +163,15 @@ client_manage(Client *c) {
if(tags == nil)
tags = gettextproperty(&c->w, "_WIN_TAGS");
- if((trans = win2client(c->trans)))
+ trans = win2client(c->trans);
+ if(trans == nil && c->group)
+ trans = group_leader(c->group);
+
+ if(tags)
+ utflcpy(c->tags, tags, sizeof(c->tags));
+ else if(trans)
utflcpy(c->tags, trans->tags, sizeof(c->tags));
- else if(tags)
- utflcpy(c->tags, tags, sizeof(c->tags));
-
free(tags);
-
- p.x = def.border;
- p.y = labelh(def.font);
-
- reparentwindow(&c->w, c->framewin, p);
if(c->tags[0])
apply_tags(c, c->tags);
@@ -116,8 +183,14 @@ client_manage(Client *c) {
if(c->sel->view == screen->sel)
if(!(c->w.ewmh.type & TypeSplash))
+ if(!c->group || c->group->ref == 1
+ || selclient() && selclient()->group == c->group)
focus(c, false);
- flushevents(EnterWindowMask, False);
+ else {
+ frame_restack(c->sel, c->sel->area->sel);
+ view_restack(c->sel->view);
+ }
+ flushenterevents();
}
static int /* Temporary Xlib error handler */
@@ -156,7 +229,7 @@ client_destroy(Client *c) {
handler = XSetErrorHandler(ignoreerrors);
dummy = nil;
- view_setclient(c, &dummy);
+ client_setviews(c, &dummy);
client_unmap(c, IconicState);
sethandler(&c->w, nil);
@@ -171,9 +244,10 @@ client_destroy(Client *c) {
XUngrabServer(display);
ewmh_destroyclient(c);
+ group_remove(c);
event("DestroyClient %C\n", c);
- flushevents(EnterWindowMask, False);
+ flushenterevents();
free(c->w.hints);
free(c);
}
@@ -339,17 +413,19 @@ client_focus(Client *c) {
Dprint(DFocus, "client_focus(%p[%C]) => %s\n", c, c, clientname(c));
- if(c && c->noinput)
- return;
+ if(c) {
+ if(c->noinput)
+ return;
+ if(c->group)
+ c->group->client = c;
+ }
if(screen->focus != c) {
Dprint(DFocus, "\t%s => %s\n", clientname(screen->focus), clientname(c));
-
if(c)
setfocus(&c->w, RevertToParent);
else
setfocus(screen->barwin, RevertToParent);
-
event("ClientFocus %C\n", c);
sync();
@@ -565,11 +641,10 @@ updatemwm(Client *c) {
};
Rectangle r;
ulong *ret;
- Atom real;
int n;
- n = getproperty(&c->w, "_MOTIF_WM_HINTS", "_MOTIF_WM_HINTS", &real,
- 0L, (void*)&ret, 3L);
+ n = getprop_long(&c->w, "_MOTIF_WM_HINTS", "_MOTIF_WM_HINTS",
+ 0L, (long**)&ret, 3L);
if(c->sel)
r = frame_rect2client(c->sel, c->sel->r);
@@ -671,8 +746,11 @@ configreq_event(Window *w, XConfigureReq
if((Dx(cr) == Dx(screen->r)) && (Dy(cr) == Dy(screen->r)))
fullscreen(c, True);
- if(c->sel->area->floating)
+ if(c->sel->area->floating) {
client_resize(c, r);
+ sync();
+ flushenterevents();
+ }
else {
c->sel->revert = r;
client_configure(c);
@@ -807,12 +885,12 @@ newcol_client(Client *c, char *arg) {
}
else
return;
- flushevents(EnterWindowMask, False);
+ flushenterevents();
}
#endif
void
-view_setclient(Client *c, char **tags) {
+client_setviews(Client *c, char **tags) {
Frame **fp, *f;
int cmp;
@@ -953,7 +1031,7 @@ apply_tags(Client *c, const char *tags)
}
toks[n] = nil;
- view_setclient(c, toks);
+ client_setviews(c, toks);
changeprop_string(&c->w, "_WMII_TAGS", c->tags);
}
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/column.c
--- a/cmd/wmii/column.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/column.c Wed Jan 16 01:01:04 2008 -0500
@@ -268,7 +268,7 @@ scale_column(Area *a) {
j--;
}
/* Doesn't change if we 'continue' */
- fp=&f->anext;
+ fp = &f->anext;
}
surplus = 0;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/dat.h
--- a/cmd/wmii/dat.h Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/dat.h Wed Jan 16 01:01:04 2008 -0500
@@ -72,34 +72,15 @@ typedef struct Client Client;
typedef struct Client Client;
typedef struct Divide Divide;
typedef struct Frame Frame;
+typedef struct Group Group;
typedef struct Key Key;
typedef struct Map Map;
typedef struct MapEnt MapEnt;
typedef struct Rule Rule;
typedef struct Ruleset Ruleset;
+typedef struct Strut Strut;
typedef struct View View;
typedef struct WMScreen WMScreen;
-
-struct Map {
- MapEnt**bucket;
- uint nhash;
-};
-
-struct MapEnt {
- ulong hash;
- const char* key;
- void* val;
- MapEnt* next;
-};
-
-struct View {
- View* next;
- char name[256];
- ushort id;
- Area* area;
- Area* sel;
- Area* revert;
-};
struct Area {
Area* next;
@@ -114,23 +95,15 @@ struct Area {
Rectangle r;
};
-struct Frame {
- Frame* cnext;
- Frame* anext;
- Frame* aprev;
- Frame* snext;
- Frame* sprev;
- View* view;
- Area* area;
- Client* client;
- ushort id;
- bool collapsed;
- float ratio;
- Rectangle r;
- Rectangle crect;
- Rectangle revert;
- Rectangle grabbox;
- Rectangle titlebar;
+struct Bar {
+ Bar* next;
+ Bar* smaller;
+ char buf[280];
+ char text[256];
+ char name[256];
+ ushort id;
+ Rectangle r;
+ CTuple col;
};
struct Client {
@@ -141,6 +114,8 @@ struct Client {
Window w;
Window* framewin;
XWindow trans;
+ Group* group;
+ Strut* strut;
Cursor cursor;
Rectangle r;
char name[256];
@@ -165,6 +140,32 @@ struct Divide {
int x;
};
+struct Frame {
+ Frame* cnext;
+ Frame* anext;
+ Frame* aprev;
+ Frame* snext;
+ Frame* sprev;
+ View* view;
+ Area* area;
+ Client* client;
+ ushort id;
+ bool collapsed;
+ float ratio;
+ Rectangle r;
+ Rectangle crect;
+ Rectangle revert;
+ Rectangle grabbox;
+ Rectangle titlebar;
+};
+
+struct Group {
+ Group* next;
+ XWindow leader;
+ Client *client;
+ int ref;
+};
+
struct Key {
Key* next;
Key* lnext;
@@ -175,15 +176,16 @@ struct Key {
KeyCode key;
};
-struct Bar {
- Bar* next;
- Bar* smaller;
- char buf[280];
- char text[256];
- char name[256];
- ushort id;
- Rectangle r;
- CTuple col;
+struct Map {
+ MapEnt**bucket;
+ uint nhash;
+};
+
+struct MapEnt {
+ ulong hash;
+ const char* key;
+ void* val;
+ MapEnt* next;
};
struct Rule {
@@ -193,9 +195,26 @@ struct Rule {
};
struct Ruleset {
- Rule *rule;
- char *string;
+ Rule* rule;
+ char* string;
uint size;
+};
+
+struct Strut {
+ Rectangle left;
+ Rectangle right;
+ Rectangle top;
+ Rectangle bottom;
+};
+
+struct View {
+ View* next;
+ char name[256];
+ ushort id;
+ Area* area;
+ Area* sel;
+ Area* oldsel;
+ Area* revert;
};
#ifndef EXTERN
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/event.c
--- a/cmd/wmii/event.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/event.c Wed Jan 16 01:01:04 2008 -0500
@@ -14,7 +14,8 @@ dispatch_event(XEvent *e) {
handler[e->type](e);
}
-#define handle(w, fn, ev) if(!(w)->handler->fn) {}else (w)->handler->fn((w), ev)
+#define handle(w, fn, ev) \
+ BLOCK(if((w)->handler->fn) (w)->handler->fn((w), ev))
uint
flushevents(long event_mask, bool dispatch) {
@@ -26,6 +27,37 @@ flushevents(long event_mask, bool dispat
dispatch_event(&ev);
n++;
}
+ return n;
+}
+
+static Bool
+findenter(Display *d, XEvent *e, XPointer v) {
+ long *l;
+
+ l = (long*)v;
+ if(*l)
+ return False;
+ if(e->type == EnterNotify)
+ return True;
+ if(e->type == MotionNotify)
+ (*l)++;
+ return False;
+}
+
+/* This isn't perfect. If there were motion events in the queue
+ * before this was called, then it flushes nothing. If we don't
+ * check for them, we might lose a legitamate enter event.
+ */
+uint
+flushenterevents(void) {
+ XEvent e;
+ long l;
+ int n;
+
+ l = 0;
+ n = 0;
+ while(XCheckIfEvent(display, &e, findenter, (void*)&l))
+ n++;
return n;
}
@@ -236,11 +268,10 @@ maprequest(XEvent *e) {
XWindowAttributes wa;
ev = &e->xmaprequest;
-
if(!XGetWindowAttributes(display, ev->window, &wa))
return;
-
if(wa.override_redirect) {
+ /* Do I really want these? */
XSelectInput(display, ev->window,
(StructureNotifyMask | PropertyChangeMask));
return;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/ewmh.c
--- a/cmd/wmii/ewmh.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/ewmh.c Wed Jan 16 01:01:04 2008 -0500
@@ -1,8 +1,9 @@
/* Copyright ©2007 Kris Maglione <fbsdaemon_AT_gmail.com>
* See LICENSE file for license details.
*/
+#include "dat.h"
#include <assert.h>
-#include "dat.h"
+#include <sys/limits.h>
#include "fns.h"
Window *ewmhwin;
@@ -190,20 +191,40 @@ ewmh_getstrut(Client *c) {
enum {
Left, Right, Top, Bottom,
LeftMin, LeftMax,
- RithtMin, RightMax,
+ RightMin, RightMax,
TopMin, TopMax,
- BottomMin, BottomMax
+ BottomMin, BottomMax,
+ Last = BottomMax
};
- Atom actual;
- long strut[12];
+ long *strut;
ulong n;
- n = getproperty(&c->w, Net("WM_STRUT_PARTIAL"), "CARDINAL", &actual,
- 0L, (void*)&strut, nelem(strut));
- if(n != nelem(strut))
- return;
- if(actual != xatom("ATOM"))
- return;
+ if(c->strut)
+ free(c->strut);
+ c->strut = nil;
+
+ n = getprop_long(&c->w, Net("WM_STRUT_PARTIAL"), "CARDINAL",
+ 0L, &strut, Last);
+ if(n != nelem(strut)) {
+ free(strut);
+ n = getprop_long(&c->w, Net("WM_STRUT"), "CARDINAL",
+ 0L, &strut, 4L);
+ if(n != 4) {
+ free(strut);
+ return;
+ }
+ strut = erealloc(strut, Last * sizeof *strut);
+ strut[LeftMin] = strut[RightMin] = 0;
+ strut[LeftMax] = strut[RightMax] = INT_MAX;
+ strut[TopMin] = strut[BottomMin] = 0;
+ strut[TopMax] = strut[BottomMax] = INT_MAX;
+ }
+ c->strut = emalloc(sizeof *c->strut);
+ c->strut->left = Rect(0, strut[LeftMin], strut[Left], strut[LeftMax]);
+ c->strut->right = Rect(-strut[Right], strut[RightMin], 0, strut[RightMax]);
+ c->strut->top = Rect(strut[TopMin], 0, strut[TopMax], strut[Top]);
+ c->strut->bottom = Rect(strut[BottomMin], -strut[Bottom], strut[BottomMax], 0);
+ free(strut);
}
int
@@ -251,23 +272,24 @@ ewmh_clientmessage(XClientMessageEvent *
if(msg == NET("ACTIVE_WINDOW")) {
if(e->format != 32)
return -1;
+ Dprint(DEwmh, "\tsource: %ld\n", l[0]);
+ Dprint(DEwmh, "\twindow: 0x%lx\n", e->window);
+ c = win2client(e->window);
+ if(c == nil)
+ return 1;
+ Dprint(DEwmh, "\tclient: %s\n", clientname(c));
if(l[0] != 2)
- return 1;
- c == win2client(e->window);
- if(c == nil)
return 1;
focus(c, true);
return 1;
}else
if(msg == NET("CURRENT_DESKTOP")) {
- print("\t%ld\n", l[0]);
if(e->format != 32)
return -1;
- print("\t%ld\n", l[0]);
for(v=view, i=l[0]; v; v=v->next, i--)
if(i == 0)
break;
- print("\t%d\n", i);
+ Dprint(DEwmh, "\t%s\n", v->name);
if(i == 0)
view_select(v->name);
return 1;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/fns.h
--- a/cmd/wmii/fns.h Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/fns.h Wed Jan 16 01:01:04 2008 -0500
@@ -57,6 +57,7 @@ void area_moveto(Area*, Frame*);
void area_moveto(Area*, Frame*);
char* area_name(Area*);
Client* area_selclient(Area*);
+void area_setsel(Area*, Frame*);
/* bar.c */
Bar* bar_create(Bar**, const char*);
@@ -108,6 +109,7 @@ void div_update_all(void);
/* event.c */
void check_x_event(IxpConn*);
void dispatch_event(XEvent*);
+uint flushenterevents(void);
uint flushevents(long, bool dispatch);
void print_focus(Client*, const char*);
@@ -138,9 +140,9 @@ void frame_insert(Frame *pos, Frame*);
void frame_insert(Frame *pos, Frame*);
void frame_remove(Frame*);
void frame_resize(Frame*, Rectangle);
+bool frame_restack(Frame*, Frame*);
void frame_setcursor(Frame*, Point);
void frame_swap(Frame*, Frame*);
-bool frame_to_top(Frame*);
int ingrabbox_p(Frame*, int x, int y);
void move_focus(Frame*, Frame*);
Rectangle constrain(Rectangle);
@@ -217,7 +219,7 @@ void view_scale(View*, int w);
void view_scale(View*, int w);
Client* view_selclient(View*);
void view_select(const char*);
-void view_setclient(Client*, char**);
+void client_setviews(Client*, char**);
void view_update_all(void);
Rectangle* view_rects(View*, uint *num, Frame *ignore);
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/frame.c
--- a/cmd/wmii/frame.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/frame.c Wed Jan 16 01:01:04 2008 -0500
@@ -90,25 +90,34 @@ frame_insert(Frame *pos, Frame *f) {
}
bool
-frame_to_top(Frame *f) {
+frame_restack(Frame *f, Frame *above) {
Area *a;
a = f->area;
- if(!a->floating || f == a->stack)
- return False;
+ if(!a->floating)
+ return false;
+ if(above && above->area != a)
+ return false;
if(f->sprev)
f->sprev->snext = f->snext;
+ else
+ a->stack = f->snext;
if(f->snext)
f->snext->sprev = f->sprev;
f->snext = a->stack;
- a->stack = f;
- f->sprev = nil;
+ f->sprev = above;
+ if(above == nil)
+ a->stack = f;
+ else
+ f->snext = above->snext;
if(f->snext)
f->snext->sprev = f;
-
- return True;
+ if(f->sprev)
+ f->sprev->snext = f;
+
+ return true;
}
/* Handlers */
@@ -130,12 +139,12 @@ bdown_event(Window *w, XButtonEvent *e)
case Button1:
mouse_resize(c, False, CENTER);
focus(c, false);
- frame_to_top(f);
+ frame_restack(f, nil);
focus(c, false); /* Blech */
break;
case Button3:
mouse_resize(c, False, quadrant(f->r, Pt(e->x_root, e->y_root)));
- frame_to_top(f);
+ frame_restack(f, nil);
focus(c, false);
break;
default:
@@ -146,7 +155,7 @@ bdown_event(Window *w, XButtonEvent *e)
XUngrabPointer(display, e->time);
}else{
if(e->button == Button1) {
- if(frame_to_top(f))
+ if(frame_restack(f, nil))
view_restack(f->view);
else if(rect_haspoint_p(Pt(e->x, e->y), f->grabbox))
mouse_resize(c, True, CENTER);
@@ -381,25 +390,29 @@ move_focus(Frame *old_f, Frame *f) {
void
frame_focus(Frame *f) {
+ Client *c;
+ Frame *old_f;
View *v;
Area *a, *old_a;
- Frame *old_f;
-
+
+ c = f->client;
+ v = f->view;
a = f->area;
- v = f->view;
old_a = v->sel;
old_f = old_a->sel;
a->sel = f;
- if(a != old_a)
+ if(a != old_a) {
+ if(c->trans || (c->w.ewmh.type & (TypeDialog|TypeSplash)))
+ v->oldsel = v->sel;
area_focus(f->area);
+ }
if(v != screen->sel || a != v->sel)
return;
move_focus(old_f, f);
-
client_focus(f->client);
if(!a->floating && ((a->mode == Colstack) || (a->mode == Colmax)))
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/fs.c
--- a/cmd/wmii/fs.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/fs.c Wed Jan 16 01:01:04 2008 -0500
@@ -247,7 +247,7 @@ message(Ixp9Req *r, MsgFunc fn) {
c = *p;
*p = '\0';
- m = ixp_message((uchar*)s, p-s, 0);
+ m = ixp_message(s, p-s, 0);
s = fn(f->p.ref, &m);
if(s)
err = s;
@@ -563,7 +563,7 @@ fs_stat(Ixp9Req *r) {
IxpMsg m;
Stat s;
int size;
- uchar *buf;
+ char *buf;
FileId *f;
f = r->fid->aux;
@@ -589,7 +589,7 @@ fs_read(Ixp9Req *r) {
char *buf;
FileId *f, *tf;
int n, offset;
- int size;
+ ulong size;
f = r->fid->aux;
@@ -604,8 +604,10 @@ fs_read(Ixp9Req *r) {
offset = 0;
size = r->ifcall.count;
+ if(size > IXP_MAX_MSG)
+ size = r->fid->iounit;
buf = emallocz(size);
- m = ixp_message((uchar*)buf, size, MsgPack);
+ m = ixp_message(buf, size, MsgPack);
tf = f = lookup_file(f, nil);
/* Note: f->tab.name == "." so we skip it */
@@ -892,7 +894,7 @@ fs_clunk(Ixp9Req *r) {
case FsFBar:
p = toutf8(f->p.bar->buf);
- m = ixp_message((uchar*)p, strlen(p), 0);
+ m = ixp_message(p, strlen(p), 0);
msg_parsecolors(&m, &f->p.bar->col);
q = (char*)m.end-1;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/main.c
--- a/cmd/wmii/main.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/main.c Wed Jan 16 01:01:04 2008 -0500
@@ -374,15 +374,18 @@ main(int argc, char *argv[]) {
wmiirc = "wmiistartrc";
ARGBEGIN{
+ case 'a':
+ address = EARGF(usage());
+ break;
+ case 'G':
+ debug |= DGeneric;
+ break;
+ case 'r':
+ wmiirc = EARGF(usage());
+ break;
case 'v':
print("%s", version);
exit(0);
- case 'a':
- address = EARGF(usage());
- break;
- case 'r':
- wmiirc = EARGF(usage());
- break;
default:
usage();
break;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/message.c
--- a/cmd/wmii/message.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/message.c Wed Jan 16 01:01:04 2008 -0500
@@ -598,7 +598,7 @@ msg_selectframe(Frame *f, IxpMsg *m, int
return "invalid selection";
frame_focus(fp);
- frame_to_top(fp);
+ frame_restack(fp, nil);
if(f->view == screen->sel)
view_restack(f->view);
return nil;
@@ -677,7 +677,7 @@ msg_sendclient(View *v, IxpMsg *m, bool
else
return Ebadvalue;
- flushevents(EnterWindowMask, False);
+ flushenterevents();
frame_focus(f);
view_arrange(v);
view_update_all();
@@ -716,7 +716,7 @@ msg_sendframe(Frame *f, int sym, bool sw
view_arrange(f->view);
- flushevents(EnterWindowMask, False);
+ flushenterevents();
frame_focus(f);
view_update_all();
return nil;
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/view.c
--- a/cmd/wmii/view.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/view.c Wed Jan 16 01:01:04 2008 -0500
@@ -139,7 +139,7 @@ view_focus(WMScreen *s, View *v) {
sync();
XUngrabServer(display);
- flushevents(EnterWindowMask, False);
+ flushenterevents();
}
void
@@ -161,6 +161,7 @@ void
void
view_attach(View *v, Frame *f) {
Client *c;
+ Frame *ff;
Area *a;
c = f->client;
@@ -169,12 +170,14 @@ view_attach(View *v, Frame *f) {
a = v->sel;
if(c->trans || c->floating || c->fixedsize
|| c->titleless || c->borderless || c->fullscreen
- || (c->w.ewmh.type & TypeDialog))
+ || (c->w.ewmh.type & (TypeDialog|TypeSplash|TypeDock)))
a = v->area;
+ else if(c->group && c->group->client
+ && (ff = client_viewframe(c->group->client, v)))
+ a = ff->area;
else if(starting && v->sel->floating)
a = v->area->next;
- if(!(c->w.ewmh.type & TypeSplash))
- area_focus(a);
+
area_attach(a, f);
}
@@ -213,10 +216,8 @@ view_restack(View *v) {
}
ewmh_updatestacking();
- if(wins.n) {
- XRaiseWindow(display, wins.ary[0]);
+ if(wins.n)
XRestackWindows(display, (ulong*)wins.ary, wins.n);
- }
}
void
diff -r c8c8cac426b5 -r b6315bae8a5d cmd/wmii/x11.c
--- a/cmd/wmii/x11.c Mon Jan 14 15:42:21 2008 -0500
+++ b/cmd/wmii/x11.c Wed Jan 16 01:01:04 2008 -0500
@@ -337,10 +337,10 @@ uint
uint
winprotocols(Window *w) {
Atom *protocols;
- Atom actual, delete;
+ Atom delete;
int i, n, protos;
- n = getproperty(w, "WM_PROTOCOLS", "ATOM", &actual, 0L, (void*)&protocols, 20L);
+ n = getprop_long(w, "WM_PROTOCOLS", "ATOM", 0L, (long**)&protocols, 20L);
if(n == 0)
return 0;
@@ -683,17 +683,17 @@ freestringlist(char *list[]) {
XFreeStringList(list);
}
-ulong
-getproperty(Window *w, char *prop, char *type, Atom *actual, ulong offset, uchar **ret, ulong length) {
+static ulong
+getprop(Window *w, char *prop, char *type, Atom *actual, int *format, ulong offset, uchar **ret, ulong length) {
Atom typea;
ulong n, extra;
- int status, format;
+ int status;
typea = (type ? xatom(type) : 0L);
status = XGetWindowProperty(display, w->w,
xatom(prop), offset, length, False /* delete */,
- typea, actual, &format, &n, &extra, ret);
+ typea, actual, format, &n, &extra, ret);
if(status != Success) {
*ret = nil;
@@ -704,6 +704,29 @@ getproperty(Window *w, char *prop, char
*ret = nil;
}
return n;
+}
+
+ulong
+getproperty(Window *w, char *prop, char *type, Atom *actual, ulong offset, uchar **ret, ulong length) {
+ int format;
+
+ return getprop(w, prop, type, actual, &format, offset, ret, length);
+}
+
+ulong
+getprop_long(Window *w, char *prop, char *type, ulong offset, long **ret, ulong length) {
+ Atom actual;
+ ulong n;
+ int format;
+
+ n = getprop(w, prop, type, &actual, &format, offset, (uchar**)ret, length);
+ if(n == 0 || format == 32 && xatom(type) == actual)
+ return n;
+ Dprint(DGeneric, "getprop_long(%W, %s, %s) format=%d, actual=\"%A\"\n",
+ w, prop, type, format, actual);
+ free(*ret);
+ *ret = 0;
+ return 0;
}
char**
diff -r c8c8cac426b5 -r b6315bae8a5d config.mk
--- a/config.mk Mon Jan 14 15:42:21 2008 -0500
+++ b/config.mk Wed Jan 16 01:01:04 2008 -0500
@@ -14,7 +14,7 @@ LIBS = -L/usr/lib -lc -L${ROOT}/lib
# Flags
include ${ROOT}/mk/gcc.mk
-CFLAGS += -g -O0 -DIXPlint
+CFLAGS += ${DEBUGCFLAGS} -DIXPlint
LDFLAGS += -g ${LIBS}
STATIC = -static
MKDEP = cpp -M
@@ -35,10 +35,14 @@ LIBIXP = ${ROOT}/libixp/libixp.a
LIBIXP = ${ROOT}/libixp/libixp.a
LIBIXP = ${LIBDIR}/libixp.a
+# *BSD
+#LIBICONV = -liconv
+# +Darwin
+#STATIC = # Darwon doesn't like static linking
+
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS} -R${PREFIX}/lib
#LDFLAGS += -lsocket -lnsl
#CFLAGS += -xtarget=ultra
-
diff -r c8c8cac426b5 -r b6315bae8a5d include/x11.h
--- a/include/x11.h Mon Jan 14 15:42:21 2008 -0500
+++ b/include/x11.h Wed Jan 16 01:01:04 2008 -0500
@@ -183,6 +183,7 @@ void freefont(Font*);
void freefont(Font*);
void freeimage(Image *);
void freestringlist(char**);
+ulong getprop_long(Window*, char*, char*, ulong, long**, ulong);
ulong getproperty(Window*, char *prop, char *type, Atom *actual, ulong offset, uchar **ret, ulong length);
int gettextlistproperty(Window *w, char *name, char **ret[]);
int grabpointer(Window*, Window *confine, Cursor, int mask);
diff -r c8c8cac426b5 -r b6315bae8a5d mk/gcc.mk
--- a/mk/gcc.mk Mon Jan 14 15:42:21 2008 -0500
+++ b/mk/gcc.mk Wed Jan 16 01:01:04 2008 -0500
@@ -1,7 +1,15 @@ CFLAGS += \
+DEBUGCFLAGS = \
+ -g \
+ -O1 \
+ -fno-builtin \
+ -fno-inline \
+ -fno-omit-frame-pointer \
+ -fno-optimize-sibling-calls \
+ -fno-unroll-loops
CFLAGS += \
-std=c99 \
+ -pedantic \
-pipe \
- -pedantic \
-Wall \
-Wimplicit \
-Wmissing-prototypes \
@@ -13,4 +21,4 @@ CFLAGS += \
-Wpointer-arith \
-Wreturn-type \
-Wstrict-prototypes \
- -Wtrigraphs \
+ -Wtrigraphs
Received on Mon Jan 21 2008 - 00:31:03 UTC
This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:58:59 UTC