implement floating windows
parent
e447cd0215
commit
c03081d85d
|
@ -38,10 +38,12 @@ static const Key keys[] = {
|
||||||
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
|
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
|
||||||
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
|
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
|
||||||
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
|
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
|
||||||
|
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
|
||||||
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} },
|
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Button buttons[] = {
|
static const Button buttons[] = {
|
||||||
{ MODKEY, BTN_LEFT, movemouse, {0} },
|
{ MODKEY, BTN_LEFT, movemouse, {0} },
|
||||||
|
{ MODKEY, BTN_MIDDLE, togglefloating, {0} },
|
||||||
{ MODKEY, BTN_RIGHT, resizemouse, {0} },
|
{ MODKEY, BTN_RIGHT, resizemouse, {0} },
|
||||||
};
|
};
|
||||||
|
|
22
dwl.c
22
dwl.c
|
@ -64,6 +64,7 @@ typedef struct {
|
||||||
struct wl_listener request_resize;
|
struct wl_listener request_resize;
|
||||||
Monitor *mon;
|
Monitor *mon;
|
||||||
int x, y; /* layout-relative */
|
int x, y; /* layout-relative */
|
||||||
|
int isfloating;
|
||||||
} Client;
|
} Client;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -147,6 +148,7 @@ static void setlayout(const Arg *arg);
|
||||||
static void setup(void);
|
static void setup(void);
|
||||||
static void spawn(const Arg *arg);
|
static void spawn(const Arg *arg);
|
||||||
static void tile(Monitor *m);
|
static void tile(Monitor *m);
|
||||||
|
static void togglefloating(const Arg *arg);
|
||||||
static void unmapnotify(struct wl_listener *listener, void *data);
|
static void unmapnotify(struct wl_listener *listener, void *data);
|
||||||
static Client *xytoclient(double x, double y,
|
static Client *xytoclient(double x, double y,
|
||||||
struct wlr_surface **surface, double *sx, double *sy);
|
struct wlr_surface **surface, double *sx, double *sy);
|
||||||
|
@ -649,6 +651,9 @@ movemouse(const Arg *arg)
|
||||||
cursor_mode = CurMove;
|
cursor_mode = CurMove;
|
||||||
grabsx = cursor->x - c->x;
|
grabsx = cursor->x - c->x;
|
||||||
grabsy = cursor->y - c->y;
|
grabsy = cursor->y - c->y;
|
||||||
|
/* Float the window */
|
||||||
|
if (!grabc->isfloating && selmon->lt[selmon->sellt]->arrange)
|
||||||
|
grabc->isfloating = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -804,6 +809,9 @@ resizemouse(const Arg *arg)
|
||||||
/* Prepare for resizing client in motionnotify */
|
/* Prepare for resizing client in motionnotify */
|
||||||
grabc = c;
|
grabc = c;
|
||||||
cursor_mode = CurResize;
|
cursor_mode = CurResize;
|
||||||
|
/* Float the window */
|
||||||
|
if (!grabc->isfloating && selmon->lt[selmon->sellt]->arrange)
|
||||||
|
grabc->isfloating = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1025,7 +1033,7 @@ tile(Monitor *m)
|
||||||
struct wlr_box ca;
|
struct wlr_box ca;
|
||||||
|
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (VISIBLEON(c, m))
|
if (VISIBLEON(c, m) && !c->isfloating)
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
|
@ -1037,7 +1045,7 @@ tile(Monitor *m)
|
||||||
mw = m->ww;
|
mw = m->ww;
|
||||||
i = my = ty = 0;
|
i = my = ty = 0;
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (!VISIBLEON(c, m))
|
if (!VISIBLEON(c, m) || c->isfloating)
|
||||||
continue;
|
continue;
|
||||||
wlr_xdg_surface_get_geometry(c->xdg_surface, &ca);
|
wlr_xdg_surface_get_geometry(c->xdg_surface, &ca);
|
||||||
if (i < m->nmaster) {
|
if (i < m->nmaster) {
|
||||||
|
@ -1053,6 +1061,16 @@ tile(Monitor *m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
togglefloating(const Arg *arg)
|
||||||
|
{
|
||||||
|
Client *sel = selclient();
|
||||||
|
if (!sel)
|
||||||
|
return;
|
||||||
|
/* return if fullscreen */
|
||||||
|
sel->isfloating = !sel->isfloating /* || sel->isfixed */;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
unmapnotify(struct wl_listener *listener, void *data)
|
unmapnotify(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue