twmv.c - wmutils - X windows manipulation utilities
 (HTM) git clone git://z3bra.org/wmutils
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       twmv.c (1784B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 
            3 #include <xcb/xcb.h>
            4 #include <xcb/xcb_aux.h>
            5 #include <stdio.h>
            6 #include <stdlib.h>
            7 #include <err.h>
            8 
            9 #include "util.h"
           10 
           11 enum {
           12         ABSOLUTE = 0,
           13         RELATIVE = 1
           14 };
           15 
           16 static xcb_connection_t *conn;
           17 static xcb_screen_t *scr;
           18 
           19 static void usage(char *);
           20 static void move(xcb_window_t, int, int, int);
           21 
           22 static void
           23 usage(char *name)
           24 {
           25         fprintf(stderr, "usage: %s [-a] <x> <y> <win>\n", name);
           26         exit(1);
           27 }
           28 
           29 static void
           30 move(xcb_window_t win, int mode, int x, int y)
           31 {
           32         uint32_t values[2];
           33         int real;
           34         xcb_get_geometry_reply_t *geom;
           35 
           36         if (!win || win == scr->root)
           37                 return;
           38 
           39         geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL);
           40         if (!geom)
           41                 return;
           42 
           43         if (mode == ABSOLUTE) {
           44                 x -= geom->x + geom->width /2;
           45                 y -= geom->y + geom->height/2;
           46         }
           47         values[0] = x ? geom->x + x : geom->x;
           48         values[1] = y ? geom->y + y : geom->y;
           49 
           50         if (x)
           51         {
           52                 real = geom->width + (geom->border_width * 2);
           53                 if (geom->x + x < 1)
           54                         values[0] = 0;
           55                 if (geom->x + x > scr->width_in_pixels - real)
           56                         values[0] = scr->width_in_pixels - real;
           57         }
           58 
           59         if (y)
           60         {
           61                 real = geom->height + (geom->border_width * 2);
           62                 if (geom->y + y < 1)
           63                         values[1] = 0;
           64                 if (geom->y + y > scr->height_in_pixels - real)
           65                         values[1] = scr->height_in_pixels - real;
           66         }
           67 
           68         xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_X
           69                         | XCB_CONFIG_WINDOW_Y, values);
           70 
           71         free(geom);
           72 }
           73 
           74 int
           75 main(int argc, char **argv)
           76 {
           77         int x, y, mode = RELATIVE;
           78         if (argc < 4)
           79                 usage(argv[0]);
           80 
           81         init_xcb(&conn);
           82         get_screen(conn, &scr);
           83 
           84         if (argv[1][0] == '-' && argv[1][1] == 'a') {
           85                 mode = ABSOLUTE;
           86                 argv++;
           87         }
           88 
           89         x = atoi(*(++argv));
           90         y = atoi(*(++argv));
           91 
           92         while (*argv)
           93                 move(strtoul(*argv++, NULL, 16), mode, x, y);
           94 
           95         xcb_aux_sync(conn);
           96 
           97         kill_xcb(&conn);
           98 
           99         return 0;
          100 }