aboutsummaryrefslogtreecommitdiffstats
path: root/screen.c
diff options
context:
space:
mode:
authorokan2015-06-26 15:21:58 +0000
committerokan2015-06-26 15:21:58 +0000
commit5cf1374cd905ac2fb2aff2baf0e178ff81d5a416 (patch)
treeeb54dacb882ea36d4e9b92274a28f2ae5f29107b /screen.c
parentc6cf16dddd47bdca93eefcaa3c8dfa858c09e426 (diff)
downloadcwm-5cf1374cd905ac2fb2aff2baf0e178ff81d5a416.tar.gz
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.
Diffstat (limited to 'screen.c')
-rw-r--r--screen.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/screen.c b/screen.c
index 4e7c617..76fad3d 100644
--- a/screen.c
+++ b/screen.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: screen.c,v 1.71 2015/01/19 14:54:16 okan Exp $
+ * $OpenBSD: screen.c,v 1.72 2015/06/26 15:21:58 okan Exp $
*/
#include <sys/types.h>
@@ -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);