mirror of
				https://github.com/leahneukirchen/cwm.git
				synced 2023-08-10 21:13:12 +03:00 
			
		
		
		
	Replace screen region info gathering with XRandR equivalent of Xinerama
queries (currently act on XRandR events anyway). Fall-back mode without XRandR is still what X provides. This removes -lXinerama.
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@@ -13,7 +13,7 @@ CPPFLAGS+=	-I${X11BASE}/include -I${X11BASE}/include/freetype2 -I${.CURDIR}
 | 
			
		||||
CFLAGS+=	-Wall
 | 
			
		||||
 | 
			
		||||
LDADD+=		-L${X11BASE}/lib -lXft -lXrender -lX11 -lxcb -lXau -lXdmcp \
 | 
			
		||||
		-lfontconfig -lexpat -lfreetype -lz -lXinerama -lXrandr -lXext
 | 
			
		||||
		-lfontconfig -lexpat -lfreetype -lz -lXrandr -lXext
 | 
			
		||||
 | 
			
		||||
MANDIR=		${X11BASE}/man/man
 | 
			
		||||
MAN=		cwm.1 cwmrc.5
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								calmwm.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								calmwm.h
									
									
									
									
									
								
							@@ -28,7 +28,6 @@
 | 
			
		||||
#include <X11/Xproto.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
#include <X11/cursorfont.h>
 | 
			
		||||
#include <X11/extensions/Xinerama.h>
 | 
			
		||||
#include <X11/extensions/Xrandr.h>
 | 
			
		||||
#include <X11/keysym.h>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								screen.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								screen.c
									
									
									
									
									
								
							@@ -152,9 +152,8 @@ screen_find_xinerama(struct screen_ctx *sc, int x, int y, int flags)
 | 
			
		||||
void
 | 
			
		||||
screen_update_geometry(struct screen_ctx *sc)
 | 
			
		||||
{
 | 
			
		||||
	XineramaScreenInfo	*info = NULL;
 | 
			
		||||
	struct region_ctx	*region;
 | 
			
		||||
	int			 info_num = 0, i;
 | 
			
		||||
	int			 i;
 | 
			
		||||
 | 
			
		||||
	sc->view.x = 0;
 | 
			
		||||
	sc->view.y = 0;
 | 
			
		||||
@@ -166,25 +165,37 @@ screen_update_geometry(struct screen_ctx *sc)
 | 
			
		||||
	sc->work.w = sc->view.w - (sc->gap.left + sc->gap.right);
 | 
			
		||||
	sc->work.h = sc->view.h - (sc->gap.top + sc->gap.bottom);
 | 
			
		||||
 | 
			
		||||
	/* RandR event may have a CTRC added or removed. */
 | 
			
		||||
	if (XineramaIsActive(X_Dpy))
 | 
			
		||||
		info = XineramaQueryScreens(X_Dpy, &info_num);
 | 
			
		||||
 | 
			
		||||
	while ((region = TAILQ_FIRST(&sc->regionq)) != NULL) {
 | 
			
		||||
		TAILQ_REMOVE(&sc->regionq, region, entry);
 | 
			
		||||
		free(region);
 | 
			
		||||
	}
 | 
			
		||||
	for (i = 0; i < info_num; i++) {
 | 
			
		||||
		region = xmalloc(sizeof(*region));
 | 
			
		||||
		region->num = i;
 | 
			
		||||
		region->area.x = info[i].x_org;
 | 
			
		||||
		region->area.y = info[i].y_org;
 | 
			
		||||
		region->area.w = info[i].width;
 | 
			
		||||
		region->area.h = info[i].height;
 | 
			
		||||
		TAILQ_INSERT_TAIL(&sc->regionq, region, entry);
 | 
			
		||||
 | 
			
		||||
	if (HasRandr) {
 | 
			
		||||
		XRRScreenResources *sr;
 | 
			
		||||
		XRRCrtcInfo *ci;
 | 
			
		||||
 | 
			
		||||
		sr = XRRGetScreenResources(X_Dpy, sc->rootwin);
 | 
			
		||||
		for (i = 0, ci = NULL; i < sr->ncrtc; i++) {
 | 
			
		||||
			ci = XRRGetCrtcInfo(X_Dpy, sr, sr->crtcs[i]);
 | 
			
		||||
			if (ci == NULL)
 | 
			
		||||
				continue;
 | 
			
		||||
			if (ci->noutput == 0) {
 | 
			
		||||
				XRRFreeCrtcInfo(ci);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			region = xmalloc(sizeof(*region));
 | 
			
		||||
			region->num = i;
 | 
			
		||||
			region->area.x = ci->x;
 | 
			
		||||
			region->area.y = ci->y;
 | 
			
		||||
			region->area.w = ci->width;
 | 
			
		||||
			region->area.h = ci->height;
 | 
			
		||||
			TAILQ_INSERT_TAIL(&sc->regionq, region, entry);
 | 
			
		||||
 | 
			
		||||
			XRRFreeCrtcInfo(ci);
 | 
			
		||||
		}
 | 
			
		||||
		XRRFreeScreenResources(sr);
 | 
			
		||||
	}
 | 
			
		||||
	if (info)
 | 
			
		||||
		XFree(info);
 | 
			
		||||
 | 
			
		||||
	xu_ewmh_net_desktop_geometry(sc);
 | 
			
		||||
	xu_ewmh_net_workarea(sc);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user