aboutsummaryrefslogtreecommitdiffstats
path: root/calmwm.c
diff options
context:
space:
mode:
authoroga2008-09-29 23:16:46 +0000
committeroga2008-09-29 23:16:46 +0000
commita45b63cfb2ae8afa0152a8e8ebc59e605cf09713 (patch)
tree274e39637d074c40f57c08c158a2ee0043392712 /calmwm.c
parent9809202df5c965b7710ef1770d36c25c586e4249 (diff)
downloadcwm-a45b63cfb2ae8afa0152a8e8ebc59e605cf09713.tar.gz
Xinerama and XRandR dual head support for cwm(1). Now we detect the xrandr
reconfiguration events and change our sizes depending on that. We also detect the xinerama screens for maximize, vertmaximize and initial window placement. This could be improved by automatically resizing maximized windows when the screen resolution changes and by moving windows that would be hidden into visible space. Said changes will come shortly. Tested by many. matthieu@ didn't oppose.
Diffstat (limited to '')
-rw-r--r--calmwm.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/calmwm.c b/calmwm.c
index dd1ea6d..b0397e0 100644
--- a/calmwm.c
+++ b/calmwm.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.
*
- * $Id: calmwm.c,v 1.29 2008/09/22 14:28:04 oga Exp $
+ * $Id: calmwm.c,v 1.30 2008/09/29 23:16:46 oga Exp $
*/
#include "headers.h"
@@ -36,6 +36,7 @@ u_int Nscreens;
struct client_ctx_q Clientq;
int Doshape, Shape_ev;
+int HasXinerama, HasRandr, Randr_ev;
int Starting;
struct conf Conf;
@@ -121,6 +122,8 @@ dpy_init(const char *dpyname)
Doshape = XShapeQueryExtension(X_Dpy, &Shape_ev, &i);
+ HasRandr = XRRQueryExtension(X_Dpy, &Randr_ev, &i);
+
TAILQ_INIT(&Screenq);
}
@@ -133,7 +136,7 @@ x_setup(void)
Nscreens = ScreenCount(X_Dpy);
for (i = 0; i < (int)Nscreens; i++) {
- XMALLOC(sc, struct screen_ctx);
+ XCALLOC(sc, struct screen_ctx);
x_setupscreen(sc, i);
TAILQ_INSERT_TAIL(&Screenq, sc, entry);
}
@@ -161,6 +164,7 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
Window *wins, w0, w1;
XWindowAttributes winattr;
XSetWindowAttributes rootattr;
+ int fake;
u_int nwins, i;
Curscreen = sc;
@@ -246,6 +250,18 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
XChangeWindowAttributes(X_Dpy, sc->rootwin,
CWEventMask, &rootattr);
+ if (XineramaQueryExtension(X_Dpy, &fake, &fake) == 1 &&
+ ((HasXinerama = XineramaIsActive(X_Dpy)) == 1))
+ HasXinerama = 1;
+ if (HasRandr)
+ XRRSelectInput(X_Dpy, sc->rootwin, RRScreenChangeNotifyMask);
+ /*
+ * initial setup of xinerama screens, if we're using RandR then we'll
+ * redo this whenever the screen changes since a CTRC may have been
+ * added or removed
+ */
+ screen_init_xinerama(sc);
+
XSync(X_Dpy, False);
return;