2005-11-18 18:54:58 +03:00
|
|
|
/*
|
|
|
|
* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
|
|
|
|
* See LICENSE file for license details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "blitz.h"
|
|
|
|
#include <cext.h>
|
|
|
|
|
2005-12-05 01:45:59 +03:00
|
|
|
static int strtoalign(Align * result, char *val)
|
2005-11-18 18:54:58 +03:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* note, resize allows syntax like "east-20", this we cannot do
|
|
|
|
* include zero termination in strncmp checking!
|
|
|
|
*/
|
|
|
|
|
|
|
|
*result = CENTER;
|
|
|
|
if (!strncmp(val, "west", 4))
|
|
|
|
*result = WEST;
|
|
|
|
else if (!strncmp(val, "nwest", 5))
|
|
|
|
*result = NWEST;
|
|
|
|
else if (!strncmp(val, "north", 5))
|
|
|
|
*result = NORTH;
|
|
|
|
else if (!strncmp(val, "neast", 5))
|
|
|
|
*result = NEAST;
|
|
|
|
else if (!strncmp(val, "east", 4))
|
|
|
|
*result = EAST;
|
|
|
|
else if (!strncmp(val, "seast", 5))
|
|
|
|
*result = SEAST;
|
|
|
|
else if (!strncmp(val, "south", 5))
|
|
|
|
*result = SOUTH;
|
|
|
|
else if (!strncmp(val, "swest", 5))
|
|
|
|
*result = SWEST;
|
|
|
|
else if (!strncmp(val, "center", 6))
|
|
|
|
*result = CENTER;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Basic Syntax: <x>,<y>,<width>,<height>
|
|
|
|
* Each component can be of following format:
|
|
|
|
* <...> = [+|-]0..n|<alignment>[[+|-]0..n]
|
|
|
|
*/
|
2005-12-05 04:25:48 +03:00
|
|
|
int blitz_strtorect(XRectangle * root, XRectangle * r, char *val)
|
2005-11-18 18:54:58 +03:00
|
|
|
{
|
2005-12-05 01:45:59 +03:00
|
|
|
char buf[64];
|
|
|
|
char *x, *y, *w, *h;
|
|
|
|
char *p;
|
|
|
|
int sx, sy, sw, sh;
|
2005-11-18 18:54:58 +03:00
|
|
|
|
|
|
|
if (!val)
|
|
|
|
return FALSE;
|
|
|
|
sx = sy = sw = sh = 0;
|
|
|
|
x = y = w = h = 0;
|
|
|
|
_strlcpy(buf, val, sizeof(buf));
|
|
|
|
|
|
|
|
x = strtok_r(buf, ",", &p);
|
|
|
|
if (x) {
|
|
|
|
y = strtok_r(0, ",", &p);
|
|
|
|
if (y) {
|
|
|
|
w = strtok_r(0, ",", &p);
|
|
|
|
if (w) {
|
|
|
|
h = strtok_r(0, "", &p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (x && (sx = (x[0] >= '0') && (x[0] <= '9')))
|
|
|
|
r->x = _strtonum(x, 0, 65535);
|
|
|
|
if (y && (sy = (y[0] >= '0') && (y[0] <= '9')))
|
|
|
|
r->y = _strtonum(y, 0, 65535);
|
|
|
|
if (w && (sw = (w[0] >= '0') && (w[0] <= '9')))
|
|
|
|
r->width = _strtonum(w, 0, 65535);
|
|
|
|
if (h && (sh = (h[0] >= '0') && (h[0] <= '9')))
|
|
|
|
r->height = _strtonum(h, 0, 65535);
|
|
|
|
|
|
|
|
if (!sx && !sw && x && w
|
2005-12-05 01:45:59 +03:00
|
|
|
&& x[0] != '-' && x[0] != '+' && w[0] != '-' && w[0] != '+') {
|
|
|
|
Align ax, aw;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&ax, x);
|
|
|
|
strtoalign(&aw, w);
|
|
|
|
if ((ax == CENTER) && (aw == EAST)) {
|
|
|
|
r->x = root->x + root->width / 2;
|
|
|
|
r->width = root->width / 2;
|
|
|
|
} else {
|
|
|
|
r->x = root->x;
|
|
|
|
if (aw == CENTER) {
|
|
|
|
r->width = root->width / 2;
|
|
|
|
} else {
|
|
|
|
r->width = root->width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (!sx && x && x[0] != '-' && x[0] != '+') {
|
2005-12-05 01:45:59 +03:00
|
|
|
Align ax;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&ax, x);
|
|
|
|
if (ax == CENTER) {
|
|
|
|
r->x = root->x + (root->width / 2) - (r->width / 2);
|
|
|
|
} else if (ax == EAST) {
|
|
|
|
r->x = root->x + root->width - r->width;
|
|
|
|
} else {
|
|
|
|
r->x = root->x;
|
|
|
|
}
|
|
|
|
} else if (!sw && w && w[0] != '-' && w[0] != '+') {
|
2005-12-05 01:45:59 +03:00
|
|
|
Align aw;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&aw, w);
|
|
|
|
if (aw == CENTER) {
|
|
|
|
r->width = (root->width / 2) - r->x;
|
|
|
|
} else {
|
|
|
|
r->width = root->width - r->x;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!sy && !sh && y && h
|
2005-12-05 01:45:59 +03:00
|
|
|
&& y[0] != '-' && y[0] != '+' && h[0] != '-' && h[0] != '+') {
|
|
|
|
Align ay, ah;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&ay, y);
|
|
|
|
strtoalign(&ah, h);
|
|
|
|
if ((ay == CENTER) && (ah == SOUTH)) {
|
|
|
|
r->y = root->y + root->height / 2;
|
|
|
|
r->height = root->height / 2;
|
|
|
|
} else {
|
|
|
|
r->y = root->y;
|
|
|
|
if (ah == CENTER) {
|
|
|
|
r->height = root->height / 2;
|
|
|
|
} else {
|
|
|
|
r->height = root->height;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (!sy && y && y[0] != '-' && y[0] != '+') {
|
2005-12-05 01:45:59 +03:00
|
|
|
Align ay;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&ay, y);
|
|
|
|
if (ay == CENTER) {
|
|
|
|
r->y = root->y + (root->height / 2) - (r->height / 2);
|
|
|
|
} else if (ay == SOUTH) {
|
|
|
|
r->y = root->y + root->height - r->height;
|
|
|
|
} else {
|
|
|
|
r->y = root->y;
|
|
|
|
}
|
|
|
|
} else if (!sh && h && h[0] != '-' && h[0] != '+') {
|
2005-12-05 01:45:59 +03:00
|
|
|
Align ah;
|
2005-11-18 18:54:58 +03:00
|
|
|
strtoalign(&ah, h);
|
|
|
|
if (ah == CENTER) {
|
|
|
|
r->height = (root->height / 2) - r->y;
|
|
|
|
} else {
|
|
|
|
r->height = root->height - r->y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* now do final calculations */
|
|
|
|
if (x) {
|
|
|
|
p = strchr(x, '-');
|
|
|
|
if (p)
|
|
|
|
r->x -= _strtonum(++p, 0, 65535);
|
|
|
|
p = strchr(x, '+');
|
|
|
|
if (p)
|
|
|
|
r->x += _strtonum(++p, 0, 65535);
|
|
|
|
}
|
|
|
|
if (y) {
|
|
|
|
p = strchr(y, '-');
|
|
|
|
if (p)
|
|
|
|
r->y -= _strtonum(++p, 0, 65535);
|
|
|
|
p = strchr(y, '+');
|
|
|
|
if (p)
|
|
|
|
r->y += _strtonum(++p, 0, 65535);
|
|
|
|
}
|
|
|
|
if (w) {
|
|
|
|
p = strchr(w, '-');
|
|
|
|
if (p)
|
|
|
|
r->width -= _strtonum(++p, 0, 65535);
|
|
|
|
p = strchr(w, '+');
|
|
|
|
if (p)
|
|
|
|
r->width += _strtonum(++p, 0, 65535);
|
|
|
|
}
|
|
|
|
if (h) {
|
|
|
|
p = strchr(h, '-');
|
|
|
|
if (p)
|
|
|
|
r->height -= _strtonum(++p, 0, 65535);
|
|
|
|
p = strchr(h, '+');
|
|
|
|
if (p)
|
|
|
|
r->height += _strtonum(++p, 0, 65535);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2005-12-05 01:45:59 +03:00
|
|
|
int blitz_ispointinrect(int x, int y, XRectangle * r)
|
2005-11-18 18:54:58 +03:00
|
|
|
{
|
|
|
|
return (x >= r->x) && (x <= r->x + r->width)
|
2005-12-05 01:45:59 +03:00
|
|
|
&& (y >= r->y) && (y <= r->y + r->height);
|
2005-11-18 18:54:58 +03:00
|
|
|
}
|
|
|
|
|
2005-12-05 01:45:59 +03:00
|
|
|
int blitz_distance(XRectangle * origin, XRectangle * target)
|
2005-11-18 18:54:58 +03:00
|
|
|
{
|
2005-12-05 01:45:59 +03:00
|
|
|
int ox = origin->x + origin->width / 2;
|
|
|
|
int oy = origin->y + origin->height / 2;
|
|
|
|
int tx = target->x + target->width / 2;
|
|
|
|
int ty = target->y + target->height / 2;
|
2005-11-18 18:54:58 +03:00
|
|
|
|
|
|
|
return (int) sqrt((double) (((ox - tx) * (ox - tx)) +
|
2005-12-05 01:45:59 +03:00
|
|
|
((oy - ty) * (oy - ty))));
|
2005-11-18 18:54:58 +03:00
|
|
|
}
|
|
|
|
|
2005-12-05 01:45:59 +03:00
|
|
|
void
|
2005-11-18 18:54:58 +03:00
|
|
|
blitz_getbasegeometry(void **items, unsigned int *size,
|
2005-12-05 01:45:59 +03:00
|
|
|
unsigned int *cols, unsigned int *rows)
|
2005-11-18 18:54:58 +03:00
|
|
|
{
|
2005-12-05 01:45:59 +03:00
|
|
|
float sq, dummy;
|
2005-11-18 18:54:58 +03:00
|
|
|
|
|
|
|
*size = count_items((void **) items);
|
|
|
|
sq = sqrt(*size);
|
|
|
|
if (modff(sq, &dummy) < 0.5)
|
|
|
|
*rows = floor(sq);
|
|
|
|
else
|
|
|
|
*rows = ceil(sq);
|
|
|
|
*cols = ((*rows) * (*rows)) < (*size) ? *rows + 1 : *rows;
|
|
|
|
}
|