wm.c
changeset 9 d567f430a81d
parent 8 7066ff2fe8bc
child 10 703255003abb
equal deleted inserted replaced
8:7066ff2fe8bc 9:d567f430a81d
    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, barwin;
    18 Window root, barwin;
    19 Atom wm_atom[WMLast], net_atom[NetLast];
    19 Atom net_atom[NetLast];
    20 Cursor cursor[CurLast];
    20 Cursor cursor[CurLast];
    21 XRectangle rect, barrect;
    21 XRectangle rect, barrect;
    22 Bool running = True;
    22 Bool running = True;
    23 Client *client = NULL;
    23 Client *clients = NULL;
    24 
    24 
    25 char *bartext, tag[256];
    25 char *bartext, tag[256];
    26 int screen, sel_screen;
    26 int screen, sel_screen;
    27 
    27 
    28 /* draw structs */
    28 /* draw structs */
    59 				manage(create_client(wins[i], &wa));
    59 				manage(create_client(wins[i], &wa));
    60 		}
    60 		}
    61 	}
    61 	}
    62 	if(wins)
    62 	if(wins)
    63 		XFree(wins);
    63 		XFree(wins);
    64 }
       
    65 
       
    66 static int
       
    67 win_property(Window w, Atom a, Atom t, long l, unsigned char **prop)
       
    68 {
       
    69 	Atom real;
       
    70 	int format;
       
    71 	unsigned long res, extra;
       
    72 	int status;
       
    73 
       
    74 	status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format,
       
    75 			&res, &extra, prop);
       
    76 
       
    77 	if(status != Success || *prop == NULL) {
       
    78 		return 0;
       
    79 	}
       
    80 	if(res == 0)
       
    81 		free((void *) *prop);
       
    82 	return res;
       
    83 }
       
    84 
       
    85 int
       
    86 win_proto(Window w)
       
    87 {
       
    88 	Atom *protocols;
       
    89 	long res;
       
    90 	int protos = 0;
       
    91 	int i;
       
    92 
       
    93 	res = win_property(w, wm_atom[WMProtocols], XA_ATOM, 20L,
       
    94 			((unsigned char **) &protocols));
       
    95 	if(res <= 0) {
       
    96 		return protos;
       
    97 	}
       
    98 	for(i = 0; i < res; i++) {
       
    99 		if(protocols[i] == wm_atom[WMDelete])
       
   100 			protos |= WM_PROTOCOL_DELWIN;
       
   101 	}
       
   102 	free((char *) protocols);
       
   103 	return protos;
       
   104 }
    64 }
   105 
    65 
   106 /*
    66 /*
   107  * There's no way to check accesses to destroyed windows, thus
    67  * There's no way to check accesses to destroyed windows, thus
   108  * those cases are ignored (especially on UnmapNotify's).
    68  * those cases are ignored (especially on UnmapNotify's).
   199 
   159 
   200 	XSetErrorHandler(0);
   160 	XSetErrorHandler(0);
   201 	x_error_handler = XSetErrorHandler(error_handler);
   161 	x_error_handler = XSetErrorHandler(error_handler);
   202 
   162 
   203 	/* init atoms */
   163 	/* init atoms */
   204 	wm_atom[WMState] = XInternAtom(dpy, "WM_STATE", False);
       
   205 	wm_atom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
       
   206 	wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
       
   207 	net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
   164 	net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
   208 	net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
   165 	net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
   209 
   166 
   210 	XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32,
   167 	XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32,
   211 			PropModeReplace, (unsigned char *) net_atom, NetLast);
   168 			PropModeReplace, (unsigned char *) net_atom, NetLast);
   240 	bartext = NULL;
   197 	bartext = NULL;
   241 	XDefineCursor(dpy, barwin, cursor[CurNormal]);
   198 	XDefineCursor(dpy, barwin, cursor[CurNormal]);
   242 	XMapRaised(dpy, barwin);
   199 	XMapRaised(dpy, barwin);
   243 	draw_bar();
   200 	draw_bar();
   244 
   201 
   245 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask;
   202 	wa.event_mask = SubstructureRedirectMask | EnterWindowMask \
       
   203 					| LeaveWindowMask;
   246 	wa.cursor = cursor[CurNormal];
   204 	wa.cursor = cursor[CurNormal];
   247 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
   205 	XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
   248 
   206 
   249 	scan_wins();
   207 	scan_wins();
   250 
   208