Compare commits
	
		
			4 Commits
		
	
	
		
			2b3504e439
			...
			07e03e9f5f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					07e03e9f5f | ||
| 
						 | 
					93f83673f2 | ||
| 
						 | 
					15491d7442 | ||
| 
						 | 
					c7e1600e91 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -3,4 +3,3 @@ dwl
 | 
				
			|||||||
*-protocol.c
 | 
					*-protocol.c
 | 
				
			||||||
*-protocol.h
 | 
					*-protocol.h
 | 
				
			||||||
.ccls-cache
 | 
					.ccls-cache
 | 
				
			||||||
config.h
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Makefile
									
									
									
									
									
								
							@ -14,9 +14,9 @@ DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CF
 | 
				
			|||||||
LDLIBS    = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
 | 
					LDLIBS    = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: dwl
 | 
					all: dwl
 | 
				
			||||||
dwl: dwl.o util.o
 | 
					dwl: dwl.o util.o net-tapesoftware-dwl-wm-unstable-v1-protocol.o
 | 
				
			||||||
	$(CC) dwl.o util.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
 | 
						$(CC) dwl.o util.o net-tapesoftware-dwl-wm-unstable-v1-protocol.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
 | 
				
			||||||
dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
 | 
					dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h net-tapesoftware-dwl-wm-unstable-v1-protocol.h
 | 
				
			||||||
util.o: util.c util.h
 | 
					util.o: util.c util.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# wayland-scanner is a tool which generates C headers and rigging for Wayland
 | 
					# wayland-scanner is a tool which generates C headers and rigging for Wayland
 | 
				
			||||||
@ -32,6 +32,16 @@ wlr-layer-shell-unstable-v1-protocol.h:
 | 
				
			|||||||
	$(WAYLAND_SCANNER) server-header \
 | 
						$(WAYLAND_SCANNER) server-header \
 | 
				
			||||||
		protocols/wlr-layer-shell-unstable-v1.xml $@
 | 
							protocols/wlr-layer-shell-unstable-v1.xml $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					net-tapesoftware-dwl-wm-unstable-v1-protocol.h: protocols/net-tapesoftware-dwl-wm-unstable-v1.xml 
 | 
				
			||||||
 | 
						$(WAYLAND_SCANNER) server-header \
 | 
				
			||||||
 | 
							protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					net-tapesoftware-dwl-wm-unstable-v1-protocol.c: protocols/net-tapesoftware-dwl-wm-unstable-v1.xml 
 | 
				
			||||||
 | 
						$(WAYLAND_SCANNER) private-code \
 | 
				
			||||||
 | 
							protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					net-tapesoftware-dwl-wm-unstable-v1-protocol.o: net-tapesoftware-dwl-wm-unstable-v1-protocol.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config.h:
 | 
					config.h:
 | 
				
			||||||
	cp config.def.h $@
 | 
						cp config.def.h $@
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								config.def.h
									
									
									
									
									
								
							@ -1,7 +1,13 @@
 | 
				
			|||||||
/* appearance */
 | 
					/* appearance */
 | 
				
			||||||
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 int smartgaps                 = 0;  /* 1 means no outer gap when there is only one window */
 | 
				
			||||||
 | 
					static const int monoclegaps               = 0;  /* 1 means outer gaps in monocle layout */
 | 
				
			||||||
static const unsigned int borderpx         = 1;  /* border pixel of windows */
 | 
					static const unsigned int borderpx         = 1;  /* border pixel of windows */
 | 
				
			||||||
 | 
					static const unsigned int gappih           = 10; /* horiz inner gap between windows */
 | 
				
			||||||
 | 
					static const unsigned int gappiv           = 10; /* vert inner gap between windows */
 | 
				
			||||||
 | 
					static const unsigned int gappoh           = 10; /* horiz outer gap between windows and screen edge */
 | 
				
			||||||
 | 
					static const unsigned int gappov           = 10; /* vert outer gap between windows and screen edge */
 | 
				
			||||||
static const float rootcolor[]             = {0.3, 0.3, 0.3, 1.0};
 | 
					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};
 | 
				
			||||||
