Compare commits

..

322 Commits

Author SHA1 Message Date
Hiltjo Posthuma a786211d6c Revert "Improve speed of drw_text when provided with large strings"
This reverts commit 716233534b.

It causes issues with truncation of characters when the text does not fit and
so on.  The patch should be reworked and properly tested.
5 years ago
Miles Alan 716233534b Improve speed of drw_text when provided with large strings
Calculates len & ew in drw_font_getexts loop by incrementing instead of
decrementing; as such avoids proportional increase in time spent in loop
based on provided strings size.
5 years ago
Quentin Rameau 138b405f0c Add a configuration option for fullscreen locking
Some people are annoyed to have this new behaviour forced for some
application which use fake fullscreen.
5 years ago
Chris Down 67d76bdc68 Do not allow focus to drift from fullscreen client via focusstack()
It generally doesn't make much sense to allow focusstack() to navigate
away from the selected fullscreen client, as you can't even see which
client you're selecting behind it.

I have had this up for a while on the wiki as a separate patch[0], but
it seems reasonable to avoid this behaviour in dwm mainline, since I'm
struggling to think of any reason to navigate away from a fullscreen
client other than a mistake.

0: https://dwm.suckless.org/patches/alwaysfullscreen/
5 years ago
Ian Remmler 61bb8b2241 Fix x coordinate calculation in buttonpress. 6 years ago
Hiltjo Posthuma bb2e7222ba dwm.1: fix wrong text in man page 6 years ago
Alex Flierl f04cac6d6e Fix memory leaks in drw
The function drw_fontset_free in drw.c was never called.
6 years ago
bakkeby f09418bbb6 dwm crashes when opening 50+ clients (tile layout)
Many users new to dwm find themselves caught out by being kicked out to the login manager (dwm crashing) when they open 50+ clients for demonstration purposes. The number of clients reported varies depending on the resolution of the monitor.

The cause of this is due to how the default tile layout calculates the height of the next client based on the position of the previous client. Because clients have a minimum size the (ty) position can exceed that of the window height, resulting in (m->wh - ty) becoming negative. The negative height stored as an unsigned int results in a very large height ultimately resulting in dwm crashing.

This patch adds safeguards to prevent the ty and my positions from exceeding that of the window height.
6 years ago
Chris Down ed3ab6b4fc drawbar: Don't shadow sw global
This jarred me a bit while reading the code, since "sw" usually refers
to the global screen geometry, but in drawbar() only it refers to
text-related geometry. Renaming it makes it more obvious that these are
not related.
6 years ago
Chris Down f087d20e6e getatomprop: Add forward declaration
No functional changes, but for every other function we have a forward
declaration here. getatomprop should be no exception.
6 years ago
Chris Down a8e9513783 setmfact: Unify bounds for compile-time and runtime mfact
There are two places that mfact can be set:

- In the mfact global, which is defined at compile time and passed
  into m->mfact during monitor setup. No bounds checks are performed,
  but the comment alongside it says that valid values are [0.05..0.95]:

      static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */

- By setmfact, which adjusts m->mfact at runtime. It also does some
  minimum and maximum bounds checks, allowing [0.1..0.9]. Values outside
  of that range are ignored, and mfact is not adjusted.

These different thresholds mean that one cannot setmfact 0.95 or 0.05,
despite the comment above that lists the legal range for mfact.

Clarify this by enforcing the same bounds in setmfact at runtime as
those listed for mfact at compile time.
6 years ago
Hiltjo Posthuma c82db690cc config.mk: fix POSIX_C_SOURCE macro for feature test for snprintf()
The feature test was incorrect:
_POSIX_C_SOURCE=2

"The value 2 or greater additionally exposes definitions for POSIX.2-1992."
http://man7.org/linux/man-pages/man7/feature_test_macros.7.html

A higher value is needed (atleast 1995):
https://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html

FreeBSD feature test macro:
on
https://github.com/freebsd/freebsd/blob/master/include/stdio.h line 297

This was already fixed in dmenu.

This fixes a warning on FreeBSD, reported by Plasmoduck on IRC, thanks.
6 years ago
Anselm R Garbe cb3f58ad06 Prepare 6.2 release. 7 years ago
Hiltjo Posthuma b69c870a30 pledge: add rpath promise for the ugly Xft font fallback 8 years ago
Hiltjo Posthuma e78b4a9207 Makefile: just show the compiler output
Don't be fancy and just show the actual output so debugging is simpler.
8 years ago
Klemens Nanni 3cd4023fb3 Do not strip at link stage
Building with debug symbols is worthless unless LDFLAGS are manually
adjusted as well.
8 years ago
Klemens Nanni f40f86fa87 Pledge on OpenBSD 8 years ago
Hiltjo Posthuma c3a2e016bb config.def.h: ClkTagBar missing from comment
by Christopher Drelich <cd@cdrakka.com>

Patch was mangled on the ML, also adjusted the order to be the same as
the enum in dwm.c
8 years ago
Christopher Drelich c8e9479186 Function declarations in correct order.
In dwm.c function declarations are in alphabetical order except for
updategeom(). There doesn't appear to be any reason for this, so this
patch corrects that, and now all function declarations are in
alphabetical order.
8 years ago
Hiltjo Posthuma 10dfa65860 remove old TODO and BUGS entries
the bug in the dwm man page is an (ancient) Java issue.

Thanks David and quinq for the patches and feedback!
8 years ago
Hiltjo Posthuma 3bd8466e93 update README: remove mentioning the old dextra repo
Thanks Christopher Drelich <cd@cdrakka.com>
8 years ago
Christopher Drelich 76c8c16d79 All functions in alphabetical order except for this one. 8 years ago
Christopher Drelich 3cb34830eb ColBorder has been moved to the enum with ColFg and ColBg. 8 years ago
Hiltjo Posthuma db2236001c dont NUL terminate _NET_WM_NAME
Reported by Kernc, thanks!

"This makes a particular program that uses libwnck [1] fail after:

    Wnck-WARNING **: Property _NET_WM_NAME contained invalid UTF-8

in this code [2] because the returned string contains a '\0' and the
documentation for g_utf8_validate() [3] explicitly states that when
string length is provided, no nul bytes are allowed."

It is not entirely clear it is incorrect, other WM's seem to not
NUL terminate it either though.
8 years ago
Hiltjo Posthuma 3756f7f6b8 sync dmenu drw.{c,h} code: use Clr* (was Scm) 8 years ago
Hiltjo Posthuma 99f78fa553 gettextprop: check result of XGetTextProperty (undefined behaviour for XFree) 8 years ago
Omar Sandoval a9b6a312a7 Set class name on status bar
This is useful for configuring compositors to ignore the status bar
window.
8 years ago
Daniel Cousens 6aa8e37efe simplify isfixed conditions 8 years ago
Anselm R Garbe ceac8c91ff yet another cleanup
The previous patches introduced some unclean space-based indentation
patterns. This patch fixes them.
9 years ago
Markus Teich 5b238c8dab Don't restrict snap in mousemove
This also fixes a bug where client windows only switch to floating mode when the
mouse is dragged in one specific direction.
9 years ago
Markus Teich 022d076054 Button passthrough when client is not focused
Before this change it is not possible to press a button in a client on the first
click if the client is not yet focused. The first click on the button would
only focus the client and a second click on the button is needed to activate it.
This situation can occur when moving the mouse over a client (therefore focusing
it) and then moving the focus to another client with keyboard shortcuts.

After this commit the behavior is fixed and button presses on unfocused clients
are passed to the client correctly.
9 years ago
Markus Teich 2952b68db8 cleanup
- unify multi-line expression alignment style.
- unify multi-line function call alignment style.
- simplify client moving on monitor count decrease.
- clarify comment for focusin().
- remove old confusing comment about input focus fix in focusmon(). The
  explanation is already in the old commit message, so no need to keep it in the
  code.
