summary refs log tree commit diff
path: root/screen.c
diff options
context:
space:
mode:
authorokan <okan>2014-02-03 21:07:47 +0000
committerokan <okan>2014-02-03 21:07:47 +0000
commitf793964c9ec586b9c4b4843c14bc83afaf275cb4 (patch)
treef86da2d983d304fdbe21b08538f859bff237ac2f /screen.c
parent8a6dd51fac7632b413dd36c08d725ab28b161797 (diff)
downloadcwm-f793964c9ec586b9c4b4843c14bc83afaf275cb4.tar.gz
cwm-f793964c9ec586b9c4b4843c14bc83afaf275cb4.tar.xz
cwm-f793964c9ec586b9c4b4843c14bc83afaf275cb4.zip
Introduce a region queue and replace screen's XineramaScreenInfo; we
still use Xinerama to populate the regions per screen, but will switch
at a more appropriate time.
Diffstat (limited to 'screen.c')
-rw-r--r--screen.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/screen.c b/screen.c
index 0bcdeec..17d6b87 100644
--- a/screen.c
+++ b/screen.c
@@ -41,6 +41,7 @@ screen_init(int which)
 	sc = xcalloc(1, sizeof(*sc));
 
 	TAILQ_INIT(&sc->mruq);
+	TAILQ_INIT(&sc->regionq);
 
 	sc->which = which;
 	sc->rootwin = RootWindow(X_Dpy, sc->which);
@@ -116,23 +117,13 @@ screen_updatestackingorder(struct screen_ctx *sc)
 struct geom
 screen_find_xinerama(struct screen_ctx *sc, int x, int y, int flags)
 {
-	XineramaScreenInfo	*info;
-	struct geom		 geom;
-	int			 i;
-
-	geom = sc->work;
-
-	if (sc->xinerama == NULL)
-		return (geom);
-
-	for (i = 0; i < sc->xinerama_no; i++) {
-		info = &sc->xinerama[i];
-		if (x >= info->x_org && x < info->x_org + info->width &&
-		    y >= info->y_org && y < info->y_org + info->height) {
-			geom.x = info->x_org;
-			geom.y = info->y_org;
-			geom.w = info->width;
-			geom.h = info->height;
+	struct region_ctx	*region;
+	struct geom		 geom = sc->work;
+
+	TAILQ_FOREACH(region, &sc->regionq, entry) {
+		if (x >= region->area.x && x < region->area.x+region->area.w &&
+		    y >= region->area.y && y < region->area.y+region->area.h) {
+			geom = region->area;
 			break;
 		}
 	}
@@ -149,7 +140,8 @@ void
 screen_update_geometry(struct screen_ctx *sc)
 {
 	XineramaScreenInfo	*info = NULL;
-	int			 info_no = 0;
+	struct region_ctx	*region;
+	int			 info_no = 0, i;
 
 	sc->view.x = 0;
 	sc->view.y = 0;
@@ -164,10 +156,22 @@ screen_update_geometry(struct screen_ctx *sc)
 	/* RandR event may have a CTRC added or removed. */
 	if (XineramaIsActive(X_Dpy))
 		info = XineramaQueryScreens(X_Dpy, &info_no);
-	if (sc->xinerama != NULL)
-		XFree(sc->xinerama);
-	sc->xinerama = info;
-	sc->xinerama_no = info_no;
+
+	while ((region = TAILQ_FIRST(&sc->regionq)) != NULL) {
+		TAILQ_REMOVE(&sc->regionq, region, entry);
+		free(region);
+	}
+	for (i = 0; i < info_no; 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 (info)
+		XFree(info);
 
 	xu_ewmh_net_desktop_geometry(sc);
 	xu_ewmh_net_workarea(sc);