master ohmu/wmutils / src / core / wmv.c
ohmu  ·  2026-07-25
  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
 11enum {
 12	ABSOLUTE = 0,
 13	RELATIVE = 1
 14};
 15
 16static xcb_connection_t *conn;
 17static xcb_screen_t *scr;
 18
 19static void usage(char *);
 20static void move(xcb_window_t, int, int, int);
 21
 22static void
 23usage(char *name)
 24{
 25	fprintf(stderr, "usage: %s [-a] <x> <y> <win>\n", name);
 26	exit(1);
 27}
 28
 29static void
 30move(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
 74int
 75main(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}