diff options
Diffstat (limited to 'src/cmd/rio/main.c')
-rw-r--r-- | src/cmd/rio/main.c | 99 |
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"); |