- remove old comment describing even older state of the code in focus().
- unify comment style.
- break up some long lines.
- fix some typos and grammar.
9 years ago
Anselm R Garbe bb3bd6fec3 applied Markus' tagset purge of alternative view on _NET_ACTIVE_WINDOW event 9 years ago
Anselm R Garbe e63bf22948 applied Ivan Delalande's NET_SUPPORTING_WM_CHECK patch for gtk3 compatibility 9 years ago
Anselm R Garbe 5376947571 applied Ian Remmler's man page adjustment suggestions 9 years ago
Anselm R Garbe 975c898376 applied Markus' decouple color-scheme patch 9 years ago
Anselm R Garbe a137a86a23 applied Markus' clarify status text padding patch 9 years ago
Quentin Rameau 839c7f6939 LICENSE: update people 9 years ago
Quentin Rameau 7a59cd1457 dwm.1: add keybinding for spawning dmenu 9 years ago
Hiltjo Posthuma 24849acada die() on calloc failure
thanks Markus Teich and David!
9 years ago
Hiltjo Posthuma ab9571bbc5 die() consistency: always add newline 10 years ago
Hiltjo Posthuma 56a31dc4a7 config.def.h: style improvement, use color Scheme enum 10 years ago
Markus Teich 7af4d439bd import new drw from libsl and minor fixes.
- better scaling for occupied tag squares.
- draw statusline first to omitt some complicated calculations.
10 years ago
Eric Pruitt cd2d7549b3 Configure geometry before applying rules
Configuring geometry before applying rules makes it possible to have
more complex constraints in applyrules that depend on the initial window
dimensions and location.
10 years ago
Hiltjo Posthuma 3465bed290 fix fullscreen clients not resized on X display resolution change
patch provided by Bert Münnich <ber.t_AT_posteo.de>, thanks!
10 years ago
Quentin Rameau 4ec3a673ff Shut up glibc about _BSD_SOURCE being deprecated 10 years ago
Hiltjo Posthuma 5ed9c48196 code-style consistency 10 years ago
Hiltjo Posthuma 3c91283ede unboolification 10 years ago
Hiltjo Posthuma e941181f46 sort include + whitespace fix 10 years ago
Hiltjo Posthuma 43e82adf0d separate program-specific c99 bool and X11
True, False are X11-specific (int), make sure to use c99 stdbool for
program-specific things.
10 years ago
Hiltjo Posthuma 42cf1c7d8f Makefile: package all files with make dist 10 years ago
Quentin Rameau dce4fb3737 setfullscreen: don't process the property twice
Some clients try to set _NET_WM_STATE_FULLSCREEN even when the window is
already in fullscreen.
For example, c->oldstate was set two times in a raw and window would
then always be floating.
We must check that it's not the case before processing it.
(original patch modified with suggestion from Markus Teich
<markus.teich@stusta.mhn.de>)
10 years ago
Hiltjo Posthuma 646b351cc7 sync updated drw code from dmenu
important:
- drw_rect: didn't use w and h, change the dwm code accordingly.
- drw_text: text is NULL is not allowed, use drw_rect().
10 years ago
Hiltjo Posthuma e3b7e1d620 dwm: use ecalloc, prevent theoretical overflow 10 years ago
Hiltjo Posthuma 04db03a4e6 cleanup, dont use c++ style comments
- signal: print error string.
- die: start message with lower-case (consistency).
- bump version to 2015.
10 years ago
Hiltjo Posthuma 4a4817b3aa dwm: cleanup: free schemes and cursors as array 10 years ago
Hiltjo Posthuma 7e1182ce55 config.h: use common default font, pass Xft font name to dmenu
dmenu uses Xft now (soon to be released).
10 years ago
Hiltjo Posthuma 40529e1469 config.mk: add $FREETYPELIBS and $FREETYPEINC, simpler to override (ports and *BSDs) 10 years ago
Eric Pruitt 14343e69cc Add Xft and follback-fonts support to graphics lib 11 years ago
Anselm R Garbe 35db6d8afc removed .hgtags, thanks Dimitris for spotting 11 years ago
Anselm R Garbe 3d1090ba89 applied Hiltjo's resize/move limitation
"Limit the amount of updates when resizing or moving a window in floating
mode to 60 times per second. This makes resizing and moving alot smoother
and by limiting it it also uses alot less resources on my machine.
12 years ago
Anselm R Garbe 18248ebf4b same as before with dwm.c as well 12 years ago
Anselm R Garbe b468873b2b updated copyright notice in LICENSE file 12 years ago
Anselm R Garbe cdec9782a1 applied Lukas' focus suggestion at startup, thanks 13 years ago
Anselm R Garbe 6af273771c applied improved version of Martti Kühne's dmenu/multi monitor approach from dwm, no dmenuspawn required 13 years ago
Anselm R Garbe 4fb31e0896 do not take our font declaration as default for st 13 years ago
Anselm R Garbe b800a1d136 applied Jochen's drw_text patch, thanks 13 years ago
Anselm R Garbe 33a74489f0 applied Julian's enum approach,
however renamed theme into scheme resp. Theme into ClrScheme
13 years ago
Anselm R Garbe 5364697914 finished libsl/drw integration 13 years ago
Anselm R Garbe 7edc596311 include font argument for st by default 13 years ago
Anselm R Garbe 68b400e95d added st to SEE ALSO section 13 years ago
Anselm R Garbe 656882d76f use st as default terminal from now on 13 years ago
Anselm R Garbe 1479e76f01 shut up about deprecated Xlib functions 13 years ago
Anselm R Garbe f2544a3318 renamed draw into drw 13 years ago
Anselm R Garbe aafeaf7317 continued with draw.c and draw.h implementation, now the integration begins 13 years ago
Anselm R Garbe f21d46ea7d continued with draw.c abstraction, also started util.{h,c} implementation, that will be used by draw.c as well 13 years ago
anselm@garbe.us c0ba635c50 removed DDC, all is Draw-dependent 13 years ago
anselm@garbe.us 0a673ad7a3 continued, distinction of Draw and DDC is bad, needs to be merged 13 years ago
anselm@garbe.us 3aabc08ede reverting the xkb dependency, I don't care if this function is deprecated, it seems it breaks other stuff instead. 13 years ago
anselm@garbe.us d456617f0e basic draw.c structure 13 years ago
anselm@garbe.us 61fe833a06 reverting to plain X11 fonts in order to implement draw.c default 13 years ago
anselm@garbe.us 917e281634 removed obsolete bugs from BUGS file 13 years ago
anselm@garbe.us 31451c3ad3 compile fix 13 years ago
anselm@garbe.us 344f35f9f5 applied Neil Klopfstein's patch, slightly modified 13 years ago
anselm@garbe.us 87adcd263b starting with initial draw.h 13 years ago
anselm@garbe.us fd3c19bd55 incorporating Xft instead of cairo, cairo provides far too many options 13 years ago
anselm@garbe.us 1bdb393f81 keep 6.1 intact 14 years ago
anselm@garbe.us 940feed314 reverted to old updategeom() after several complains, we need to optimize the old way 14 years ago
anselm@garbe.us 606b44179d applied James Turner's XkbKeycodeToKeysym patch, thanks 14 years ago
anselm@garbe.us 20f6917910 drastically changed updategeom() handling, see comment in updategeom() for details 14 years ago
anselm@garbe.us 820cbb3545 reversed Andreas Amann's fullscreen fix with the approach proposed by Gary Langshaw:
- idea is not supporting movemouse/resizemouse/togglefloating for fullscreen windows
- as fullscreen windows are broken anyways, they should only be adjusted by their own means
14 years ago
anselm@garbe.us 90f3238301 added kludge to fix some input focus misbehavior in gedit and anjuta, thanks Martti Kühne 14 years ago
anselm@garbe.us 3bfc43c3d0 applied Andreas Amanns' netwm_client_list patch, but with some indentation fixes 14 years ago
anselm@garbe.us c1128417a9 applied Andreas Amann's netwm_active_window patch, thx 14 years ago
anselm@garbe.us 1b62f8fa58 applied Andreas Amann fullscreen fix, some minor modifications 14 years ago
Connor Lane Smith 54c3044dec unfocus on slow sloppy monitor focus 14 years ago
anselm@garbe.us 51336aa4a3 applied Eckehard Berns fix fix, sorry that this took so long 14 years ago
anselm@garbe.us c4b6ac812e added 20h's clarification 14 years ago
anselm@garbe.us 873bcb97a9 applied Eckehard Berns barwin leak fix and his suggestion to deal with restack() -- the latter aspect needs further investigation. 14 years ago
anselm@garbe.us 907db0a851 config.mk cleanup 14 years ago
anselm@garbe.us 4e7c469862 Added tag 6.0 for changeset ec4baab78314 14 years ago
anselm@garbe.us 26445a0dc9 bump version to 6.0 14 years ago
Connor Lane Smith b5068e32e9 add sloppy monitor focus 14 years ago
Connor Lane Smith f099d2d5b5 new default colour scheme 14 years ago
Connor Lane Smith 80a9da555e calculate window/monitor intersection 14 years ago
Connor Lane Smith d21026f0a1 honour fullscreen hint on map 14 years ago
anselm@garbe.us e5a1e77351 testing Brians multiscreen issue fix 14 years ago
Christoph Lohmann 8262d9e663 make ewmh dialog windows float 14 years ago
Connor Lane Smith 90af1ced3c allow 0 nmaster 14 years ago
Connor Lane Smith 5ccd42f807 fix big-border corner case 14 years ago
garbeam@gmail.com 1586b7a02d added keyrelease remark to TODO 14 years ago
Connor Lane Smith 2420071f4c improve tile spacing 14 years ago
Connor Lane Smith 04c26574b8 add nmaster binds to manpage 14 years ago
Connor Lane Smith b1a28ae1da apply nmaster patch 14 years ago
Connor Lane Smith f68a01cd76 apply resize hints in floating layout 14 years ago
Connor Lane Smith 2b625eb73e hide clients to the left, not the right 14 years ago
garbeam@gmail.com 0f1f30daca applied Connors cleanup patch of Eckehards proposed fix of applyrules(), thanks everyone involved 15 years ago
garbeam@gmail.com dec4850d05 applied Connors and Valentins patch to improve the unmapnotify handling of broken clients 15 years ago
garbeam@gmail.com 0de4197cc5 applied Peter Hartlichs nice interim Xinerama and map fix patches, for debugging purposes I also added his transient test driver 15 years ago
garbeam@gmail.com a372248b80 applied anonymous code cleanup patch 15 years ago
garbeam@gmail.com 69e7d7dfd3 added a marker for the flash fullscreen issue 15 years ago
garbeam@gmail.com c99fe7dd7d changed sleep 20 into sleep 1 in example script as suggested by Snader_LB 15 years ago
garbeam@gmail.com d6670a800d applied Connors aesthitic buf fix in tile(), thanks 15 years ago
garbeam@gmail.com 6288c44697 applied Peters magic float mode bugfix 15 years ago
garbeam@gmail.com d5c5c52b30 applied lolilolicon's floating center patch, further investigation wrt his second issue reported needed 15 years ago
garbeam@gmail.com d0b4575bf4 thanks to recursions on IRC for his remark 15 years ago
garbeam@gmail.com 03518ce49e Added tag 5.9 for changeset dd74622a4785 15 years ago
garbeam@gmail.com cd8bb06af5 enabled release flags 15 years ago
garbeam@gmail.com 3150a8a1be applied Peters wintoclient/wintomon optimisation in enternotify() 15 years ago
garbeam@gmail.com b3c5f5435a removed unneeded offset recalculation, thanks Jukka, let's see if this breaks some other client 15 years ago
garbeam@gmail.com a692bdcf2b undo the focus optimisation patch for 5.9 15 years ago
garbeam@gmail.com d83454f6b7 applied Peters two patches, please test hg tip, if nothing breaks this is 5.9 15 years ago
garbeam@gmail.com 27b0142203 applied Garys patch in a slightly modified way 15 years ago
garbeam@gmail.com 867ba36030 applied Nicolas Capit's patch as interim solution until the multiscreen support is reworked in 6.0 15 years ago
Connor Lane Smith e83f36db10 fixed scroll lock (thanks bogdan) 15 years ago
Connor Lane Smith 212f417e44 fix numlock (thanks mikhail) 15 years ago
garbeam@gmail.com 3a392b8558 making enternotify less focus hungry 15 years ago
garbeam@gmail.com 92fe06b501 applied Andreas Amann's patch from Oct 2010, thanks 15 years ago
garbeam@gmail.com 6cf29bff33 applied Rudys barwidth patch, thanks Rudy 15 years ago
garbeam@gmail.com 60c06a7cb4 don't check for monocle layout in zoom() exit condition 15 years ago
garbeam@gmail.com 1147546122 Thanks for the pedantic review :) 15 years ago
garbeam@gmail.com d384cee751 fixing some minor issues, next week is dwm-5.9 release time 15 years ago
Connor Lane Smith 5c710cf89c rm draw.c from 5.9 branch 15 years ago
Connor Lane Smith 8a111c181e fix typo 15 years ago
Connor Lane Smith 2255bf46a0 cleaner drawing 15 years ago
Connor Lane Smith 04797343db update draw.c 15 years ago
Connor Lane Smith e7d41cc188 added draw.h, draw.c 15 years ago
Anselm R Garbe 22d8818850 applied Evil_Bobs cleanup patch 15 years ago
Anselm R Garbe 6784429c3c applied another minor change to the README 15 years ago
Anselm R Garbe 37fea84de8 applied Thomas' README patch 15 years ago
Anselm R Garbe c14d293e51 applied Jack's mplayer fullscreen patch 15 years ago
Anselm R Garbe 79b1657a19 missed declaration 15 years ago
Anselm R Garbe d24837f1ad minor fix of the NetActiveWindow multi-monitor flaw, slight rearrangement 15 years ago
Anselm R Garbe 3c2d303c0e applied Peter/Andreas NetActiveWindow patch in a slightly modified version 15 years ago
Anselm R Garbe 1e20a0f78a applied Brendan MacDonell's WM_TAKE_FOCUS patch, thanks Brendan! 15 years ago
Anselm R Garbe 96f9855248 applied another patch of Hiltjo, thanks 15 years ago
Anselm R Garbe 3c48858ffa applied Hiltjos' BUGS patch from 23 Mar, sorry took a while :) 15 years ago
Anselm R Garbe dd46d5b588 applied Hiltjo's multimon mouse-based resize fix 15 years ago
Anselm R Garbe 0bc4e41ebd applied anonymous patch, I don't think the reversed array access has semantic side-effects 15 years ago
Anselm R Garbe 703c4dd253 added a todo 15 years ago
Anselm R Garbe b68528d85d applied Hiltjo's cleanup patch 15 years ago
Anselm R Garbe a644baf674 applied Hiltjo's tiny cleanup fix 16 years ago
Anselm R Garbe c1f8688bfa applied Hiltjo's tiny cleanup patch, thanks! 16 years ago
Anselm R Garbe bea4dd2490 does this make a difference? 16 years ago
anselm@garbe.us 83d10be1c1 added TODO and bumped version to 5.9 16 years ago
anselm@garbe.us 1529058f27 applied Hiltjo Posthuma's line saver patch 16 years ago
Anselm R Garbe 36311d88af applied Hiltjo Posthuma's double-XineramaQueryScreens() patch, thanks Hiltjo! 16 years ago
anselm@garbe.us f1a2a3c850 Added tag 5.8.2 for changeset a043f0800805 16 years ago
Anselm R Garbe ee734fae6b increased version 16 years ago
Anselm R Garbe 62d3caa999 implemented better fullscreen handling, please test 16 years ago
Anselm R Garbe 4c9b397ff9 Added tag 5.8.1 for changeset 1ed1e75c9c2e 16 years ago
Anselm R Garbe 5c6545adf5 removing Sylvain's patch because it breaks more than it fixes unfortunately, re-issuing a bugfix release 5.8.1 16 years ago
Anselm R Garbe a704b1ee34 Added tag 5.8 for changeset 60ea8fed13ab 16 years ago
anselm@garbe.us f83d61dfe8 removed DEBUG code and added 2010 to the copyright list 16 years ago
anselm@garbe.us c6180949a7 applied Sylvain Laurent's EWMH fullscreen state patch, simplified his patch a bit 16 years ago
Anselm R Garbe 1973ab0643 added the related bug reported by voltaic 16 years ago
Anselm R Garbe 427053f8d1 pretty printing bugs a bit 16 years ago
Anselm R Garbe a88e0373ef selmon optimisation is needed 16 years ago
Anselm R Garbe aa9f2be24e more debug output, experimental focus optimisation 16 years ago
Anselm R Garbe c53b29e60b quick typo fix 16 years ago
Anselm R Garbe d6bdd03d91 it's debug season for upcoming dwm 5.8, so only use this if you really want to run experimental code or debug code 16 years ago
Anselm R Garbe 1144e98394 another bug report 16 years ago
Anselm R Garbe 7671d03a90 removed misleading comment, thanks Romain Bertrand 16 years ago
Anselm R Garbe bc554d45d8 added nsz's last bug corner case 16 years ago
Anselm R Garbe ac4caea921 added BUGS, next version is 5.8 16 years ago
Anselm R Garbe 161f2d921b Added tag 5.7.2 for changeset 15761ac5e2f1 17 years ago
Anselm R Garbe 210378f198 applied Ryan Zheng's patch and re-releasing 5.7.2 17 years ago
Anselm R Garbe 7879616a75 Added tag 5.7.1 for changeset 48c3f87c335d 17 years ago
Anselm R Garbe 9e8dd3479d fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested)
- optimised drawbar() and arrange() handling for multiple monitors, arrange only arranges the relevant monitors when applicable, same with drawbar
- need to release 5.7.1
17 years ago
Anselm R Garbe 0b72be924d Added tag 5.7 for changeset 257403d4cd96 17 years ago
Anselm R Garbe 91e902f7fe switching to release flags 17 years ago
Anselm R Garbe 30fed9a211 implemented nn < n case, k-zed please recheck 17 years ago
Anselm R Garbe c45d46ad9a use buffer instead of pointer for mon->ltsymbol 17 years ago
Anselm R Garbe 6f55de8310 added missing scan 17 years ago
Anselm R Garbe 07ad298133 implemented different version of updategeom 17 years ago
Anselm R Garbe f0a4845e7d added TODO to updategeom in order to implement a decent version of it soon 17 years ago
Anselm R Garbe 82ec7a7ed4 new experimental updategeom() additions that should avoid several problems with Xinerama, this is EXPERIMENTAL and might break something, the algorithms in use are quite complex and cumbersome, patches and comments welcome 17 years ago
Anselm R Garbe e7300e0f6f implemented dynamic layout symbol stuff 17 years ago
Anselm R Garbe c3feffa1e2 applied Tony Lainson's config.def.h patch 17 years ago
Anselm R Garbe 956a430054 update 17 years ago
Anselm R Garbe 01056b6636 hard-core destruction 17 years ago
Anselm R Garbe eb260b1a41 renaming isdestroyed into destroyed 17 years ago
Anselm R Garbe 7fe81359d4 sync when a client is being killed 17 years ago
Anselm R Garbe a3a859b4e9 added isdestroyed flag to unmanage 17 years ago
nsz@tpx 9c066c24b3 always updategeom when root is configured 17 years ago
Anselm R Garbe 0a668922a4 another small optimisation 17 years ago
Anselm R Garbe 5762964232 also update title if the client is on an unfocused monitor 17 years ago
Anselm R Garbe cba6b211c2 applied nsz's dwm.1 patch, also added wmname 17 years ago
Anselm R Garbe 42750a621b applied Jukka's cosmetic patch 17 years ago
Anselm R Garbe 8ef465d592 applied Jukka's sigchld patch 17 years ago
Anselm R Garbe 33fe200b52 added merged patch of anydot and Neale 17 years ago
Anselm R Garbe 91fffb3f7d fixed nn declaration 17 years ago
Anselm R Garbe 1fa31efebf Added tag 5.6.1 for changeset e47a47bd3ed4 17 years ago
Anselm R Garbe 244addb3f4 applied nsz patch 17 years ago
Anselm R Garbe c13be8d620 updategeom fix for same geom screens 17 years ago
Anselm R Garbe dc39ae8568 applied nsz' man page comment, thanks! 17 years ago
Anselm R Garbe 966d76a428 merge 17 years ago
Anselm R Garbe 7151bf8329 removed Standard input hint 17 years ago
Anselm R Garbe dfecd46190 merge 17 years ago
Anselm R Garbe 5bc4db0f76 applied nsz' dwm.1 fixes, thanks Szabolcs! 17 years ago
Anselm R Garbe 999d6e795f removed misleading comment 17 years ago
Anselm R Garbe 636075297c merge 17 years ago
Anselm R Garbe 6877a00033 it's all nsz's hard investigation effort, hail nsz! ;) 17 years ago
Anselm R Garbe 0927d635bc Added tag 5.6 for changeset 555070221577 17 years ago
Anselm R Garbe 450b08dde2 final style fixes 17 years ago
Anselm R Garbe da80487c07 removed int cast in TAGMASK as suggested by nsz 17 years ago
Anselm R Garbe d9779c06fc some stylistic changes 17 years ago
Anselm R Garbe 20996c6c5a removed obsolete BUG 17 years ago
anselm@x200s.config 8dc9fcf1b9 mark broken clients as broken 17 years ago
anselm@x200s.config fc21dd4b7e fixing updatetitle 17 years ago
Anselm R Garbe 758b100d12 extended rule to apply monitors if set up accordingly 17 years ago
Anselm R Garbe 8420fb1ced reverting to optimised compiler options, current state seems stable 17 years ago
Anselm R Garbe f6128a16f9 extended man page to mention number of visible windows 17 years ago
Anselm R Garbe 87526be6f0 added client number printing right of layout symbol 17 years ago
Anselm R Garbe 565050ac51 removed monsyms, useless 17 years ago
Anselm R Garbe 5e408d8ff6 restricting number of mons by length of monsyms 17 years ago
Anselm R Garbe 1724f7fa43 introducing const where it might make some sense 17 years ago
Anselm R Garbe 3e6fe6b541 no that's definately better 17 years ago
Anselm R Garbe 6620615ab9 some minor changes 17 years ago
Anselm R Garbe 61c3095f2f die if malloc sizeof(Monitor) fails 17 years ago
Anselm R Garbe a72dc2fec2 applied Mate's patch, added Mate to LICENSE 17 years ago
Anselm R Garbe 8b17f5517b some cleanups 17 years ago
Anselm R Garbe cd96232f7e hotfix 17 years ago
Anselm R Garbe a9e145fe6d changed focusmon/tagmon to work on prev/next instead (-1/+1), changed shortcuts to Mod1-, Mod1-. and Mod1-Shift-, Mod1-Shift-. 17 years ago
Anselm R Garbe 5dd92c7655 removed some empty lines 17 years ago
Anselm R Garbe 52bd69c2a4 interactive resizals allow display dimensions again 17 years ago
Anselm R Garbe ca376970db more sensible 17 years ago
Anselm R Garbe 8352f2b3a8 hmm, can't decide on the default monitor symbol set 17 years ago
Anselm R Garbe d4bfde79f3 update 17 years ago
Anselm R Garbe 7ac8c1d4e1 introduced monitor symbols 17 years ago
Anselm R Garbe 16e1ef5d40 minor fix 17 years ago
Anselm R Garbe 1d729384d1 several bugfixes 17 years ago
Anselm R Garbe 25c1eb28f9 some minor fix if xinerama is disabled, still some odd behavior in there 17 years ago
Anselm R Garbe d719cc9a0e updated year ranges 17 years ago
Anselm R Garbe 9cde6570cc fixed usage of sx, sy, sw, sh 17 years ago
Anselm R Garbe e408ca97d8 don't draw monitor number, if there is just one monitor 17 years ago
Anselm R Garbe 183dc670a3 fixed order of transient monitor applicaion and rule application 17 years ago
Anselm R Garbe 25947bcfdb hotfix 17 years ago
Anselm R Garbe 1ddfc571ae several simplifications 17 years ago
Anselm R Garbe 21cd59a630 play safe 17 years ago
Anselm R Garbe 6cbe47d481 applied a collection of Christof Musik patches, and fixed an issue reported by waistcoats on IRC 17 years ago
Anselm R Garbe 029655bb22 some cleanup handling for index based mon search 17 years ago
Anselm R Garbe 27db9d4448 using mon in function names for consistency reasons 17 years ago
Anselm R Garbe 176408afa8 fixed several issues with focus handling via mouse, also added sending clients to the right monitor they belong to after mouse moves/resizals 17 years ago
Anselm R Garbe 64674c395b fixed focusmon brokeness 17 years ago
Anselm R Garbe b9dee2c6f1 tag fix 17 years ago
Anselm R Garbe a73ff905b0 typo fix 17 years ago
Anselm R Garbe e3f0445df1 assign selected tags of target monitor to client when tagmon is performed (less obtrusive imho) 17 years ago
Anselm R Garbe ab06f7444b added some TODOs, some other focus fixes 17 years ago
Anselm R Garbe a2a3590979 disabled XINULATOR code for now 17 years ago
Anselm R Garbe e8aafb8e91 made bar based monitor switching working 17 years ago
Anselm R Garbe 18b1312449 several other focus fixes, introduced unfocus() 17 years ago
Anselm R Garbe 80ee95473b some focus fixes 17 years ago
Anselm R Garbe 454a04acdf fixed title rendering on non-active screen 17 years ago
Anselm R Garbe 891831fe62 fixed getclient brokeness 17 years ago
Anselm R Garbe cdb8e27453 some hotfix cleanup related to wild selmon-> destruction 17 years ago
Anselm R Garbe 5c4913e983 some restack fixes, still odd behavior if n>1 on unmanaging clients 17 years ago
Anselm R Garbe fa5ae54bbb added some dual head simulator code 17 years ago
Anselm R Garbe 7de534192c simplified left over re-assignment 17 years ago
Anselm R Garbe 54dc0d542c fixed tagmon, re-using detach/detachstack and attach/attachstack 17 years ago
Anselm R Garbe 913333f518 simplified ISVISBLE and nexttiled 17 years ago
Anselm R Garbe d702f39274 moved clients/stack/sel to Monitor, that's a per monitor structure from now on 17 years ago
Anselm R Garbe 0d8671a5ad declare buf only if XINERAMA support is used 17 years ago
Anselm R Garbe 38e9b67026 if compiled without XINERAMA support assume 1 monitor by default (n = 1) 17 years ago
Anselm R Garbe a3bbdb1b7b some more refactoring, bar toggle fixes 17 years ago
Anselm R Garbe d53ceee682 hotfixes 17 years ago
Anselm R Garbe 78f56672b5 changes monitor structure to be a list 17 years ago
Anselm R Garbe c2fff604a7 we need a tagset per monitor, removed tagset declaration from config.h 17 years ago
Anselm R Garbe 6644a6aa2e some minor fixes regarding the new xinerama support 17 years ago
Anselm R Garbe 3da2453997 several fixes through ISVISIBLE change (takes Monitor into account) 17 years ago
Anselm R Garbe 2ce37bc69e experimental xinerama support, two new actions, Mod1-w/e and Mod1-Shift-w/e 17 years ago
Anselm R Garbe f27ccc5c60 introduction of Monitor for better Xinerama support, work in progress 17 years ago
Anselm R Garbe 2dbfda72f0 removed MAXTAGLEN 17 years ago
Anselm R Garbe 7df39f3fc7 next version will be 5.6, shortened some very long lines 17 years ago
Anselm R Garbe 0b45199cec Added tag 5.5 for changeset deaa276abac1 17 years ago
Anselm R Garbe 3632d7132f applied Marc Andre Tanners showhide patch, the removal of ntiled 17 years ago
Anselm R Garbe 565697087b applied Gottox' patches, and also removed usegrab 17 years ago
arg@garbe.us ea0008cba2 applied the patch I missed from Gottox, thanks mate! 17 years ago
Anselm R Garbe af508c2e82 applied Gottox' resizehints patch, thanks Gottox! 17 years ago
Anselm R Garbe f0d1d5206f some NULL fixes 17 years ago
Anselm R Garbe 1c80c05587 override_redirect is Bool 17 years ago
Anselm R Garbe 1e350be229 applied Gottox' adjustborder removal patch (thanks!) 17 years ago
a@null 1a26389e2b applied nsz' remark 17 years ago
Premysl Hruby bf9da23f07 fix of typo, thx to Enno Gottox Boland 17 years ago
a@null 2373940215 Added tag 5.4.1 for changeset 85a78d8afa0f 17 years ago
a@null 90687482ad fixed an issue reported by Nibble, also fixed s/2008/2009/ 17 years ago
a@null 5ab627c06c Added tag 5.4 for changeset 8b7836a471f8 17 years ago
a@null 76d7e80fc4 avoid reverting the border if it's not necessary (avoids some flashing on view()) 17 years ago
a@null af8049bce8 spotted missing spaces 17 years ago
a@null 2bb51b3246 reverting some border patches 17 years ago
a@null b16d8282be changed adjustborder to be a macro 17 years ago
a@null fef4614772 applied yiyus applyrules() patch 17 years ago
a@null be39dddcc5 implemented noborder for 1 client in the view 17 years ago
a@null 6d209b9b29 made status script example of .xinitrc more useful 17 years ago
a@null 57a0788bd8 ok, using signal.h for portability reasons 17 years ago
a@null 3ad906eede removed unnecessary closure of stdin reported by Frederic Chardon, thx 17 years ago
a@null 0be9fb8797 added sys/signal.h inclusion for BSD compliance 17 years ago
a@null 62a491e36d re-applied Neale's spawn patch, credited Neale in LICENSE 17 years ago
a@null 0b5dcf229f applied Neale Pickett's xprop status reading patch, updated README and dwm.1 accordingly 17 years ago
arg@localhost.localdomain fda92f46aa applied yiyus fix 17 years ago
Anselm R Garbe a62ea4062f fix 17 years ago
Anselm R Garbe 7dc28d130f Added tag 5.3.1 for changeset 335301ed102f 17 years ago

