mirror of
https://codeberg.org/dwl/dwl.git
synced 2024-12-26 19:26:32 +00:00
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
|
Only report bugs that can be reproduced on the main line
|
||||||
Report patch issues to their respective authors
|
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
|
#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
|
static inline void
|
||||||
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
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;
|
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 */
|
/* The others */
|
||||||
static inline void
|
static inline void
|
||||||
client_activate_surface(struct wlr_surface *s, int activated)
|
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;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
if (c->surface.xdg->client->shell->version >=
|
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 wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +182,20 @@ client_get_geometry(Client *c, struct wlr_box *geom)
|
||||||
wlr_xdg_surface_get_geometry(c->surface.xdg, 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 *
|
static inline const char *
|
||||||
client_get_title(Client *c)
|
client_get_title(Client *c)
|
||||||
{
|
{
|
||||||
|
@ -212,6 +255,32 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
|
||||||
return 0;
|
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
|
static inline int
|
||||||
client_is_unmanaged(Client *c)
|
client_is_unmanaged(Client *c)
|
||||||
{
|
{
|
||||||
|
@ -276,6 +345,9 @@ client_set_size(Client *c, uint32_t width, uint32_t height)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#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);
|
return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,43 +392,3 @@ client_wants_fullscreen(Client *c)
|
||||||
#endif
|
#endif
|
||||||
return c->surface.xdg->toplevel->requested.fullscreen;
|
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;
|
|
||||||
}
|
|
||||||
|
|
17
config.def.h
17
config.def.h
|
@ -2,14 +2,13 @@
|
||||||
static const int sloppyfocus = 1; /* focus follows mouse */
|
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 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 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 bordercolor[] = {0.5, 0.5, 0.5, 1.0};
|
||||||
static const float focuscolor[] = {1.0, 0.0, 0.0, 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 */
|
/* 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};
|
static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
|
||||||
|
|
||||||
/* tagging */
|
/* tagging - tagcount must be no greater than 31 */
|
||||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
static const int tagcount = 9;
|
||||||
|
|
||||||
static const Rule rules[] = {
|
static const Rule rules[] = {
|
||||||
/* app_id title tags mask isfloating monitor */
|
/* app_id title tags mask isfloating monitor */
|
||||||
|
@ -29,12 +28,12 @@ static const Layout layouts[] = {
|
||||||
|
|
||||||
/* monitors */
|
/* monitors */
|
||||||
static const MonitorRule monrules[] = {
|
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:
|
/* 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 */
|
/* 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 */
|
/* keyboard */
|
||||||
|
@ -66,9 +65,9 @@ LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
|
||||||
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||||
|
|
||||||
/* You can choose between:
|
/* You can choose between:
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_NONE
|
LIBINPUT_CONFIG_CLICK_METHOD_NONE
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
|
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
|
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
|
||||||
*/
|
*/
|
||||||
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
_VERSION = 0.4-rc1
|
_VERSION = 0.4
|
||||||
VERSION = `git describe --long --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
||||||
|
|
||||||
PKG_CONFIG = pkg-config
|
PKG_CONFIG = pkg-config
|
||||||
|
|
||||||
|
|
4
push.c
4
push.c
|
@ -24,7 +24,7 @@ prevtiled(Client *sel) {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pushup(const Arg *arg) {
|
pushup(const Arg *arg) {
|
||||||
Client *sel = selclient();
|
Client *sel = focustop(selmon);
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
if(!sel || sel->isfloating)
|
if(!sel || sel->isfloating)
|
||||||
|
@ -44,7 +44,7 @@ pushup(const Arg *arg) {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pushdown(const Arg *arg) {
|
pushdown(const Arg *arg) {
|
||||||
Client *sel = selclient();
|
Client *sel = focustop(selmon);
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
if(!sel || sel->isfloating)
|
if(!sel || sel->isfloating)
|
||||||
|
|
Loading…
Reference in a new issue