Extract geometric functions from helpers.c

This commit is contained in:
Bastien Dejean 2016-02-26 14:22:03 +01:00
parent 87a89ffeac
commit c895ef0f0e
9 changed files with 108 additions and 44 deletions

View file

@ -14,7 +14,7 @@ ZSHCPL ?= $(PREFIX)/share/zsh/site-functions
MD_DOCS = README.md doc/CONTRIBUTING.md doc/INSTALL.md doc/MISC.md doc/TODO.md
XSESSIONS ?= $(PREFIX)/share/xsessions
WM_SRC = bspwm.c helpers.c jsmn.c settings.c monitor.c desktop.c tree.c stack.c history.c \
WM_SRC = bspwm.c helpers.c geometry.c jsmn.c settings.c monitor.c desktop.c tree.c stack.c history.c \
events.c pointer.c window.c messages.c parse.c query.c restore.c rule.c ewmh.c subscribe.c
WM_OBJ = $(WM_SRC:.c=.o)
CLI_SRC = bspc.c helpers.c

65
geometry.c Normal file
View file

@ -0,0 +1,65 @@
/* Copyright (c) 2012, Bastien Dejean
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <math.h>
#include "geometry.h"
double distance(xcb_point_t a, xcb_point_t b)
{
return hypot(a.x - b.x, a.y - b.y);
}
bool is_inside(xcb_point_t p, xcb_rectangle_t r)
{
return (p.x >= r.x && p.x < (r.x + r.width) &&
p.y >= r.y && p.y < (r.y + r.height));
}
unsigned int area(xcb_rectangle_t r)
{
return r.width * r.height;
}
bool rect_eq(xcb_rectangle_t a, xcb_rectangle_t b)
{
return (a.x == b.x && a.y == b.y &&
a.width == b.width && a.height == b.height);
}
int rect_cmp(xcb_rectangle_t r1, xcb_rectangle_t r2)
{
if (r1.y >= (r2.y + r2.height)) {
return 1;
} else if (r2.y >= (r1.y + r1.height)) {
return -1;
} else {
if (r1.x >= (r2.x + r2.width)) {
return 1;
} else if (r2.x >= (r1.x + r1.width)) {
return -1;
} else {
return area(r1) - area(r2);
}
}
}

37
geometry.h Normal file
View file

@ -0,0 +1,37 @@
/* Copyright (c) 2012, Bastien Dejean
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef BSPWM_GEOMETRY_H
#define BSPWM_GEOMETRY_H
#include <stdbool.h>
#include <xcb/xcb.h>
double distance(xcb_point_t a, xcb_point_t b);
bool is_inside(xcb_point_t p, xcb_rectangle_t r);
unsigned int area(xcb_rectangle_t r);
bool rect_eq(xcb_rectangle_t a, xcb_rectangle_t b);
int rect_cmp(xcb_rectangle_t r1, xcb_rectangle_t r2);
#endif

View file

@ -31,7 +31,6 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <math.h>
#include "bspwm.h"
void warn(char *fmt, ...)
@ -130,19 +129,3 @@ bool is_hex_color(const char *color)
}
return true;
}
bool rect_eq(xcb_rectangle_t a, xcb_rectangle_t b)
{
return (a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height);
}
bool is_inside(xcb_point_t p, xcb_rectangle_t r)
{
return (p.x >= r.x && p.x < (r.x + r.width) &&
p.y >= r.y && p.y < (r.y + r.height));
}
double distance(xcb_point_t a, xcb_point_t b)
{
return hypot(a.x - b.x, a.y - b.y);
}

View file

@ -65,8 +65,5 @@ void err(char *fmt, ...);
char *read_string(const char *file_path, size_t *tlen);
uint32_t get_color_pixel(const char *color);
bool is_hex_color(const char *color);
bool rect_eq(xcb_rectangle_t a, xcb_rectangle_t b);
bool is_inside(xcb_point_t p, xcb_rectangle_t r);
double distance(xcb_point_t a, xcb_point_t b);
#endif

View file

@ -33,6 +33,7 @@
#include "history.h"
#include "query.h"
#include "settings.h"
#include "geometry.h"
#include "tree.h"
#include "subscribe.h"
#include "window.h"
@ -183,25 +184,6 @@ void focus_monitor(monitor_t *m)
put_status(SBSC_MASK_MONITOR_FOCUS, "monitor_focus %s\n", m->name);
}
int monitor_cmp(monitor_t *m1, monitor_t *m2)
{
xcb_rectangle_t r1 = m1->rectangle;
xcb_rectangle_t r2 = m2->rectangle;
if (r1.y >= (r2.y + r2.height)) {
return 1;
} else if (r2.y >= (r1.y + r1.height)) {
return -1;
} else {
if (r1.x >= (r2.x + r2.width)) {
return 1;
} else if (r2.x >= (r1.x + r1.width)) {
return -1;
} else {
return 0;
}
}
}
void add_monitor(monitor_t *m)
{
xcb_rectangle_t r = m->rectangle;
@ -212,7 +194,7 @@ void add_monitor(monitor_t *m)
mon_tail = m;
} else {
monitor_t *a = mon_head;
while (a != NULL && monitor_cmp(m, a) > 0) {
while (a != NULL && rect_cmp(m->rectangle, a->rectangle) > 0) {
a = a->next;
}
if (a != NULL) {

View file

@ -35,7 +35,6 @@ monitor_t *get_monitor_by_id(xcb_randr_output_t id);
void embrace_client(monitor_t *m, client_t *c);
void adapt_geometry(xcb_rectangle_t *rs, xcb_rectangle_t *rd, node_t *n);
void focus_monitor(monitor_t *m);
int monitor_cmp(monitor_t *m1, monitor_t *m2);
void add_monitor(monitor_t *m);
void remove_monitor(monitor_t *m);
void merge_monitors(monitor_t *ms, monitor_t *md);

4
tree.c
View file

@ -33,6 +33,7 @@
#include "history.h"
#include "monitor.h"
#include "query.h"
#include "geometry.h"
#include "subscribe.h"
#include "settings.h"
#include "stack.h"
@ -971,8 +972,7 @@ unsigned int node_area(desktop_t *d, node_t *n)
if (n == NULL) {
return 0;
}
xcb_rectangle_t rect = get_rectangle(d, n);
return rect.width * rect.height;
return area(get_rectangle(d, n));
}
int tiled_count(node_t *n)

View file

@ -32,6 +32,7 @@
#include "query.h"
#include "rule.h"
#include "settings.h"
#include "geometry.h"
#include "stack.h"
#include "tree.h"
#include "parse.h"