Border resizing and 9term greying.

This commit is contained in:
rsc 2004-03-30 05:01:53 +00:00
parent 1cb3fa8093
commit c005568a7f
9 changed files with 321 additions and 102 deletions

View file

@ -4,15 +4,10 @@ and I'd prefer not to resort to patches, I have renamed it "rio".
Current incompatibilities that would be nice to fix:
- Rio uses X11 fonts for the menu, and there aren't any good ones!
I'm tempted to hard-code the Plan 9 default font bitmap.
- The command-line options should be made more like Plan 9.
- Should work out a protocol between 9term and rio so that:
* 9term can tell rio to blue its border during hold mode
* rio can tell 9term to fade its text when it loses focus
* rio can tell 9term to unfade its text when it regains focus
- Should change window focus on b2/b3 clicks and then
pass along the click event to the now-focused window.
@ -20,11 +15,14 @@ I'm tempted to hard-code the Plan 9 default font bitmap.
- Should change 9term to redirect b3 clicks to rio so that rio
can put up the usual b3 menu.
Axel Belinfante contributed the code to handle border grabbing
for resize.
The original README is below.
- russ cox
rsc@swtch.com
20 march 2004
30 march 2004
9wm Version 1.2

View file

@ -25,10 +25,12 @@ setactive(Client *c, int on)
if (c->proto & Ptakefocus)
sendcmessage(c->window, wm_protocols, wm_take_focus, 0);
cmapfocus(c);
}
else
} else {
if (c->proto & Plosefocus)
sendcmessage(c->window, wm_protocols, wm_lose_focus, 0);
XGrabButton(dpy, AnyButton, AnyModifier, c->parent, False,
ButtonMask, GrabModeAsync, GrabModeSync, None, None);
}
draw_border(c, on);
}
@ -49,7 +51,7 @@ draw_border(Client *c, int active)
pixel = c->screen->inactiveborder;
}
if (debug) fprintf(stderr, "draw_border 0x%p pixel %ld active %d hold %d\n", c, pixel, active, c->hold);
if (debug) fprintf(stderr, "draw_border %p pixel %ld active %d hold %d\n", c, pixel, active, c->hold);
XSetWindowBackground(dpy, c->parent, pixel);
XClearWindow(dpy, c->parent);
}
@ -104,10 +106,11 @@ nofocus(void)
}
current = 0;
if (w == 0) {
mask = CWOverrideRedirect;
mask = CWOverrideRedirect/*|CWColormap*/;
attr.override_redirect = 1;
/* attr.colormap = screens[0].def_cmap;*/
w = XCreateWindow(dpy, screens[0].root, 0, 0, 1, 1, 0,
CopyFromParent, InputOnly, CopyFromParent, mask, &attr);
0 /*screens[0].depth*/, InputOnly, screens[0].vis, mask, &attr);
XMapWindow(dpy, w);
}
XSetInputFocus(dpy, w, RevertToPointerRoot, timestamp());

View file

@ -197,16 +197,20 @@ ScreenInfo *s;
s->root_pixmap = XCreatePixmapFromBitmapData(dpy,
s->root, grey_bits, grey_width, grey_height,
s->black, s->white, DefaultDepth(dpy, s->num));
s->black, s->white, s->depth);
s->bordcurs[BorderN] = XCreateFontCursor(dpy, 138);
s->bordcurs[BorderS] = XCreateFontCursor(dpy, 16);
s->bordcurs[BorderW] = XCreateFontCursor(dpy, 70);
s->bordcurs[BorderNNE] = XCreateFontCursor(dpy, 136);
s->bordcurs[BorderENE] = s->bordcurs[BorderNNE] ;
s->bordcurs[BorderE] = XCreateFontCursor(dpy, 96);
s->bordcurs[BorderNW] = XCreateFontCursor(dpy, 134);
s->bordcurs[BorderSW] = XCreateFontCursor(dpy, 12);
s->bordcurs[BorderNE] = XCreateFontCursor(dpy, 136);
s->bordcurs[BorderSE] = XCreateFontCursor(dpy, 14);
s->bordcurs[BorderESE] = XCreateFontCursor(dpy, 14);
s->bordcurs[BorderSSE] = s->bordcurs[BorderESE];
s->bordcurs[BorderS] = XCreateFontCursor(dpy, 16);
s->bordcurs[BorderSSW] = XCreateFontCursor(dpy, 12);
s->bordcurs[BorderWSW] = s->bordcurs[BorderSSW];
s->bordcurs[BorderW] = XCreateFontCursor(dpy, 70);
s->bordcurs[BorderWNW] = XCreateFontCursor(dpy, 134);
s->bordcurs[BorderNNW] = s->bordcurs[BorderWNW];
}