@ -1,59 +0,0 @@
d31b5ad96b0ba7b5b0a30928fcf000428339a577 0.1
0a6472e2203994bc5738d40a340d26f7ec9d6062 0.2
7e66082e5092fb0bccd18a3695a0bec52c80fdb2 0.3
eb3165734f00fe7f7da8aeebaed00e60a57caac9 0.4
22213b9a2114167ee8ba019a012e27da0422a61a 0.5
c11f86db4550cac5d0a648a3fe4d6d3b9a4fcf7e 0.6
3fb41412e2492f66476d92ce8f007a8b48fb1d2a 0.7
cd15de32e173f8ce97bfe1c9b6607937b59056b4 0.8
fae61afa861755636c4a1070694209ace8efbb6c 0.9
bbc98e77ae89a7c9232a5be0835f60ea00d8036e 1.0
44a55e6e46bf6c231780b09d919977d6f01083de 1.1
e3179ce2b90451d2807cd53b589d768412b8666b 1.2
f5f5cbf016a94b48a8fe9c47f0736e96d166d5d4 1.3
3cff9403766bf83a9fc2a0aef230115d68de2a8e 1.4
728c9089b079721b43c3347124639a29baa22a97 1.5
ad3fa2d185426c51fd5deceae809770363f8d33c 1.6
4dbdb61c8b8ce21dee5c7050a6b103855964ed20 1.7
d5ad819f2a66a40fa75dd2e44429f3bfc884d07b 1.7.1
c71952fa3c7ca848ec38a6923b5c6d0e18fff431 1.8
a5567a0d30112822db2627a04a2e7aa3b6c38148 1.9
12deea36603da407e3f32640048846a3bd74a9ec 2.0
a2c465098a3b972bbed00feda9804b6aae1e9531 2.1
7e92f58754ae6edb3225f26d754bd89c1ff458cf 2.2
719b37b37b0df829d7cf017ac70e353088fe5849 2.3
32b246925086910d63147483160281a91a47479f 2.4
dcbbfabc8ecc5f33a6cc950584de87da1a368045 2.5
c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2.5.1
5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2.6
21951c0dfbae5af68ed77821a4d87253ee91803f 2.7
107719a9ce3bd0c79f9f1f626596eb338a276561 2.8
3a5910fac3ccb522a98aeeba7af7008530b25092 2.9
76b58d21ea98257c05565a3b9c850b9b26a32968 3.0
e1c8bef05e6e48df4f26471ea0712aa43ab9d949 3.1
4ce65f61f01b055fa6c2901c6d2527ef741aa4bf 3.2
f2cabc83a18f9b5b548159329ddd4dee904fa31f 3.2.1
d3876aa792923f9a95f7ad0c7f0134533404df35 3.2.2
0f91934037b04221ff5d1ba3a6c39c1ff26e3661 3.3
9ede7b2d2450537e750d5505789fbe63960e97e6 3.4
63ad05e7f9e1f4f1881fb02f529cb6c6ae81e693 3.5
75b1b25fe0d7e29400baf30568153f668324928b 3.6
20ec6976cee1fcfee0c2f354ae382ee3f9f68efa 3.6.1
baee494346e520f8dee2cee9491b8350064770d2 3.7
2ea201354cf016407ea93e1e390d1422940d29b0 3.8
55478328b2422c700c5404a774c85e77322f41a3 3.9
018c3846842291cb6c009dc087e7fe2f0ef53bea 4.0
00f4180df72b49aadb2933804fde4bfb33e5666d 4.1
c13cb8c6b7a56af74cc88346e71d2490470b546f 4.2
e0ec0d5d8b1ef3ee04a83c7c0fee5853aa2ac6a6 4.3
408014d2126153d2b0fce26a13ba707db222b7b9 4.4
7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1
2acc60d6dfe28c101a8cd44a8aa710a38ae3607c 4.5
bcd7e18e196a00cc2e97ff3a4a58f3cdaba13856 4.6
d6d3085307d8d98b8b012b669e858fd787befeb1 4.7
607015ddb091d49cbd3457af41713691aa69f4d6 4.8
22c669b2dd3673785c3476b9976da21e8783f745 4.9
06eb9644e2dad7667d97495eb7d7bc62aa0429e8 5.0
ce355cea9bb89e162f61913737a46908cdfa7e45 5.1
e4bcaca8e6ef13d2c3b81f1218ad15e5da4d68bd 5.2
4004d61160355d869a7d2672561caad440751ba0 5.3

