aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rio/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/rio/main.c')
-rw-r--r--src/cmd/rio/main.c99
1 files changed, 78 insertions, 21 deletions
diff --git a/src/cmd/rio/main.c b/src/cmd/rio/main.c
index 2eb63867..c25f8a4c 100644
--- a/src/cmd/rio/main.c
+++ b/src/cmd/rio/main.c
@@ -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,
- CopyFromParent,
+
+ 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,
+ 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,
- CWBackPixel | CWBorderPixel | CWSaveUnder,
+ 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");