@ -118,6 +124,22 @@ static const Key keys[] = {
 | 
				
			|||||||
	{ MODKEY,                    XKB_KEY_d,          incnmaster,     {.i = -1} },
 | 
						{ MODKEY,                    XKB_KEY_d,          incnmaster,     {.i = -1} },
 | 
				
			||||||
	{ MODKEY,                    XKB_KEY_h,          setmfact,       {.f = -0.05} },
 | 
						{ MODKEY,                    XKB_KEY_h,          setmfact,       {.f = -0.05} },
 | 
				
			||||||
	{ MODKEY,                    XKB_KEY_l,          setmfact,       {.f = +0.05} },
 | 
						{ MODKEY,                    XKB_KEY_l,          setmfact,       {.f = +0.05} },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO,  XKB_KEY_h,          incgaps,       {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO,  XKB_KEY_l,          incgaps,       {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT,   XKB_KEY_H,      incogaps,      {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT,   XKB_KEY_L,      incogaps,      {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL,    XKB_KEY_h,      incigaps,      {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL,    XKB_KEY_l,      incigaps,      {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO,  XKB_KEY_0,          togglegaps,     {0} },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT,   XKB_KEY_parenright,defaultgaps,    {0} },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_y,          incihgaps,     {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_o,          incihgaps,     {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_CTRL,  XKB_KEY_y,          incivgaps,     {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_CTRL,  XKB_KEY_o,          incivgaps,     {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO,  XKB_KEY_y,          incohgaps,     {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_LOGO,  XKB_KEY_o,          incohgaps,     {.i = -1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Y,          incovgaps,     {.i = +1 } },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O,          incovgaps,     {.i = -1 } },
 | 
				
			||||||
	{ MODKEY,                    XKB_KEY_Return,     zoom,           {0} },
 | 
						{ MODKEY,                    XKB_KEY_Return,     zoom,           {0} },
 | 
				
			||||||
	{ MODKEY,                    XKB_KEY_Tab,        view,           {0} },
 | 
						{ MODKEY,                    XKB_KEY_Tab,        view,           {0} },
 | 
				
			||||||
	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C,          killclient,     {0} },
 | 
						{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C,          killclient,     {0} },
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										183
									
								
								config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								config.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,183 @@
 | 
				
			|||||||
 | 
					/* 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 int smartgaps                 = 0;  /* 1 means no outer gap when there is only one window */
 | 
				
			||||||
 | 
					static const int monoclegaps               = 0;  /* 1 means outer gaps in monocle layout */
 | 
				
			||||||
 | 
					static const unsigned int gappih           = 10; /* horiz inner gap between windows */
 | 
				
			||||||
 | 
					static const unsigned int gappiv           = 10; /* vert inner gap between windows */
 | 
				
			||||||
 | 
					static const unsigned int gappoh           = 10; /* horiz outer gap between windows and screen edge */
 | 
				
			||||||
 | 
					static const unsigned int gappov           = 10; /* vert outer gap between windows and screen edge */
 | 
				
			||||||
 | 
					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" };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const Rule rules[] = {
 | 
				
			||||||
 | 
						/* app_id     title       tags mask     isfloating   monitor */
 | 
				
			||||||
 | 
						/* examples:
 | 
				
			||||||
 | 
						{ "Gimp",     NULL,       0,            1,           -1 },
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						{ "firefox",  NULL,       1 << 6,       0,           -1 },
 | 
				
			||||||
 | 
						{ "librewolf",  NULL,       1 << 7,       0,           -1 },
 | 
				
			||||||
 | 
						{ "firefox.real",  NULL,       1 << 8,       0,           -1 }, // tor browser
 | 
				
			||||||
 | 
						{ "pinentry-gnome3", NULL, 0,           1,           -1 },
 | 
				
			||||||
 | 
						{ "firefox", "Firefox - Sharing Indicator", 0, 1, -1},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* layout(s) */
 | 
				
			||||||
 | 
					static const Layout layouts[] = {
 | 
				
			||||||
 | 
						/* symbol     arrange function */
 | 
				
			||||||
 | 
						{ "[]=",      tile },
 | 
				
			||||||
 | 
						{ "><>",      NULL },    /* no layout function means floating behavior */
 | 
				
			||||||
 | 
						{ "[M]",      monocle },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* monitors */
 | 
				
			||||||
 | 
					static const MonitorRule monrules[] = {
 | 
				
			||||||
 | 
						/* name       mfact nmaster scale layout       rotate/reflect */
 | 
				
			||||||
 | 
						{ "eDP-1",    0.5,  1,      1.5,    &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* defaults */
 | 
				
			||||||
 | 
						{ NULL,       0.55, 1,      1,    &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* keyboard */
 | 
				
			||||||
 | 
					static const struct xkb_rule_names xkb_rules = {
 | 
				
			||||||
 | 
						/* can specify fields: rules, model, layout, variant, options */
 | 
				
			||||||
 | 
						/* example:
 | 
				
			||||||
 | 
						.options = "ctrl:nocaps",
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						.options = NULL,
 | 
				
			||||||
 | 
						.layout = "gb",
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const int repeat_rate = 25;
 | 
				
			||||||
 | 
					static const int repeat_delay = 600;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Trackpad */
 | 
				
			||||||
 | 
					static const int tap_to_click = 1;
 | 
				
			||||||
 | 
					static const int tap_and_drag = 1;
 | 
				
			||||||
 | 
					static const int drag_lock = 1;
 | 
				
			||||||
 | 
					static const int natural_scrolling = 0;
 | 
				
			||||||
 | 
					static const int disable_while_typing = 0;
 | 
				
			||||||
 | 
					static const int left_handed = 0;
 | 
				
			||||||
 | 
					static const int middle_button_emulation = 0;
 | 
				
			||||||
 | 
					/* You can choose between:
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SCROLL_NO_SCROLL
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SCROLL_2FG
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SCROLL_EDGE
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* You can choose between:
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_CLICK_METHOD_NONE       
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS       
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER 
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* You can choose between:
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* You can choose between:
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
 | 
				
			||||||
 | 
					static const double accel_speed = 0.0;
 | 
				
			||||||
 | 
					/* You can choose between:
 | 
				
			||||||
 | 
					LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
 | 
				
			||||||
 | 
					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 TAGKEYS(KEY,SKEY,TAG) \
 | 
				
			||||||
 | 
						{ MODKEY,                    KEY,            view,            {.ui = 1 << TAG} }, \
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_CTRL,  KEY,            toggleview,      {.ui = 1 << TAG} }, \
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_SHIFT, SKEY,           tag,             {.ui = 1 << TAG} }, \
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* helper for spawning shell commands in the pre dwm-5.0 fashion */
 | 
				
			||||||
 | 
					#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* commands */
 | 
				
			||||||
 | 
					static const char *termcmd[] = { "foot", NULL };
 | 
				
			||||||
 | 
					static const char *menucmd[] = { "dmenu_run", 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_u,          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_quotedbl,                         1),
 | 
				
			||||||
 | 
						TAGKEYS(          XKB_KEY_3, XKB_KEY_sterling,                 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} },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Custom key bindings */
 | 
				
			||||||
 | 
						{ MODKEY,										 XKB_KEY_l,					 spawn,					 SHCMD("swaylock") },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_o,          spawn,          SHCMD("passmenu") },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_r,          spawn,          SHCMD("MOZ_ENABLE_WAYLAND=1 torbrowser-launcher") },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_d,          spawn,          SHCMD("MOZ_ENABLE_WAYLAND=1 librewolf") },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_c,          spawn,          SHCMD("MOZ_ENABLE_WAYLAND=1 firefox") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Function key bindings */
 | 
				
			||||||
 | 
						{ 0,										 XKB_KEY_XF86MonBrightnessUp, spawn,         SHCMD("brightnessctl set 10%+") },
 | 
				
			||||||
 | 
						{ 0,										 XKB_KEY_XF86MonBrightnessDown, spawn,       SHCMD("brightnessctl set 10%-") },
 | 
				
			||||||
 | 
						{ 0,										 XKB_KEY_Print,								spawn,	 SHCMD("GRIM_DEFAULT_DIR=/home/elimin8/Pictures/Screenshots/ grim -g \"$(slurp)\" - | wl-copy -t \"image/png\"") },
 | 
				
			||||||
 | 
						{ WLR_MODIFIER_SHIFT,									 XKB_KEY_Print,								spawn,	 SHCMD("GRIM_DEFAULT_DIR=/home/elimin8/Pictures/Screenshots/ grim -g \"$(slurp)\" && ls /home/elimin8/Pictures/Screenshots -Art | tail -n 1 | awk '{print \"/home/elimin8/Pictures/Screenshots/\"$1}' | wl-copy") },
 | 
				
			||||||
 | 
						{ MODKEY,                    XKB_KEY_b,          spawn,          SHCMD("$HOME/.local/bin/get-bookmark.sh") },
 | 
				
			||||||
 | 
						{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_B,          spawn,          SHCMD("$HOME/.local/bin/add-bookmark.sh") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 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} },
 | 
				
			||||||
 | 
					#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
 | 
				
			||||||
 | 
						CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
 | 
				
			||||||
 | 
						CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const Button buttons[] = {
 | 
				
			||||||
 | 
						{ MODKEY, BTN_LEFT,   moveresize,     {.ui = CurMove} },
 | 
				
			||||||
 | 
						{ MODKEY, BTN_MIDDLE, togglefloating, {0} },
 | 
				
			||||||
 | 
						{ MODKEY, BTN_RIGHT,  moveresize,     {.ui = CurResize} },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -7,8 +7,6 @@ PKG_CONFIG = pkg-config
 | 
				
			|||||||
PREFIX = /usr/local
 | 
					PREFIX = /usr/local
 | 
				
			||||||
MANDIR = $(PREFIX)/share/man
 | 
					MANDIR = $(PREFIX)/share/man
 | 
				
			||||||
 | 
					
 | 
				
			||||||
XWAYLAND =
 | 
					 | 
				
			||||||
XLIBS =
 | 
					 | 
				
			||||||
# Uncomment to build XWayland support
 | 
					# Uncomment to build XWayland support
 | 
				
			||||||
#XWAYLAND = -DXWAYLAND
 | 
					XWAYLAND = -DXWAYLAND
 | 
				
			||||||
#XLIBS = xcb xcb-icccm
 | 
					XLIBS = xcb xcb-icccm
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										367
									
								
								dwl.c
									
									
									
									
									
								
							
							
						
						
									
										367
									
								
								dwl.c
									
									
									
									
									
								
							@ -52,6 +52,7 @@
 | 
				
			|||||||
#include <wlr/types/wlr_xdg_shell.h>
 | 
					#include <wlr/types/wlr_xdg_shell.h>
 | 
				
			||||||
#include <wlr/util/log.h>
 | 
					#include <wlr/util/log.h>
 | 
				
			||||||
#include <xkbcommon/xkbcommon.h>
 | 
					#include <xkbcommon/xkbcommon.h>
 | 
				
			||||||
 | 
					#include "net-tapesoftware-dwl-wm-unstable-v1-protocol.h"
 | 
				
			||||||
#ifdef XWAYLAND
 | 
					#ifdef XWAYLAND
 | 
				
			||||||
#include <wlr/xwayland.h>
 | 
					#include <wlr/xwayland.h>
 | 
				
			||||||
#include <X11/Xlib.h>
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
@ -167,6 +168,12 @@ typedef struct {
 | 
				
			|||||||
	void (*arrange)(Monitor *);
 | 
						void (*arrange)(Monitor *);
 | 
				
			||||||
} Layout;
 | 
					} Layout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						struct wl_list link;
 | 
				
			||||||
 | 
						struct wl_resource *resource;
 | 
				
			||||||
 | 
						struct Monitor *monitor;
 | 
				
			||||||
 | 
					} DwlWmMonitor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Monitor {
 | 
					struct Monitor {
 | 
				
			||||||
	struct wl_list link;
 | 
						struct wl_list link;
 | 
				
			||||||
	struct wlr_output *wlr_output;
 | 
						struct wlr_output *wlr_output;
 | 
				
			||||||
@ -179,7 +186,12 @@ struct Monitor {
 | 
				
			|||||||
	struct wlr_box m;      /* monitor area, layout-relative */
 | 
						struct wlr_box m;      /* monitor area, layout-relative */
 | 
				
			||||||
	struct wlr_box w;      /* window area, layout-relative */
 | 
						struct wlr_box w;      /* window area, layout-relative */
 | 
				
			||||||
	struct wl_list layers[4]; /* LayerSurface::link */
 | 
						struct wl_list layers[4]; /* LayerSurface::link */
 | 
				
			||||||
 | 
						struct wl_list dwl_wm_monitor_link;
 | 
				
			||||||
	const Layout *lt[2];
 | 
						const Layout *lt[2];
 | 
				
			||||||
 | 
						int gappih;           /* horizontal gap between windows */
 | 
				
			||||||
 | 
						int gappiv;           /* vertical gap between windows */
 | 
				
			||||||
 | 
						int gappoh;           /* horizontal outer gaps */
 | 
				
			||||||
 | 
						int gappov;           /* vertical outer gaps */
 | 
				
			||||||
	unsigned int seltags;
 | 
						unsigned int seltags;
 | 
				
			||||||
	unsigned int sellt;
 | 
						unsigned int sellt;
 | 
				
			||||||
	unsigned int tagset[2];
 | 
						unsigned int tagset[2];
 | 
				
			||||||
@ -239,6 +251,7 @@ static void createmon(struct wl_listener *listener, void *data);
 | 
				
			|||||||
static void createnotify(struct wl_listener *listener, void *data);
 | 
					static void createnotify(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void createpointer(struct wlr_pointer *pointer);
 | 
					static void createpointer(struct wlr_pointer *pointer);
 | 
				
			||||||
static void cursorframe(struct wl_listener *listener, void *data);
 | 
					static void cursorframe(struct wl_listener *listener, void *data);
 | 
				
			||||||
 | 
					static void defaultgaps(const Arg *arg);
 | 
				
			||||||
static void destroydragicon(struct wl_listener *listener, void *data);
 | 
					static void destroydragicon(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void destroyidleinhibitor(struct wl_listener *listener, void *data);
 | 
					static void destroyidleinhibitor(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
 | 
					static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
 | 
				
			||||||
@ -254,6 +267,13 @@ static void focusstack(const Arg *arg);
 | 
				
			|||||||
static Client *focustop(Monitor *m);
 | 
					static Client *focustop(Monitor *m);
 | 
				
			||||||
static void fullscreennotify(struct wl_listener *listener, void *data);
 | 
					static void fullscreennotify(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void incnmaster(const Arg *arg);
 | 
					static void incnmaster(const Arg *arg);
 | 
				
			||||||
 | 
					static void incgaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incigaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incihgaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incivgaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incogaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incohgaps(const Arg *arg);
 | 
				
			||||||
 | 
					static void incovgaps(const Arg *arg);
 | 
				
			||||||
static void inputdevice(struct wl_listener *listener, void *data);
 | 
					static void inputdevice(struct wl_listener *listener, void *data);
 | 
				
			||||||
static int keybinding(uint32_t mods, xkb_keysym_t sym);
 | 
					static int keybinding(uint32_t mods, xkb_keysym_t sym);
 | 
				
			||||||
static void keypress(struct wl_listener *listener, void *data);
 | 
					static void keypress(struct wl_listener *listener, void *data);
 | 
				
			||||||
@ -283,6 +303,7 @@ static void run(char *startup_cmd);
 | 
				
			|||||||
static void setcursor(struct wl_listener *listener, void *data);
 | 
					static void setcursor(struct wl_listener *listener, void *data);
 | 
				
			||||||
static void setfloating(Client *c, int floating);
 | 
					static void setfloating(Client *c, int floating);
 | 
				
			||||||
static void setfullscreen(Client *c, int fullscreen);
 | 
					static void setfullscreen(Client *c, int fullscreen);
 | 
				
			||||||
 | 
					static void setgaps(int oh, int ov, int ih, int iv);
 | 
				
			||||||
static void setlayout(const Arg *arg);
 | 
					static void setlayout(const Arg *arg);
 | 
				
			||||||
static void setmfact(const Arg *arg);
 | 
					static void setmfact(const Arg *arg);
 | 
				
			||||||
static void setmon(Client *c, Monitor *m, unsigned int newtags);
 | 
					static void setmon(Client *c, Monitor *m, unsigned int newtags);
 | 
				
			||||||
@ -296,6 +317,7 @@ static void tagmon(const Arg *arg);
 | 
				
			|||||||
static void tile(Monitor *m);
 | 
					static void tile(Monitor *m);
 | 
				
			||||||
static void togglefloating(const Arg *arg);
 | 
					static void togglefloating(const Arg *arg);
 | 
				
			||||||
static void togglefullscreen(const Arg *arg);
 | 
					static void togglefullscreen(const Arg *arg);
 | 
				
			||||||
 | 
					static void togglegaps(const Arg *arg);
 | 
				
			||||||
static void toggletag(const Arg *arg);
 | 
					static void toggletag(const Arg *arg);
 | 
				
			||||||
static void toggleview(const Arg *arg);
 | 
					static void toggleview(const Arg *arg);
 | 
				
			||||||
static void unlocksession(struct wl_listener *listener, void *data);
 | 
					static void unlocksession(struct wl_listener *listener, void *data);
 | 
				
			||||||
@ -311,6 +333,10 @@ static struct wlr_scene_node *xytonode(double x, double y, struct wlr_surface **
 | 
				
			|||||||
		Client **pc, LayerSurface **pl, double *nx, double *ny);
 | 
							Client **pc, LayerSurface **pl, double *nx, double *ny);
 | 
				
			||||||
static void zoom(const Arg *arg);
 | 
					static void zoom(const Arg *arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void dwl_wm_bind(struct wl_client *client, void *data,
 | 
				
			||||||
 | 
							uint32_t version, uint32_t id);
 | 
				
			||||||
 | 
					static void dwl_wm_printstatus(Monitor *monitor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* variables */
 | 
					/* variables */
 | 
				
			||||||
static const char broken[] = "broken";
 | 
					static const char broken[] = "broken";
 | 
				
			||||||
static const char *cursor_image = "left_ptr";
 | 
					static const char *cursor_image = "left_ptr";
 | 
				
			||||||
@ -356,6 +382,8 @@ static struct wlr_box sgeom;
 | 
				
			|||||||
static struct wl_list mons;
 | 
					static struct wl_list mons;
 | 
				
			||||||
static Monitor *selmon;
 | 
					static Monitor *selmon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int enablegaps = 1;   /* enables gaps, used by togglegaps */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* global event handlers */
 | 
					/* global event handlers */
 | 
				
			||||||
static struct wl_listener cursor_axis = {.notify = axisnotify};
 | 
					static struct wl_listener cursor_axis = {.notify = axisnotify};
 | 
				
			||||||
static struct wl_listener cursor_button = {.notify = buttonpress};
 | 
					static struct wl_listener cursor_button = {.notify = buttonpress};
 | 
				
			||||||
@ -678,6 +706,7 @@ cleanupmon(struct wl_listener *listener, void *data)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	Monitor *m = wl_container_of(listener, m, destroy);
 | 
						Monitor *m = wl_container_of(listener, m, destroy);
 | 
				
			||||||
	LayerSurface *l, *tmp;
 | 
						LayerSurface *l, *tmp;
 | 
				
			||||||
 | 
						DwlWmMonitor *mon, *montmp;
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i <= ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY; i++)
 | 
						for (i = 0; i <= ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY; i++)
 | 
				
			||||||
@ -689,6 +718,10 @@ cleanupmon(struct wl_listener *listener, void *data)
 | 
				
			|||||||
	wl_list_remove(&m->link);
 | 
						wl_list_remove(&m->link);
 | 
				
			||||||
	m->wlr_output->data = NULL;
 | 
						m->wlr_output->data = NULL;
 | 
				
			||||||
	wlr_output_layout_remove(output_layout, m->wlr_output);
 | 
						wlr_output_layout_remove(output_layout, m->wlr_output);
 | 
				
			||||||
 | 
						wl_list_for_each_safe(mon, montmp, &m->dwl_wm_monitor_link, link) {
 | 
				
			||||||
 | 
							wl_resource_set_user_data(mon->resource, NULL);
 | 
				
			||||||
 | 
							free(mon);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	wlr_scene_output_destroy(m->scene_output);
 | 
						wlr_scene_output_destroy(m->scene_output);
 | 
				
			||||||
	wlr_scene_node_destroy(&m->fullscreen_bg->node);
 | 
						wlr_scene_node_destroy(&m->fullscreen_bg->node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -892,6 +925,7 @@ createmon(struct wl_listener *listener, void *data)
 | 
				
			|||||||
	const MonitorRule *r;
 | 
						const MonitorRule *r;
 | 
				
			||||||
	size_t i;
 | 
						size_t i;
 | 
				
			||||||
	Monitor *m = wlr_output->data = ecalloc(1, sizeof(*m));
 | 
						Monitor *m = wlr_output->data = ecalloc(1, sizeof(*m));
 | 
				
			||||||
 | 
						wl_list_init(&m->dwl_wm_monitor_link);
 | 
				
			||||||
	m->wlr_output = wlr_output;
 | 
						m->wlr_output = wlr_output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wlr_output_init_render(wlr_output, alloc, drw);
 | 
						wlr_output_init_render(wlr_output, alloc, drw);
 | 
				
			||||||
@ -899,6 +933,11 @@ createmon(struct wl_listener *listener, void *data)
 | 
				
			|||||||
	/* Initialize monitor state using configured rules */
 | 
						/* Initialize monitor state using configured rules */
 | 
				
			||||||
	for (i = 0; i < LENGTH(m->layers); i++)
 | 
						for (i = 0; i < LENGTH(m->layers); i++)
 | 
				
			||||||
		wl_list_init(&m->layers[i]);
 | 
							wl_list_init(&m->layers[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m->gappih = gappih;
 | 
				
			||||||
 | 
						m->gappiv = gappiv;
 | 
				
			||||||
 | 
						m->gappoh = gappoh;
 | 
				
			||||||
 | 
						m->gappov = gappov;
 | 
				
			||||||
	m->tagset[0] = m->tagset[1] = 1;
 | 
						m->tagset[0] = m->tagset[1] = 1;
 | 
				
			||||||
	for (r = monrules; r < END(monrules); r++) {
 | 
						for (r = monrules; r < END(monrules); r++) {
 | 
				
			||||||
		if (!r->name || strstr(wlr_output->name, r->name)) {
 | 
							if (!r->name || strstr(wlr_output->name, r->name)) {
 | 
				
			||||||
@ -1055,6 +1094,12 @@ cursorframe(struct wl_listener *listener, void *data)
 | 
				
			|||||||
	wlr_seat_pointer_notify_frame(seat);
 | 
						wlr_seat_pointer_notify_frame(seat);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					defaultgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(gappoh, gappov, gappih, gappiv);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
destroydragicon(struct wl_listener *listener, void *data)
 | 
					destroydragicon(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1317,6 +1362,83 @@ incnmaster(const Arg *arg)
 | 
				
			|||||||
	arrange(selmon);
 | 
						arrange(selmon);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh + arg->i,
 | 
				
			||||||
 | 
							selmon->gappov + arg->i,
 | 
				
			||||||
 | 
							selmon->gappih + arg->i,
 | 
				
			||||||
 | 
							selmon->gappiv + arg->i
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incigaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh,
 | 
				
			||||||
 | 
							selmon->gappov,
 | 
				
			||||||
 | 
							selmon->gappih + arg->i,
 | 
				
			||||||
 | 
							selmon->gappiv + arg->i
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incihgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh,
 | 
				
			||||||
 | 
							selmon->gappov,
 | 
				
			||||||
 | 
							selmon->gappih + arg->i,
 | 
				
			||||||
 | 
							selmon->gappiv
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incivgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh,
 | 
				
			||||||
 | 
							selmon->gappov,
 | 
				
			||||||
 | 
							selmon->gappih,
 | 
				
			||||||
 | 
							selmon->gappiv + arg->i
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incogaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh + arg->i,
 | 
				
			||||||
 | 
							selmon->gappov + arg->i,
 | 
				
			||||||
 | 
							selmon->gappih,
 | 
				
			||||||
 | 
							selmon->gappiv
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incohgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh + arg->i,
 | 
				
			||||||
 | 
							selmon->gappov,
 | 
				
			||||||
 | 
							selmon->gappih,
 | 
				
			||||||
 | 
							selmon->gappiv
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					incovgaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						setgaps(
 | 
				
			||||||
 | 
							selmon->gappoh,
 | 
				
			||||||
 | 
							selmon->gappov + arg->i,
 | 
				
			||||||
 | 
							selmon->gappih,
 | 
				
			||||||
 | 
							selmon->gappiv
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
inputdevice(struct wl_listener *listener, void *data)
 | 
					inputdevice(struct wl_listener *listener, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1555,7 +1677,11 @@ monocle(Monitor *m)
 | 
				
			|||||||
	wl_list_for_each(c, &clients, link) {
 | 
						wl_list_for_each(c, &clients, link) {
 | 
				
			||||||
		if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
 | 
							if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		resize(c, m->w, 0);
 | 
							if (!monoclegaps)
 | 
				
			||||||
 | 
								resize(c, m->w, 0);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								resize(c, (struct wlr_box){.x = m->w.x + gappoh, .y = m->w.y + gappov,
 | 
				
			||||||
 | 
									.width = m->w.width - 2 * gappoh, .height = m->w.height - 2 * gappov}, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ((c = focustop(m)))
 | 
						if ((c = focustop(m)))
 | 
				
			||||||
		wlr_scene_node_raise_to_top(&c->scene->node);
 | 
							wlr_scene_node_raise_to_top(&c->scene->node);
 | 
				
			||||||
@ -1806,6 +1932,7 @@ printstatus(void)
 | 
				
			|||||||
		printf("%s tags %u %u %u %u\n", m->wlr_output->name, occ, m->tagset[m->seltags],
 | 
							printf("%s tags %u %u %u %u\n", m->wlr_output->name, occ, m->tagset[m->seltags],
 | 
				
			||||||
				sel, urg);
 | 
									sel, urg);
 | 
				
			||||||
		printf("%s layout %s\n", m->wlr_output->name, m->lt[m->sellt]->symbol);
 | 
							printf("%s layout %s\n", m->wlr_output->name, m->lt[m->sellt]->symbol);
 | 
				
			||||||
 | 
							dwl_wm_printstatus(m);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fflush(stdout);
 | 
						fflush(stdout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1987,6 +2114,16 @@ setfullscreen(Client *c, int fullscreen)
 | 
				
			|||||||
	printstatus();
 | 
						printstatus();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					setgaps(int oh, int ov, int ih, int iv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						selmon->gappoh = MAX(oh, 0);
 | 
				
			||||||
 | 
						selmon->gappov = MAX(ov, 0);
 | 
				
			||||||
 | 
						selmon->gappih = MAX(ih, 0);
 | 
				
			||||||
 | 
						selmon->gappiv = MAX(iv, 0);
 | 
				
			||||||
 | 
						arrange(selmon);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
setlayout(const Arg *arg)
 | 
					setlayout(const Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -2234,6 +2371,8 @@ setup(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	wlr_scene_set_presentation(scene, wlr_presentation_create(dpy, backend));
 | 
						wlr_scene_set_presentation(scene, wlr_presentation_create(dpy, backend));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_global_create(dpy, &znet_tapesoftware_dwl_wm_v1_interface, 1, NULL, dwl_wm_bind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef XWAYLAND
 | 
					#ifdef XWAYLAND
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Initialise the XWayland X server.
 | 
						 * Initialise the XWayland X server.
 | 
				
			||||||
@ -2298,7 +2437,7 @@ tagmon(const Arg *arg)
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
tile(Monitor *m)
 | 
					tile(Monitor *m)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i, n = 0, mw, my, ty;
 | 
						unsigned int i, n = 0, h, r, oe = enablegaps, ie = enablegaps, mw, my, ty;
 | 
				
			||||||
	Client *c;
 | 
						Client *c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_list_for_each(c, &clients, link)
 | 
						wl_list_for_each(c, &clients, link)
 | 
				
			||||||
@ -2307,22 +2446,31 @@ tile(Monitor *m)
 | 
				
			|||||||
	if (n == 0)
 | 
						if (n == 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						if (smartgaps == n) {
 | 
				
			||||||
 | 
							oe = 0; // outer gaps disabled
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (n > m->nmaster)
 | 
						if (n > m->nmaster)
 | 
				
			||||||
		mw = m->nmaster ? m->w.width * m->mfact : 0;
 | 
							mw = m->nmaster ? (m->w.width + m->gappiv*ie) * m->mfact : 0;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		mw = m->w.width;
 | 
							mw = m->w.width - 2*m->gappov*oe + m->gappiv*ie;
 | 
				
			||||||
	i = my = ty = 0;
 | 
						i = 0;
 | 
				
			||||||
 | 
						my = ty = m->gappoh*oe;
 | 
				
			||||||
	wl_list_for_each(c, &clients, link) {
 | 
						wl_list_for_each(c, &clients, link) {
 | 
				
			||||||
		if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
 | 
							if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (i < m->nmaster) {
 | 
							if (i < m->nmaster) {
 | 
				
			||||||
			resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw,
 | 
								r = MIN(n, m->nmaster) - i;
 | 
				
			||||||
				.height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0);
 | 
								h = (m->w.height - my - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
 | 
				
			||||||
			my += c->geom.height;
 | 
								resize(c, (struct wlr_box){.x = m->w.x + m->gappov*oe, .y = m->w.y + my,
 | 
				
			||||||
 | 
									.width = mw - m->gappiv*ie, .height = h}, 0);
 | 
				
			||||||
 | 
								my += c->geom.height + m->gappih*ie;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty,
 | 
								r = n - i;
 | 
				
			||||||
				.width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0);
 | 
								h = (m->w.height - ty - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
 | 
				
			||||||
			ty += c->geom.height;
 | 
								resize(c, (struct wlr_box){.x = m->w.x + mw + m->gappov*oe, .y = m->w.y + ty,
 | 
				
			||||||
 | 
									.width = m->w.width - mw - 2*m->gappov*oe, .height = h}, 0);
 | 
				
			||||||
 | 
								ty += c->geom.height + m->gappih*ie;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		i++;
 | 
							i++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -2345,6 +2493,13 @@ togglefullscreen(const Arg *arg)
 | 
				
			|||||||
		setfullscreen(sel, !sel->isfullscreen);
 | 
							setfullscreen(sel, !sel->isfullscreen);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					togglegaps(const Arg *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						enablegaps = !enablegaps;
 | 
				
			||||||
 | 
						arrange(selmon);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
toggletag(const Arg *arg)
 | 
					toggletag(const Arg *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -2773,3 +2928,193 @@ main(int argc, char *argv[])
 | 
				
			|||||||
usage:
 | 
					usage:
 | 
				
			||||||
	die("Usage: %s [-v] [-s startup command]", argv[0]);
 | 
						die("Usage: %s [-v] [-s startup command]", argv[0]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* dwl_wm_monitor_v1 */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_monitor_handle_release(struct wl_client *client, struct wl_resource *resource)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						wl_resource_destroy(resource);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_monitor_handle_destroy(struct wl_resource *resource)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *mon = wl_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						if (mon) {
 | 
				
			||||||
 | 
							wl_list_remove(&mon->link);
 | 
				
			||||||
 | 
							free(mon);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_printstatus_to(Monitor *m, const DwlWmMonitor *mon)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Client *c, *focused;
 | 
				
			||||||
 | 
						int tagmask, state, numclients, focused_client;
 | 
				
			||||||
 | 
						focused = focustop(m);
 | 
				
			||||||
 | 
						znet_tapesoftware_dwl_wm_monitor_v1_send_selected(mon->resource, m == selmon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (int tag = 0; tag<LENGTH(tags); tag++) {
 | 
				
			||||||
 | 
							numclients = state = 0;
 | 
				
			||||||
 | 
							focused_client = -1;
 | 
				
			||||||
 | 
							tagmask = 1 << tag;
 | 
				
			||||||
 | 
							if ((tagmask & m->tagset[m->seltags]) != 0)
 | 
				
			||||||
 | 
								state = state | ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_ACTIVE;
 | 
				
			||||||
 | 
							wl_list_for_each(c, &clients, link) {
 | 
				
			||||||
 | 
								if (c->mon != m)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								if (!(c->tags & tagmask))
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								if (c == focused)
 | 
				
			||||||
 | 
									focused_client = numclients;
 | 
				
			||||||
 | 
								numclients++;
 | 
				
			||||||
 | 
								if (c->isurgent)
 | 
				
			||||||
 | 
									state = state | ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_URGENT;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							znet_tapesoftware_dwl_wm_monitor_v1_send_tag(mon->resource,
 | 
				
			||||||
 | 
								tag, state, numclients, focused_client);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						znet_tapesoftware_dwl_wm_monitor_v1_send_layout(mon->resource, m->lt[m->sellt] - layouts);
 | 
				
			||||||
 | 
						znet_tapesoftware_dwl_wm_monitor_v1_send_title(mon->resource,
 | 
				
			||||||
 | 
							focused ? client_get_title(focused) : "");
 | 
				
			||||||
 | 
						znet_tapesoftware_dwl_wm_monitor_v1_send_frame(mon->resource);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_printstatus(Monitor *m)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *mon;
 | 
				
			||||||
 | 
						wl_list_for_each(mon, &m->dwl_wm_monitor_link, link) {
 | 
				
			||||||
 | 
							dwl_wm_printstatus_to(m, mon);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_monitor_handle_set_tags(struct wl_client *client, struct wl_resource *resource,
 | 
				
			||||||
 | 
						uint32_t t, uint32_t toggle_tagset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *mon;
 | 
				
			||||||
 | 
						Monitor *m;
 | 
				
			||||||
 | 
						mon = wl_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						if (!mon)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						m = mon->monitor;
 | 
				
			||||||
 | 
						if ((t & TAGMASK) == m->tagset[m->seltags])
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						if (toggle_tagset)
 | 
				
			||||||
 | 
							m->seltags ^= 1;
 | 
				
			||||||
 | 
						if (t & TAGMASK)
 | 
				
			||||||
 | 
							m->tagset[m->seltags] = t & TAGMASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						focusclient(focustop(m), 1);
 | 
				
			||||||
 | 
						arrange(m);
 | 
				
			||||||
 | 
						printstatus();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_monitor_handle_set_layout(struct wl_client *client, struct wl_resource *resource,
 | 
				
			||||||
 | 
						uint32_t layout)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *mon;
 | 
				
			||||||
 | 
						Monitor *m;
 | 
				
			||||||
 | 
						mon = wl_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						if (!mon)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						m = mon->monitor;
 | 
				
			||||||
 | 
						if (layout >= LENGTH(layouts))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						if (layout != m->lt[m->sellt] - layouts)
 | 
				
			||||||
 | 
							m->sellt ^= 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m->lt[m->sellt] = &layouts[layout];
 | 
				
			||||||
 | 
						arrange(m);
 | 
				
			||||||
 | 
						printstatus();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_monitor_handle_set_client_tags(struct wl_client *client, struct wl_resource *resource,
 | 
				
			||||||
 | 
						uint32_t and, uint32_t xor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *mon;
 | 
				
			||||||
 | 
						Client *sel;
 | 
				
			||||||
 | 
						unsigned int newtags;
 | 
				
			||||||
 | 
						mon = wl_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						if (!mon)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						sel = focustop(mon->monitor);
 | 
				
			||||||
 | 
						if (!sel)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						newtags = (sel->tags & and) ^ xor;
 | 
				
			||||||
 | 
						if (newtags) {
 | 
				
			||||||
 | 
							sel->tags = newtags;
 | 
				
			||||||
 | 
							focusclient(focustop(selmon), 1);
 | 
				
			||||||
 | 
							arrange(selmon);
 | 
				
			||||||
 | 
							printstatus();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct znet_tapesoftware_dwl_wm_monitor_v1_interface dwl_wm_monitor_implementation = {
 | 
				
			||||||
 | 
						.release = dwl_wm_monitor_handle_release,
 | 
				
			||||||
 | 
						.set_tags = dwl_wm_monitor_handle_set_tags,
 | 
				
			||||||
 | 
						.set_layout = dwl_wm_monitor_handle_set_layout,
 | 
				
			||||||
 | 
						.set_client_tags = dwl_wm_monitor_handle_set_client_tags,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* dwl_wm_v1 */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_handle_release(struct wl_client *client, struct wl_resource *resource)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						wl_resource_destroy(resource);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_handle_get_monitor(struct wl_client *client, struct wl_resource *resource,
 | 
				
			||||||
 | 
						uint32_t id, struct wl_resource *output)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DwlWmMonitor *dwl_wm_monitor;
 | 
				
			||||||
 | 
						struct wlr_output *wlr_output = wlr_output_from_resource(output);
 | 
				
			||||||
 | 
						struct Monitor *m = wlr_output->data;
 | 
				
			||||||
 | 
						struct wl_resource *dwlOutputResource = wl_resource_create(client,
 | 
				
			||||||
 | 
							&znet_tapesoftware_dwl_wm_monitor_v1_interface, wl_resource_get_version(resource), id);
 | 
				
			||||||
 | 
						if (!resource) {
 | 
				
			||||||
 | 
							wl_client_post_no_memory(client);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dwl_wm_monitor = calloc(1, sizeof(DwlWmMonitor));
 | 
				
			||||||
 | 
						dwl_wm_monitor->resource = dwlOutputResource;
 | 
				
			||||||
 | 
						dwl_wm_monitor->monitor = m;
 | 
				
			||||||
 | 
						wl_resource_set_implementation(dwlOutputResource, &dwl_wm_monitor_implementation,
 | 
				
			||||||
 | 
						dwl_wm_monitor, dwl_wm_monitor_handle_destroy);
 | 
				
			||||||
 | 
						wl_list_insert(&m->dwl_wm_monitor_link, &dwl_wm_monitor->link);
 | 
				
			||||||
 | 
						dwl_wm_printstatus_to(m, dwl_wm_monitor);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_handle_destroy(struct wl_resource *resource)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* no state to destroy */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct znet_tapesoftware_dwl_wm_v1_interface dwl_wm_implementation = {
 | 
				
			||||||
 | 
						.release = dwl_wm_handle_release,
 | 
				
			||||||
 | 
						.get_monitor = dwl_wm_handle_get_monitor,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dwl_wm_bind(struct wl_client *client, void *data,
 | 
				
			||||||
 | 
						uint32_t version, uint32_t id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct wl_resource *resource = wl_resource_create(client,
 | 
				
			||||||
 | 
							&znet_tapesoftware_dwl_wm_v1_interface, version, id);
 | 
				
			||||||
 | 
						if (!resource) {
 | 
				
			||||||
 | 
							wl_client_post_no_memory(client);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_resource_set_implementation(resource, &dwl_wm_implementation, NULL, dwl_wm_handle_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (int i = 0; i < LENGTH(tags); i++)
 | 
				
			||||||
 | 
							znet_tapesoftware_dwl_wm_v1_send_tag(resource, tags[i]);
 | 
				
			||||||
 | 
						for (int i = 0; i < LENGTH(layouts); i++)
 | 
				
			||||||
 | 
							znet_tapesoftware_dwl_wm_v1_send_layout(resource, layouts[i].symbol);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										164
									
								
								protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,164 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<protocol name="net_tapesoftware_dwl_wm_unstable_v1">
 | 
				
			||||||
 | 
					    <copyright>
 | 
				
			||||||
 | 
					        Copyright (c) 2021 Raphael Robatsch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Permission is hereby granted, free of charge, to any person obtaining a
 | 
				
			||||||
 | 
					        copy of this software and associated documentation files (the
 | 
				
			||||||
 | 
					        "Software"), to deal in the Software without restriction, including
 | 
				
			||||||
 | 
					        without limitation the rights to use, copy, modify, merge, publish,
 | 
				
			||||||
 | 
					        distribute, sublicense, and/or sell copies of the Software, and to
 | 
				
			||||||
 | 
					        permit persons to whom the Software is furnished to do so, subject to
 | 
				
			||||||
 | 
					        the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        The above copyright notice and this permission notice (including the
 | 
				
			||||||
 | 
					        next paragraph) shall be included in all copies or substantial portions
 | 
				
			||||||
 | 
					        of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | 
				
			||||||
 | 
					        OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
				
			||||||
 | 
					        MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | 
				
			||||||
 | 
					        IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					        CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 | 
				
			||||||
 | 
					        TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 | 
				
			||||||
 | 
					        SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					    </copyright>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <interface name="znet_tapesoftware_dwl_wm_v1" version="1">
 | 
				
			||||||
 | 
					        <description summary="control the dwl state">
 | 
				
			||||||
 | 
					            This interface is exposed as a global in the wl_registry.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Clients can use this protocol to receive updates of the window manager
 | 
				
			||||||
 | 
					            state (active tags, active layout, and focused window).
 | 
				
			||||||
 | 
					            Clients can also control this state.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            After binding, the client will receive the available tags and layouts
 | 
				
			||||||
 | 
					            with the 'tag' and 'layout' events. These can be used in subsequent
 | 
				
			||||||
 | 
					            dwl_wm_monitor_v1.set_tags/set_layout requests, and to interpret the
 | 
				
			||||||
 | 
					            dwl_wm_monitor_v1.layout/tag events.
 | 
				
			||||||
 | 
					        </description>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="release" type="destructor">
 | 
				
			||||||
 | 
					            <description summary="release dwl_wm">
 | 
				
			||||||
 | 
					                This request indicates that the client will not use the dwl_wm
 | 
				
			||||||
 | 
					                object any more. Objects that have been created through this instance
 | 
				
			||||||
 | 
					                are not affected.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="get_monitor">
 | 
				
			||||||
 | 
					            <description summary="gets a dwl monitor from an output">
 | 
				
			||||||
 | 
					                Gets a dwl monitor for the specified output. The window manager
 | 
				
			||||||
 | 
					                state on the output can be controlled using the monitor.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="id" type="new_id" interface="znet_tapesoftware_dwl_wm_monitor_v1" />
 | 
				
			||||||
 | 
					            <arg name="output" type="object" interface="wl_output" />
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="tag">
 | 
				
			||||||
 | 
					            <description summary="announces the presence of a tag">
 | 
				
			||||||
 | 
					                This event is sent immediately after binding.
 | 
				
			||||||
 | 
					                A roundtrip after binding guarantees that the client has received all tags.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="name" type="string"/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="layout">
 | 
				
			||||||
 | 
					            <description summary="announces the presence of a layout">
 | 
				
			||||||
 | 
					                This event is sent immediately after binding.
 | 
				
			||||||
 | 
					                A roundtrip after binding guarantees that the client has received all layouts.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="name" type="string"/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					    </interface>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <interface name="znet_tapesoftware_dwl_wm_monitor_v1" version="1">
 | 
				
			||||||
 | 
					        <description summary="control one monitor">
 | 
				
			||||||
 | 
					            Observes and controls one monitor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Events are double-buffered: Clients should cache all events and only
 | 
				
			||||||
 | 
					            redraw themselves once the 'frame' event is sent.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Requests are not double-buffered: The compositor will update itself
 | 
				
			||||||
 | 
					            immediately.
 | 
				
			||||||
 | 
					        </description>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <enum name="tag_state">
 | 
				
			||||||
 | 
					            <entry name="none" value="0" summary="no state"/>
 | 
				
			||||||
 | 
					            <entry name="active" value="1" summary="tag is active"/>
 | 
				
			||||||
 | 
					            <entry name="urgent" value="2" summary="tag has at least one urgent client"/>
 | 
				
			||||||
 | 
					        </enum>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="release" type="destructor">
 | 
				
			||||||
 | 
					            <description summary="release dwl_monitor">
 | 
				
			||||||
 | 
					                This request indicates that the client is done with this dwl_monitor.
 | 
				
			||||||
 | 
					                All further requests are ignored.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="selected">
 | 
				
			||||||
 | 
					            <description summary="updates the selected state of the monitor">
 | 
				
			||||||
 | 
					                If 'selected' is nonzero, this monitor is the currently selected one.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="selected" type="uint"/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="tag">
 | 
				
			||||||
 | 
					            <description summary="updates the state of one tag">
 | 
				
			||||||
 | 
					                Announces the update of a tag. num_clients and focused_client can be
 | 
				
			||||||
 | 
					                used to draw client indicators.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="tag" type="uint" summary="index of a tag received by the dwl_wm_v1.tag event." />
 | 
				
			||||||
 | 
					            <arg name="state" type="uint" enum="tag_state"/>
 | 
				
			||||||
 | 
					            <arg name="num_clients" type="uint" summary="number of clients on this tag"/>
 | 
				
			||||||
 | 
					            <arg name="focused_client" type="int" summary="out of num_clients. -1 if there is no focused client"/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="layout">
 | 
				
			||||||
 | 
					            <description summary="updates the selected layout">
 | 
				
			||||||
 | 
					                Announces the update of the selected layout.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="layout" type="uint" summary="index of a layout received by the dwl_wm_v1.layout event."/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="title">
 | 
				
			||||||
 | 
					            <description summary="updates the focused client">
 | 
				
			||||||
 | 
					                Announces the update of the selected client.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="title" type="string"/>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <event name="frame">
 | 
				
			||||||
 | 
					            <description summary="end of status update sequence">
 | 
				
			||||||
 | 
					                Sent after all other events belonging to the status update has been sent.
 | 
				
			||||||
 | 
					                Clients should redraw themselves now.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					        </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="set_tags">
 | 
				
			||||||
 | 
					            <description summary="sets the active tags on this monitor.">
 | 
				
			||||||
 | 
					                Changes are applied immediately.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
 | 
				
			||||||
 | 
					            <arg name="toggle_tagset" type="uint"/>
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="set_client_tags">
 | 
				
			||||||
 | 
					            <description summary="updates the tags of the focused client.">
 | 
				
			||||||
 | 
					                tags are updated as follows:
 | 
				
			||||||
 | 
					                new_tags = (current_tags AND and_tags) XOR xor_tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Changes are applied immediately.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="and_tags" type="uint"/>
 | 
				
			||||||
 | 
					            <arg name="xor_tags" type="uint"/>
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <request name="set_layout">
 | 
				
			||||||
 | 
					            <description summary="sets the active layout on this monitor.">
 | 
				
			||||||
 | 
					                Changes are applied immediately.
 | 
				
			||||||
 | 
					            </description>
 | 
				
			||||||
 | 
					            <arg name="layout" type="uint" summary="index of a layout received by the dwl_wm_v1.layout event."/>
 | 
				
			||||||
 | 
					        </request>
 | 
				
			||||||
 | 
					    </interface>
 | 
				
			||||||
 | 
					</protocol>
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user