wmii

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

commit bb15c97023c03be8d094f4703dc8fdefcd0ea63d
parent df071b6523a5f503deb76712c87bf36ab7e779ac
Author: Kris Maglione <jg@suckless.org>
Date:   Fri, 17 Oct 2008 12:08:44 -0400

Better Xinerama fullscreen support

Diffstat:
cmd/wmii/Makefile | 1+
cmd/wmii/area.c | 4++--
cmd/wmii/client.c | 10++++++----
cmd/wmii/dat.h | 6+++---
cmd/wmii/ewmh.c | 2+-
cmd/wmii/float.c | 2+-
cmd/wmii/fns.h | 5++++-
cmd/wmii/frame.c | 8++++----
cmd/wmii/mouse.c | 2+-
cmd/wmii/view.c | 20++++++--------------
cmd/wmii9menu.c | 11+++++++----
11 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/cmd/wmii/Makefile b/cmd/wmii/Makefile @@ -32,6 +32,7 @@ OBJ = area \ mouse \ rule \ printevent\ + screen \ utf \ _util \ view \ diff --git a/cmd/wmii/area.c b/cmd/wmii/area.c @@ -179,7 +179,7 @@ area_moveto(Area *to, Frame *f) { assert(to->view == f->view); - if(f->client->fullscreen && !to->floating) + if(f->client->fullscreen >= 0 && !to->floating) return; from = f->area; @@ -257,7 +257,7 @@ area_focus(Area *a) { f = a->sel; old_a = v->sel; - if(view_fullscreen_p(v) && !a->floating) + if(!a->floating && view_fullscreen_p(v, a->screen)) return; v->sel = a; diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -97,6 +97,7 @@ client_create(XWindow w, XWindowAttributes *wa) { int depth; c = emallocz(sizeof *c); + c->fullscreen = -1; c->border = wa->border_width; c->r.min = Pt(wa->x, wa->y); @@ -381,7 +382,7 @@ client_floats_p(Client *c) { || c->fixedsize || c->titleless || c->borderless - || c->fullscreen + || c->fullscreen >= 0 || (c->w.ewmh.type & (TypeDialog|TypeSplash|TypeDock)); } @@ -593,14 +594,14 @@ fullscreen(Client *c, int fullscreen) { bool wassel; if(fullscreen == Toggle) - fullscreen = c->fullscreen ^ On; - if(fullscreen == c->fullscreen) + fullscreen = (c->fullscreen >= 0) ^ On; + if(fullscreen == (c->fullscreen >= 0)) return; event("Fullscreen %C %s\n", c, (fullscreen ? "on" : "off")); - c->fullscreen = fullscreen; ewmh_updatestate(c); + c->fullscreen = -1; if(!fullscreen) for(f=c->frame; f; f=f->cnext) { if(f->oldarea == 0) { @@ -617,6 +618,7 @@ fullscreen(Client *c, int fullscreen) { } } else { + c->fullscreen = ownerscreen(c->r); for(f=c->frame; f; f=f->cnext) f->oldarea = -1; if((f = c->sel)) diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -177,16 +177,16 @@ struct Client { char name[256]; char tags[256]; char props[512]; - uint border; long proto; + uint border; + int fullscreen; + int unmapped; char floating; char fixedsize; - char fullscreen; char urgent; char borderless; char titleless; char noinput; - int unmapped; }; struct Divide { diff --git a/cmd/wmii/ewmh.c b/cmd/wmii/ewmh.c @@ -445,7 +445,7 @@ ewmh_updatestate(Client *c) { i = 0; if(f->collapsed) state[i++] = STATE("SHADED"); - if(c->fullscreen) + if(c->fullscreen >= 0) state[i++] = STATE("FULLSCREEN"); if(c->urgent) state[i++] = STATE("DEMANDS_ATTENTION"); diff --git a/cmd/wmii/float.c b/cmd/wmii/float.c @@ -173,7 +173,7 @@ float_placeframe(Frame *f) { if(c->trans) return; */ - if(c->fullscreen || c->w.hints->position || starting) { + if(c->fullscreen >= 0 || c->w.hints->position || starting) { f->r = f->floatr; return; } diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h @@ -236,6 +236,9 @@ Align snap_rect(Rectangle *rects, int num, Rectangle *current, Align *mask, int /* printevent.c */ void printevent(XEvent*); +/* screen.c */ +int ownerscreen(Rectangle); + /* rule.c */ void trim(char *str, const char *chars); void update_rules(Rule**, const char*); @@ -248,7 +251,7 @@ void view_destroy(View*); void view_detach(Frame*); Area* view_findarea(View*, int, bool); void view_focus(WMScreen*, View*); -bool view_fullscreen_p(View*); +bool view_fullscreen_p(View*, int); char* view_index(View*); void view_init(View*, int iscreen); char** view_names(void); diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -298,7 +298,7 @@ frame_gethints(Frame *f) { } #define ADJ(PE, ME) \ - if(c->fullscreen) \ + if(c->fullscreen >= 0) \ return r; \ \ if(!floating) { \ @@ -350,9 +350,9 @@ frame_resize(Frame *f, Rectangle r) { } c = f->client; - if(c->fullscreen) { - f->crect = screen->r; - f->r = screen->r; + if(c->fullscreen >= 0) { + f->crect = screens[c->fullscreen]->r; + f->r = rectsetorigin(f->crect, ZP); return; } diff --git a/cmd/wmii/mouse.c b/cmd/wmii/mouse.c @@ -362,7 +362,7 @@ mouse_resize(Client *c, Align align, bool grabmod) { Frame *f; f = c->sel; - if(f->client->fullscreen) + if(f->client->fullscreen >= 0) return; if(!f->area->floating) { if(align==Center) diff --git a/cmd/wmii/view.c b/cmd/wmii/view.c @@ -46,11 +46,11 @@ view_selclient(View *v) { } bool -view_fullscreen_p(View *v) { +view_fullscreen_p(View *v, int scrn) { Frame *f; for(f=v->floating->frame; f; f=f->anext) - if(f->client->fullscreen) + if(f->client->fullscreen == scrn) return true; return false; } @@ -269,7 +269,6 @@ view_update(View *v) { Client *c; Frame *f; Area *a; - bool fscrn; int s; if(v != selview) @@ -280,11 +279,9 @@ view_update(View *v) { frames_update_sel(v); view_arrange(v); - fscrn = false; foreach_frame(v, s, a, f) - if(f->client->fullscreen) { + if(f->client->fullscreen >= 0) { f->collapsed = false; - fscrn = true; if(!f->area->floating) { f->oldarea = area_idx(f->area); area_moveto(v->floating, f); @@ -308,7 +305,7 @@ view_update(View *v) { } view_restack(v); - if(fscrn) + if(!v->sel->floating && view_fullscreen_p(v, v->sel->screen)) area_focus(v->floating); else area_focus(v->sel); @@ -427,13 +424,11 @@ view_restack(View *v) { Divide *d; Frame *f; Area *a; - bool fscrn; if(v != selview) return; wins.n = 0; - fscrn = view_fullscreen_p(v); /* *sigh */ for(f=v->floating->stack; f; f=f->snext) @@ -442,14 +437,11 @@ view_restack(View *v) { else break; - if(!fscrn) - vector_lpush(&wins, screen->barwin->w); - for(; f; f=f->snext) vector_lpush(&wins, f->client->framewin->w); - if(fscrn) - vector_lpush(&wins, screen->barwin->w); + for(int s=0; s < nscreens; s++) + vector_lpush(&wins, screens[s]->barwin->w); for(d = divs; d && d->w->mapped; d = d->next) vector_lpush(&wins, d->w->w); diff --git a/cmd/wmii9menu.c b/cmd/wmii9menu.c @@ -213,7 +213,7 @@ run_menu(void) wide = max(wide, textwidth(font, labels[i])); wide += font->height & ~1; - size_window(wide, high * i); + size_window(wide, high); warpmouse(wide, high); for(;;) { @@ -248,7 +248,8 @@ run_menu(void) case Expose: redraw(high, wide); break; - case MappingNotify: /* why do we get this? */ + case ConfigureNotify: + case MappingNotify: break; } } @@ -277,16 +278,18 @@ create_window(void) void size_window(int wide, int high) { + Rectangle r; Point p; int h; h = high * numitems; + r = Rect(0, 0, wide, h); p = querypointer(&scr.root); p.x -= wide / 2; if(p.x < 0) p.x = 0; - else if(p.x + wide > Dy(scr.rect)) + else if(p.x + wide > Dx(scr.rect)) p.x = Dy(scr.rect) - wide; p.y -= cur * high + high / 2; @@ -295,7 +298,7 @@ size_window(int wide, int high) else if(p.y + h > Dy(scr.rect)) p.y = Dy(scr.rect) - h; - reshapewin(menuwin, Rpt(p, addpt(p, Pt(wide, high)))); + reshapewin(menuwin, rectaddpt(r, p)); //XSetWindowBackground(display, menuwin->w, cnorm.bg); setborder(menuwin, 1, cnorm.border);