View file

@ -21,7 +21,7 @@
typedef struct Client Client;
typedef struct Menu Menu;
typedef struct ScreenInfo ScreenInfo;
typedef enum BorderLocation BorderLocation;
typedef enum BorderOrient BorderOrient;
struct Client {
Window window;
@ -67,6 +67,7 @@ struct Client {
/* c->proto */
#define Pdelete 1
#define Ptakefocus 2
#define Plosefocus 4
struct Menu {
char **item;
@ -74,22 +75,27 @@ struct Menu {
int lasthit;
};
enum BorderLocation {
enum BorderOrient {
BorderUnknown = 0, /* we depend on this!*/
BorderN,
BorderNE,
BorderNNE,
BorderENE,
BorderE,
BorderSE,
BorderESE,
BorderSSE,
BorderS,
BorderSW,
BorderSSW,
BorderWSW,
BorderW,
BorderNW,
BorderUnknown,
BorderWNW,
BorderNNW,
NBorder,
};
struct ScreenInfo {
int num;
int depth;
Visual *vis;
int width;
int height;
Window root;
@ -149,6 +155,7 @@ extern Atom _9wm_hold_mode;
extern Atom wm_protocols;
extern Atom wm_delete;
extern Atom wm_take_focus;
extern Atom wm_lose_focus;
extern Atom wm_colormaps;
/* client.c */

View file

@ -460,7 +460,8 @@ leave(XCrossingEvent *e)
Client *c;
c = getclient(e->window, 0);
XUndefineCursor(dpy, c->parent);
if (c)
XUndefineCursor(dpy, c->parent);
/* XDefineCursor(dpy, c->parent, c->screen->arrow); */
}
@ -481,17 +482,17 @@ focusin(XFocusChangeEvent *e)
}
}
BorderLocation
borderlocation(Client *c, int x, int y)
BorderOrient
borderorient(Client *c, int x, int y)
{
if (x <= BORDER) {
if (y <= CORNER) {
if (debug) fprintf(stderr, "topleft\n");
return BorderNW;
return BorderWNW;
}
if (y >= (c->dy + 2*BORDER) - CORNER) {
if (debug) fprintf(stderr, "botleft\n");
return BorderSW;
return BorderWSW;
}
if (y > CORNER &&
y < (c->dy + 2*BORDER) - CORNER) {
@ -501,20 +502,20 @@ borderlocation(Client *c, int x, int y)
} else if (x <= CORNER) {
if (y <= BORDER) {
if (debug) fprintf(stderr, "topleft\n");
return BorderNW;
return BorderNNW;
}
if (y >= (c->dy + BORDER)) {
if (debug) fprintf(stderr, "botleft\n");
return BorderSW;
return BorderSSW;
}
} else if (x >= (c->dx + BORDER)) {
if (y <= CORNER) {
if (debug) fprintf(stderr, "topright\n");
return BorderNE;
return BorderENE;
}
if (y >= (c->dy + 2*BORDER) - CORNER) {
if (debug) fprintf(stderr, "botright\n");
return BorderSE;
return BorderESE;
}
if (y > CORNER &&
y < (c->dy + 2*BORDER) - CORNER) {
@ -524,11 +525,11 @@ borderlocation(Client *c, int x, int y)
} else if (x >= (c->dx + 2*BORDER) - CORNER) {
if (y <= BORDER) {
if (debug) fprintf(stderr, "topright\n");
return BorderNE;
return BorderNNE;
}
if (y >= (c->dy + BORDER)) {
if (debug) fprintf(stderr, "botright\n");
return BorderSE;
return BorderSSE;
}
} else if (x > CORNER &&
x < (c->dx + 2*BORDER) - CORNER) {
@ -548,11 +549,11 @@ void
motionnotify(XMotionEvent *e)
{
Client *c;
BorderLocation bl;
BorderOrient bl;
c = getclient(e->window, 0);
if (c) {
bl = borderlocation(c, e->x, e->y);
bl = borderorient(c, e->x, e->y);
if (bl == BorderUnknown)
XUndefineCursor(dpy, c->parent);
else

View file

@ -40,7 +40,7 @@ void leave();
void focusin();
void reparent();
void motionnotify();
BorderLocation borderlocation();
BorderOrient borderorient();
/* manage.c */
int manage();

View file

@ -222,8 +222,8 @@ selectwin(int release, int *shift, ScreenInfo *s)
}
}
void
sweepcalc(Client *c, int x, int y, BorderLocation bl)
int
sweepcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
{
int dx, dy, sx, sy;
@ -264,56 +264,166 @@ sweepcalc(Client *c, int x, int y, BorderLocation bl)
}
c->dx = sx*(dx + 2*BORDER);
c->dy = sy*(dy + 2*BORDER);
return ignored;
}
void
dragcalc(Client *c, int x, int y, BorderLocation bl)
int
dragcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
{
c->x += x;
c->y += y;
return ignored;
}
void
pullcalc(Client *c, int x, int y, BorderLocation bl)
int
pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
{
int dx, dy, sx, sy, px, py, spx, spy, rdx, rdy, xoff, yoff, xcorn, ycorn;
px = c->x;
py = c->y;
dx = c->dx;
dy = c->dy;
sx = sy = 1;
spx = spy = 0;
xoff = yoff = 0;
xcorn = ycorn = 0;
switch(bl) {
case BorderN:
c->y += y;
c->dy -= y;
py = y;
dy = (c->y + c->dy) - y;
spy = 1;
yoff = y - c->y;
break;
case BorderS:
c->dy += y;
dy = y - c->y;
yoff = (c->y + c->dy) - y;
break;
case BorderE:
c->dx += x;
dx = x - c->x;
xoff = (c->x + c->dx) - x;
break;
case BorderW:
c->x += x;
c->dx -= x;
px = x;
dx = (c->x + c->dx) - x;
spx = 1;
xoff = x - c->x;
break;
case BorderNW:
c->x += x;
c->dx -= x;
c->y += y;
c->dy -= y;
case BorderNNW:
case BorderWNW:
px = x;
dx = (c->x + c->dx) - x;
spx = 1;
py = y;
dy = (c->y + c->dy) - y;
spy = 1;
xoff = x - c->x;
yoff = y - c->y;
break;
case BorderNE:
c->dx += x;
c->y += y;
c->dy -= y;
case BorderNNE:
case BorderENE:
dx = x - c->x;
py = y;
dy = (c->y + c->dy) - y;
spy = 1;
xoff = (c->x + c->dx) - x;
yoff = y - c->y;
break;
case BorderSE:
c->dx += x;
c->dy += y;
case BorderSSE:
case BorderESE:
dx = x - c->x;
dy = y - c->y;
xoff = (c->x + c->dx) - x;
yoff = (c->y + c->dy) - y;
break;
case BorderSW:
c->x += x;
c->dx -= x;
c->dy += y;
case BorderSSW:
case BorderWSW:
px = x;
dx = (c->x + c->dx) - x;
spx = 1;
dy = y - c->y;
xoff = x - c->x;
yoff = (c->y + c->dy) - y;
break;
default:
break;
}
switch(bl) {
case BorderNNW:
case BorderNNE:
case BorderSSW:
case BorderSSE:
xcorn = 1;
break;
case BorderWNW:
case BorderENE:
case BorderWSW:
case BorderESE:
ycorn = 1;
break;
}
if (!init
|| xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
|| yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)) {
xoff = 0;
yoff = 0;
init = 0;
}
if (debug) fprintf(stderr, "c %dx%d+%d+%d m +%d+%d r %dx%d+%d+%d sp (%d,%d) bl %d\n",
c->dx, c->dy, c->x, c->y, x, y, dx, dy, px, py, spx, spy, bl);
if (dx < 0) {
dx = -dx;
sx = -1;
}
if (dy < 0) {
dy = -dy;
sy = -1;
}
/* remember requested size;
* after applying size hints we may have to correct position
*/
rdx = sx*dx;
rdy = sy*dy;
/* apply size hints */
dx -= (2*BORDER - xoff);
dy -= (2*BORDER - yoff);
if (!c->is9term) {
if (dx < c->min_dx)
dx = c->min_dx;
if (dy < c->min_dy)
dy = c->min_dy;
}
if (c->size.flags & PResizeInc) {
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
}
if (c->size.flags & PMaxSize) {
if (dx > c->size.max_width)
dx = c->size.max_width;
if (dy > c->size.max_height)
dy = c->size.max_height;
}
/* set size and position */
c->dx = sx*(dx + 2*BORDER );
c->dy = sy*(dy + 2*BORDER );
c->x = px;
c->y = py;
/* compensate position for size changed due to size hints */
c->x -= spx*(c->dx - rdx);
c->y -= spy*(c->dy - rdy);
return init;
}
static void
@ -330,6 +440,8 @@ drawbound(Client *c, int drawing)
{
int x, y, dx, dy;
ScreenInfo *s;
if (debug) fprintf(stderr, "drawbound %dx%d +%d+%d\n", c->dx, c->dy, c->x, c->y);
s = c->screen;
x = c->x;
@ -393,14 +505,16 @@ misleep(int msec)
}
int
sweepdrag(Client *c, int but, XButtonEvent *e0, BorderLocation bl, void (*recalc)(Client*, int, int, BorderLocation))
sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(Client*, int, int, BorderOrient, int))
{
XEvent ev;
int idle;
int cx, cy, rx, ry;
int ox, oy, odx, ody;
XButtonEvent *e;
int notmoved;
notmoved = 1;
ox = c->x;
oy = c->y;
odx = c->dx;
@ -409,13 +523,14 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderLocation bl, void (*recalc
c->y -= BORDER;
c->dx += 2*BORDER;
c->dy += 2*BORDER;
if (bl)
if (bl || e0 == 0)
getmouse(&cx, &cy, c->screen);
else if (e0)
getmouse(&c->x, &c->y, c->screen);
else
getmouse(&cx, &cy, c->screen);
getmouse(&c->x, &c->y, c->screen);
XGrabServer(dpy);
if (bl) {
notmoved = recalc(c, cx, cy, bl, notmoved);
}
drawbound(c, 1);
idle = 0;
for (;;) {
@ -430,10 +545,10 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderLocation bl, void (*recalc
XGrabServer(dpy);
idle = 0;
}
if(e0)
recalc(c, rx, ry, bl);
if(e0 || bl)
notmoved = recalc(c, rx, ry, bl, notmoved);
else
recalc(c, rx-cx, ry-cy, bl);
notmoved = recalc(c, rx-cx, ry-cy, bl, notmoved);
cx = rx;
cy = ry;
drawbound(c, 1);
@ -508,9 +623,11 @@ pull(Client *c, int but, XButtonEvent *e)
{
int status;
ScreenInfo *s;
BorderLocation bl;
BorderOrient bl;
bl = borderorient(c, e->x, e->y);
/* assert(bl > BorderUnknown && bl < NBorder); */
bl = borderlocation(c, e->x, e->y);
s = c->screen;
status = grab(s->root, s->root, ButtonMask, s->bordcurs[bl], 0);
if (status != GrabSuccess) {
@ -544,6 +661,7 @@ getmouse(int *x, int *y, ScreenInfo *s)
unsigned int t3;
XQueryPointer(dpy, s->root, &dw1, &dw2, x, y, &t1, &t2, &t3);
if (debug) fprintf(stderr, "getmouse: %d %d\n", *x, *y);
}
void

View file

@ -46,6 +46,7 @@ Atom wm_change_state;
Atom wm_protocols;
Atom wm_delete;
Atom wm_take_focus;
Atom wm_lose_focus;
Atom wm_colormaps;
Atom _9wm_running;
Atom _9wm_hold_mode;
@ -152,11 +153,14 @@ main(int argc, char *argv[])
exit(0);
}
if (0) XSynchronize(dpy, True);
wm_state = XInternAtom(dpy, "WM_STATE", False);
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", False);
wm_delete = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
wm_take_focus = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
wm_lose_focus = XInternAtom(dpy, "_9WM_LOSE_FOCUS", False);
wm_colormaps = XInternAtom(dpy, "WM_COLORMAP_WINDOWS", False);
_9wm_running = XInternAtom(dpy, "_9WM_RUNNING", False);
_9wm_hold_mode = XInternAtom(dpy, "_9WM_HOLD_MODE", False);
@ -214,8 +218,11 @@ initscreen(ScreenInfo *s, int i, int background)
{
char *ds, *colon, *dot1;
unsigned long mask;
unsigned long gmask;
XGCValues gv;
XSetWindowAttributes attr;
XVisualInfo xvi;
XSetWindowAttributes attrs;
s->num = i;
s->root = RootWindow(dpy, i);
@ -223,6 +230,44 @@ initscreen(ScreenInfo *s, int i, int background)
s->min_cmaps = MinCmapsOfScreen(ScreenOfDisplay(dpy, i));
s->depth = DefaultDepth(dpy, i);
/*
* Figure out underlying screen format.
*/
if(XMatchVisualInfo(dpy, i, 16, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 16, DirectColor, &xvi)){
s->vis = xvi.visual;
s->depth = 16;
}
else
if(XMatchVisualInfo(dpy, i, 15, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 15, DirectColor, &xvi)){
s->vis = xvi.visual;
s->depth = 15;
}
else
if(XMatchVisualInfo(dpy, i, 24, TrueColor, &xvi)
|| XMatchVisualInfo(dpy, i, 24, DirectColor, &xvi)){
s->vis = xvi.visual;
s->depth = 24;
}
else
if(XMatchVisualInfo(dpy, i, 8, PseudoColor, &xvi)
|| XMatchVisualInfo(dpy, i, 8, StaticColor, &xvi)){
s->vis = xvi.visual;
s->depth = 8;
}
else{
s->depth = DefaultDepth(dpy, i);
if(s->depth != 8){
fprintf(stderr, "can't understand depth %d screen", s->depth);
exit(1);
}
s->vis = DefaultVisual(dpy, i);
}
if(DefaultDepth(dpy, i) != s->depth) {
s->def_cmap = XCreateColormap(dpy, s->root, s->vis, AllocNone);
}
ds = DisplayString(dpy);
colon = rindex(ds, ':');
if (colon && num_screens > 1) {
@ -254,36 +299,36 @@ initscreen(ScreenInfo *s, int i, int background)
gv.function = GXxor;
gv.line_width = 0;
gv.subwindow_mode = IncludeInferiors;
mask = GCForeground | GCBackground | GCFunction | GCLineWidth
gmask = GCForeground | GCBackground | GCFunction | GCLineWidth
| GCSubwindowMode;
if (font != 0) {
gv.font = font->fid;
mask |= GCFont;
gmask |= GCFont;
}
s->gc = XCreateGC(dpy, s->root, mask, &gv);
s->gc = XCreateGC(dpy, s->root, gmask, &gv);
gv.function = GXcopy;
s->gccopy = XCreateGC(dpy, s->root, mask, &gv);
s->gccopy = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = s->red;
s->gcred = XCreateGC(dpy, s->root, mask, &gv);
s->gcred = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = colorpixel(dpy, s->depth, 0xEEEEEE, s->black);
s->gcsweep = XCreateGC(dpy, s->root, mask, &gv);
s->gcsweep = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = colorpixel(dpy, s->depth, 0xE9FFE9, s->white);
s->gcmenubg = XCreateGC(dpy, s->root, mask, &gv);
s->gcmenubg = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = colorpixel(dpy, s->depth, 0x448844, s->black);
s->gcmenubgs = XCreateGC(dpy, s->root, mask, &gv);
s->gcmenubgs = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = s->black;
gv.background = colorpixel(dpy, s->depth, 0xE9FFE9, s->white);
s->gcmenufg = XCreateGC(dpy, s->root, mask, &gv);
s->gcmenufg = XCreateGC(dpy, s->root, gmask, &gv);
gv.foreground = colorpixel(dpy, s->depth, 0xE9FFE9, s->white);
gv.background = colorpixel(dpy, s->depth, 0x448844, s->black);
s->gcmenufgs = XCreateGC(dpy, s->root, mask, &gv);
s->gcmenufgs = XCreateGC(dpy, s->root, gmask, &gv);
initcurs(s);
@ -300,21 +345,31 @@ initscreen(ScreenInfo *s, int i, int background)
XClearWindow(dpy, s->root);
} else
system("xsetroot -solid grey30");
s->menuwin = XCreateSimpleWindow(dpy, s->root, 0, 0, 1, 1, 2, colorpixel(dpy, s->depth, 0x88CC88, s->black), colorpixel(dpy, s->depth, 0xE9FFE9, s->white));
// s->sweepwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 4, s->red, colorpixel(dpy, s->depth, 0xEEEEEE, s->black));
{
XSetWindowAttributes attrs;
attrs.background_pixel = colorpixel(dpy, s->depth, 0xEEEEEE, s->black);
attrs.border_pixel = s->red;
attrs.save_under = True;
s->sweepwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 4,
attrs.border_pixel = colorpixel(dpy, s->depth, 0x88CC88, s->black);
attrs.background_pixel = colorpixel(dpy, s->depth, 0xE9FFE9, s->white);
attrs.save_under = True; /* Does this help us in anyway? */
attrs.colormap = s->def_cmap;
s->menuwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 2,
s->depth,
CopyFromParent,
CopyFromParent,
CopyFromParent,
CWBackPixel | CWBorderPixel | CWSaveUnder,
s->vis,
CWBackPixel | CWBorderPixel | CWSaveUnder|CWColormap,
&attrs
);
attrs.border_pixel = s->red;
attrs.background_pixel = colorpixel(dpy, s->depth, 0xEEEEEE, s->black);
attrs.save_under = True; /* Does this help us in anyway? */
attrs.colormap = s->def_cmap;
s->sweepwin = XCreateWindow(dpy, s->root, 0, 0, 1, 1, 4,
s->depth,
CopyFromParent,
s->vis,
CWBackPixel | CWBorderPixel | CWSaveUnder|CWColormap,
&attrs
);
}
}
ScreenInfo*
@ -360,6 +415,8 @@ sendcmessage(Window w, Atom a, long x, int isroot)
mask = 0L;
if (isroot)
mask = SubstructureRedirectMask; /* magic! */
else
mask = ExposureMask; /* not really correct but so be it */
status = XSendEvent(dpy, w, False, mask, &ev);
if (status == 0)
fprintf(stderr, "9wm: sendcmessage failed\n");

View file

@ -19,6 +19,7 @@ manage(Client *c, int mapped)
long msize;
XClassHint class;
XWMHints *hints;
XSetWindowAttributes attrs;
trace("manage", c, 0);
XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask);
@ -118,20 +119,38 @@ manage(Client *c, int mapped)
else
gravitate(c, 0);
c->parent = XCreateSimpleWindow(dpy, c->screen->root,
attrs.border_pixel = c->screen->black;
attrs.background_pixel = c->screen->white;
attrs.colormap = c->screen->def_cmap;
c->parent = XCreateWindow(dpy, c->screen->root,
c->x - BORDER, c->y - BORDER,
c->dx + 2*BORDER, c->dy + 2*BORDER,
0,
c->screen->black, c->screen->white);
c->screen->depth,
CopyFromParent,
c->screen->vis,
CWBackPixel | CWBorderPixel | CWColormap,
&attrs);
XSelectInput(dpy, c->parent, SubstructureRedirectMask | SubstructureNotifyMask|ButtonPressMask| PointerMotionMask|LeaveWindowMask);
if (mapped)
c->reparenting = 1;
if (doreshape && !fixsize)
XResizeWindow(dpy, c->window, c->dx, c->dy);
XSetWindowBorderWidth(dpy, c->window, 0);
if (1 || c->screen->depth <= 8) {
/*
* To have something more than only a big white or black border
* XXX should replace this by a pattern in the white or black
* such that we can see the border also if all our
* windows are black and/or white
* (black (or white) border around black (or white) window
* is not very helpful.
*/
if (c->screen->depth <= 8) {
XSetWindowBorderWidth(dpy, c->parent, 1);
}
XReparentWindow(dpy, c->window, c->parent, BORDER, BORDER);
#ifdef SHAPE
if (shape) {
@ -159,6 +178,16 @@ manage(Client *c, int mapped)
if (current && (current != c))
cmapfocus(current);
c->init = 1;
/*
* If we swept the window, let's send a resize event to the
* guy who just got resized. It's not clear whether the apps
* should notice their new size via other means. Try as I might,
* I can't find a way to have them notice during initdraw, so
* I solve the problem this way instead. -rsc
*/
if(c->is9term)
sendconfig(c);
return 1;
}
@ -488,6 +517,8 @@ getproto(Client *c)
c->proto |= Pdelete;
else if (p[i] == wm_take_focus)
c->proto |= Ptakefocus;
else if (p[i] == wm_lose_focus)
c->proto |= Plosefocus;
XFree((char *) p);
}