summaryrefslogtreecommitdiff
path: root/overlay/x11
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-08-25 23:37:58 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-08-25 23:44:35 +0100
commit1e65d5ac2f1c3b80444fd3c12e7bfcaf033a117f (patch)
tree6589bc7c15e0fabbcc3c1ef8ce153ddf0ea494be /overlay/x11
parentc9f0173764c5266ebd29a3d57ea8a379440346b4 (diff)
overlay: Allow simple positioning and resizing
Using window.size=<width>x<height> or window.size=<scale>% in the config file, or --size=<scale>% or --size=<width>x<height> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'overlay/x11')
-rw-r--r--overlay/x11/position.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/overlay/x11/position.c b/overlay/x11/position.c
index 0dcfc8de..ebfc3afe 100644
--- a/overlay/x11/position.c
+++ b/overlay/x11/position.c
@@ -80,12 +80,13 @@ x11_position(Screen *scr, int width, int height,
geometry = config_get_value(config, "window", "geometry");
if (geometry) {
sscanf(geometry, "%dx%d+%d+%d", w, h, x, y);
- if (*w < width)
- *w = width;
- if (*h < height)
- *h = height;
+ if (*w < width/2)
+ *w = width/2;
+ if (*h < height/2)
+ *h = height/2;
} else {
position = get_position(config);
+
if (position != POS_UNSET) {
if (width == -1) {
*w = scr->width;
@@ -94,10 +95,7 @@ x11_position(Screen *scr, int width, int height,
case 0:
case 2: *w >>= 1; break;
}
- } else if (width > scr->width) {
- *w = scr->width;
- } else
- *w = width;
+ }
if (height == -1) {
*h = scr->height;
@@ -106,11 +104,41 @@ x11_position(Screen *scr, int width, int height,
case 0:
case 2: *h >>= 1; break;
}
- } else if (height > scr->height)
- *h = scr->height;
- else
- *h = height;
+ }
+ }
+ geometry = config_get_value(config, "window", "size");
+ if (geometry) {
+ int size_w, size_h;
+ float scale_x, scale_y;
+
+ if (sscanf(geometry, "%dx%d", &size_w, &size_h) == 2) {
+ *w = size_w;
+ *h = size_h;
+ } else if (sscanf(geometry, "%f%%x%f%%", &scale_x, &scale_y) == 2) {
+ if (*w != -1)
+ *w = (*w * scale_x) / 100.;
+ if (*h != -1)
+ *h = (*h * scale_y) / 100.;
+ } else if (sscanf(geometry, "%f%%", &scale_x) == 1) {
+ if (*w != -1)
+ *w = (*w * scale_x) / 100.;
+ if (*h != -1)
+ *h = (*h * scale_x) / 100.;
+ }
+ if ((unsigned)*w < width/2)
+ *w = width/2;
+ if ((unsigned)*h < height/2)
+ *h = height/2;
+ }
+
+ if ((unsigned)*w > scr->width)
+ *w = scr->width;
+
+ if ((unsigned)*h > scr->height)
+ *h = scr->height;
+
+ if (position != POS_UNSET) {
switch (position & 7) {
default:
case 0: *x = 0; break;