@ -1,14 +1,22 @@
MIT/X Consortium License MIT/X Consortium License
© 2006-2008 Anselm R Garbe <garbeam at gmail dot com> © 2006-2019 Anselm R Garbe <anselm@garbe.ca>
© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Jukka Salmi <jukka at salmi dot ch> © 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
© 2007 Premysl Hruby <dfenze at gmail dot com> © 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
© 2007 Szabolcs Nagy <nszabolcs at gmail dot com> © 2007-2009 Christof Musik <christof at sendfax dot de>
© 2007 Christof Musik <christof at sendfax dot de> © 2007-2009 Premysl Hruby <dfenze at gmail dot com>
© 2007-2008 Enno Gottox Boland <gottox at s01 dot de> © 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
© 2007-2008 Peter Hartlich <sgkkr at hartlich dot com>
© 2008 Martin Hurton <martin dot hurton at gmail dot com> © 2008 Martin Hurton <martin dot hurton at gmail dot com>
© 2008 Neale Pickett <neale dot woozle dot org>
© 2009 Mate Nagy <mnagy at port70 dot net>
© 2010-2016 Hiltjo Posthuma <hiltjo@codemadness.org>
© 2010-2012 Connor Lane Smith <cls@lubutu.com>
© 2011 Christoph Lohmann <20h@r-36.net>
© 2015-2016 Quentin Rameau <quinq@fifth.space>
© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),

