diff options
| -rw-r--r-- | config.def.h | 114 | ||||
| -rw-r--r-- | dwl.c | 104 | 
2 files changed, 169 insertions, 49 deletions
| diff --git a/config.def.h b/config.def.h index 447ba00..fa73252 100644 --- a/config.def.h +++ b/config.def.h @@ -1,21 +1,20 @@  /* appearance */  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 bordercolor[]           = {0.5, 0.5, 0.5, 1.0}; -static const float focuscolor[]            = {1.0, 0.0, 0.0, 1.0}; +static const unsigned int borderpx         = 2;  /* border pixel of windows */ +static const float bordercolor[]           = {0.27, 0.27,  0.27, 1.0}; +static const float focuscolor[]            = {0.0,  0.33,  0.47, 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}; +static const float fullscreen_bg[]         = {0.1,  0.1,   0.1,  1.0};  /* tagging - tagcount must be no greater than 31 */  static const int tagcount = 9;  static const Rule rules[] = { -	/* app_id     title       tags mask     isfloating   monitor */ -	/* examples: -	{ "Gimp",     NULL,       0,            1,           -1 }, -	*/ -	{ "firefox",  NULL,       1 << 8,       0,           -1 }, +	/* app_id     title       tags mask     isfloating  isterm  noswallow  monitor */ +	{ "wev",      NULL,       0,		0,          0,      1,         -1 }, +	{ "foot",     NULL,       0,		0,          1,      0,         -1 }, +	{ "firefox",  NULL,       1 << 8,       0,          0,      1,         -1 },  };  /* layout(s) */ @@ -91,7 +90,7 @@ LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right  static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;  /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ -#define MODKEY WLR_MODIFIER_ALT +#define MODKEY WLR_MODIFIER_LOGO  #define TAGKEYS(KEY,SKEY,TAG) \  	{ MODKEY,                    KEY,            view,            {.ui = 1 << TAG} }, \ @@ -104,44 +103,68 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA  /* commands */  static const char *termcmd[] = { "foot", NULL }; -static const char *menucmd[] = { "bemenu-run", NULL }; +static const char *menucmd[] = { "menu_run", NULL }; +static const char *nnnfm[]   = { "foot", "nnn", "-decC", NULL }; +static const char *www[]     = { "firefox", NULL }; +static const char *damb[]    = { "damb", NULL }; +static const char *dbook[]   = { "dbook", NULL }; + +/* control */ +static const char *scrlock[] = { "swaylock", NULL }; +static const char *upbri[]   = { "wobload", "brightnessctl", "set", "+1%", NULL }; +static const char *downbri[] = { "wobload", "brightnessctl", "set", "1%-", NULL }; +static const char *upvol[]   = { "wobload", "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "5%+", NULL }; +static const char *downvol[] = { "wobload", "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "5%-",   NULL }; +static const char *voltogl[] = { "wobload", "wpctl", "set-mute", "@DEFAULT_AUDIO_SINK@", "toggle", NULL }; +static const char *mutemic[] = { "audio_mutemic", NULL };  static const Key keys[] = {  	/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -	/* modifier                  key                 function        argument */ -	{ MODKEY,                    XKB_KEY_p,          spawn,          {.v = menucmd} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return,     spawn,          {.v = termcmd} }, -	{ MODKEY,                    XKB_KEY_j,          focusstack,     {.i = +1} }, -	{ MODKEY,                    XKB_KEY_k,          focusstack,     {.i = -1} }, -	{ MODKEY,                    XKB_KEY_i,          incnmaster,     {.i = +1} }, -	{ MODKEY,                    XKB_KEY_d,          incnmaster,     {.i = -1} }, -	{ MODKEY,                    XKB_KEY_h,          setmfact,       {.f = -0.05} }, -	{ MODKEY,                    XKB_KEY_l,          setmfact,       {.f = +0.05} }, -	{ MODKEY,                    XKB_KEY_Return,     zoom,           {0} }, -	{ MODKEY,                    XKB_KEY_Tab,        view,           {0} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C,          killclient,     {0} }, -	{ MODKEY,                    XKB_KEY_t,          setlayout,      {.v = &layouts[0]} }, -	{ MODKEY,                    XKB_KEY_f,          setlayout,      {.v = &layouts[1]} }, -	{ MODKEY,                    XKB_KEY_m,          setlayout,      {.v = &layouts[2]} }, -	{ MODKEY,                    XKB_KEY_space,      setlayout,      {0} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space,      togglefloating, {0} }, -	{ MODKEY,                    XKB_KEY_e,         togglefullscreen, {0} }, -	{ MODKEY,                    XKB_KEY_0,          view,           {.ui = ~0} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag,            {.ui = ~0} }, -	{ MODKEY,                    XKB_KEY_comma,      focusmon,       {.i = WLR_DIRECTION_LEFT} }, -	{ MODKEY,                    XKB_KEY_period,     focusmon,       {.i = WLR_DIRECTION_RIGHT} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less,       tagmon,         {.i = WLR_DIRECTION_LEFT} }, -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater,    tagmon,         {.i = WLR_DIRECTION_RIGHT} }, -	TAGKEYS(          XKB_KEY_1, XKB_KEY_exclam,                     0), -	TAGKEYS(          XKB_KEY_2, XKB_KEY_at,                         1), -	TAGKEYS(          XKB_KEY_3, XKB_KEY_numbersign,                 2), -	TAGKEYS(          XKB_KEY_4, XKB_KEY_dollar,                     3), -	TAGKEYS(          XKB_KEY_5, XKB_KEY_percent,                    4), -	TAGKEYS(          XKB_KEY_6, XKB_KEY_asciicircum,                5), -	TAGKEYS(          XKB_KEY_7, XKB_KEY_ampersand,                  6), -	TAGKEYS(          XKB_KEY_8, XKB_KEY_asterisk,                   7), -	TAGKEYS(          XKB_KEY_9, XKB_KEY_parenleft,                  8), -	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q,          quit,           {0} }, +	/* modifier                  key			    function        argument */ +	{ MODKEY,                    XKB_KEY_p,			    spawn,          {.v = menucmd} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return,		    spawn,          {.v = termcmd} }, +	{ MODKEY,                    XKB_KEY_n,			    spawn,          {.v = nnnfm} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_W,			    spawn,	    {.v = www} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A,			    spawn,	    {.v = damb} }, +	{ MODKEY,		     XKB_KEY_x,			    spawn,	    {.v = scrlock} }, +	{ MODKEY,		     XKB_KEY_b,			    spawn,	    {.v = dbook} }, +	{ 0,			     XKB_KEY_XF86MonBrightnessDown, spawn,          {.v = downbri} }, +	{ 0,			     XKB_KEY_XF86MonBrightnessUp,   spawn,          {.v = upbri} }, +	{ 0,			     XKB_KEY_XF86AudioMute,	    spawn,          {.v = voltogl} }, +	{ 0,			     XKB_KEY_XF86AudioLowerVolume,  spawn,          {.v = downvol} }, +	{ 0,			     XKB_KEY_XF86AudioRaiseVolume,  spawn,          {.v = upvol} }, +	{ 0,			     XKB_KEY_XF86AudioMicMute,	    spawn,          {.v = mutemic} }, +	{ MODKEY,                    XKB_KEY_j,			    focusstack,     {.i = +1} }, +	{ MODKEY,                    XKB_KEY_k,			    focusstack,     {.i = -1} }, +	{ MODKEY,                    XKB_KEY_i,			    incnmaster,     {.i = +1} }, +	{ MODKEY,                    XKB_KEY_d,			    incnmaster,     {.i = -1} }, +	{ MODKEY,                    XKB_KEY_h,			    setmfact,       {.f = -0.05} }, +	{ MODKEY,                    XKB_KEY_l,			    setmfact,       {.f = +0.05} }, +	{ MODKEY,                    XKB_KEY_Return,		    zoom,           {0} }, +	{ MODKEY,                    XKB_KEY_Tab,		    view,           {0} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C,			    killclient,     {0} }, +	{ MODKEY,                    XKB_KEY_t,			    setlayout,      {.v = &layouts[0]} }, +	{ MODKEY,                    XKB_KEY_f,			    setlayout,      {.v = &layouts[1]} }, +	{ MODKEY,                    XKB_KEY_m,			    setlayout,      {.v = &layouts[2]} }, +	{ MODKEY,                    XKB_KEY_space,		    setlayout,      {0} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space,		    togglefloating, {0} }, +	{ MODKEY,                    XKB_KEY_e,			    togglefullscreen, {0} }, +	{ MODKEY,                    XKB_KEY_0,			    view,           {.ui = ~0} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright,	    tag,            {.ui = ~0} }, +	{ MODKEY,                    XKB_KEY_comma,		    focusmon,       {.i = WLR_DIRECTION_LEFT} }, +	{ MODKEY,                    XKB_KEY_period,		    focusmon,       {.i = WLR_DIRECTION_RIGHT} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less,		    tagmon,         {.i = WLR_DIRECTION_LEFT} }, +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater,		    tagmon,         {.i = WLR_DIRECTION_RIGHT} }, +	TAGKEYS(          XKB_KEY_1, XKB_KEY_exclam,				    0), +	TAGKEYS(          XKB_KEY_2, XKB_KEY_at,				    1), +	TAGKEYS(          XKB_KEY_3, XKB_KEY_numbersign,			    2), +	TAGKEYS(          XKB_KEY_4, XKB_KEY_dollar,				    3), +	TAGKEYS(          XKB_KEY_5, XKB_KEY_percent,				    4), +	TAGKEYS(          XKB_KEY_6, XKB_KEY_asciicircum,			    5), +	TAGKEYS(          XKB_KEY_7, XKB_KEY_ampersand,				    6), +	TAGKEYS(          XKB_KEY_8, XKB_KEY_asterisk,				    7), +	TAGKEYS(          XKB_KEY_9, XKB_KEY_parenleft,				    8), +	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q,			    quit,           {0} },  	/* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */  	{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, @@ -155,3 +178,4 @@ static const Button buttons[] = {  	{ MODKEY, BTN_MIDDLE, togglefloating, {0} },  	{ MODKEY, BTN_RIGHT,  moveresize,     {.ui = CurResize} },  }; + @@ -95,7 +95,8 @@ typedef struct {  } Button;  typedef struct Monitor Monitor; -typedef struct { +typedef struct Client Client; +struct Client {  	/* Must keep these three elements in this order */  	unsigned int type; /* XDGShell or X11* */  	struct wlr_box geom; /* layout-relative, includes border */ @@ -123,10 +124,12 @@ typedef struct {  	struct wl_listener set_hints;  #endif  	unsigned int bw; +	int isfloating, isurgent, isfullscreen, isterm, noswallow;  	uint32_t tags; -	int isfloating, isurgent, isfullscreen;  	uint32_t resize; /* configure serial of a pending resize */ -} Client; +	pid_t pid; +	Client *swallowing, *swallowedby; +};  typedef struct {  	uint32_t mod; @@ -208,6 +211,8 @@ typedef struct {  	const char *title;  	uint32_t tags;  	int isfloating; +	int isterm; +	int noswallow;  	int monitor;  } Rule; @@ -318,6 +323,10 @@ static Monitor *xytomon(double x, double y);  static struct wlr_scene_node *xytonode(double x, double y, struct wlr_surface **psurface,  		Client **pc, LayerSurface **pl, double *nx, double *ny);  static void zoom(const Arg *arg); +static pid_t getparentprocess(pid_t p); +static int isdescprocess(pid_t p, pid_t c); +static Client *termforwin(Client *w); +static void swallow(Client *c, Client *w);  /* variables */  static const char broken[] = "broken"; @@ -461,6 +470,8 @@ applyrules(Client *c)  		if ((!r->title || strstr(title, r->title))  				&& (!r->id || strstr(appid, r->id))) {  			c->isfloating = r->isfloating; +			c->isterm     = r->isterm; +			c->noswallow  = r->noswallow;  			newtags |= r->tags;  			i = 0;  			wl_list_for_each(m, &mons, link) @@ -1012,6 +1023,8 @@ createnotify(struct wl_listener *listener, void *data)  	c->surface.xdg = xdg_surface;  	c->bw = borderpx; +	wl_client_get_credentials(c->surface.xdg->client->client, &c->pid, NULL, NULL); +  	LISTEN(&xdg_surface->events.map, &c->map, mapnotify);  	LISTEN(&xdg_surface->events.unmap, &c->unmap, unmapnotify);  	LISTEN(&xdg_surface->events.destroy, &c->destroy, destroynotify); @@ -1336,6 +1349,62 @@ fullscreennotify(struct wl_listener *listener, void *data)  	setfullscreen(c, client_wants_fullscreen(c));  } +pid_t +getparentprocess(pid_t p) +{ +	unsigned int v = 0; + +	FILE *f; +	char buf[256]; +	snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); + +	if (!(f = fopen(buf, "r"))) +		return 0; + +	fscanf(f, "%*u %*s %*c %u", &v); +	fclose(f); + +	return (pid_t)v; +} + +int +isdescprocess(pid_t p, pid_t c) +{ +	while (p != c && c != 0) +		c = getparentprocess(c); + +	return (int)c; +} + +Client * +termforwin(Client *w) +{ +	Client *c; + +	if (!w->pid || w->isterm || w->noswallow) +		return NULL; + +	wl_list_for_each(c, &clients, link) +		if (c->isterm && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid)) +			return c; + +	return NULL; +} + +void +swallow(Client *c, Client *w) +{ +	c->bw = w->bw; +	c->isfloating = w->isfloating; +	c->isurgent = w->isurgent; +	c->isfullscreen = w->isfullscreen; +	resize(c, w->geom, 0); +	wl_list_insert(&w->link, &c->link); +	wl_list_insert(&w->flink, &c->flink); +	wlr_scene_node_set_enabled(&w->scene->node, 0); +	wlr_scene_node_set_enabled(&c->scene->node, 1); +} +  int  handlesig(int signo, void *data)  { @@ -1542,7 +1611,7 @@ void  mapnotify(struct wl_listener *listener, void *data)  {  	/* Called when the surface is mapped, or ready to display on-screen. */ -	Client *p, *w, *c = wl_container_of(listener, c, map); +	Client *p, *w, *t, *c = wl_container_of(listener, c, map);  	Monitor *m;  	int i; @@ -1603,6 +1672,20 @@ mapnotify(struct wl_listener *listener, void *data)  	}  	printstatus(); +	if (!c->noswallow) { +		t = termforwin(c); +		if (t) { +			c->swallowedby = t; +			t->swallowing  = c; +			wl_list_remove(&c->link); +			wl_list_remove(&c->flink); +			swallow(c,t); +			wl_list_remove(&t->link); +			wl_list_remove(&t->flink); +			arrange(c->mon); +		} +	} +  unset_fullscreen:  	m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y);  	wl_list_for_each(w, &clients, link) @@ -2477,6 +2560,18 @@ unmapnotify(struct wl_listener *listener, void *data)  		grabc = NULL;  	} +	if (c->swallowing) { +		c->swallowing->swallowedby = NULL; +		c->swallowing = NULL; +	} + +	if (c->swallowedby) { +		setfullscreen(c->swallowedby, 0); +		swallow(c->swallowedby, c); +		c->swallowedby->swallowing = NULL; +		c->swallowedby = NULL; +	} +  	if (client_is_unmanaged(c)) {  		if (c == exclusive_focus)  			exclusive_focus = NULL; @@ -2823,3 +2918,4 @@ main(int argc, char *argv[])  usage:  	die("Usage: %s [-v] [-s startup command]", argv[0]);  } + | 
