wm.c
changeset 5 e5018cae273f
parent 3 e969f3575b7a
child 6 e0cefb3981c8
equal deleted inserted replaced
4:991bd8b0771e 5:e5018cae273f
    13 
    13 
    14 #include "wm.h"
    14 #include "wm.h"
    15 
    15 
    16 /* X structs */
    16 /* X structs */
    17 Display *dpy;
    17 Display *dpy;
    18 Window root;
    18 Window root, barwin;
    19 XRectangle rect;
    19 Atom wm_atom[WMLast], net_atom[NetLast];
    20 Pixmap pmap;
       
    21 Atom wm_atom[WMLast];
       
    22 Atom net_atom[NetLast];
       
    23 Cursor cursor[CurLast];
    20 Cursor cursor[CurLast];
    24 
    21 XRectangle rect, barrect;
       
    22 Bool running = True;
       
    23 
       
    24 char *bartext, *shell;
    25 int screen, sel_screen;
    25 int screen, sel_screen;
    26 unsigned int kmask, numlock_mask;
    26 unsigned int lock_mask, numlock_mask;
    27 
    27 
    28 /* draw structs */
    28 /* draw structs */
    29 Brush brush = {0};
    29 Brush brush = {0};
    30 
    30 
    31 enum { WM_PROTOCOL_DELWIN = 1 };
    31 enum { WM_PROTOCOL_DELWIN = 1 };
   164 			if(numlock && (modmap->modifiermap[i] == numlock))
   164 			if(numlock && (modmap->modifiermap[i] == numlock))
   165 				numlock_mask = masks[i / modmap->max_keypermod];
   165 				numlock_mask = masks[i / modmap->max_keypermod];
   166 	}
   166 	}
   167 	XFreeModifiermap(modmap);
   167 	XFreeModifiermap(modmap);
   168 
   168 
   169 	kmask = 255 & ~(numlock_mask | LockMask);
   169 	lock_mask = 255 & ~(numlock_mask | LockMask);
   170 }
   170 }
   171 
   171 
   172 static void
   172 static void
   173 cleanup()
   173 cleanup()
   174 {
   174 {
   185 {
   185 {
   186 	int i;
   186 	int i;
   187 	XSetWindowAttributes wa;
   187 	XSetWindowAttributes wa;
   188 	unsigned int mask;
   188 	unsigned int mask;
   189 	Window w;
   189 	Window w;
       
   190 	XEvent ev;
   190 
   191 
   191 	/* command line args */
   192 	/* command line args */
   192 	for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
   193 	for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
   193 		switch (argv[i][1]) {
   194 		switch (argv[i][1]) {
   194 		case 'v':
   195 		case 'v':
   216 	XFlush(dpy);
   217 	XFlush(dpy);
   217 
   218 
   218 	if(other_wm_running)
   219 	if(other_wm_running)
   219 		error("gridwm: another window manager is already running\n");
   220 		error("gridwm: another window manager is already running\n");
   220 
   221 
       
   222 	if(!(shell = getenv("SHELL")))
       
   223 		shell = "/bin/sh";
       
   224 
   221 	rect.x = rect.y = 0;
   225 	rect.x = rect.y = 0;
   222 	rect.width = DisplayWidth(dpy, screen);
   226 	rect.width = DisplayWidth(dpy, screen);
   223 	rect.height = DisplayHeight(dpy, screen);
   227 	rect.height = DisplayHeight(dpy, screen);
   224 	sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
   228 	sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
   225 
   229 
   242 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
   246 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
   243 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
   247 	cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
   244 
   248 
   245 	init_lock_keys();
   249 	init_lock_keys();
   246 
   250 
   247 	pmap = XCreatePixmap(dpy, root, rect.width, rect.height,
   251 	brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height,
   248 			DefaultDepth(dpy, screen));
   252 			DefaultDepth(dpy, screen));
       
   253 	brush.gc = XCreateGC(dpy, root, 0, 0);
       
   254 
       
   255 	/* style */
       
   256 	loadcolors(dpy, screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR);
       
   257 	loadfont(dpy, &brush.font, FONT);
       
   258 
       
   259 	wa.override_redirect = 1;
       
   260 	wa.background_pixmap = ParentRelative;
       
   261 	wa.event_mask = ExposureMask;
       
   262 
       
   263 	barrect = rect;
       
   264 	barrect.height = labelheight(&brush.font);
       
   265 	barrect.y = rect.height - barrect.height;
       
   266 	barwin = XCreateWindow(dpy, root, barrect.x, barrect.y,
       
   267 			barrect.width, barrect.height, 0, DefaultDepth(dpy, screen),
       
   268 			CopyFromParent, DefaultVisual(dpy, screen),
       
   269 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
       
   270 	bartext = 0;
       
   271 	XDefineCursor(dpy, barwin, cursor[CurNormal]);
       
   272 	XMapRaised(dpy, barwin);
       
   273 	draw_bar();
   249 
   274 
   250 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask;
   275 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask;
   251 	wa.cursor = cursor[CurNormal];
   276 	wa.cursor = cursor[CurNormal];
   252 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
   277 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
   253 
   278 
   254 	/* style */
       
   255 	loadcolors(dpy, screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR);
       
   256 	loadfont(dpy, &brush.font, FONT);
       
   257 
       
   258 	scan_wins();
   279 	scan_wins();
       
   280 
       
   281 	while(running) {
       
   282 		XNextEvent(dpy, &ev);
       
   283 		if(handler[ev.type])
       
   284 			(handler[ev.type]) (&ev); /* call handler */
       
   285 	}
   259 
   286 
   260 	cleanup();
   287 	cleanup();
   261 	XCloseDisplay(dpy);
   288 	XCloseDisplay(dpy);
   262 
   289 
   263 	return 0;
   290 	return 0;