@ -3,7 +3,7 @@
include config.mk include config.mk
SRC = dwm.c SRC = drw.c dwm.c util.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options dwm all: options dwm
@ -15,46 +15,37 @@ options:
@echo "CC = ${CC}" @echo "CC = ${CC}"
.c.o: .c.o:
@echo CC $< ${CC} -c ${CFLAGS} $<
@${CC} -c ${CFLAGS} $<
${OBJ}: config.h config.mk ${OBJ}: config.h config.mk
config.h: config.h:
@echo creating $@ from config.def.h cp config.def.h $@
@cp config.def.h $@
dwm: ${OBJ} dwm: ${OBJ}
@echo CC -o $@ ${CC} -o $@ ${OBJ} ${LDFLAGS}
@${CC} -o $@ ${OBJ} ${LDFLAGS}
clean: clean:
@echo cleaning rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
@rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
dist: clean dist: clean
@echo creating dist tarball mkdir -p dwm-${VERSION}
@mkdir -p dwm-${VERSION} cp -R LICENSE Makefile README config.def.h config.mk\
@cp -R LICENSE Makefile README config.def.h config.mk \ dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
dwm.1 ${SRC} dwm-${VERSION} tar -cf dwm-${VERSION}.tar dwm-${VERSION}
@tar -cf dwm-${VERSION}.tar dwm-${VERSION} gzip dwm-${VERSION}.tar
@gzip dwm-${VERSION}.tar rm -rf dwm-${VERSION}
@rm -rf dwm-${VERSION}
install: all install: all
@echo installing executable file to ${DESTDIR}${PREFIX}/bin mkdir -p ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin cp -f dwm ${DESTDIR}${PREFIX}/bin
@cp -f dwm ${DESTDIR}${PREFIX}/bin chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm mkdir -p ${DESTDIR}${MANPREFIX}/man1
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1 chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
@sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
uninstall: uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin rm -f ${DESTDIR}${PREFIX}/bin/dwm\
@rm -f ${DESTDIR}${PREFIX}/bin/dwm ${DESTDIR}${MANPREFIX}/man1/dwm.1
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${MANPREFIX}/man1/dwm.1
.PHONY: all options clean dist install uninstall .PHONY: all options clean dist install uninstall

