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:
okan 2015-06-26 15:21:58 +00:00
parent d324f4a41d
commit 9660be8b0b
3 changed files with 31 additions and 21 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.20 2013/05/19 23:38:20 okan Exp $
# $OpenBSD: Makefile,v 1.21 2015/06/26 15:21:58 okan Exp $
.include <bsd.xconf.mk>
@ -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

View File

@ -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: calmwm.h,v 1.292 2015/06/09 13:02:15 okan Exp $
* $OpenBSD: calmwm.h,v 1.293 2015/06/26 15:21:58 okan Exp $
*/
#ifndef _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>

View File

@ -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);