Thanks so much for helping to keep the project running while life was crazy!
TOFCZFUYVBVEBHMKVG6G5MKCAEF2QCQ4GKMKGQUSJRLGLDZEJF4QC
OHAXZDUSN77TGUZFMNO6V4744KH3HDP7SCXVXYEM7EK35KMHOLLAC
QL4B4MMAVQZ52JOKUTRFZLCTSZLYUJLRYSDSBRZBZ5UNPQ7TOQRQC
V3FJE2F2RDV6KH6EB7CCYRKQC726BIEH27DCTZKHHAYSQPUZU6LQC
3YASTKW6ARYFEDXJU2OH2O26NLG24ZKGELZNCRCPSMQ6KJ63OBUQC
DYFVLEF66ARTPLPSVB3CNZFR3CMJPE2HZXGYI2A4BWHPUFZBLM5QC
QRRSKK2KU2ELH5E6ZGDCCWJRXG6RB5EYFHD324I6LKWADGG56M6QC
NZZZBRGVI57UXK257IAY7ZPC5DOTWP2HGFZLNS543R2EH5FDHNKQC
ZGRRKB6DZARJGDEE2QL46TBMF6HO37VCQ26SEHMAWJ6SM7POXULAC
GVPRPAVLH42RKRJO4AVXWTVCQVRRXL6OQOUVYB3ZHKC3NU5MZLFQC
VO3MWB6Z442HXCPJQAIFUKJGKNM5HKSZMELZTOBHDPXSVMZONWMQC
ZTOYJ4G4UQ665FKUH376KJOOO5GXHI62SWVXNZS7X6F2Y4GG2FSQC
INFGFQAZC2P57M7B7G32YWZOAMUNVDB4FUMRY6GTQ6ANSMSPLIHAC
F7JWVNZNHDF6QWHQDPFNIBNL3HARWDYF6BCW4IK7JLQRGVJPSNJQC
RV6O6UDDBQMQQMSEHCS2T7SGUIG7UCNL6CEY37DJDRNUUURRDELQC
IZ2KIIKXVGAUR2NRYJMZCTIXUCPWCRQFDXDAE2SAW6NFKINXRPWQC
O2GTCFVDCWU4TI3PJDMOWLUINIOCCQDOQAGZR476NSVLTUINGJYQC
QABPNBR63OM7GUPREDFVZEQH3SE55ZGJLSOI7TPFA2KJNJSQMZLAC
SCGPO3IMIRLM6JAGVBLYO6MCN24HTDRMOTBZ36RRDO3R65BZJFAQC
QDFBAKHJXFFUKZASI36Y25WMR7MNUQOAPYIRIRL6WGIWV45BMSNAC
ZF4XKSZDOZ72J3I2CBN3M4MXTATJYKBUFZKBS4DDVHCACWUAZ5ZQC
RM7J7D2HLZX66BJZW5O6BLUIDECLCCPQIZH3PXLQOZC67YCBSY6QC
S5I7HVUVLNMAV64UX4AW4OWIB7UTQRGQG6TXBR7ZMZXXLCTVGAJAC
JRXMQ2GKMY3ZPLMON4D7OPHU62B4A7PV5FXLYBQMJRNCLVKTUALQC
MRPV4XBEVZNHLWBK3BMNXRPOBWGKX44RVT5XHEB4XP5VANMRWEMQC
TXT5WDVXWSX6H7A5IDFPAR42VB6RJD2FKHUR5WW4UWCRJSQ4MPIAC
7B74AT3BXYB7PVW4F6SGQNPMHOU5TEV5TZ54CG6VSQI46XSEKWXQC
Q63IYM3JPFW56MOE5PFL7U4AJ6BHTRSV7NHO5N3ILDA43MNQ4PZQC
DACFL7ZVMNMIL75ZQE5BIXFCRYOWYISZ42OKHOTD4AD5GY63AUWAC
LQPHYO7IIMLXHUD5IK657BO4BE3SGT5HYDRJDU5OFDF5YUXKIRTAC
4QUF4MKRSB5LYYS5FSYTCDSIEMYIERI2BQZLRGJ3GIGVYCPJVEPAC
3VV4BEF4XL3UURJHRQ3MEC3E3IIE6KMNKY7DHQTMQ4QBACKIKLMQC
2OQAWQSW5DDGUFJ4YWT5VXHZMRWQPDKZFO3JUPO4SV6JQHWT6HRAC
PLJJLNS7E2UXW2YARGBSV6IHZEBGL5EW354IMMHPDATY5DQD77DAC
USRQOWVNGWY42YR6YQ4XGZIMWMP7UR65JMKHEPBQTHFX67AJGWCQC
6OZ3VUODEBOTXODIJQU5TKXCDEJOWTYHCMCDB4MJ2X3T6EG374SAC
J6OSBEBQXZR5JZ5TOCCUPELBPUVEQULGCXURXLPY7WFYTDEQOU2AC
PMRSYJRYQAXZ3OEDD7ANMXTECMT2DNJEC3XQABRNA63SAOUZWA3AC
VCNLR5X75OAXVKPZQHF5RUZ7BONBUC6RPGO2NZEUD3FZ7TEVL66AC
MO5ORR7VSER3YUNO77DZJVKGOVYC2KNDCSC72J4NF7JYOHHTLRQAC
CD2JEM3MH5BXN7ADZAWLJFTRZG7PMDCKISDNJEO472PIBEJHBH2AC
SXR2JTOL5ZWTFNSCWS3D3W6QP7BVS53AF2WXBAWEE4K3CUWVHCTAC
D425ND7AT3F7QJ3CCSESMVDOC3J5C5P32M5SJDBHECZJXLHNQ2FAC
XGXZF5T7UFWJQES25XVBJZ4BN53SJ3SXZH3YUB2JUYVPN2PDRPJAC
34ZVZ4LWAOYLVXC2VO5QZLJHCH4ZKLDJUPILGNFFEPJ6BLTAN3HAC
NLOBELMSKHUSKSMPZ2QSDVIOJRGWV7HNXNIKZ55TMUCH7DI73TAAC
6XZIQSMIVP2GZ5S3UCKEVNDSLTHSQEVSXLV4UIFF3G3SRCGJPXYAC
IIWDZCVWWDAJITIXQXCFIAF7Z46DTFV2FYCUYMS4P7JMP34A6BUQC
VB73LHGDVI7ZDLCT35D7TICLZAAVEFSDIAJXBJTT5HYMMNMFHJKQC
IIKPVF4PWEWCLOY4656OTCFZJ6KUMBGCHZW6A76AJBI2WJWYROGAC
E7UO6NRGXFDMBU3BSJYRDNOA3Y7VHD7NWPHI5PHCPHQF6ZNOPZLQC
HWS332I73ETH3YIIOCQO7WB7VPQICME6GGXFJ7EUWDH5O3KA27QQC
7L3TU7JVWPBPHN7WF4TJ263BZ6BC3AYRRW6PULFUP5JZUGWWNUSAC
RJ533ETG67DQKGRTX2A6N2MFI76GTSU3KFGFAZGCVD33TT3SC67AC
WRXZXFDNBE3RXUV7VRWD54QHRWMSVHPKE4NKDOIFQLD6WZ73MQPAC
FCEQONUYK6M5ZEWKBAPW6F64EURYKHBH4YIM4HVBSBKFRDD7YHRQC
F72VJF4KJZEYZEYGAGKCWPMEQGPKS7T5PEEJPJKZO6ZG246TTLAQC
TBCINKTPRLMPUWXGGPFZLJQO3KYXCGIQFE5IMHNLKNBO4TWJHM2AC
SCBBNYN2ZEI2UBCW5C5QXQLLQGEWY4DWM2UHGTRZ7B653AONDQKAC
VJ6T4L76LPIIV25GCFWUSFZXEFIBQ2EMRU2WHF3YFJHXSAMHNO5AC
UCSTVE5NIAIQ3NJL5YLDFDKDPOCJS6NMAGABSWG67RGCPH47JQEQC
7HUMD4TAMWWBQDOZYCMWQXR66G3IU5WU3IVKTPCSMETSB6VREWTAC
NBKUNVS3OI6G2JXUF2OA2NMA7EKDCHS3O2RKOZAY66HCHWJ4T5KAC
XXOC2AY53ZWML6TVPKX6BHGKZJNRET4IWRSTCVMJQJZMK3MFD3TQC
VPJQMU6GLXQ34RRPU7ER6CC3UDB2OM3FQWMEPK33LG5LGHNBZTFQC
ZOOCZQBGZ4PCOU54EPPUPWNOIFWCM5RMZ4EFL2WFR7LFJTAMHZGAC
SP45PRAMJKF52GEK4TQU6PQQ3AY3KRXCUDGQNUN65UOBA4R6VL6QC
QQGHHW5XN2GWROQUW6BRS3W5J5W6ANKEVCP3EC7RTXAA3KCA4GYAC
625W47O7SIM55H5CFM7JKX2EN4EIP2TXFVFO7URBZIXQNMX4LBDAC
CFIOQQFW4UKNDR2FDDHPZN5DBTMELTGUVZDNEZA6OF7WVONVEZJQC
OFMBPPFARLKEKUP4ENSHZSIFJOFMO65UZOYO77N4YCXJ2S6PVTMQC
MIZBQX6SKECIVNNGBF3LCR3IHXQVWQ5BJURMRSBNEVEUWFBH3MTQC
6TCDMCXLC4RNNQI6AEYYA6RZNHG3V2U6YDGXJOCU27F5TNKN26LQC
JJXQTKU5WR74D7XW3JTN4Y3JSYDQTZ54GTD4F5XHT5RR2UWR72AAC
WT554G3D2X4YAEDOCISXRNXQNNMQZVHIUANSJMT2CWRL756ZWZTAC
34QBMVT4HUWX4NS7QFHDTWS7ICNX25BECPI2K33AZV7VXI6NOCGQC
GGLHB6M466D32B57EBNJMZRGNJB2DAKCMHNUKTN25TPZ4LV2GNYQC
CFCIJBASG4L5JQUZ57IKRUV45CFAS65CRWGURGI5UHVGEKAJYOUQC
3RU5REBOOAYYK7CJKRFPTSQ7QKD7CPIM6C3I6G6NCE47IRMTRIPAC
RDEV6AMJ4SLUNXMGVNH7OFA2D2DCV7QZFQ4MJFPWXE2T2PQXX5TAC
AILEOG6JDK6PKFTW6JIDQ5GGSKEZL3DBLHLUHF7KR262QE2FZQFQC
O3TIITAWQBJXO45JGUYX2N4JITKH4SEHV62AN5OG6GXQHDXVCR7QC
KP7Q7NW257U3YLYPR3TVNTN4YZCBCDLON5NDDZ425CMVJMCAQBCQC
TZ6AAEIJVIR4Y2QHKWVWVASJE5CT335GKODVUSGB4IWDJ56TUOGQC
W32YIHMVPAREXUADJOAX45B6CTXZY42EE77RDDZYNJFEE2HLQ3HAC
I2UG6WQKU6GNMQXFZXVONILKQFYXI7AIGK44KCMDWCQETA3UZW2AC
VYZMMYEO3CEHLATYEHS7G6XBGEVOWDMAXHMHMINACSNF75TH72UAC
22AOV53ZPZKPZPJGHYOLNJYTUNQEB55NXSDW3HNFXD4IX4KXGHTAC
W2IIP5B2G4PR6LRN5C3WYIMROFJV7YIAT5NBMCQTYCEMOZAULMVQC
S7RXJJZG4IEIVLPHEWFT5M2T3SRRO5US5SYBPXSYSWJJLXAKNNPAC
RS7FD3UJQ7HVHZ6I5TW476LSXRHSQS4BZMN6MJDMDQ42JH2MOE6QC
6LVZRZGDURMWBUBXHFGV4HGB7L5M2FKCYGJCAU3X2PK74VJQ6RCAC
O5JVMDEEKP334BAYMJ6HHXROW4X4WC24JHCYZTKJRQE5UGYXV7YQC
2QL2H4REDZT46FI3LQ4RYEMQYZBNBK3IC3KH3XERAJU3NCZWMNYQC
65GPTMYLVOQPVAKNBCN5RHHZEL7USZYSJ4VJQO7LYBCS7BZM7BYAC
SHN6Q2EL3A4WO6LD252QC7CVJUPBRWY3LYI6NONASWYJ2KOVVCLAC
IM5D7DQINVNZPB6MV4Q5TWZU23YM7QMWNCCZNTF4SBBEESV3S2PAC
SJYYGTAHOXUL5VHGVPIZKIYQ3JCXQHARIECVKKPBFBSMGIOSDA7AC
46MQCVOAPLYAM3HMYFA7E2B6IXSXO2Z57JNBORUBRL6P2GXADSPQC
DZARK42IRA3GGM2HTCVSMT3IXJATCQCKXPWJKS6CZ23FWRH34YDAC
ZJSS4UDVHV6NYWHSI2U4CHCP46CKN3S5XJ3LL2KT4V6FFYHD5D2QC
ZIXAFAJJEKSFECJJW57MQ2Z666IZSJXU5FVAQ2JLG34BEJIV322AC
QIIHRSY26Q3QJQUIDTU4M4C5NGAW3NGDOKT5UVZBD25A6UVPQDPQC
RTF6FIROMZBLFDIGA66N3CZXVXKYJWI7TB5RM3B5X4BU5AFIAEMAC
P3BVYOM6YV7M33KYMI5XNLZ6F44BBAP3I6NXPNTTCUAAPVPJ3PVQC
WH2QXAEHJ3UWIAS5YCRYXCTROAX4SNC3UESM56HUMM3UGUUAAZQAC
LRGGX34PR2PQEBW6U465VYOGIYOPD365PB444JGR6R3H7E524CCQC
XHVBTXWGXGOVHLFX57RQI54NP2OY3BYI42K4ZODZDHXVZ2VF5YTQC
CJYJF7B4EVOQ52VLDGPXTJSYZEBXJO4S4A5N2DM4IWI6UQ2BZTVQC
OPA33YRIB5AVFBKVANDGJF4IO7ZPPSIAJ75RULIM46SI2YX54ODAC
VU5S7GWUAARNDZWDB6XGP5SHY43DRWPIDE2YQVCZWXI4MBBLDOEAC
QD3NDIJ4CRDN6QGCHALU2UG5DPMAYGE4MSGJPLYVXKLZNCV2WGIAC
6ZKVISYIRGGLYDMIHGXDCHV6N6WYJP2DK3CRJL4AMCZY65OSEYDAC
ECOJQLQTN3LTJT7DRH7MXAJMZ5A7UOIMKLTNZFODOGE5B2U7EDVAC
FJIYVCRICFJ7T52B2SLJOGFFX6AEYZNOSM3FJZ2B2ETFFYX2QXNAC
3EKVUJXI7KI4ZCILWWFJ6UNBYAHBS42TZ3PIPXOEXQ24KEFFA72QC
US4HQXVWZEPU6HZ7Q733QB5QXOD32HJBYHUAQTT3DZGVXBMPNNOAC
EUJMBPB6W6ADQS4ZFMODC4S5WWH6SZIVM5OW46Z6CPMPDOL4HM7QC
GX2PWWI3Y7BOEOUIXW5NS4SYX4SXRWUC4TZ4RALA3AVCPX23CUEAC
TOHEQJ4RLXZXOUGTQN2OCPCIKSVNGVMSUC4UB3KGCLZV4JUULD2QC
R2EEZTZFT5S4KDNLI6RTD5X4H6BYJCL6EF24I33DSLUI6E7FBYRQC
4WVZ2LAGAIQ2EROHNA4T5PWQEEIPJRTA3CBHGAO55NACCUGLKEZQC
4VNCBQXHKJMDO7A4KJCFLLU6ORI6ZYOEGJOQWBLGXKF67I3P7V6QC
WIS5F3QY5CUHYUK723DE2JWDB6AWZEWSQED67M2HDY5B7UAE6NVQC
6V3JKJZJ7KBS5I3Q266ZCRJYVO56ZQKLJL4EOHN6XC222CZFXCDQC
6HOXS3C6YQT4KLOHDMK4DVQ3EBGFBLHT2QNJY7Z6BVHM7ZPI6COAC
4E4BAOHMWKREJPN35VYZD54WX7XZWN7XBYGJO2IHSUFDPGIDZCYAC
DFTXJKCO3JDLQDWKBGO7SISX7BFHYZL3GXSIT2GEEZBV4ND33YPQC
2ZRKX4A24W4WNSLJNPKP3FWB3Y3UCYLWWESTC65P45BQFSJKS4PQC
SFBYBWC35S4IMTSC3ULSSAJVBWKUMZMKSF5RYODD3ARWD645RIUAC
N64TMMPDOHSXHEAX4JTOA2TTGLHOTTL52MMGYIMZP2JDBH6WW7NAC
ZPSXARCBIT2LZ4PLNMKXHIEEWG3XLVXXISIZDYNGFACDI5I256NQC
if (tap_to_click && libinput_device_config_tap_get_finger_count(libinput_device))
libinput_device_config_tap_set_enabled(libinput_device, LIBINPUT_CONFIG_TAP_ENABLED);
if (libinput_device_config_scroll_has_natural_scroll(libinput_device))
libinput_device_config_scroll_set_natural_scroll_enabled(libinput_device, natural_scrolling);
}
}
void
fullscreennotify(struct wl_listener *listener, void *data)
{
Client *c = wl_container_of(listener, c, fullscreen);
setfullscreen(c, !c->isfullscreen);
}
}
void
setfullscreen(Client *c, bool fullscreen)
{
c->isfullscreen = fullscreen;
c->bw = (1 - fullscreen) * borderpx;
#ifdef XWAYLAND
if (c->type == X11Managed)
wlr_xwayland_surface_set_fullscreen(c->surface.xwayland, fullscreen);
else
#endif
wlr_xdg_toplevel_set_fullscreen(c->surface.xdg, fullscreen);
// restore previous size instead of arrange to work with floating windows
if (fullscreen) {
c->oldx = c->geom.x;
c->oldy = c->geom.y;
c->oldheight = c->geom.height;
c->oldwidth = c->geom.width;
resize(c, c->mon->m.x, c->mon->m.y,
c->mon->m.width, c->mon->m.height, false);
} else {
resize(c, c->oldx, c->oldy, c->oldwidth, c->oldheight, false);
for (i = 0; i < nsyms; i++)
if (c->isfullscreen) {
resize(c, c->mon->m.x, c->mon->m.y, c->mon->m.width, c->mon->m.height, false);
return;
}
resize(c, m->w.x, m->w.y, m->w.width, m->w.height, false);
c->fullscreen.notify = fullscreennotify;
wl_signal_add(&xwayland_surface->events.request_fullscreen, &c->fullscreen);
c->isfullscreen = false;
if (c->isfullscreen) {
resize(c, c->mon->m.x, c->mon->m.y,
c->mon->m.width, c->mon->m.height, false);
return;
}
const float *color = (c == sel) ? focuscolor : bordercolor;
for (int i = 0; i < 4; i++) {
int w = surface->current.width;
int h = surface->current.height;
struct wlr_box *borders = (struct wlr_box[4]) {
wlr_render_rect(renderer, &borders[i], color,
dwl is a work in progress, and it has not yet reached its feature goals in a number of ways:
- A window's texture is scaled for its "home" monitor only (noticeable when window sits across a monitor boundary)
- Urgent/attention/focus-request ([not yet supported](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/9) by xdg-shell protocol)
- Damage tracking
Many thanks to suckless.org and the dwm developers and community for the inspiration, and to Devin J. Pohly for creating dwl.
Many thanks to suckless.org and the dwm developers and community for the inspiration, and to the various contributors to the project, including:
- Alexander Courtis for the XWayland implementation
- Guido Cella for the layer-shell protocol implementation and for helping to keep the project running