@ -18,9 +18,6 @@ necessary as root):
make clean install make clean install
If you are going to use the default bluegray color scheme it is highly
recommended to also install the bluegray files shipped in the dextra package.
Running dwm Running dwm
----------- -----------
@ -38,11 +35,11 @@ the DISPLAY environment variable is set correctly, e.g.:
In order to display status info in the bar, you can do something In order to display status info in the bar, you can do something
like this in your .xinitrc: like this in your .xinitrc:
while true while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
do do
echo `date` `uptime | sed 's/.*,//'` sleep 1
sleep 1 done &
done | dwm exec dwm
Configuration Configuration

@ -1,36 +1,43 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
/* appearance */ /* appearance */
static const char font[] = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*"; static const unsigned int borderpx = 1; /* border pixel of windows */
static const char normbordercolor[] = "#cccccc"; static const unsigned int snap = 32; /* snap pixel */
static const char normbgcolor[] = "#cccccc"; static const int showbar = 1; /* 0 means no bar */
static const char normfgcolor[] = "#000000"; static const int topbar = 1; /* 0 means bottom bar */
static const char selbordercolor[] = "#0066ff"; static const char *fonts[] = { "monospace:size=10" };
static const char selbgcolor[] = "#0066ff"; static const char dmenufont[] = "monospace:size=10";
static const char selfgcolor[] = "#ffffff"; static const char col_gray1[] = "#222222";
static unsigned int borderpx = 1; /* border pixel of windows */ static const char col_gray2[] = "#444444";
static unsigned int snap = 32; /* snap pixel */ static const char col_gray3[] = "#bbbbbb";
static Bool showbar = True; /* False means no bar */ static const char col_gray4[] = "#eeeeee";
static Bool topbar = True; /* False means bottom bar */ static const char col_cyan[] = "#005577";
static Bool readin = True; /* False means do not read stdin */ static const char *colors[][3] = {
static Bool usegrab = False; /* True means grabbing the X server /* fg bg border */
during mouse-based resizals */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
/* tagging */ /* tagging */
static const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
static Rule rules[] = { static const Rule rules[] = {
/* class instance title tags mask isfloating */ /* xprop(1):
{ "Gimp", NULL, NULL, 0, True }, * WM_CLASS(STRING) = instance, class
{ "Firefox", NULL, NULL, 1 << 8, True }, * WM_NAME(STRING) = title
*/
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, 1, -1 },
{ "Firefox", NULL, NULL, 1 << 8, 0, -1 },
}; };
/* layout(s) */ /* layout(s) */
static float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static Bool resizehints = True; /* False means respect size hints in tiled resizals */ static const int nmaster = 1; /* number of clients in master area */
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
static Layout layouts[] = { static const Layout layouts[] = {
/* symbol arrange function */ /* symbol arrange function */
{ "[]=", tile }, /* first entry is default */ { "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */ { "><>", NULL }, /* no layout function means floating behavior */
@ -49,8 +56,9 @@ static Layout layouts[] = {
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */ /* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
static const char *termcmd[] = { "uxterm", NULL }; static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
static const char *termcmd[] = { "st", NULL };
static Key keys[] = { static Key keys[] = {
/* modifier key function argument */ /* modifier key function argument */
@ -59,6 +67,8 @@ static Key keys[] = {
{ MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Return, zoom, {0} },
@ -71,6 +81,10 @@ static Key keys[] = {
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0) TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1) TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2) TAGKEYS( XK_3, 2)
@ -84,8 +98,7 @@ static Key keys[] = {
}; };
/* button definitions */ /* button definitions */
/* click can be a tag number (starting at 0), /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
* ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = { static Button buttons[] = {
/* click event mask button function argument */ /* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button1, setlayout, {0} },

@ -1,5 +1,5 @@
# dwm version # dwm version
VERSION = 5.3 VERSION = 6.2
# Customize below to fit your system # Customize below to fit your system
@ -10,18 +10,25 @@ MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
# Xinerama, un-comment if you want it # Xinerama, comment if you don't want it
#XINERAMALIBS = -L${X11LIB} -lXinerama XINERAMALIBS = -lXinerama
#XINERAMAFLAGS = -DXINERAMA XINERAMAFLAGS = -DXINERAMA
# freetype
FREETYPELIBS = -lfontconfig -lXft
FREETYPEINC = /usr/include/freetype2
# OpenBSD (uncomment)
#FREETYPEINC = ${X11INC}/freetype2
# includes and libs # includes and libs
INCS = -I. -I/usr/include -I${X11INC} INCS = -I${X11INC} -I${FREETYPEINC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
# flags # flags
CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} #CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS} CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
LDFLAGS = ${LIBS}
# Solaris # Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"

436
drw.c

@ -0,0 +1,436 @@
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xft/Xft.h>
#include "drw.h"
#include "util.h"
#define UTF_INVALID 0xFFFD
#define UTF_SIZ 4
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
static long
utf8decodebyte(const char c, size_t *i)
{
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
return (unsigned char)c & ~utfmask[*i];
return 0;
}
static size_t
utf8validate(long *u, size_t i)
{
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
*u = UTF_INVALID;
for (i = 1; *u > utfmax[i]; ++i)
;
return i;
}
static size_t
utf8decode(const char *c, long *u, size_t clen)
{
size_t i, j, len, type;
long udecoded;
*u = UTF_INVALID;
if (!clen)
return 0;
udecoded = utf8decodebyte(c[0], &len);
if (!BETWEEN(len, 1, UTF_SIZ))
return 1;
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
if (type)
return j;
}
if (j < len)
return 0;
*u = udecoded;
utf8validate(u, len);
return len;
}
Drw *
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
{
Drw *drw = ecalloc(1, sizeof(Drw));
drw->dpy = dpy;
drw->screen = screen;
drw->root = root;
drw->w = w;
drw->h = h;
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
drw->gc = XCreateGC(dpy, root, 0, NULL);
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
return drw;
}
void
drw_resize(Drw *drw, unsigned int w, unsigned int h)
{
if (!drw)
return;
drw->w = w;
drw->h = h;
if (drw->drawable)
XFreePixmap(drw->dpy, drw->drawable);
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
}
void
drw_free(Drw *drw)
{
XFreePixmap(drw->dpy, drw->drawable);
XFreeGC(drw->dpy, drw->gc);
drw_fontset_free(drw->fonts);
free(drw);
}
/* This function is an implementation detail. Library users should use
* drw_fontset_create instead.
*/
static Fnt *
xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
{
Fnt *font;
XftFont *xfont = NULL;
FcPattern *pattern = NULL;
if (fontname) {
/* Using the pattern found at font->xfont->pattern does not yield the
* same substitution results as using the pattern returned by
* FcNameParse; using the latter results in the desired fallback
* behaviour whereas the former just results in missing-character
* rectangles being drawn, at least with some fonts. */
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
return NULL;
}
if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
XftFontClose(drw->dpy, xfont);
return NULL;
}
} else if (fontpattern) {
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
fprintf(stderr, "error, cannot load font from pattern.\n");
return NULL;
}
} else {
die("no font specified.");
}
/* Do not allow using color fonts. This is a workaround for a BadLength
* error from Xft with color glyphs. Modelled on the Xterm workaround. See
* https://bugzilla.redhat.com/show_bug.cgi?id=1498269
* https://lists.suckless.org/dev/1701/30932.html
* https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
* and lots more all over the internet.
*/
FcBool iscol;
if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
XftFontClose(drw->dpy, xfont);
return NULL;
}
font = ecalloc(1, sizeof(Fnt));
font->xfont = xfont;
font->pattern = pattern;
font->h = xfont->ascent + xfont->descent;
font->dpy = drw->dpy;
return font;
}
static void
xfont_free(Fnt *font)
{
if (!font)
return;
if (font->pattern)
FcPatternDestroy(font->pattern);
XftFontClose(font->dpy, font->xfont);
free(font);
}
Fnt*
drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
{
Fnt *cur, *ret = NULL;
size_t i;
if (!drw || !fonts)
return NULL;
for (i = 1; i <= fontcount; i++) {
if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
cur->next = ret;
ret = cur;
}
}
return (drw->fonts = ret);
}
void
drw_fontset_free(Fnt *font)
{
if (font) {
drw_fontset_free(font->next);
xfont_free(font);
}
}
void
drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
{
if (!drw || !dest || !clrname)
return;
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
DefaultColormap(drw->dpy, drw->screen),
clrname, dest))
die("error, cannot allocate color '%s'", clrname);
}
/* Wrapper to create color schemes. The caller has to call free(3) on the
* returned color scheme when done using it. */
Clr *
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
{
size_t i;
Clr *ret;
/* need at least two colors for a scheme */
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
return NULL;
for (i = 0; i < clrcount; i++)
drw_clr_create(drw, &ret[i], clrnames[i]);
return ret;
}
void
drw_setfontset(Drw *drw, Fnt *set)
{
if (drw)
drw->fonts = set;
}
void
drw_setscheme(Drw *drw, Clr *scm)
{
if (drw)
drw->scheme = scm;
}
void
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
{
if (!drw || !drw->scheme)
return;
XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
if (filled)
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
else
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
}
int
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
{
char buf[1024];
int ty;
unsigned int ew;
XftDraw *d = NULL;
Fnt *usedfont, *curfont, *nextfont;
size_t i, len;
int utf8strlen, utf8charlen, render = x || y || w || h;
long utf8codepoint = 0;
const char *utf8str;
FcCharSet *fccharset;
FcPattern *fcpattern;
FcPattern *match;
XftResult result;
int charexists = 0;
if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
return 0;
if (!render) {
w = ~w;
} else {
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
d = XftDrawCreate(drw->dpy, drw->drawable,
DefaultVisual(drw->dpy, drw->screen),
DefaultColormap(drw->dpy, drw->screen));
x += lpad;
w -= lpad;
}
usedfont = drw->fonts;
while (1) {
utf8strlen = 0;
utf8str = text;
nextfont = NULL;
while (*text) {
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
for (curfont = drw->fonts; curfont; curfont = curfont->next) {
charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
if (charexists) {
if (curfont == usedfont) {
utf8strlen += utf8charlen;
text += utf8charlen;
} else {
nextfont = curfont;
}
break;
}
}
if (!charexists || nextfont)
break;
else
charexists = 0;
}
if (utf8strlen) {
drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL);
/* shorten text if necessary */
for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--)
drw_font_getexts(usedfont, utf8str, len, &ew, NULL);
if (len) {
memcpy(buf, utf8str, len);
buf[len] = '\0';
if (len < utf8strlen)
for (i = len; i && i > len - 3; buf[--i] = '.')
; /* NOP */
if (render) {
ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
usedfont->xfont, x, ty, (XftChar8 *)buf, len);
}
x += ew;
w -= ew;
}
}
if (!*text) {
break;
} else if (nextfont) {
charexists = 0;
usedfont = nextfont;
} else {
/* Regardless of whether or not a fallback font is found, the
* character must be drawn. */
charexists = 1;
fccharset = FcCharSetCreate();
FcCharSetAddChar(fccharset, utf8codepoint);
if (!drw->fonts->pattern) {
/* Refer to the comment in xfont_create for more information. */
die("the first font in the cache must be loaded from a font string.");
}
fcpattern = FcPatternDuplicate(drw->fonts->pattern);
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
FcDefaultSubstitute(fcpattern);
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
FcCharSetDestroy(fccharset);
FcPatternDestroy(fcpattern);
if (match) {
usedfont = xfont_create(drw, NULL, match);
if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
; /* NOP */
curfont->next = usedfont;
} else {
xfont_free(usedfont);
usedfont = drw->fonts;
}
}
}
}
if (d)
XftDrawDestroy(d);
return x + (render ? w : 0);
}
void
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
{
if (!drw)
return;
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
XSync(drw->dpy, False);
}
unsigned int
drw_fontset_getwidth(Drw *drw, const char *text)
{
if (!drw || !drw->fonts || !text)
return 0;
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
}
void
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
{
XGlyphInfo ext;
if (!font || !text)
return;
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
if (w)
*w = ext.xOff;
if (h)
*h = font->h;
}
Cur *
drw_cur_create(Drw *drw, int shape)
{
Cur *cur;
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
return NULL;
cur->cursor = XCreateFontCursor(drw->dpy, shape);
return cur;
}
void
drw_cur_free(Drw *drw, Cur *cursor)
{
if (!cursor)
return;
XFreeCursor(drw->dpy, cursor->cursor);
free(cursor);
}

