dwm.c
changeset 1464 555070221577
parent 1463 ba3114b785a1
child 1466 aa47da304ae2
equal deleted inserted replaced
1463:ba3114b785a1 1464:555070221577
   378 
   378 
   379 void
   379 void
   380 arrange(void) {
   380 arrange(void) {
   381 	Monitor *m;
   381 	Monitor *m;
   382 
   382 
   383 	/* optimise two loops into one, check focus(NULL) */
       
   384 	for(m = mons; m; m = m->next)
   383 	for(m = mons; m; m = m->next)
   385 		showhide(m->stack);
   384 		showhide(m->stack);
   386 	focus(NULL);
   385 	focus(NULL);
   387 	for(m = mons; m; m = m->next) {
   386 	for(m = mons; m; m = m->next) {
   388 		if(m->lt[m->sellt]->arrange)
   387 		if(m->lt[m->sellt]->arrange)
   438 		focus(c);
   437 		focus(c);
   439 		click = ClkClientWin;
   438 		click = ClkClientWin;
   440 	}
   439 	}
   441 	for(i = 0; i < LENGTH(buttons); i++)
   440 	for(i = 0; i < LENGTH(buttons); i++)
   442 		if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
   441 		if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
   443 		   && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
   442 		&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
   444 			buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
   443 			buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
   445 }
   444 }
   446 
   445 
   447 void
   446 void
   448 checkotherwm(void) {
   447 checkotherwm(void) {
   883 	unsigned char *p = NULL;
   882 	unsigned char *p = NULL;
   884 	unsigned long n, extra;
   883 	unsigned long n, extra;
   885 	Atom real;
   884 	Atom real;
   886 
   885 
   887 	status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
   886 	status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
   888 			&real, &format, &n, &extra, (unsigned char **)&p);
   887 	                            &real, &format, &n, &extra, (unsigned char **)&p);
   889 	if(status != Success)
   888 	if(status != Success)
   890 		return -1;
   889 		return -1;
   891 	if(n != 0)
   890 	if(n != 0)
   892 		result = *p;
   891 		result = *p;
   893 	XFree(p);
   892 	XFree(p);
   907 	if(!name.nitems)
   906 	if(!name.nitems)
   908 		return False;
   907 		return False;
   909 	if(name.encoding == XA_STRING)
   908 	if(name.encoding == XA_STRING)
   910 		strncpy(text, (char *)name.value, size - 1);
   909 		strncpy(text, (char *)name.value, size - 1);
   911 	else {
   910 	else {
   912 		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
   911 		if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
   913 		&& n > 0 && *list)
       
   914 		{
       
   915 			strncpy(text, *list, size - 1);
   912 			strncpy(text, *list, size - 1);
   916 			XFreeStringList(list);
   913 			XFreeStringList(list);
   917 		}
   914 		}
   918 	}
   915 	}
   919 	text[size - 1] = '\0';
   916 	text[size - 1] = '\0';
  1020 
  1017 
  1021 	ev = &e->xkey;
  1018 	ev = &e->xkey;
  1022 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
  1019 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
  1023 	for(i = 0; i < LENGTH(keys); i++)
  1020 	for(i = 0; i < LENGTH(keys); i++)
  1024 		if(keysym == keys[i].keysym
  1021 		if(keysym == keys[i].keysym
  1025 		   && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
  1022 		&& CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
  1026 		   && keys[i].func)
  1023 		&& keys[i].func)
  1027 			keys[i].func(&(keys[i].arg));
  1024 			keys[i].func(&(keys[i].arg));
  1028 }
  1025 }
  1029 
  1026 
  1030 void
  1027 void
  1031 killclient(const Arg *arg) {
  1028 killclient(const Arg *arg) {
  1166 			break;
  1163 			break;
  1167 		case MotionNotify:
  1164 		case MotionNotify:
  1168 			nx = ocx + (ev.xmotion.x - x);
  1165 			nx = ocx + (ev.xmotion.x - x);
  1169 			ny = ocy + (ev.xmotion.y - y);
  1166 			ny = ocy + (ev.xmotion.y - y);
  1170 			if(snap && nx >= selmon->wx && nx <= selmon->wx + selmon->ww
  1167 			if(snap && nx >= selmon->wx && nx <= selmon->wx + selmon->ww
  1171 			        && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
  1168 			&& ny >= selmon->wy && ny <= selmon->wy + selmon->wh) {
  1172 				if(abs(selmon->wx - nx) < snap)
  1169 				if(abs(selmon->wx - nx) < snap)
  1173 					nx = selmon->wx;
  1170 					nx = selmon->wx;
  1174 				else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
  1171 				else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
  1175 					nx = selmon->wx + selmon->ww - WIDTH(c);
  1172 					nx = selmon->wx + selmon->ww - WIDTH(c);
  1176 				if(abs(selmon->wy - ny) < snap)
  1173 				if(abs(selmon->wy - ny) < snap)
  1177 					ny = selmon->wy;
  1174 					ny = selmon->wy;
  1178 				else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
  1175 				else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
  1179 					ny = selmon->wy + selmon->wh - HEIGHT(c);
  1176 					ny = selmon->wy + selmon->wh - HEIGHT(c);
  1180 				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
  1177 				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
  1181 				                  && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
  1178 				&& (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
  1182 					togglefloating(NULL);
  1179 					togglefloating(NULL);
  1183 			}
  1180 			}
  1184 			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
  1181 			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
  1185 				resize(c, nx, ny, c->w, c->h, True);
  1182 				resize(c, nx, ny, c->w, c->h, True);
  1186 			break;
  1183 			break;
  1277 		return;
  1274 		return;
  1278 	restack(selmon);
  1275 	restack(selmon);
  1279 	ocx = c->x;
  1276 	ocx = c->x;
  1280 	ocy = c->y;
  1277 	ocy = c->y;
  1281 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
  1278 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
  1282 	None, cursor[CurResize], CurrentTime) != GrabSuccess)
  1279 	                None, cursor[CurResize], CurrentTime) != GrabSuccess)
  1283 		return;
  1280 		return;
  1284 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
  1281 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
  1285 	do {
  1282 	do {
  1286 		XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
  1283 		XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
  1287 		switch(ev.type) {
  1284 		switch(ev.type) {
  1292 			break;
  1289 			break;
  1293 		case MotionNotify:
  1290 		case MotionNotify:
  1294 			nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
  1291 			nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
  1295 			nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
  1292 			nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
  1296 			if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww
  1293 			if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww
  1297 			        && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) {
  1294 			&& nh >= selmon->wy && nh <= selmon->wy + selmon->wh)
       
  1295 			{
  1298 				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
  1296 				if(!c->isfloating && selmon->lt[selmon->sellt]->arrange
  1299 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1297 				&& (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1300 					togglefloating(NULL);
  1298 					togglefloating(NULL);
  1301 			}
  1299 			}
  1302 			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
  1300 			if(!selmon->lt[selmon->sellt]->arrange || c->isfloating)
  1303 				resize(c, c->x, c->y, nw, nh, True);
  1301 				resize(c, c->x, c->y, nw, nh, True);
  1304 			break;
  1302 			break;
  1471 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
  1469 	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
  1472 			PropModeReplace, (unsigned char *) netatom, NetLast);
  1470 			PropModeReplace, (unsigned char *) netatom, NetLast);
  1473 	/* select for events */
  1471 	/* select for events */
  1474 	wa.cursor = cursor[CurNormal];
  1472 	wa.cursor = cursor[CurNormal];
  1475 	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
  1473 	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask
  1476 			|EnterWindowMask|LeaveWindowMask|StructureNotifyMask
  1474 	                |EnterWindowMask|LeaveWindowMask|StructureNotifyMask
  1477 			|PropertyChangeMask;
  1475 	                |PropertyChangeMask;
  1478 	XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
  1476 	XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
  1479 	XSelectInput(dpy, root, wa.event_mask);
  1477 	XSelectInput(dpy, root, wa.event_mask);
  1480 	grabkeys();
  1478 	grabkeys();
  1481 }
  1479 }
  1482 
  1480