forked from mirror/dwl
Merge branch 'push' of github:Abanoub8/dwl into push
This commit is contained in:
commit
81c8ebf677
6 changed files with 502 additions and 243 deletions
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -14,9 +14,4 @@ wlroots version:
|
|||
<!--
|
||||
Only report bugs that can be reproduced on the main line
|
||||
Report patch issues to their respective authors
|
||||
If the patch author doesn't respond within a reasonable time, email me:
|
||||
|
||||
Leonardo Hernández Hernández <leohdz172@protonmail.com>
|
||||
|
||||
but note that I'm NOT making any promises
|
||||
-->
|
||||
|
|
182
client.h
182
client.h
|
@ -16,40 +16,6 @@ client_is_x11(Client *c)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline Client *
|
||||
client_from_wlr_surface(struct wlr_surface *s)
|
||||
{
|
||||
struct wlr_xdg_surface *surface;
|
||||
|
||||
#ifdef XWAYLAND
|
||||
struct wlr_xwayland_surface *xsurface;
|
||||
if (s && wlr_surface_is_xwayland_surface(s)
|
||||
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s)))
|
||||
return xsurface->data;
|
||||
#endif
|
||||
if (s && wlr_surface_is_xdg_surface(s)
|
||||
&& (surface = wlr_xdg_surface_from_wlr_surface(s))
|
||||
&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
|
||||
return surface->data;
|
||||
|
||||
if (s && wlr_surface_is_subsurface(s))
|
||||
return client_from_wlr_surface(wlr_surface_get_root_surface(s));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline Client *
|
||||
client_get_parent(Client *c)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c) && c->surface.xwayland->parent)
|
||||
return client_from_wlr_surface(c->surface.xwayland->parent->surface);
|
||||
#endif
|
||||
if (c->surface.xdg->toplevel->parent)
|
||||
return client_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
||||
{
|
||||
|
@ -85,6 +51,69 @@ client_surface(Client *c)
|
|||
return c->surface.xdg->surface;
|
||||
}
|
||||
|
||||
static inline int
|
||||
toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
||||
{
|
||||
struct wlr_xdg_surface *xdg_surface;
|
||||
struct wlr_surface *root_surface;
|
||||
struct wlr_layer_surface_v1 *layer_surface;
|
||||
Client *c = NULL;
|
||||
LayerSurface *l = NULL;
|
||||
int type = -1;
|
||||
#ifdef XWAYLAND
|
||||
struct wlr_xwayland_surface *xsurface;
|
||||
#endif
|
||||
|
||||
if (!s)
|
||||
return type;
|
||||
root_surface = wlr_surface_get_root_surface(s);
|
||||
|
||||
#ifdef XWAYLAND
|
||||
if (wlr_surface_is_xwayland_surface(root_surface)
|
||||
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface))) {
|
||||
c = xsurface->data;
|
||||
type = c->type;
|
||||
goto end;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (wlr_surface_is_layer_surface(root_surface)
|
||||
&& (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface))) {
|
||||
l = layer_surface->data;
|
||||
type = LayerShell;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (wlr_surface_is_xdg_surface(root_surface)
|
||||
&& (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
|
||||
while (1) {
|
||||
switch (xdg_surface->role) {
|
||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||
if (!xdg_surface->popup->parent)
|
||||
return -1;
|
||||
else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
|
||||
return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
|
||||
|
||||
xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
|
||||
break;
|
||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||
c = xdg_surface->data;
|
||||
type = c->type;
|
||||
goto end;
|
||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
if (pl)
|
||||
*pl = l;
|
||||
if (pc)
|
||||
*pc = c;
|
||||
return type;
|
||||
}
|
||||
|
||||
/* The others */
|
||||
static inline void
|
||||
client_activate_surface(struct wlr_surface *s, int activated)
|
||||
|
@ -112,7 +141,7 @@ client_set_bounds(Client *c, int32_t width, int32_t height)
|
|||
return 0;
|
||||
#endif
|
||||
if (c->surface.xdg->client->shell->version >=
|
||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION)
|
||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0)
|
||||
return wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height);
|
||||
return 0;
|
||||
}
|
||||
|
@ -153,6 +182,20 @@ client_get_geometry(Client *c, struct wlr_box *geom)
|
|||
wlr_xdg_surface_get_geometry(c->surface.xdg, geom);
|
||||
}
|
||||
|
||||
static inline Client *
|
||||
client_get_parent(Client *c)
|
||||
{
|
||||
Client *p = NULL;
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c) && c->surface.xwayland->parent)
|
||||
toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL);
|
||||
#endif
|
||||
if (c->surface.xdg->toplevel->parent)
|
||||
toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
client_get_title(Client *c)
|
||||
{
|
||||
|
@ -212,6 +255,32 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
client_is_stopped(Client *c)
|
||||
{
|
||||
int pid;
|
||||
siginfo_t in = {0};
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
|
||||
if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) {
|
||||
/* This process is not our child process, while is very unluckely that
|
||||
* it is stopped, in order to do not skip frames assume that it is. */
|
||||
if (errno == ECHILD)
|
||||
return 1;
|
||||
} else if (in.si_pid) {
|
||||
if (in.si_code == CLD_STOPPED || in.si_code == CLD_TRAPPED)
|
||||
return 1;
|
||||
if (in.si_code == CLD_CONTINUED)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
client_is_unmanaged(Client *c)
|
||||
{
|
||||
|
@ -276,6 +345,9 @@ client_set_size(Client *c, uint32_t width, uint32_t height)
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
if (width == c->surface.xdg->toplevel->current.width
|
||||
&& height ==c->surface.xdg->toplevel->current.height)
|
||||
return 0;
|
||||
return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, width, height);
|
||||
}
|
||||
|
||||
|
@ -320,43 +392,3 @@ client_wants_fullscreen(Client *c)
|
|||
#endif
|
||||
return c->surface.xdg->toplevel->requested.fullscreen;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
toplevel_from_popup(struct wlr_xdg_popup *popup)
|
||||
{
|
||||
struct wlr_xdg_surface *surface = popup->base;
|
||||
|
||||
while (1) {
|
||||
switch (surface->role) {
|
||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||
if (!surface->popup->parent)
|
||||
return NULL;
|
||||
else if (wlr_surface_is_layer_surface(surface->popup->parent))
|
||||
return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
|
||||
else if (!wlr_surface_is_xdg_surface(surface->popup->parent))
|
||||
return NULL;
|
||||
|
||||
surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent);
|
||||
break;
|
||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||
return surface->data;
|
||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *
|
||||
toplevel_from_wlr_layer_surface(struct wlr_surface *s)
|
||||
{
|
||||
Client *c;
|
||||
struct wlr_layer_surface_v1 *wlr_layer_surface;
|
||||
|
||||
if ((c = client_from_wlr_surface(s)))
|
||||
return c;
|
||||
else if (s && wlr_surface_is_layer_surface(s)
|
||||
&& (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s)))
|
||||
return wlr_layer_surface->data;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
11
config.def.h
11
config.def.h
|
@ -2,14 +2,13 @@
|
|||
static const int sloppyfocus = 1; /* focus follows mouse */
|
||||
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
|
||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
static const float rootcolor[] = {0.3, 0.3, 0.3, 1.0};
|
||||
static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0};
|
||||
static const float focuscolor[] = {1.0, 0.0, 0.0, 1.0};
|
||||
/* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */
|
||||
static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
|
||||
|
||||
/* tagging */
|
||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
/* tagging - tagcount must be no greater than 31 */
|
||||
static const int tagcount = 9;
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* app_id title tags mask isfloating monitor */
|
||||
|
@ -29,12 +28,12 @@ static const Layout layouts[] = {
|
|||
|
||||
/* monitors */
|
||||
static const MonitorRule monrules[] = {
|
||||
/* name mfact nmaster scale layout rotate/reflect */
|
||||
/* name mfact nmaster scale layout rotate/reflect x y */
|
||||
/* example of a HiDPI laptop monitor:
|
||||
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
|
||||
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
|
||||
*/
|
||||
/* defaults */
|
||||
{ NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
|
||||
{ NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
|
||||
};
|
||||
|
||||
/* keyboard */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
_VERSION = 0.4-rc1
|
||||
VERSION = `git describe --long --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
||||
_VERSION = 0.4
|
||||
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
||||
|
||||
PKG_CONFIG = pkg-config
|
||||
|
||||
|
|
4
push.c
4
push.c
|
@ -24,7 +24,7 @@ prevtiled(Client *sel) {
|
|||
|
||||
static void
|
||||
pushup(const Arg *arg) {
|
||||
Client *sel = selclient();
|
||||
Client *sel = focustop(selmon);
|
||||
Client *c;
|
||||
|
||||
if(!sel || sel->isfloating)
|
||||
|
@ -44,7 +44,7 @@ pushup(const Arg *arg) {
|
|||
|
||||
static void
|
||||
pushdown(const Arg *arg) {
|
||||
Client *sel = selclient();
|
||||
Client *sel = focustop(selmon);
|
||||
Client *c;
|
||||
|
||||
if(!sel || sel->isfloating)
|
||||
|
|
Loading…
Reference in a new issue