57
drw.h

@ -0,0 +1,57 @@
/* See LICENSE file for copyright and license details. */
typedef struct {
Cursor cursor;
} Cur;
typedef struct Fnt {
Display *dpy;
unsigned int h;
XftFont *xfont;
FcPattern *pattern;
struct Fnt *next;
} Fnt;
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
typedef XftColor Clr;
typedef struct {
unsigned int w, h;
Display *dpy;
int screen;
Window root;
Drawable drawable;
GC gc;
Clr *scheme;
Fnt *fonts;
} Drw;
/* Drawable abstraction */
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
void drw_free(Drw *drw);
/* Fnt abstraction */
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
void drw_fontset_free(Fnt* set);
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
/* Colorscheme abstraction */
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
/* Cursor abstraction */
Cur *drw_cur_create(Drw *drw, int shape);
void drw_cur_free(Drw *drw, Cur *cursor);
/* Drawing context manipulation */
void drw_setfontset(Drw *drw, Fnt *set);
void drw_setscheme(Drw *drw, Clr *scm);
/* Drawing functions */
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
/* Map functions */
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);

111
dwm.1

@ -10,8 +10,9 @@ and floating layouts. Either layout can be applied dynamically, optimising the
environment for the application in use and the task performed. environment for the application in use and the task performed.
.P .P
In tiled layouts windows are managed in a master and stacking area. The master In tiled layouts windows are managed in a master and stacking area. The master
area contains the window which currently needs most attention, whereas the area on the left contains one window by default, and the stacking area on the
stacking area contains all other windows. In monocle layout all windows are right contains all other windows. The number of master area windows can be
adjusted from zero to an arbitrary number. In monocle layout all windows are
maximised to the screen size. In floating layout windows can be resized and maximised to the screen size. In floating layout windows can be resized and
moved freely. Dialog windows are always managed floating, regardless of the moved freely. Dialog windows are always managed floating, regardless of the
layout applied. layout applied.
@ -19,25 +20,27 @@ layout applied.
Windows are grouped by tags. Each window can be tagged with one or multiple Windows are grouped by tags. Each window can be tagged with one or multiple
tags. Selecting certain tags displays all windows with these tags. tags. Selecting certain tags displays all windows with these tags.
.P .P
dwm contains a small status bar which displays all available tags, the layout, Each screen contains a small status bar which displays all available tags, the
the title of the focused window, and the text read from standard input. A layout, the title of the focused window, and the text read from the root window
floating window is indicated with an empty square and a maximised name property, if the screen is focused. A floating window is indicated with an
floating window is indicated with a filled square before the windows empty square and a maximised floating window is indicated with a filled square
title. The selected tags are indicated with a different color. The tags of before the windows title. The selected tags are indicated with a different
the focused window are indicated with a filled square in the top left color. The tags of the focused window are indicated with a filled square in the
corner. The tags which are applied to one or more windows are indicated top left corner. The tags which are applied to one or more windows are
with an empty square in the top left corner. indicated with an empty square in the top left corner.
.P .P
dwm draws a small border around windows to indicate the focus state. dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-v .B \-v
prints version information to standard output, then exits. prints version information to stderr, then exits.
.SH USAGE .SH USAGE
.SS Status bar .SS Status bar
.TP .TP
.B Standard input .B X root window name
is read and displayed in the status text area. is read and displayed in the status text area. It can be set with the
.BR xsetroot (1)
command.
.TP .TP
.B Button1 .B Button1
click on a tag label to display all windows with that tag, click on the layout click on a tag label to display all windows with that tag, click on the layout
@ -55,7 +58,24 @@ click on a tag label adds/removes that tag to/from the focused window.
.TP .TP
.B Mod1\-Shift\-Return .B Mod1\-Shift\-Return
Start Start
.BR xterm. .BR st(1).
.TP
.B Mod1\-p
Spawn
.BR dmenu(1)
for launching other programs.
.TP
.B Mod1\-,
Focus previous screen, if any.
.TP
.B Mod1\-.
Focus next screen, if any.
.TP
.B Mod1\-Shift\-,
Send focused window to previous screen, if any.
.TP
.B Mod1\-Shift\-.
Send focused window to next screen, if any.
.TP .TP
.B Mod1\-b .B Mod1\-b
Toggles bar on and off. Toggles bar on and off.
@ -78,12 +98,18 @@ Focus next window.
.B Mod1\-k .B Mod1\-k
Focus previous window. Focus previous window.
.TP .TP
.B Mod1\-h .B Mod1\-i
Decrease master area size. Increase number of windows in master area.
.TP
.B Mod1\-d
Decrease number of windows in master area.
.TP .TP
.B Mod1\-l .B Mod1\-l
Increase master area size. Increase master area size.
.TP .TP
.B Mod1\-h
Decrease master area size.
.TP
.B Mod1\-Return .B Mod1\-Return
Zooms/cycles focused window to/from master area (tiled layouts only). Zooms/cycles focused window to/from master area (tiled layouts only).
.TP .TP
@ -97,30 +123,22 @@ Toggle focused window between tiled and floating state.
Toggles to the previously selected tags. Toggles to the previously selected tags.
.TP .TP
.B Mod1\-Shift\-[1..n] .B Mod1\-Shift\-[1..n]
Apply Apply nth tag to focused window.
.RB nth
tag to focused window.
.TP .TP
.B Mod1\-Shift\-0 .B Mod1\-Shift\-0
Apply all tags to focused window. Apply all tags to focused window.
.TP .TP
.B Mod1\-Control\-Shift\-[1..n] .B Mod1\-Control\-Shift\-[1..n]
Add/remove Add/remove nth tag to/from focused window.
.B nth
tag to/from focused window.
.TP .TP
.B Mod1\-[1..n] .B Mod1\-[1..n]
View all windows with View all windows with nth tag.
.BR nth
tag.
.TP .TP
.B Mod1\-0 .B Mod1\-0
View all windows with any tag. View all windows with any tag.
.TP .TP
.B Mod1\-Control\-[1..n] .B Mod1\-Control\-[1..n]
Add/remove all windows with Add/remove all windows with nth tag to/from the view.
.BR nth
tag to/from the view.
.TP .TP
.B Mod1\-Shift\-q .B Mod1\-Shift\-q
Quit dwm. Quit dwm.
@ -138,26 +156,21 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
dwm is customized by creating a custom config.h and (re)compiling the source dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple. code. This keeps it fast, secure and simple.
.SH SEE ALSO .SH SEE ALSO
.BR dmenu (1) .BR dmenu (1),
.SH BUGS .BR st (1)
The status bar may display .SH ISSUES
.BR "EOF"
when dwm has been started by an X session manager like
.BR xdm (1),
because those close standard output before executing dwm.
.P
Java applications which use the XToolkit/XAWT backend may draw grey windows Java applications which use the XToolkit/XAWT backend may draw grey windows
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
JDK 1.6 versions, because it assumes a reparenting window manager. As a workaround JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
you can use JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or you are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
can set the following environment variable (to use the older Motif environment variable
backend instead): .BR AWT_TOOLKIT=MToolkit
.BR AWT_TOOLKIT=MToolkit . (to use the older Motif backend instead) or running
.P .B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
GTK 2.10.9+ versions contain a broken or
.BR Save\-As .B wmname LG3D
file dialog implementation, (to pretend that a non-reparenting window manager is running that the
which requests to reconfigure its window size in an endless loop. However, its XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
window is still respondable during this state, so you can simply ignore the flicker .BR _JAVA_AWT_WM_NONREPARENTING=1 .
until a new GTK version appears, which will fix this bug, approximately .SH BUGS
GTK 2.10.12+ versions. Send all bug reports with a patch to hackers@suckless.org.

2334
dwm.c

File diff suppressed because it is too large Load Diff

@ -0,0 +1,42 @@
/* cc transient.c -o transient -lX11 */
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main(void) {
Display *d;
Window r, f, t = None;
XSizeHints h;
XEvent e;
d = XOpenDisplay(NULL);
if (!d)
exit(1);
r = DefaultRootWindow(d);
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
h.min_width = h.max_width = h.min_height = h.max_height = 400;
h.flags = PMinSize | PMaxSize;
XSetWMNormalHints(d, f, &h);
XStoreName(d, f, "floating");
XMapWindow(d, f);
XSelectInput(d, f, ExposureMask);
while (1) {
XNextEvent(d, &e);
if (t == None) {
sleep(5);
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
XSetTransientForHint(d, t, f);
XStoreName(d, t, "transient");
XMapWindow(d, t);
XSelectInput(d, t, ExposureMask);
}
}
XCloseDisplay(d);
exit(0);
}

@ -0,0 +1,35 @@
/* See LICENSE file for copyright and license details. */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}
void
die(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
} else {
fputc('\n', stderr);
}
exit(1);
}

@ -0,0 +1,8 @@
/* See LICENSE file for copyright and license details. */
#define MAX(A, B) ((A) > (B) ? (A) : (B))
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
void die(const char *fmt, ...);
void *ecalloc(size_t nmemb, size_t size);
Loading…
Cancel
Save