void subScreenResize(void) { int i; assert(subtle); /* Update screens */ for(i = 0; i < subtle->screens->ndata; i++) { SubScreen *s = SCREEN(subtle->screens->data[i]); /* Add strut */ s->geom.x = s->base.x + subtle->styles.subtle.padding.left; s->geom.y = s->base.y + subtle->styles.subtle.padding.top; s->geom.width = s->base.width - subtle->styles.subtle.padding.left - subtle->styles.subtle.padding.right; s->geom.height = s->base.height - subtle->styles.subtle.padding.top - subtle->styles.subtle.padding.bottom; /* Update panels */ if(s->flags & SUB_SCREEN_PANEL1) { XMoveResizeWindow(subtle->dpy, s->panel1, s->base.x, s->base.y, s->base.width, subtle->ph); XMapRaised(subtle->dpy, s->panel1); /* Update height */ s->geom.y += subtle->ph; s->geom.height -= subtle->ph; } else XUnmapWindow(subtle->dpy, s->panel1); if(s->flags & SUB_SCREEN_PANEL2) { XMoveResizeWindow(subtle->dpy, s->panel2, s->base.x, s->base.y + s->base.height - subtle->ph, s->base.width, subtle->ph); XMapRaised(subtle->dpy, s->panel2); /* Update height */ s->geom.height -= subtle->ph; } else XUnmapWindow(subtle->dpy, s->panel2); /* Create/update drawable for double buffering */ if(s->drawable) XFreePixmap(subtle->dpy, s->drawable); s->drawable = XCreatePixmap(subtle->dpy, ROOT, s->base.width, subtle->ph, XDefaultDepth(subtle->dpy, DefaultScreen(subtle->dpy))); } ScreenPublish(); subSubtleLogDebugSubtle("Resize\n"); } /* }}} */
void subScreenInit(void) { SubScreen *s = NULL; #ifdef HAVE_X11_EXTENSIONS_XRANDR_H /* Check both but prefer xrandr */ if(subtle->flags & SUB_SUBTLE_XRANDR) { XRRScreenResources *res = NULL; if((res = XRRGetScreenResourcesCurrent(subtle->dpy, ROOT))) { int i; XRRCrtcInfo *crtc = NULL; /* Query screens */ for(i = 0; i < res->ncrtc; i++) { if((crtc = XRRGetCrtcInfo(subtle->dpy, res, res->crtcs[i]))) { /* Create new screen if crtc is enabled */ if(None != crtc->mode && (s = subScreenNew(crtc->x, crtc->y, crtc->width, crtc->height))) subArrayPush(subtle->screens, (void *)s); XRRFreeCrtcInfo(crtc); } } XRRFreeScreenResources(res); } } #endif /* HAVE_X11_EXTENSIONS_XRANDR_H */ #ifdef HAVE_X11_EXTENSIONS_XINERAMA_H if(subtle->flags & SUB_SUBTLE_XINERAMA && 0 == subtle->screens->ndata && XineramaIsActive(subtle->dpy)) { int i, n = 0; XineramaScreenInfo *info = NULL; /* Query screens */ if((info = XineramaQueryScreens(subtle->dpy, &n))) { for(i = 0; i < n; i++) { /* Create new screen */ if((s = subScreenNew(info[i].x_org, info[i].y_org, info[i].width, info[i].height))) subArrayPush(subtle->screens, (void *)s); } XFree(info); } } #endif /* HAVE_X11_EXTENSIONS_XINERAMA_H */ /* Create default screen */ if(0 == subtle->screens->ndata) { /* Create new screen */ if((s = subScreenNew(0, 0, subtle->width, subtle->height))) subArrayPush(subtle->screens, (void *)s); } printf("Running on %d screen(s)\n", subtle->screens->ndata); ScreenPublish(); subScreenPublish(); subSharedLogDebugSubtle("init=screen\n"); } /* }}} */