tAllow resizing windows via absolute coordinates - wmutils - X windows manipulation utilities
 (HTM) git clone git://z3bra.org/wmutils
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b715c5e6a880562520dc818d24bc784ded8f77e4
 (DIR) parent 43cfe64796c8df2648071aa15983e0ff8b998858
 (HTM) Author: z3bra <willy@mailoo.org>
       Date:   Wed, 10 Jun 2015 21:28:45 +0200
       
       Allow resizing windows via absolute coordinates
       
       Diffstat:
         M man/wrs.1                           |      11 ++++++++++-
         M wrs.c                               |      25 ++++++++++++++++++++-----
       
       2 files changed, 30 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/man/wrs.1 b/man/wrs.1
       t@@ -3,9 +3,10 @@
        .Os wmutils
        .Sh NAME
        .Nm wrs
       -.Nd resize windows (relatively)
       +.Nd resize windows
        .Sh SYNOPSIS
        .Nm wrs
       +.Op Fl a
        .Ar x y wid Op ...
        .Sh DESCRIPTION
        .Nm
       t@@ -15,6 +16,14 @@ based on the relative pixel values
        .Ar x
        and
        .Ar y .
       +.Bl -tag -width Ds
       +.It Fl a
       +Absolute mode. The window will be resized up to the 
       +.Ar x
       +and
       +.Ar y
       +coordinates.
       +.El
        .Sh ENVIRONMENT
        .Nm
        acts on the X display specified by the
 (DIR) diff --git a/wrs.c b/wrs.c
       t@@ -7,21 +7,26 @@
        
        #include "util.h"
        
       +enum {
       +        ABSOLUTE = 0,
       +        RELATIVE = 1
       +};
       +
        static xcb_connection_t *conn;
        static xcb_screen_t *scr;
        
        static void usage(char *);
       -static void resize(xcb_window_t, int, int);
       +static void resize(xcb_window_t, int, int, int);
        
        static void
        usage(char *name)
        {
       -        fprintf(stderr, "usage: %s <x> <y> <wid> [wid..]", name);
       +        fprintf(stderr, "usage: %s [-a] <x> <y> <wid> [wid..]", name);
                exit(1);
        }
        
        static void
       -resize(xcb_window_t w, int x, int y)
       +resize(xcb_window_t w, int mode, int x, int y)
        {
                uint32_t val[3];
                uint32_t mask = XCB_CONFIG_WINDOW_WIDTH
       t@@ -36,6 +41,11 @@ resize(xcb_window_t w, int x, int y)
                if (r == NULL)
                        return;
        
       +        if (mode == ABSOLUTE) {
       +                x -= r->x + r->width;
       +                y -= r->y + r->height;
       +        }
       +
                if ((r->x + r->width + 2*r->border_width + x) > scr->width_in_pixels)
                        x = scr->width_in_pixels - (
                                        r->x + r->width + (2*r->border_width));
       t@@ -56,18 +66,23 @@ resize(xcb_window_t w, int x, int y)
        int
        main(int argc, char **argv)
        {
       -        int x, y;
       +        int x, y, mode = RELATIVE;
                if (argc < 4)
                        usage(argv[0]);
        
                init_xcb(&conn);
                get_screen(conn, &scr);
        
       +        if (argv[1][0] == '-' && argv[1][1] == 'a') {
       +                mode = ABSOLUTE;
       +                argv++;
       +        }
       +
                x = atoi(*(++argv));
                y = atoi(*(++argv));
        
                while (*argv)
       -                resize(strtoul(*argv++, NULL, 16), x, y);
       +                resize(strtoul(*argv++, NULL, 16), mode, x, y);
        
                xcb_flush(conn);