aboutsummaryrefslogtreecommitdiff
path: root/dwl.c
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2020-04-23 22:56:27 -0500
committerDevin J. Pohly <djpohly@gmail.com>2020-04-23 23:35:54 -0500
commit1870187d62e7eb1a526bd3a24effd4d58ec3b9dd (patch)
tree0353d8182664e15798035f29f21661049db5d571 /dwl.c
parentfb6b16aeee78cabc26d4c1ac6575247eb97dbca5 (diff)
make space for window borders
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/dwl.c b/dwl.c
index fb346c4..4922c6b 100644
--- a/dwl.c
+++ b/dwl.c
@@ -66,7 +66,8 @@ typedef struct {
struct wl_listener request_move;
struct wl_listener request_resize;
Monitor *mon;
- int x, y; /* layout-relative */
+ int x, y; /* layout-relative, includes border */
+ int bw;
unsigned int tags;
int isfloating;
} Client;
@@ -359,6 +360,7 @@ createnotify(struct wl_listener *listener, void *data)
/* Allocate a Client for this surface */
Client *c = calloc(1, sizeof(*c));
c->xdg_surface = xdg_surface;
+ c->bw = borderpx;
/* Tell the client not to try anything fancy */
wlr_xdg_toplevel_set_tiled(c->xdg_surface, true);
@@ -526,6 +528,7 @@ inputdevice(struct wl_listener *listener, void *data)
createpointer(device);
break;
default:
+ /* XXX handle other input device types */
break;
}
/* We need to let the wlr_seat know what our capabilities are, which is
@@ -643,8 +646,9 @@ motionnotify(uint32_t time)
/* If we are currently grabbing the mouse, handle and return */
if (cursor_mode == CurMove) {
/* Move the grabbed client to the new position. */
- grabc->x = cursor->x - grabsx;
- grabc->y = cursor->y - grabsy;
+ /* XXX assumes the surface is at (0,0) within grabc */
+ grabc->x = cursor->x - grabsx - grabc->bw;
+ grabc->y = cursor->y - grabsy - grabc->bw;
return;
} else if (cursor_mode == CurResize) {
/*
@@ -832,8 +836,8 @@ renderclients(Monitor *m, struct timespec *now)
struct render_data rdata = {
.output = m->wlr_output,
.when = now,
- .x = c->x,
- .y = c->y,
+ .x = c->x + c->bw,
+ .y = c->y + c->bw,
};
/* This calls our render function for each surface among the
* xdg_surface's toplevel and popups. */
@@ -888,7 +892,7 @@ resize(Client *c, int x, int y, int w, int h)
{
c->x = x;
c->y = y;
- wlr_xdg_toplevel_set_size(c->xdg_surface, w, h);
+ wlr_xdg_toplevel_set_size(c->xdg_surface, w - 2 * c->bw, h - 2 * c->bw);
}
void
@@ -904,8 +908,8 @@ resizemouse(const Arg *arg)
/* Doesn't work for X11 output - the next absolute motion event
* returns the cursor to where it started */
wlr_cursor_warp_closest(cursor, NULL,
- grabc->x + sbox.x + sbox.width,
- grabc->y + sbox.y + sbox.height);
+ grabc->x + sbox.x + sbox.width + 2 * grabc->bw,
+ grabc->y + sbox.y + sbox.height + 2 * grabc->bw);
/* Float the window and tell motionnotify to resize it */
if (!grabc->isfloating && selmon->lt[selmon->sellt]->arrange)
@@ -1198,11 +1202,11 @@ tile(Monitor *m)
if (i < m->nmaster) {
h = (m->wh - my) / (MIN(n, m->nmaster) - i);
resize(c, m->wx, m->wy + my, mw, h);
- my += ca.height;
+ my += ca.height + 2 * c->bw;
} else {
h = (m->wh - ty) / (n - i);
resize(c, m->wx + mw, m->wy + ty, m->ww - mw, h);
- ty += ca.height;
+ ty += ca.height + 2 * c->bw;
}
i++;
}
@@ -1272,6 +1276,7 @@ Client *
xytoclient(double x, double y,
struct wlr_surface **surface, double *sx, double *sy)
{
+ /* XXX what if (x,y) is within a window's border? */
/* This iterates over all of our surfaces and attempts to find one under the
* cursor. This relies on stack being ordered from top-to-bottom. */
Client *c;
@@ -1290,7 +1295,7 @@ xytoclient(double x, double y,
double _sx, _sy;
struct wlr_surface *_surface = NULL;
_surface = wlr_xdg_surface_surface_at(c->xdg_surface,
- x - c->x, y - c->y, &_sx, &_sy);
+ x - c->x - c->bw, y - c->y - c->bw, &_sx, &_sy);
if (_surface) {
*sx = _sx;