Compare commits

..

838 Commits
3.8 ... master

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 17 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
Anselm R Garbe fbce733532 integrated yiyus clearurgent refactoring 17 years ago
arg@localhost.localdomain e7572804fa reverted spawn 17 years ago
Anselm R Garbe ed1bef1241 Added tag 5.3 for changeset 4004d6116035 17 years ago
Anselm R Garbe 2b047e460b added Neale Pickett's spawn patch, thanks Neale 17 years ago
Anselm R Garbe 5f74dc5e78 applied Gottox' comment fix (thanks) 17 years ago
Anselm R Garbe ea8a4ca46a several changes towards 5.3, XINERAMA is disabled by default, introduced usegrab Bool for grabbing the server during mouse-based resizals/movements (disabled by default), continued debugging tile() with resizehints == True and a lot of terminals supporting resizehints, still no optimal solution, I need to think about it, considering recursive algorithm for the space optimization 18 years ago
Premysl Hruby 4883a06221 removed NOBORDER(broken and badly used), introduce WIDTH/HEIGHT macros for computing client size with border added, fixes bug announced by sergey_m 18 years ago
Anselm R Garbe 4dea5324c0 Added tag 5.2 for changeset e4bcaca8e6ef 18 years ago
Anselm R Garbe 53cac17692 using malloc() instead of calloc() and sticking to static initializer and struct assignment, not using *c = (Client){}; right now to avoid some ugly gcc warning, possibly a gcc bug since we are using -std=c99 18 years ago
Anselm R Garbe 83abfc05eb applied XGetWMNormalHints fix 18 years ago
Anselm R Garbe 862b0d541d I prefer doing the check in showhide 18 years ago
Anselm R Garbe c1c6fdc5d8 applied Donald Chai's showhide patch in slightly modified ways 18 years ago
Anselm R Garbe 9a4d07d9de applied Martin Hurton's checkotherwm simplification 18 years ago
Anselm R Garbe 30410108eb applied Peter Hartlichs aspect revert fix 18 years ago
Anselm R Garbe 753e0e048e applied Gottox' grabkey patch 18 years ago
Anselm R Garbe d15d4ba45a applied yiyus tagbar patch 18 years ago
arg@localhost.localdomain 815f9c054d merged merge 18 years ago
Anselm R Garbe addc52c948 fixed 18 years ago
Anselm R Garbe 26f41c9055 checking result of XGetClassHint, removed some obsolete lines in initfont() 18 years ago
Anselm R Garbe 73ec124ae9 merged my changes 18 years ago
Anselm R Garbe ec11a3470c introduced NOBORDER macro to hide the nasty - 2 * c->bw in various calculations, moved tagset to config.def.h 18 years ago
Premysl Hruby 4b3b597da3 WM_NAME is builtin atom 18 years ago
Anselm R Garbe 288cf78b18 grabbuttons() and grabkeys() are now independent from prior numlockmask initialization 18 years ago
Anselm R Garbe 6411aa921b reverted some resize() changes, reverted setlocale removal 18 years ago
Anselm R Garbe db5db8806f applied Peter Hartlich's patch regarding aspect calculation with slight modifications 18 years ago
Anselm R Garbe 258c338030 removed artifact from wmii 18 years ago
Anselm R Garbe 85da537856 changed grabkeys, removed initmodmap 18 years ago
Anselm R Garbe 2b4157eccd applied Peter Hartlich's initmodmap patch 18 years ago
Premysl Hruby 0f26de991f applied fix of toggletag by Jan Kaliszewski 18 years ago
Anselm R Garbe 840f937a98 Martin Hurtons typo fix 18 years ago
Anselm R Garbe 6975a7e31a fixed error I did when applying Martin Hurton's drawtext patch 18 years ago
Anselm R Garbe 47f63dce55 applied Martin Hurtons resizemouse patch 18 years ago
Anselm R Garbe 02a8ca95cf applied Martin Hurton's movemouse() patch 18 years ago
Anselm R Garbe 2ce50a9cad using None instead of 0 for trans 18 years ago
Anselm R Garbe bfa5869da1 abc... 18 years ago
Anselm R Garbe 087a55f8d3 removed the i = textnw... as remarked by Martin Hurton 18 years ago
Anselm R Garbe 6d7285fd6e applied Martin Hurton's scan() patch with slight modifications 18 years ago
Anselm R Garbe 69c7b4b0ba changed order of variables in drawtext 18 years ago
Anselm R Garbe 97699e5b1b applied Martin Hurton's drawtext() patch 18 years ago
Anselm R Garbe 2dc7f42fd7 applied Martin Hurton's view() simplification, not checking arg 18 years ago
Anselm R Garbe 9f3a5cb754 making a comment more explicit 18 years ago
Anselm R Garbe b48fa3f101 removed setlocale() stuff, not necessary if Xmb in use 18 years ago
Anselm R Garbe 051a404b66 added a comment about FAQ regarding mfact meaning 18 years ago
Anselm R Garbe d8d733c34f added some comments regarding FAQ about s{x,y,w,h}, w{x,y,w,h}, b{y,h,lw} 18 years ago
Anselm R Garbe bb01e5a16f initialize trans with 0 18 years ago
Premysl Hruby 06f7eed103 fix of XGetTransientForHint in manage() 18 years ago
Premysl Hruby 0ffa6d1393 applied cleanup from M. Hurton and S. Nagy 18 years ago
Premysl Hruby 15ce143620 fixes using arg->i instead of arg->ui 18 years ago
anselm@anselm1 63d7190231 applied Johannes Hofmann's patch, please test 18 years ago
Anselm R Garbe b279cef670 made readin a config.h variable 18 years ago
Anselm R Garbe 6254ef9dc7 Added tag 5.1 for changeset ce355cea9bb8 18 years ago
Anselm R Garbe 4a2902efe4 forcing fullscreen windows to bw=0, though most fullscreen apps are broken anyways 18 years ago
Anselm R Garbe 6fad4c49f1 potential crash fix if xinerama behaves broken, though I doubt it 18 years ago
Premysl Hruby 78f0f8595f make hg tip compilable with default config 18 years ago
Anselm R Garbe 7ecadcee39 local use of xidx is useless, got rid of it, falling back to screen 0 if pointer query fails for whatever reason 18 years ago
Anselm R Garbe c86ed46a1b got rid of compile time xidx configuration, querying mouse pointer instead 18 years ago
Anselm R Garbe 9086f98068 reverted uint redefinition 18 years ago
anselm@aab 9aa4a9043d applied anydot's urgency hint patch, thanks! 18 years ago
Anselm R Garbe d5893f55be renamed eprint die 18 years ago
Anselm R Garbe f529d41ca1 simplified detach() 18 years ago
Anselm R Garbe 45768ee04b removed aux* stuff from Client 18 years ago
Anselm R Garbe a6d23fb61c removed useless comment 18 years ago
Anselm R Garbe bf76cefe47 minor fix to view() 18 years ago
Anselm R Garbe 9bb0f20515 applied Frederik Ternerot's grabbuttons patch with slight modifications 18 years ago
Anselm R Garbe 2431ae7df7 locale update 18 years ago
Anselm R Garbe 829b6b57e7 removed useless characters 18 years ago
Anselm R Garbe 7b4c512e62 applied James Turner's dwm.1 patch, thanks James! 18 years ago
Anselm R Garbe 7f7c3140a9 fix of monocle 18 years ago
Anselm R Garbe 277155cf77 another merge 18 years ago
Anselm R Garbe 0c38ec7cd6 does this fix anything? 18 years ago
Anselm R Garbe deef4c9bfd fixed Gottox' buttonpress/ClkTagBar code 18 years ago
Anselm R Garbe b86c818599 applied Gottox' ClkTagBar patch 18 years ago
Anselm R Garbe c2a916bf30 made arrange again like it was once 18 years ago
Anselm R Garbe 2bd46d1ce6 fix 18 years ago
Anselm R Garbe 6e0ce46365 use sel instead of seeking the list 18 years ago
Anselm R Garbe c853d5e9bb resize should apply if !banned 18 years ago
Anselm R Garbe 31da0b7525 applied Gottox patch 18 years ago
Anselm R Garbe 12ea925076 untested monocle 18 years ago
Anselm R Garbe 79ecbeca7e non-zero 18 years ago
Anselm R Garbe cf98ea2a9c Added tag 5.0 for changeset 06eb9644e2da 18 years ago
Anselm R Garbe d8fad9bf7a branch merge 18 years ago
Anselm R Garbe f25cc5678f tiled layout resizehints should be respected by default 18 years ago
Anselm R Garbe 5a92420fce restored y-coordinate fixing of client windows 18 years ago
arg@suckless.org ae1d865ac0 s/tags ref/tags mask/ 18 years ago
Anselm R Garbe 1ce173402f updated man page regarding Mod1-m 18 years ago
Anselm R Garbe a06b9193c7 minor fixes towards 5.0 18 years ago
Anselm R Garbe 43bb77a569 removed explicit warp in movemouse 18 years ago
Anselm R Garbe e3da222c1e removed scroll-wheel based focussing on window title clicks 18 years ago
Anselm R Garbe 66608a60fe fix of swapped focusstack mouse buttons 18 years ago
Anselm R Garbe b6aa84e51b removed the ButtonPressMask for root windows as well 18 years ago
Anselm R Garbe 9ff5143acb removed root window click handling 18 years ago
Anselm R Garbe 1edf6a7866 removed font and color definitions 18 years ago
Anselm R Garbe 4db2f44277 minor fix 18 years ago
Anselm R Garbe 1f1a132784 fixed tag click handling, however ClkRootWin doesn't work for me 18 years ago
Anselm R Garbe 512541bfbd update 18 years ago
Anselm R Garbe 709da0b858 some bugfixes of the patch application yesterday 18 years ago
Anselm R Garbe 5cd65f8cd8 integrated yiyus mouse.diff (though the bar click handling is slightly broken, I'm to tired to debug it now, yiyus could you please?) 18 years ago
Anselm R Garbe e3838e8585 made Xinerama screen index customizable 18 years ago
Anselm R Garbe 016dca4f69 removed trailing spaces reported by Soleen 18 years ago
Anselm R Garbe 8f052596b2 crash fix 18 years ago
Anselm R Garbe 9463d5354b made lt visible again in config.def.h 18 years ago
Anselm R Garbe d662f98d89 added nsz' patch 18 years ago
Anselm R Garbe e5a965a274 added SHCMD support for pipe-based commands due the new spawn() versio 18 years ago
Anselm R Garbe 5d422bb1ce using foo layout during cleanup (suggested by Gottox), add Arg->v handling for togglelayout() suggested by anydot 18 years ago
Anselm R Garbe 38a43c2dcc lt will point to a foo-layout during cleanup now (Gottox' suggestion), and togglelayout respects Arg->v 18 years ago
Anselm R Garbe c56533615f integrated Peter Hartlich's patch, removed const char *c from union, simplified togglelayout 18 years ago
Anselm R Garbe a8e0772c4d applied anydot's patchset.diff 18 years ago
arg@suckless.org 98e7950be8 final version -- Gottox verified it using the test driver 18 years ago
arg@suckless.org 88e6eb4a3a revert of introduced problem 18 years ago
arg@suckless.org 0840c1367c applied nsz' textnw patch thank you 18 years ago
arg@suckless.org 077d3e435b updated the for-loop with Gottox' proposal 18 years ago
arg@suckless.org d26b60b43e minor change 18 years ago
arg@suckless.org 32f36ab2d5 applied nsz's patches (many thanks!) 18 years ago
arg@suckless.org 08bcf721b4 small change to drawtext 18 years ago
Anselm R Garbe fc578c57e4 fixed the tile() issue with xpdf 18 years ago
Anselm R Garbe c8eaab21b6 using anydot's memcpy-approach in drawtext, however it still looks awkward to me 18 years ago
Anselm R Garbe c26e22ccee Gottox' drawtext simplification 18 years ago
Anselm R Garbe c2784e4a38 applied noviewprev.diff, fix.diff and unusedflags.diff 18 years ago
Anselm R Garbe 6e9387793b fix 18 years ago
Anselm R Garbe 92f3c181c3 lt->arrange in mfact 18 years ago
Anselm R Garbe d589f7679a isfixed implies isfloating 18 years ago
Anselm R Garbe 75690c808d applied nibbles fixes, slightly modified 18 years ago
Anselm R Garbe fde58d5e63 applied yiyus tip patch from tue 18 years ago
Anselm R Garbe e1002745fa core dump fix in cleanup 18 years ago
Anselm R Garbe 940a4cc6c6 updated the initial comment to reflect the use of bit arrays 18 years ago
Anselm R Garbe 64243ab05b slight changes 18 years ago
Anselm R Garbe 32c5046635 removed bx and bw, unnecessary 18 years ago
Anselm R Garbe 6c8618f502 renamed domax into ismax 18 years ago
Anselm R Garbe 9189f7a12d simplified tile() 18 years ago
Anselm R Garbe 2d4faae522 removed Layout->updategeom, unnecessary 18 years ago
Anselm R Garbe 5d2385b636 removed TEXTW 18 years ago
Anselm R Garbe 0fe2e783e9 applied yiyus domax patch with slight modifications 18 years ago
Anselm R Garbe cd3d83f571 replaced isvisible with a macro 18 years ago
Anselm R Garbe 0a9ef560c0 removed emallocz 18 years ago
Anselm R Garbe 0528a37c79 s/int/uint/ in config.h 18 years ago
Anselm R Garbe 56b2fece9e removed debug output, sanitized tag limit check 18 years ago
Anselm R Garbe 9f569fac74 setmfact argument was wrong 18 years ago
Anselm R Garbe 48d0c56eac Key.mod is uint, Client.[old]bw is int 18 years ago
Anselm R Garbe 825d6cb93a s/unsigned long/ulong/ 18 years ago
Anselm R Garbe f852504014 s/nextunfloating/nexttiled/, changed zoom() behavior 18 years ago
Anselm R Garbe c3fa9e879f s/unsigned int/uint/ 18 years ago
Anselm R Garbe 8e05f6c592 s/void */const void */ 18 years ago
Anselm R Garbe 39d1ecd5b0 applied Gottox bitmask + void *arg patch 18 years ago
anselm@anselm1 103fb58a44 some minor fixes 18 years ago
anselm@anselm1 5f55af40ae simplification 18 years ago
anselm@anselm1 f806a17692 reverted dist target in Makefile 18 years ago
anselm@anselm1 822101dd5b merged tile.c again into dwm.c 18 years ago
Anselm R Garbe 6bdef73a4f take bar into account 18 years ago
Anselm R Garbe 234b12eb73 be more polite to clients which like to appear outside the window area, but still on the screen 18 years ago
Anselm R Garbe bd4deaebfc fixed comment 18 years ago
Anselm R Garbe 499315c22c fix 18 years ago
Anselm R Garbe f22d047d41 make it easier for the user, if Xinerama support is given, always use the screen 0 as window area/bar area, everything else can be used for floating clients 18 years ago
Anselm R Garbe 4a5c8d84db improving space usage if master is left of stack (default) 18 years ago
Anselm R Garbe 71365a524f only snap within window area 18 years ago
Anselm R Garbe 3afca3e6a1 s/DEFGEOM/CUSTOMGEOM/ 18 years ago
Anselm R Garbe bdc80bdad6 update 18 years ago
Anselm R Garbe 64707da963 updatetilegeom should be fine for setmfact 18 years ago
Anselm R Garbe 549726869b recent changes, introduced togglebar, changed some defines into variable declarations where possible 18 years ago
Anselm R Garbe 42cb2bd3be new stuff 18 years ago
Anselm R Garbe 585294ce0f removed the <M> togglelayout call 18 years ago
Anselm R Garbe a864a82b34 s/tilegeom/updatetilegeom/ 18 years ago
Anselm R Garbe bd67a82fb5 removed monocle for now 18 years ago
Anselm R Garbe 14d8d828ab removed the exact focus mechanism of next/prev window 18 years ago
Anselm R Garbe 4246affc15 moved all tile()-related stuff into tile.c which is included from config.def.h, the default dwm is now nearly independent from the arrange() algorithm in use 18 years ago
Anselm R Garbe 42c4b31003 removed tileh, renamed tilev into tile again, removed counttiles, tilemaster 18 years ago
Anselm R Garbe a785a0d712 removed Layout->isfloating 18 years ago
Anselm R Garbe 489ac07e83 removed reapply() -- unnecessary 18 years ago
Anselm R Garbe 349d768b57 renamed setlayout into togglelayout 18 years ago
Anselm R Garbe 6dfa7cac56 removed temporary wildcard handling 18 years ago
Anselm R Garbe 71681c21a5 added wild-card handling for tags 18 years ago
Anselm R Garbe 704781875c applied nsz's another style patch 18 years ago
Anselm R Garbe d7cc0f6416 applied nsz's style.diff patch 18 years ago
Anselm R Garbe 6b79f3f326 just added a comment 18 years ago
Anselm R Garbe 446fa8c671 minor fixes 18 years ago
Anselm R Garbe fa244aa7fb having monocle on Mod1-m 18 years ago
Anselm R Garbe 7ac4f8a4af hotfix 18 years ago
Anselm R Garbe 7eb26288fc removed Geom stuff, introduced updategeom() again, still view is somewhat broken? 18 years ago
Anselm R Garbe 93a4fe1052 cleaned up config.def.h 18 years ago
Anselm R Garbe 5602f44b29 implemented exact focus next, if arg != NULL to focus{next,prev} 18 years ago
Anselm R Garbe b848f4bda8 applied the proposal by nsz 18 years ago
Anselm R Garbe 86c4797f2c applied JUCE patch 18 years ago
Anselm R Garbe c094ed2473 simplification of view() as proposed by anydot 18 years ago
Anselm R Garbe bfd6079a15 applied yiyus tagset patch 18 years ago
Anselm R Garbe 7f70d90219 applied yiyus fgeom patch 18 years ago
Anselm R Garbe 858251de46 applied dfenze drawtext simplifications 18 years ago
anselm@anselm1 d26c28c1e7 this is the correct way 18 years ago
anselm@anselm1 b6335776e4 copyright notice is in LICENSE 18 years ago
anselm@anselm1 c059625128 applied Ph's seltags-simplification with some modifications 18 years ago
anselm@anselm1 874837f653 applied Ph's MIN/MAX patch, nice work! 18 years ago
anselm@anselm1 5fa559dbfc applied Ph's patch regarding geom and lt initialization 18 years ago
anselm@anselm1 146ff227fe applied Gottox' applyrules() fix 18 years ago
Anselm R Garbe bb0a328978 geometry fix proposed by Jukka 18 years ago
Anselm R Garbe 721b208478 applied applyrules-fix by Jukka, thank you Jukka! 18 years ago
Anselm R Garbe 6229ed20c2 fix 18 years ago
Anselm R Garbe 940240e5e6 applied the proposed monocle patch from the mailinglist 18 years ago
Anselm R Garbe 08c596ed10 next version is 5.0 18 years ago
anselm@anselm1 9ce6abb95c Added tag 4.9 for changeset 22c669b2dd36 18 years ago
Anselm R Garbe 0e21794e02 yet another cleanup 18 years ago
Anselm R Garbe d477fb6927 some cleanup changes 18 years ago
anselm@anselm1 3d6630b7d2 uncommented dual layout in preparation of dwm 4.9 18 years ago
anselm@anselm1 c982bb1389 applied Peter Hartlich's simplification patch of setmfact and his revival of MFACT, appliead Janness Hofmann's simplification of grabbuttons() -- thanks guys! 18 years ago
Anselm R Garbe 6cf73e706a aspects hints seem broken for fullscreen apps 18 years ago
Anselm R Garbe a520ba3c0b removed uneccessary line 18 years ago
Anselm R Garbe 0c71b16b92 bugfix 18 years ago
Anselm R Garbe 00c28a7ef2 setmfact should not have any effect if in floating layout 18 years ago
Anselm R Garbe 5a3a2d6b63 minor fix 18 years ago
Anselm R Garbe a355782a77 revival of mfact and setmfact 18 years ago
Anselm R Garbe 20cd336087 setlayout and setgeom are now togglable again 18 years ago
Anselm R Garbe a6a216f28c geom indicator and layout indicator is only displayed if there are several geoms/layouts 18 years ago
anselm@anselm1 2c2063bc75 hotfix of idxoftag 18 years ago
anselm@anselm1 e6ede461a9 blw/bgw calculation bugfix 18 years ago
Anselm R Garbe 6877205e9d updated configurenotify 18 years ago
anselm@anselm1 fb5f99d935 minor bugfix in applyrules 18 years ago
Anselm R Garbe 7ebab7533a added sample of {grow,shrink}master to config.def.h 18 years ago
Anselm R Garbe 9fa5ca3538 renamed c->border into c->bw, fixed monocle to subtract c->bw from each h/w value 18 years ago
Anselm R Garbe fe6b0c0fc1 geoms are now drawed in the status bar 18 years ago
Anselm R Garbe aa2395b6a8 removed the string-based setgeom approach, introduced a new Geom type instead and a helper macro 18 years ago
Anselm R Garbe dba22848c7 made the string-based setgeom working 18 years ago
Anselm R Garbe 33b1960220 some experimental state DO NOT USE THIS, I plan to have a nicer interface to change geometries 18 years ago
Anselm R Garbe e237b2a76f some changes towards 4.9 18 years ago
Anselm R Garbe dd9ee6d248 Added tag 4.8 for changeset 607015ddb091 18 years ago
Anselm R Garbe 1380569133 removed the comment again 18 years ago
Anselm R Garbe 831428b00c some polishing in tileh/tilev 18 years ago
Anselm R Garbe 69439715c0 minor bugfix 18 years ago
Anselm R Garbe f2e98f48fb added a new comment 18 years ago
Anselm R Garbe c19d4b2930 some cleanup 18 years ago
Anselm R Garbe f77a3d0a62 updated my geoms function 18 years ago
Anselm R Garbe 8aa1533879 update 18 years ago
Anselm R Garbe 2fc9cffdeb set layout already here 18 years ago
Anselm R Garbe 3c5b6f03ba well I use a different default tile 18 years ago
Anselm R Garbe 02673538bc added updatebarpos() 18 years ago
Anselm R Garbe 95eae7b9d2 removed all defines of geoms, implemented setgeoms() instead, added config.anselm.h to show how I'd like to see that people edit their geoms 18 years ago
Anselm R Garbe 59107755c8 some polishing 18 years ago
Anselm R Garbe d05d09b205 updated dwm(1) 18 years ago
anselm@anselm1 47b1974446 added bx, by, bw, wx, wy, ww, wh, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh ad variables 18 years ago
Anselm R Garbe 247ba66c08 changed config.def.h 18 years ago
Anselm R Garbe d7b074fcce new stuff 18 years ago
Anselm R Garbe c9170189bf implemented setlayout in the way proposed on the ml, split tile() into two functions, a third will follow soon 18 years ago
Anselm R Garbe f7a45ff28b allow for vstack 18 years ago
Anselm R Garbe add7df6e9b added some comments what the TODOs are for 4.8 18 years ago
Anselm R Garbe 3a79b82721 changed config.def.h 18 years ago
Anselm R Garbe b31b430592 integrated the new -x -y -w toggles of dmenu into my setup 18 years ago
Anselm R Garbe 88c8ead3e8 removed some more useless clunk 18 years ago
Anselm R Garbe 2e95837220 implemented the stuff as I discussed on dwm@ 18 years ago
Anselm R Garbe 5d9ae3f3b7 fixed urgent hint handling 18 years ago
Anselm R Garbe 2e38296edd renamed maximise to monocle again. 18 years ago
Anselm R Garbe 59aa02a075 fixed urgency hint, though Xinerama integration is still ongoing 18 years ago
anselm@anselm1 e3c2d327f6 next on TODO 18 years ago
anselm@anselm1 295ad21092 renamed MAXLEN into MAXTAGLEN (backward compliance) 18 years ago
anselm@anselm1 39af3c2607 renamed monocle into maxmise, documented the keybindings in dwm(1) 18 years ago
Anselm R Garbe 96ee9d888c monocle goes mainstream 18 years ago
Anselm R Garbe a82cba2759 fixed applyrules bug 18 years ago
anselm@anselm1 f7c097e802 removed View cruft, now back to the roots 18 years ago
Anselm R Garbe da1b3fa437 made tag names snappier 18 years ago
anselm@anselm1 ad0a2fa042 fixed some issues nsz reported in IRC log 18 years ago
anselm@anselm1 9804726c82 well, AIM_XINERAMA should not be enabled 18 years ago
anselm@anselm1 7bc272a4e4 made the basics of the tagging concept working -- if people want dynamic tags, that's even possible with this concept, the vtags[] array needs to be modified during runtime for this -- the new code is quite experimental, ugly and needs polishing 18 years ago
anselm@anselm1 f1719ac2de removed initags -- we autoselect the first tag in each view instead 18 years ago
Anselm R Garbe d99ec61482 a small fix to buttonpress 18 years ago
Anselm R Garbe 2f70a14ee1 some more changes towards a better dwm 18 years ago
anselm@anselm1 00ca643bd7 proceeded, though we still miss a real Tag struct 18 years ago
anselm@anselm1 0271ac0ed7 disabled AIM_XINERAMA 18 years ago
anselm@anselm1 d5178292ed simplified dwm 18 years ago
anselm@anselm1 2bfd3fffbf certain fixes, though still a lot of the mutex stuff missing 18 years ago
anselm@anselm1 a3d8c05a95 pushing my changes of tonight upstream (hg tip is NOW very UNSTABLE -- but those changes are necessary to get a decent multihead support) -- I renamed Monitor into View, to reflect in a better way the dwm terminology of the past 18 years ago
anselm@anselm1 fd01413fae fixed Gottox' mail address 18 years ago
Anselm R Garbe d6e24f7116 well typo fix 18 years ago
Anselm R Garbe c43d7b7587 added Gottox to Copyright holders after all his contributions, applied his last patch 18 years ago
Anselm R Garbe de5b294edc some other fixes, resize contains a minor bug 18 years ago
Anselm R Garbe 8e0f8ffcc6 crash fix 18 years ago
Anselm R Garbe dd21823536 made arrange() Monitor-dependent as well, fixed the movemouse/resizemouse issues 18 years ago
Anselm R Garbe 9cb9c32ee7 minor 18 years ago
Anselm R Garbe 4076e2ff60 applied Gottox' monitor.diff patch (thanks btw) 18 years ago
Anselm R Garbe 55edd2d6ec made restack, drawbar also Monitor-related only 18 years ago
Anselm R Garbe 2e8e5509d9 changed arrange functions to contain the Monitor as first argument 18 years ago
Anselm R Garbe 4426032450 applied Jukka's zoom-patch 18 years ago
Anselm R Garbe e0f0397896 resize handles offscreen issues 18 years ago
Anselm R Garbe ca3e847e45 applied some necessary changes 18 years ago
Anselm R Garbe c2737b7b93 removed Monitor->dc, unnecessary 18 years ago
Anselm R Garbe 191cb9ce28 removed Monitor->root, since we do not support classical multihead 18 years ago
Anselm R Garbe 6ab163c695 some drawbar() polishing, and certain related fixes 18 years ago
Anselm R Garbe e8244395e4 urgency hook handling needs also to invert the square if present 18 years ago
Anselm R Garbe 954db46bac Chris pointed me to the fact, that the window geoms calculation can be done once for each monitor, so I applied this remark 18 years ago
Anselm R Garbe 508922b90d fixed missing else branch 18 years ago
Anselm R Garbe 4adfdc9d95 applied dme's patch to prevent changing prevtags if nothing actually changed 18 years ago
Anselm R Garbe c619363d15 applied dwm-4.8-snaptileds.diff 18 years ago
anselm@aab 012710a3ce implemented urgent hint handling (with multihead support) 18 years ago
anselm@aab c2c54cc0fa got initial Xinerama support working, though there is a lot work todo 18 years ago
anselm@anselm1 a62630ae92 some more polishing/consistency changes 18 years ago
anselm@anselm1 62b18fb9d4 proceeded with multihead/Xinerama support 18 years ago
anselm@anselm1 e0d6451086 removed maximize, there will be monocle soon 18 years ago
anselm@anselm1 7a496e9777 fixed wrong tagging stuff 18 years ago
anselm@anselm1 308f95ae5a added dmenu_run to config.h 18 years ago
anselm@anselm1 40a734bca9 root window and screen have to be in Monitor struct, we want side-by-side Xinerama and Multihead support (only Xinerama when enabled and present) 18 years ago
anselm@anselm1 985e330524 merged Christof Musik's Xinerama support patches, though this needs some polishing! 18 years ago
Anselm R. Garbe 5f19423c7b simplified Mod-m 18 years ago
Anselm R. Garbe d66ad1457e implemented reapply for re-applying the tagging rules during runtime, Mod-r 18 years ago
Anselm R. Garbe 8497f9f781 next version will be 4.8 18 years ago
Anselm R. Garbe 91bb749e97 Added tag 4.7 for changeset d6d3085307d8 18 years ago
Anselm R. Garbe 68ff133857 fixed focus steeling bug done by clients like opera 18 years ago
Anselm R. Garbe 4380db468a removed support for the NetSupportingWmCheck stuff, netbeans, argouml and others also don't work with compiz, so it is Suns problem to provide a fix 18 years ago
Anselm R. Garbe 123a565bb9 yeah compiz didn't did the trick, but identifying dwm as LookingGlass (LG3D) 18 years ago
Anselm R. Garbe d0e0505301 foo 18 years ago
Anselm R. Garbe 762b66ae7c hack that adds NET_SUPPORTING_WM_CHECK handling, dwm identifies itself as compiz, hence I believe this might workaround the JDK 1.6+ XToolkit bug 18 years ago
Anselm R. Garbe cb4951dd54 applied Ritesh's patch to stext handling with some minor modifications 19 years ago
Anselm R. Garbe 667da18b31 initialize prevtags in setup, now users can setup which seltags should be selectedin config.h 19 years ago
Anselm R. Garbe e9a0733506 Using a new tags definition (const char [][MAXTAGLEN] - thanks go to Szabolcs! 19 years ago
arg@suckless.org 198502f41d moved LENGTH to dwm.c, moved prevtags to dwm.c 19 years ago
Anselm R. Garbe 35efafe8ac we check variable == value, and not the other way - the other way is for beginner programmers. 19 years ago
Anselm R. Garbe 951d022dfc removed a misleading comment about client title windows, which don't exist anymore 19 years ago
Anselm R. Garbe 54bde0f9d7 full names in -v output of dwm 19 years ago
Anselm R. Garbe 260a55ef62 doing it in a shorter way 19 years ago
Anselm R. Garbe 0e98090d65 removed fgets usage, increment offset until a line is read, dwm will drop all lines read in one call, except the first!!! one (previously it preferred the last) - but the current approach is simplier and works better for general purpose in conjunction with the offset handling 19 years ago
Anselm R. Garbe af4667a85a simplified 19 years ago
Anselm R. Garbe a98b5e5935 made error handling more proper 19 years ago
Anselm R. Garbe b8985dc7bb replaced low-level stext reading with an fgets call 19 years ago
Anselm R. Garbe 6f60b2e1cd revival of RESIZEHINTS 19 years ago
arg@suckless.org 3033d45d1c sanders patch for b2 toggle 19 years ago
Anselm R. Garbe 34e7872c89 replaced Nmacros with LENGTH(x) macro 19 years ago
Anselm R. Garbe c36f7c3c5e replaced ISTILE with domwfact/dozoom bools, removed nrules, nlayouts and ltidx, added NRULES, NLAYOUTS and Layout *layout as alternatives, removed isarrange(), checking against layout->arrange instead. 19 years ago
Anselm R. Garbe 3fd39feb41 some sanity changes 19 years ago
Anselm R. Garbe 93eee247ca going toward 4.7 19 years ago
Anselm R. Garbe d5e8edcbcb Added tag 4.6 for changeset bcd7e18e196a 19 years ago
arg@suckless.org 13577b15e5 fixed a comment 19 years ago
Anselm R. Garbe 5473e763f6 also consider width for tile fallback enforcing 19 years ago
arg@suckless.org cdd6c3e820 removed RESIZEHINTS and enhanced tile for fixed or aspect-ratio'ed clients 19 years ago
arg@suckless.org 29f2b15ddc some cleanup, removed ntags variable, defined NTAGS macro, simplified tag(), view() and idxoftag(), fixed some NULL comparisions 19 years ago
arg@suckless.org 7b65b763bc parenthized use of ISTILE macro in dwm.c 19 years ago
arg@suckless.org e94774dd69 thx to Toni Lainson 19 years ago
arg@suckless.org af0034f3a5 fixed two comments 19 years ago
arg@suckless.org cd7ebaad25 removed dwm.h, just include C-files in config.h if you extend dwm, that's simplier and most flexible than all other possibilities 19 years ago
arg@suckless.org 8dc03d6e6b small cosmetic fix 19 years ago
arg@suckless.org 1dcb18c124 uncommented DEBUG CFLGAS/LDFLAGS 19 years ago
arg@suckless.org 206eb344e2 just making dwm.h saner 19 years ago
Anselm R. Garbe 04de5720e6 applied Eric Mertens patch to mainstream dwm, however this needs testing 19 years ago
Anselm R. Garbe 5a04edecb1 cleaned up dwm.c/dwm.h somewhat that it allows easier integration of patches 19 years ago
Anselm R. Garbe 24c125cc8a small comment 19 years ago
Anselm R. Garbe 0453c1d180 recreated dwm.h 19 years ago
Anselm R. Garbe 0b5c14cf59 added Mod1-Tab description to dwm.1 19 years ago
Anselm R. Garbe a73de0cff4 added antoszka's viewprev patch with some minor modifications, restored Client->tags as Bool *, however kept the static initialization of ntags and seltags (prevtags) - this seems to be the best compromise 19 years ago
Anselm R. Garbe eeea4ef583 applied Brandon MacDone's static initialization patch for seltags and Client->tags 19 years ago
Anselm R. Garbe 883e09b2eb removing NULL-terminating **tags definition in config.h 19 years ago
Anselm R. Garbe 7e25897f11 removed two spaces reported by Soleen 19 years ago
Anselm R. Garbe 95091dcad4 reverted Peters patch to tile, I will discuss the reasons at dwm@ 19 years ago
Anselm R. Garbe 57676994ea s/xterm/uxterm/ 19 years ago
Anselm R. Garbe 60adbab726 added hint for downloading dextra 19 years ago
Anselm R. Garbe c3eca4d14f fixed font definition 19 years ago
Anselm R. Garbe d1f4fbb469 fixed man page 19 years ago
Anselm R. Garbe 635b64384d fixed an issue in Peter's patch (it is no good idea to restack() all clients on enternotify() 19 years ago
Anselm R. Garbe bedbe59aaa applied Peter Hartlich's border collapse patch 19 years ago
Anselm R. Garbe 3f3086f8b8 improved tile() for the RESIZEHINTS == True case, now more space is consumed by the clients (esp. if those clients use increment handling heavily) 19 years ago
Anselm R. Garbe f92a4e45c4 fixed colors 19 years ago
arg@suckless.org 2fc8a13588 fixed inclusion order 19 years ago
Anselm R. Garbe 63725004f5 updated with my favorite colorscheme 19 years ago
Anselm R. Garbe e9348dcaca applied colors depend from lavishs proposal 19 years ago
Anselm R. Garbe fa857b2896 switching to white normal bg, renaming tag 9 into www, for static use in conjunction with ff 19 years ago
Anselm R. Garbe c77663fcb4 btw 4.6 will be the next release 19 years ago
Anselm R. Garbe 17d39ee014 renamed config.h into config.def.h, config.h will be created if not present, this seems less annoying after all 19 years ago
Anselm R. Garbe 8d1810c85b introduced ISTILE, which can be easily extended with other layout functions to allow reuse of setmwfact() and zoom() 19 years ago
Anselm R. Garbe 60444daa70 setmwfact and zoom check isarrange(floating) now, not !isarrange(tile) - this makes it easier to play well with bstack and nmtile patches 19 years ago
Anselm R. Garbe b0477c3017 Added tag 4.5 for changeset 2acc60d6dfe2 19 years ago
Anselm R. Garbe 24dae7d7e3 cosmetic fix 19 years ago
Anselm R. Garbe fa1ce22bc4 fixed a comment 19 years ago
arg@suckless.org 1fafcb1820 applied Peters patch, applied yiyus hint to initfont 19 years ago
Anselm R. Garbe 08c2d92480 applied Peter Hartlich's togglemax patch to allow toggling tiled clients to maximum 19 years ago
arg@suckless.org fe2775a15b made all stuff non-static - so you can choose wether to use dwm the static or the extern way when extending it 19 years ago
Anselm R. Garbe 01022b95d6 there might be envs which need Xlib.h 19 years ago
Anselm R. Garbe b2f276b0f9 Mod1-Button2 on a floating but not-fixed client will make it tiled again 19 years ago
Anselm R. Garbe d1ce3eac33 now tiled windows can be resized/moved, their floating state will be toggled implicitely 19 years ago
Anselm R. Garbe 9449ea3e00 some more rearrangements 19 years ago
Anselm R. Garbe 49197fe4bf ordered all functions alphabetically 19 years ago
Anselm R. Garbe 11cfff2dae corrected a misleading comment 19 years ago
Anselm R. Garbe a026617c65 macros which have been defined in config.h can only be used at function level, however you can nest code into config.h now for implementing a different layout (just for example), eg. #include "supertile.c" 19 years ago
Anselm R. Garbe a6df995b5d ordered function forward definitions 19 years ago
Anselm R. Garbe e041ff70b0 backporting my intro-comment of old dwm.h 19 years ago
Anselm R. Garbe 2d7bb8d7c9 removed grabkeys, not necessary 19 years ago
Anselm R. Garbe 0235a84ef2 micromizing dwm step 1 19 years ago
Anselm R. Garbe 2091200c95 new colorscheme (16-bit compliant) 19 years ago
Anselm R. Garbe 7e476fb86b moved bar-related stuff to bar.c (merged draw.c into that) 19 years ago
Anselm R. Garbe 9800518ae3 renamed drawstatus into drawbar 19 years ago
Anselm R. Garbe 5d831eaa94 renamed config.default.h into config.h 19 years ago
Anselm R. Garbe e0a6dee30d dist target only needs to add config.default.h 19 years ago
Anselm R. Garbe 73e2aba341 removed config.arg.h, only 1 config.h necessary 19 years ago
Anselm R. Garbe 9f88fd093c small changes of the colors 19 years ago
Anselm R. Garbe 0e515a06c8 other color 19 years ago
Anselm R. Garbe c4b3c0d979 using light colorscheme, preparing merge of config.arg.h with config.default.h 19 years ago
Anselm R. Garbe f3a5116248 I work with enabled RESIZEHINTS, simply because I force myself to continue the st development ;) 19 years ago
Anselm R. Garbe ae760f3f38 introduced new define RESIZEHINTS, which allows to enable/disable size hint handling in tiled resizals 19 years ago
Anselm R. Garbe 169d96ae8f 14px fonts drives me nuts 19 years ago
Anselm R. Garbe f651435061 Added tag 4.4.1 for changeset 7c117df5d202 19 years ago
Anselm R. Garbe a92cf496c1 prepared 4.4.1 bugfix and minor feature enhancement release 19 years ago
Anselm R. Garbe cc7970010b Added tag 4.4 for changeset 408014d21261 19 years ago
Anselm R. Garbe 67a1141f44 removed unnecessary include, prepared dwm-4.4 19 years ago
Anselm R. Garbe 8be3f3ec9e setlayout should perform strcmp's if arg != NULL, because Layout is local to screen.o 19 years ago
Anselm R. Garbe 5762e92994 reverted release CFLAGs 19 years ago
Anselm R. Garbe 36672d0401 removed the _DWM_PROPERTIES handling, reverted ban/unban to XMoveWindow(), and changed argument of setlayout to layout[N].symbol check 19 years ago
Anselm R. Garbe b18e684015 renamed char prop[] into buf[] 19 years ago
Anselm R. Garbe fc109ea8f7 fixed misappearance of iconified windows on SIGKILL 19 years ago
Anselm R. Garbe b975c47280 moved updatebarpos to screen 19 years ago
Anselm R. Garbe 47765f7286 added screen.c, removed layout.c and tag.c 19 years ago
Anselm R. Garbe 96d7fe16ea prepared merging layout.c and tag.c into screen.c 19 years ago
Anselm R. Garbe 78d1a22d4e small fix 19 years ago
Anselm R. Garbe 0c60620410 hmm I doubt the usefulness of storing this information... 19 years ago
Anselm R. Garbe 50be6c8b67 cleaned up settags-handling 19 years ago
Anselm R. Garbe 7d156dee1e applied Gottox mwfact patch 19 years ago
Anselm R. Garbe 55d8dda9f4 replaced static Layout *lt with static unsigned int sellayout... (will be adapted later when _DWM_CONFIG is serialized as root window property) 19 years ago
Anselm R. Garbe 86953bd682 renamed seltag into seltags 19 years ago
Anselm R. Garbe a923298d35 applied Jukka Salmi's setmwfact patch 19 years ago
Anselm R. Garbe 04dec4c943 made plural arrays 19 years ago
Anselm R. Garbe e40448fd63 fixed the issue observed by various people, that clients appeared on empty tags 19 years ago
Anselm R. Garbe 10bc0ce912 made tag/view/toggle{tag,view} work on pointer to tags-array, there was the need to define Key key[] not static to do this. split focusclient into focusnext/prev, fixed config.*.h's 19 years ago
Anselm R. Garbe e8792d95a1 applied Jukka's patch 19 years ago
Anselm R. Garbe feec92df84 fixed _DWM_CONFIG persistation, fixed the client disapperance bug during restarts 19 years ago
Anselm R. Garbe 10d13f01ff fififi 19 years ago
Anselm R. Garbe 8fcc4ff0ae fix of resize (thanks Sander for the hint!) 19 years ago
Anselm R. Garbe f2512243f4 fixed a typo 19 years ago
Anselm R. Garbe b32cd4454b small bugfix 19 years ago
Anselm R. Garbe 9e56e1ded6 tags should be persistent now during X server run 19 years ago
Anselm R. Garbe e4ad320599 small bugfix 19 years ago
Anselm R. Garbe a200c39635 made tile simplier 19 years ago
Anselm R. Garbe 77044e8765 made Layout a static struct in layout.c, added some convenience getters in layout.c, now lt->arrange accesses are not possible anymore, arrange() is the super-arrange function which sets up all layouts 19 years ago
Anselm R. Garbe 2feb3afe78 made resize more precise 19 years ago
Anselm R. Garbe 0937cc78bf moved floating to layout.c, kept tile.c outside 19 years ago
Anselm R. Garbe f6e41b0bc3 renamed MASTER into MWFACT, master into mwfact, and incmaster into addtomwfact 19 years ago
Anselm R. Garbe 2c6087e3d2 fixed a comment 19 years ago
Anselm R. Garbe 2d81b78b85 separated layout-specific stuff into separate .h and .c files which are included in config.h resp. config.mk - this allows writing layouts for dwm without any need to patch existing code 19 years ago
Anselm R. Garbe b5eea45a31 let not overlap the borders 19 years ago
Anselm R. Garbe aa53e39ec0 removed VRATIO, NMASTER, inc*(), renamed HRATIO into MASTER, see mailinglist for details 19 years ago
Anselm R. Garbe 4216bf801f slight change of my color scheme 19 years ago
Anselm R. Garbe 2cd1609770 removed spow(x, 0); calls, I did them for consistency's sake, but it should be rather obvious how the scaling works anyways 19 years ago
Anselm R. Garbe 85c9ebf2fc applied Jukka's dwm.1 patch 19 years ago
Anselm R. Garbe 796925089c changed shortcuts as described on the mailinglist, added sanity checks for ratios during tile (fallback to wah if clients would get too small), documented that new stuff/shortcuts in dwm(1) 19 years ago
Anselm R. Garbe da91dfc948 small fix of static function order 19 years ago
Anselm R. Garbe 4135e34dfa I introduced {H,V}RATIO and inc{h,v,}ratio() functions - the default behaves like in dwm-4.3, config.arg.h shows how I prefer the ratio being handled (for the future I plan to change const char *arg into ..., and renaming Client into Win.) 19 years ago
Anselm R. Garbe 846128a498 removed a C++ style comment 19 years ago
Anselm R. Garbe e461e60997 implemented ratio tile as described on the mailinglist 19 years ago
Anselm R. Garbe 28c10330bd changed the fix of yesterday, the resize should only be necessary at manage() time, not on any unban() 19 years ago
Anselm R. Garbe 0d40590c2c foo 19 years ago
Anselm R. Garbe 8fda28be35 set client state to iconic on maprequest 19 years ago
Anselm R. Garbe a54cf2ecef changed ban/unban implementation to not move the windows anymore, but map/unmap them instead - PLEASE TEST THIS 19 years ago
Anselm R. Garbe 4b9337a01e removed shiftview(), if you scroll the views in the tag area, you can also use Button1 instead
removed focusclient([-]1) bound to scroll wheel - if you slightly move the mouse you will focus the first client anways which is in the way
19 years ago
Anselm R. Garbe 154497541d applied Jeroen's {clean,spell}.diff patches, thanks Jeroen! 19 years ago
Anselm R. Garbe e0cfe07648 applied Jeroen Schot's shiftview patch 19 years ago
arg@f00b4r 82be289985 applied dwm-windowscrolling patch 19 years ago
arg@f00b4r f2190c8fc2 Added tag 4.3 for changeset e0ec0d5d8b1e 19 years ago
arg@f00b4r c31648d15d restoring tip to be a working dwm again (switching FONT to terminus in config.arg.h) 19 years ago
Anselm R. Garbe 52250e7c1e please recheck this patch with Mathematica from Wolfram Research - lemme know if it fixes the geyish blob window bug 19 years ago
Anselm R. Garbe 51a94a2f14 removed crappy createnotify handler 19 years ago
Anselm R. Garbe c95bf3db9d applied restack patch of anydot, with slight changes 19 years ago
Anselm R. Garbe 4bf3b01953 I change the style of init somewhat, init as early as possible. 19 years ago
Anselm R. Garbe ff957d1eac uncommented creatnotify 19 years ago
Anselm R. Garbe 83aa110c6f added an creatnotify event handler 19 years ago
Anselm R. Garbe 5a1a2edf0e applied anudots [un]ban repair patch 19 years ago
Anselm R. Garbe b3419f49a3 making variable declarations in dwm.h extern, this seems to be more ansi compliant 19 years ago
Anselm R. Garbe 141beb2704 replaced BORDERPX with sel->border in togglemax(), in other places this is not possible. 19 years ago
Anselm R. Garbe 4e49d5a0ad Added tag 4.2 for changeset c13cb8c6b7a5 19 years ago
Anselm R. Garbe 2c6be7239f referred to LICENSE file 19 years ago
Anselm R. Garbe d934296476 Jukka also belongs to Copyright holders after all he has contributed and done for dwm, updated -v as well 19 years ago
Anselm R. Garbe 39ae286861 applied Jukkas patch 19 years ago
Anselm R. Garbe 59e65d1709 changed -v output (now also anydot and nsz are contained in this output) 19 years ago
Anselm R. Garbe 9fdd2cd1a9 added nsz to copyright holders as well, because he did a lot recently 19 years ago
Anselm R. Garbe e1deda9e04 added anydot to Copyright holders, because he contributed a lot recently 19 years ago
Anselm R. Garbe 199a601611 applied anydot's 3 minor patches, thank you anydot 19 years ago
Anselm R. Garbe 492c6f10fc applied Sanders patch 19 years ago
Anselm R. Garbe caa7ab5362 applied anydots proposal to let togglefloating restore fixed windows 19 years ago
Anselm R. Garbe f3e672efd8 fix if n < nmaster of remainer calculation for master windows 19 years ago
Anselm R. Garbe 02d5dddc00 rev 900, cool 19 years ago
Anselm R. Garbe c789941bba fo 19 years ago
Anselm R. Garbe e45b3ced67 calculating the remainder for master and stack area correctly 19 years ago
Anselm R. Garbe 5a9af492ae fixed issue reported by Christian Garbs 19 years ago
Anselm R. Garbe 32563abe86 removed the only one and superfloues strncmp 19 years ago
Anselm R. Garbe 70c7b432ea foo 19 years ago
Anselm R. Garbe 69dfcaa317 reverted last change after Sander pointed out the original decision 19 years ago
Anselm R. Garbe 6ee8e3e93b applied anydots remark of togglefloating() 19 years ago
Anselm R. Garbe 8439369db9 applied Szabolcs proposal for zoom() as well 19 years ago
Anselm R. Garbe 81658eaab3 applied Szabolcs proposal to simplify setlayout() 19 years ago
Anselm R. Garbe 81aebf8cae Added tag 4.1 for changeset 00f4180df72b 19 years ago
Anselm R. Garbe fa32f02a43 no that change breaks fullscreen apps 19 years ago
Anselm R. Garbe 598e22907e raise barwin in restack, that's the most elegant solution I think 19 years ago
Anselm R. Garbe 1e826ddd3e simplification 19 years ago
Anselm R. Garbe a967d7f664 raising the barwin has no effect becasue of restack 19 years ago
Anselm R. Garbe ce450c5bf1 fix 19 years ago
Anselm R. Garbe 8f5f7a5b5a barwindow raising 19 years ago
Anselm R. Garbe 5ad2828c57 using BarTop as fallback if BARPOS is set to BarOff as default for toggling 19 years ago
Anselm R. Garbe b896b58d6d removed strip, added -s to LDFLAGS 19 years ago
Anselm R. Garbe fef6c5c66b added new Mod1-b functionality to dwm(1) 19 years ago
Anselm R. Garbe 37e062b0ed another fix, call lt->arrange() in togglebar only 19 years ago
Anselm R. Garbe cf58091736 fixed bpos init 19 years ago
Anselm R. Garbe 2aef8b9b4c made bar togglalble 19 years ago
Anselm R. Garbe d96307cbe4 thanks to Jukka 19 years ago
Anselm R. Garbe 124866e269 added the GTK Save-As bug report to BUGS section of dwm(1) 19 years ago
Anselm R. Garbe ab3d6a7dfe applied dfenze cleanups, fixed some comments in dwm.h 19 years ago
Anselm R. Garbe c67dbb28e4 small fix of fix 19 years ago
Anselm R. Garbe b8bccb4ac5 fixed a potential security flaw 19 years ago
Anselm R. Garbe b6b2f584ec applied Maarten Maathuis recenter-patch for floating clients only requesting new width and height exceeding the screen space 19 years ago
Anselm R. Garbe f7bdb39d9e s/remain/remainder/ 19 years ago
Anselm R. Garbe ecd9c3e222 fixing remaining space calculation 19 years ago
Anselm R. Garbe 216099d072 thanks to Juka to check -Wall ;) 19 years ago
Anselm R. Garbe fc2e3eae20 next version is 4.1 19 years ago
Anselm R. Garbe f9e7a33019 applied patch of Paul Liu to allow onthefly resizing due to xrandr changes 19 years ago
Anselm R. Garbe 7c9fa2566f Added tag 4.0 for changeset 018c38468422 19 years ago
Anselm R. Garbe 22399a3bc0 fixed the border issue for mplayer, ff is definately broken when using F11 (fullscreen mode) 19 years ago
Anselm R. Garbe ad2508f957 touch border 19 years ago
Anselm R. Garbe b078599833 set border at manage time 19 years ago
Anselm R. Garbe 1e80207876 using pixelcarnage-monospace (proggyclean), because this is better to the eyes 19 years ago
Anselm R. Garbe 464fc2cd18 changed border handling 19 years ago
Anselm R. Garbe be8d6d40f6 changing order of c->border restorage 19 years ago
Anselm R. Garbe f0c2353393 I used 2006 in other places as well 19 years ago
Anselm R. Garbe a730213c3b yet another fix of copyright compactisition 19 years ago
Anselm R. Garbe 399993c6b5 making Copyright notices more compact 19 years ago
Anselm R. Garbe 4d318060a2 next version will be 4.0, so don't expect it within the next days 19 years ago
Anselm R. Garbe 540d5eed46 make also transients floating when we do not know the main window 19 years ago
Anselm R. Garbe 7d071ce2bd Added tag 3.9 for changeset 55478328b242 19 years ago
Anselm R. Garbe 93aeaa53c9 next version will be 3.9, but don't expect it this week 19 years ago
Anselm R. Garbe 06f9f346e6 add an additional check in resize() to prevent a crash of dwm 19 years ago
Anselm R. Garbe 5c48012ad2 Added tag 3.8 for changeset 2ea201354cf0 19 years ago

@ -1,42 +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

@ -1,22 +1,37 @@
MIT/X Consortium License
(C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
(C)opyright MMVI-MMVII Sander van Dijk <a dot h dot vandijk 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>
© 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
© 2007-2009 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>
© 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
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
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 shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice 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
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.

@ -1,9 +1,9 @@
# dwm - dynamic window manager
# (C)opyright MMVI-MMVII Anselm R. Garbe
# See LICENSE file for copyright and license details.
include config.mk
SRC = client.c draw.c event.c layout.c main.c tag.c util.c
SRC = drw.c dwm.c util.c
OBJ = ${SRC:.c=.o}
all: options dwm
@ -15,47 +15,37 @@ options:
@echo "CC = ${CC}"
.c.o:
@echo CC $<
@${CC} -c ${CFLAGS} $<
${CC} -c ${CFLAGS} $<
${OBJ}: dwm.h config.h config.mk
${OBJ}: config.h config.mk
config.h:
@echo creating $@ from config.default.h
@cp config.default.h $@
cp config.def.h $@
dwm: ${OBJ}
@echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
@strip $@
${CC} -o $@ ${OBJ} ${LDFLAGS}
clean:
@echo cleaning
@rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
dist: clean
@echo creating dist tarball
@mkdir -p dwm-${VERSION}
@cp -R LICENSE Makefile README config.*.h config.mk \
dwm.1 dwm.h ${SRC} dwm-${VERSION}
@tar -cf dwm-${VERSION}.tar dwm-${VERSION}
@gzip dwm-${VERSION}.tar
@rm -rf dwm-${VERSION}
mkdir -p dwm-${VERSION}
cp -R LICENSE Makefile README config.def.h config.mk\
dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
tar -cf dwm-${VERSION}.tar dwm-${VERSION}
gzip dwm-${VERSION}.tar
rm -rf dwm-${VERSION}
install: all
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f dwm ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
@sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
mkdir -p ${DESTDIR}${PREFIX}/bin
cp -f dwm ${DESTDIR}${PREFIX}/bin
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
mkdir -p ${DESTDIR}${MANPREFIX}/man1
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/dwm
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${MANPREFIX}/man1/dwm.1
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
${DESTDIR}${MANPREFIX}/man1/dwm.1
.PHONY: all options clean dist install uninstall

@ -35,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
like this in your .xinitrc:
while true
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
do
echo `date` `uptime | sed 's/.*,//'`
sleep 1
done | dwm
sleep 1
done &
exec dwm
Configuration

@ -1,402 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdlib.h>
#include <string.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
/* static */
static void
attachstack(Client *c) {
c->snext = stack;
stack = c;
}
static void
detachstack(Client *c) {
Client **tc;
for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
*tc = c->snext;
}
static void
grabbuttons(Client *c, Bool focused) {
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
if(focused) {
XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
}
else
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
}
static Bool
isprotodel(Client *c) {
int i, n;
Atom *protocols;
Bool ret = False;
if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
for(i = 0; !ret && i < n; i++)
if(protocols[i] == wmatom[WMDelete])
ret = True;
XFree(protocols);
}
return ret;
}
static void
setclientstate(Client *c, long state) {
long data[] = {state, None};
XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
PropModeReplace, (unsigned char *)data, 2);
}
static int
xerrordummy(Display *dsply, XErrorEvent *ee) {
return 0;
}
/* extern */
void
attach(Client *c) {
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
}
void
configure(Client *c) {
XConfigureEvent ce;
ce.type = ConfigureNotify;
ce.display = dpy;
ce.event = c->win;
ce.window = c->win;
ce.x = c->x;
ce.y = c->y;
ce.width = c->w;
ce.height = c->h;
ce.border_width = c->border;
ce.above = None;
ce.override_redirect = False;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
}
void
detach(Client *c) {
if(c->prev)
c->prev->next = c->next;
if(c->next)
c->next->prev = c->prev;
if(c == clients)
clients = c->next;
c->next = c->prev = NULL;
}
void
focus(Client *c) {
if(c && !isvisible(c))
return;
if(sel && sel != c) {
grabbuttons(sel, False);
XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
}
if(c) {
detachstack(c);
attachstack(c);
grabbuttons(c, True);
}
sel = c;
drawstatus();
if(!selscreen)
return;
if(c) {
XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
}
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
void
killclient(const char *arg) {
XEvent ev;
if(!sel)
return;
if(isprotodel(sel)) {
ev.type = ClientMessage;
ev.xclient.window = sel->win;
ev.xclient.message_type = wmatom[WMProtocols];
ev.xclient.format = 32;
ev.xclient.data.l[0] = wmatom[WMDelete];
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(dpy, sel->win, False, NoEventMask, &ev);
}
else
XKillClient(dpy, sel->win);
}
void
manage(Window w, XWindowAttributes *wa) {
Client *c, *t;
Window trans;
XWindowChanges wc;
c = emallocz(sizeof(Client));
c->tags = emallocz(ntags * sizeof(Bool));
c->win = w;
c->x = wa->x;
c->y = wa->y;
c->w = wa->width;
c->h = wa->height;
if(c->w == sw && c->h == sh) {
c->border = 0;
c->x = sx;
c->y = sy;
}
else {
c->border = BORDERPX;
if(c->x + c->w + 2 * c->border > wax + waw)
c->x = wax + waw - c->w - 2 * c->border;
if(c->y + c->h + 2 * c->border > way + wah)
c->y = way + wah - c->h - 2 * c->border;
if(c->x < wax)
c->x = wax;
if(c->y < way)
c->y = way;
}
updatesizehints(c);
XSelectInput(dpy, w,
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
XGetTransientForHint(dpy, w, &trans);
grabbuttons(c, False);
wc.border_width = c->border;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
updatetitle(c);
for(t = clients; t && t->win != trans; t = t->next);
settags(c, t);
if(!c->isfloating)
c->isfloating = (t != NULL) || c->isfixed;
attach(c);
attachstack(c);
c->isbanned = True;
XMoveWindow(dpy, w, c->x + 2 * sw, c->y);
XMapWindow(dpy, w);
setclientstate(c, NormalState);
if(isvisible(c))
focus(c);
lt->arrange();
}
void
resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
float dx, dy, max, min, ratio;
XWindowChanges wc;
if(w <= 0 || h <= 0)
return;
if(sizehints) {
if(c->minay > 0 && c->maxay && (h - c->baseh) > 0) {
dx = (float)(w - c->basew);
dy = (float)(h - c->baseh);
min = (float)(c->minax) / (float)(c->minay);
max = (float)(c->maxax) / (float)(c->maxay);
ratio = dx / dy;
if(max > 0 && min > 0 && ratio > 0) {
if(ratio < min) {
dy = (dx * min + dy) / (min * min + 1);
dx = dy * min;
w = (int)dx + c->basew;
h = (int)dy + c->baseh;
}
else if(ratio > max) {
dy = (dx * min + dy) / (max * max + 1);
dx = dy * min;
w = (int)dx + c->basew;
h = (int)dy + c->baseh;
}
}
}
if(c->minw && w < c->minw)
w = c->minw;
if(c->minh && h < c->minh)
h = c->minh;
if(c->maxw && w > c->maxw)
w = c->maxw;
if(c->maxh && h > c->maxh)
h = c->maxh;
if(c->incw)
w -= (w - c->basew) % c->incw;
if(c->inch)
h -= (h - c->baseh) % c->inch;
}
if(w == sw && h == sh)
c->border = 0;
else
c->border = BORDERPX;
/* offscreen appearance fixes */
if(x > sw)
x = sw - w - 2 * c->border;
if(y > sh)
y = sh - h - 2 * c->border;
if(x + w + 2 * c->border < sx)
x = sx;
if(y + h + 2 * c->border < sy)
y = sy;
if(c->x != x || c->y != y || c->w != w || c->h != h) {
c->x = wc.x = x;
c->y = wc.y = y;
c->w = wc.width = w;
c->h = wc.height = h;
wc.border_width = c->border;
XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
}
}
void
togglefloating(const char *arg) {
if(!sel || lt->arrange == floating)
return;
sel->isfloating = !sel->isfloating;
lt->arrange();
}
void
updatesizehints(Client *c) {
long msize;
XSizeHints size;
if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
size.flags = PSize;
c->flags = size.flags;
if(c->flags & PBaseSize) {
c->basew = size.base_width;
c->baseh = size.base_height;
}
else if(c->flags & PMinSize) {
c->basew = size.min_width;
c->baseh = size.min_height;
}
else
c->basew = c->baseh = 0;
if(c->flags & PResizeInc) {
c->incw = size.width_inc;
c->inch = size.height_inc;
}
else
c->incw = c->inch = 0;
if(c->flags & PMaxSize) {
c->maxw = size.max_width;
c->maxh = size.max_height;
}
else
c->maxw = c->maxh = 0;
if(c->flags & PMinSize) {
c->minw = size.min_width;
c->minh = size.min_height;
}
else if(c->flags & PBaseSize) {
c->minw = size.base_width;
c->minh = size.base_height;
}
else
c->minw = c->minh = 0;
if(c->flags & PAspect) {
c->minax = size.min_aspect.x;
c->maxax = size.max_aspect.x;
c->minay = size.min_aspect.y;
c->maxay = size.max_aspect.y;
}
else
c->minax = c->maxax = c->minay = c->maxay = 0;
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh
&& c->maxw == c->minw && c->maxh == c->minh);
}
void
updatetitle(Client *c) {
char **list = NULL;
int n;
XTextProperty name;
name.nitems = 0;
c->name[0] = 0;
XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]);
if(!name.nitems)
XGetWMName(dpy, c->win, &name);
if(!name.nitems)
return;
if(name.encoding == XA_STRING)
strncpy(c->name, (char *)name.value, sizeof c->name);
else {
if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
&& n > 0 && *list)
{
strncpy(c->name, *list, sizeof c->name);
XFreeStringList(list);
}
}
XFree(name.value);
}
void
unmanage(Client *c) {
Client *nc;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
detach(c);
detachstack(c);
if(sel == c) {
for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
focus(nc);
}
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
lt->arrange();
}

@ -1,99 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
/* appearance */
#define BORDERPX 1
#define FONT "-*-proggyclean-medium-r-*-*-13-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#333"
#define NORMBGCOLOR "#222"
#define NORMFGCOLOR "#ccc"
#define SELBORDERCOLOR "#8c8"
#define SELBGCOLOR "#555"
#define SELFGCOLOR "#fff"
#define TOPBAR True /* False */
/* tagging */
#define TAGS \
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL };
#define RULES \
static Rule rule[] = { \
/* class:instance:title regex tags regex isfloating */ \
{ "Firefox", "3", False }, \
{ "Gimp", NULL, True }, \
{ "MPlayer", NULL, True }, \
{ "Acroread", NULL, True }, \
};
/* layout(s) */
#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
{ "[]=", tile }, /* first entry is default */ \
{ "><>", floating }, \
};
#define MASTERWIDTH 600 /* master width per thousand */
#define NMASTER 1 /* clients in master area */
#define SNAP 32 /* snap pixel */
/* key definitions */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function argument */ \
{ MODKEY, XK_p, spawn, \
"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \
{ MODKEY|ShiftMask, XK_Return, spawn, \
"exec urxvtcd -tr -bg '#222' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
{ MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \
{ MODKEY, XK_1, view, "0" }, \
{ MODKEY, XK_2, view, "1" }, \
{ MODKEY, XK_3, view, "2" }, \
{ MODKEY, XK_4, view, "3" }, \
{ MODKEY, XK_5, view, "4" }, \
{ MODKEY, XK_6, view, "5" }, \
{ MODKEY, XK_7, view, "6" }, \
{ MODKEY, XK_8, view, "7" }, \
{ MODKEY, XK_9, view, "8" }, \
{ MODKEY|ControlMask, XK_1, toggleview, "0" }, \
{ MODKEY|ControlMask, XK_2, toggleview, "1" }, \
{ MODKEY|ControlMask, XK_3, toggleview, "2" }, \
{ MODKEY|ControlMask, XK_4, toggleview, "3" }, \
{ MODKEY|ControlMask, XK_5, toggleview, "4" }, \
{ MODKEY|ControlMask, XK_6, toggleview, "5" }, \
{ MODKEY|ControlMask, XK_7, toggleview, "6" }, \
{ MODKEY|ControlMask, XK_8, toggleview, "7" }, \
{ MODKEY|ControlMask, XK_9, toggleview, "8" }, \
{ MODKEY|ShiftMask, XK_0, tag, NULL }, \
{ MODKEY|ShiftMask, XK_1, tag, "0" }, \
{ MODKEY|ShiftMask, XK_2, tag, "1" }, \
{ MODKEY|ShiftMask, XK_3, tag, "2" }, \
{ MODKEY|ShiftMask, XK_4, tag, "3" }, \
{ MODKEY|ShiftMask, XK_5, tag, "4" }, \
{ MODKEY|ShiftMask, XK_6, tag, "5" }, \
{ MODKEY|ShiftMask, XK_7, tag, "6" }, \
{ MODKEY|ShiftMask, XK_8, tag, "7" }, \
{ MODKEY|ShiftMask, XK_9, tag, "8" }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, "0" }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, "1" }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, "2" }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, "3" }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, "4" }, \
{ MODKEY|ControlMask|ShiftMask, XK_6, toggletag, "5" }, \
{ MODKEY|ControlMask|ShiftMask, XK_7, toggletag, "6" }, \
{ MODKEY|ControlMask|ShiftMask, XK_8, toggletag, "7" }, \
{ MODKEY|ControlMask|ShiftMask, XK_9, toggletag, "8" }, \
{ MODKEY|ShiftMask, XK_q, quit, NULL }, \
};

@ -0,0 +1,116 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
static const char *fonts[] = { "monospace:size=10" };
static const char dmenufont[] = "monospace:size=10";
static const char col_gray1[] = "#222222";
static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb";
static const char col_gray4[] = "#eeeeee";
static const char col_cyan[] = "#005577";
static const char *colors[][3] = {
/* fg bg border */
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = {
/* xprop(1):
* WM_CLASS(STRING) = instance, class
* 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) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
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 const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
};
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, 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 char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
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[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, 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_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.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_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
};
/* button definitions */
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};

@ -1,97 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
/* appearance */
#define BORDERPX 1
#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#dddddd"
#define NORMBGCOLOR "#eeeeee"
#define NORMFGCOLOR "#222222"
#define SELBORDERCOLOR "#ff0000"
#define SELBGCOLOR "#006699"
#define SELFGCOLOR "#ffffff"
#define TOPBAR True /* False */
/* tagging */
#define TAGS \
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL };
/* Query class:instance:title for regex matching info with following command:
* xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */
#define RULES \
static Rule rule[] = { \
/* class:instance:title regex tags regex isfloating */ \
{ "Gimp", NULL, True }, \
{ "MPlayer", NULL, True }, \
{ "Acroread", NULL, True }, \
};
/* layout(s) */
#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
{ "[]=", tile }, /* first entry is default */ \
{ "><>", floating }, \
};
#define MASTERWIDTH 600 /* master width per thousand */
#define NMASTER 1 /* clients in master area */
#define SNAP 32 /* snap pixel */
/* key definitions */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function argument */ \
{ MODKEY|ShiftMask, XK_Return, spawn, "exec xterm" }, \
{ MODKEY, XK_p, spawn, "exe=`dmenu_path | dmenu` && exec $exe" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
{ MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \
{ MODKEY, XK_1, view, "0" }, \
{ MODKEY, XK_2, view, "1" }, \
{ MODKEY, XK_3, view, "2" }, \
{ MODKEY, XK_4, view, "3" }, \
{ MODKEY, XK_5, view, "4" }, \
{ MODKEY, XK_6, view, "5" }, \
{ MODKEY, XK_7, view, "6" }, \
{ MODKEY, XK_8, view, "7" }, \
{ MODKEY, XK_9, view, "8" }, \
{ MODKEY|ControlMask, XK_1, toggleview, "0" }, \
{ MODKEY|ControlMask, XK_2, toggleview, "1" }, \
{ MODKEY|ControlMask, XK_3, toggleview, "2" }, \
{ MODKEY|ControlMask, XK_4, toggleview, "3" }, \
{ MODKEY|ControlMask, XK_5, toggleview, "4" }, \
{ MODKEY|ControlMask, XK_6, toggleview, "5" }, \
{ MODKEY|ControlMask, XK_7, toggleview, "6" }, \
{ MODKEY|ControlMask, XK_8, toggleview, "7" }, \
{ MODKEY|ControlMask, XK_9, toggleview, "8" }, \
{ MODKEY|ShiftMask, XK_0, tag, NULL }, \
{ MODKEY|ShiftMask, XK_1, tag, "0" }, \
{ MODKEY|ShiftMask, XK_2, tag, "1" }, \
{ MODKEY|ShiftMask, XK_3, tag, "2" }, \
{ MODKEY|ShiftMask, XK_4, tag, "3" }, \
{ MODKEY|ShiftMask, XK_5, tag, "4" }, \
{ MODKEY|ShiftMask, XK_6, tag, "5" }, \
{ MODKEY|ShiftMask, XK_7, tag, "6" }, \
{ MODKEY|ShiftMask, XK_8, tag, "7" }, \
{ MODKEY|ShiftMask, XK_9, tag, "8" }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, "0" }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, "1" }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, "2" }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, "3" }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, "4" }, \
{ MODKEY|ControlMask|ShiftMask, XK_6, toggletag, "5" }, \
{ MODKEY|ControlMask|ShiftMask, XK_7, toggletag, "6" }, \
{ MODKEY|ControlMask|ShiftMask, XK_8, toggletag, "7" }, \
{ MODKEY|ControlMask|ShiftMask, XK_9, toggletag, "8" }, \
{ MODKEY|ShiftMask, XK_q, quit, NULL }, \
};

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

136
draw.c

@ -1,136 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <string.h>
/* static */
static void
drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) {
int x;
XGCValues gcv;
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
gcv.foreground = col[ColFG];
XChangeGC(dpy, dc.gc, GCForeground, &gcv);
x = (dc.font.ascent + dc.font.descent + 2) / 4;
r.x = dc.x + 1;
r.y = dc.y + 1;
if(filled) {
r.width = r.height = x + 1;
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
}
else if(empty) {
r.width = r.height = x;
XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);
}
}
static Bool
isoccupied(unsigned int t) {
Client *c;
for(c = clients; c; c = c->next)
if(c->tags[t])
return True;
return False;
}
static unsigned int
textnw(const char *text, unsigned int len) {
XRectangle r;
if(dc.font.set) {
XmbTextExtents(dc.font.set, text, len, NULL, &r);
return r.width;
}
return XTextWidth(dc.font.xfont, text, len);
}
/* extern */
void
drawstatus(void) {
int i, x;
dc.x = dc.y = 0;
for(i = 0; i < ntags; i++) {
dc.w = textw(tags[i]);
if(seltag[i]) {
drawtext(tags[i], dc.sel);
drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel);
}
else {
drawtext(tags[i], dc.norm);
drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm);
}
dc.x += dc.w;
}
dc.w = blw;
drawtext(lt->symbol, dc.norm);
x = dc.x + dc.w;
dc.w = textw(stext);
dc.x = sw - dc.w;
if(dc.x < x) {
dc.x = x;
dc.w = sw - x;
}
drawtext(stext, dc.norm);
if((dc.w = dc.x - x) > bh) {
dc.x = x;
if(sel) {
drawtext(sel->name, dc.sel);
drawsquare(sel->ismax, sel->isfloating, dc.sel);
}
else
drawtext(NULL, dc.norm);
}
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0);
XSync(dpy, False);
}
void
drawtext(const char *text, unsigned long col[ColLast]) {
int x, y, w, h;
static char buf[256];
unsigned int len, olen;
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
if(!text)
return;
w = 0;
olen = len = strlen(text);
if(len >= sizeof buf)
len = sizeof buf - 1;
memcpy(buf, text, len);
buf[len] = 0;
h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */
while(len && (w = textnw(buf, len)) > dc.w - h)
buf[--len] = 0;
if(len < olen) {
if(len > 1)
buf[len - 1] = '.';
if(len > 2)
buf[len - 2] = '.';
if(len > 3)
buf[len - 3] = '.';
}
if(w > dc.w)
return; /* too long */
XSetForeground(dpy, dc.gc, col[ColFG]);
if(dc.font.set)
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
else
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
unsigned int
textw(const char *text) {
return textnw(text, strlen(text)) + dc.font.height;
}

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);

162
dwm.1

@ -5,38 +5,42 @@ dwm \- dynamic window manager
.B dwm
.RB [ \-v ]
.SH DESCRIPTION
dwm is a dynamic window manager for X. It manages windows in tiled and
floating layouts. Either layout can be applied dynamically, optimizing the
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
and floating layouts. Either layout can be applied dynamically, optimising the
environment for the application in use and the task performed.
.P
In tiled layout windows are managed in a master and stacking area. The master
area contains the windows which currently need most attention, whereas the
stacking area contains all other windows. In floating layout windows can be
resized and moved freely. Dialog windows are always managed floating,
regardless of the layout applied.
In tiled layouts windows are managed in a master and stacking area. The master
area on the left contains one window by default, and the stacking area on the
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
moved freely. Dialog windows are always managed floating, regardless of the
layout applied.
.P
Windows are grouped by tags. Each window can be tagged with one or multiple
tags. Selecting certain tags displays all windows with these tags.
.P
dwm contains a small status bar which displays all available tags, the layout,
the title of the focused window, and the text read from standard input. A
floating window is indicated with an empty square and a maximized
floating window is indicated with a filled square before the windows
title. The selected tags are indicated with a different color. The tags of
the focused window are indicated with a filled square in the top left
corner. The tags which are applied to one or more windows are indicated
with an empty square in the top left corner.
Each screen contains a small status bar which displays all available tags, the
layout, the title of the focused window, and the text read from the root window
name property, if the screen is focused. A floating window is indicated with an
empty square and a maximised floating window is indicated with a filled square
before the windows title. The selected tags are indicated with a different
color. The tags of the focused window are indicated with a filled square in the
top left corner. The tags which are applied to one or more windows are
indicated with an empty square in the top left corner.
.P
dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS
.TP
.B \-v
prints version information to standard output, then exits.
prints version information to stderr, then exits.
.SH USAGE
.SS Status bar
.TP
.B Standard input
is read and displayed in the status text area.
.B X root window name
is read and displayed in the status text area. It can be set with the
.BR xsetroot (1)
command.
.TP
.B Button1
click on a tag label to display all windows with that tag, click on the layout
@ -54,10 +58,39 @@ click on a tag label adds/removes that tag to/from the focused window.
.TP
.B Mod1\-Shift\-Return
Start
.BR xterm.
.BR st(1).
.TP
.B Mod1\-Return
Zooms/cycles current window to/from master area (tiled layout only).
.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
.B Mod1\-b
Toggles bar on and off.
.TP
.B Mod1\-t
Sets tiled layout.
.TP
.B Mod1\-f
Sets floating layout.
.TP
.B Mod1\-m
Sets monocle layout.
.TP
.B Mod1\-space
Toggles between current and previous layout.
.TP
.B Mod1\-j
Focus next window.
@ -65,84 +98,79 @@ Focus next window.
.B Mod1\-k
Focus previous window.
.TP
.B Mod1\-Shift\-j
Increase the number of windows in the master area (tiled layout only).
.B Mod1\-i
Increase number of windows in master area.
.TP
.B Mod1\-Shift\-k
Decrease the number of windows in the master area (tiled layout only).
.B Mod1\-d
Decrease number of windows in master area.
.TP
.B Mod1\-l
Increase master area width (tiled layout only).
Increase master area size.
.TP
.B Mod1\-h
Decrease master area width (tiled layout only).
Decrease master area size.
.TP
.B Mod1\-m
Toggles maximization of current window (floating layout only).
.B Mod1\-Return
Zooms/cycles focused window to/from master area (tiled layouts only).
.TP
.B Mod1\-Shift\-[1..n]
Apply
.RB nth
tag to current window.
.B Mod1\-Shift\-c
Close focused window.
.TP
.B Mod1\-Shift\-0
Apply all tags to current window.
.B Mod1\-Shift\-space
Toggle focused window between tiled and floating state.
.TP
.B Mod1\-Control\-Shift\-[1..n]
Add/remove
.B nth
tag to/from current window.
.B Mod1\-Tab
Toggles to the previously selected tags.
.TP
.B Mod1\-Shift\-c
Close focused window.
.B Mod1\-Shift\-[1..n]
Apply nth tag to focused window.
.TP
.B Mod1\-space
Toggle between tiled and floating layout (affects all windows).
.B Mod1\-Shift\-0
Apply all tags to focused window.
.TP
.B Mod1\-Shift\-space
Toggle focused window between tiled and floating state (tiled layout only).
.B Mod1\-Control\-Shift\-[1..n]
Add/remove nth tag to/from focused window.
.TP
.B Mod1\-[1..n]
View all windows with
.BR nth
tag.
View all windows with nth tag.
.TP
.B Mod1\-0
View all windows with any tag.
.TP
.B Mod1\-Control\-[1..n]
Add/remove all windows with
.BR nth
tag to/from the view.
Add/remove all windows with nth tag to/from the view.
.TP
.B Mod1\-Shift\-q
Quit dwm.
.SS Mouse commands
.TP
.B Mod1\-Button1
Move current window while dragging (floating layout only).
Move focused window while dragging. Tiled windows will be toggled to the floating state.
.TP
.B Mod1\-Button2
Zooms/cycles current window to/from master area (tiled layout only).
Toggles focused window between floating and tiled state.
.TP
.B Mod1\-Button3
Resize current window while dragging (floating layout only).
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
.SH CUSTOMIZATION
dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH SEE ALSO
.BR dmenu (1)
.SH BUGS
The status bar may display
.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
.BR dmenu (1),
.BR st (1)
.SH ISSUES
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
JDK 1.6 versions, because it assumes a reparenting window manager. As a workaround
you can use JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or you
can set the following environment variable (to use the older Motif
backend instead):
.BR AWT_TOOLKIT=MToolkit .
JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
environment variable
.BR AWT_TOOLKIT=MToolkit
(to use the older Motif backend instead) or running
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
or
.B wmname LG3D
(to pretend that a non-reparenting window manager is running that the
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
.SH BUGS
Send all bug reports with a patch to hackers@suckless.org.

2152
dwm.c

File diff suppressed because it is too large Load Diff

147
dwm.h

@ -1,147 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*
* dynamic window manager is designed like any other X client as well. It is
* driven through handling X events. In contrast to other X clients, a window
* manager selects for SubstructureRedirectMask on the root window, to receive
* events about window (dis-)appearance. Only one X connection at a time is
* allowed to select for this event mask.
*
* Calls to fetch an X event from the event queue are blocking. Due reading
* status text from standard input, a select()-driven main loop has been
* implemented which selects for reads on the X connection and STDIN_FILENO to
* handle all data smoothly. The event handlers of dwm are organized in an
* array which is accessed whenever a new event has been fetched. This allows
* event dispatching in O(1) time.
*
* Each child of the root window is called a client, except windows which have
* set the override_redirect flag. Clients are organized in a global
* doubly-linked client list, the focus history is remembered through a global
* stack list. Each client contains an array of Bools of the same size as the
* global tags array to indicate the tags of a client. For each client dwm
* creates a small title window, which is resized whenever the (_NET_)WM_NAME
* properties are updated or the client is moved/resized.
*
* Keys and tagging rules are organized as arrays and defined in the config.h
* file. These arrays are kept static in event.o and tag.o respectively,
* because no other part of dwm needs access to them. The current layout is
* represented by the lt pointer.
*
* To understand everything else, start reading main.c:main().
*/
#include "config.h"
#include <X11/Xlib.h>
/* mask shorthands, used in event.c and client.c */
#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
typedef struct Client Client;
struct Client {
char name[256];
int x, y, w, h;
int rx, ry, rw, rh; /* revert geometry */
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int minax, maxax, minay, maxay;
long flags;
unsigned int border;
Bool isbanned, isfixed, ismax, isfloating;
Bool *tags;
Client *next;
Client *prev;
Client *snext;
Window win;
};
typedef struct {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
GC gc;
struct {
int ascent;
int descent;
int height;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
typedef struct {
const char *symbol;
void (*arrange)(void);
} Layout;
extern const char *tags[]; /* all tags */
char stext[256]; /* status text */
int screen, sx, sy, sw, sh; /* screen geometry */
int wax, way, wah, waw; /* windowarea geometry */
unsigned int bh, blw; /* bar height, bar layout label width */
unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */
void (*handler[LASTEvent])(XEvent *); /* event handler */
Atom wmatom[WMLast], netatom[NetLast];
Bool selscreen, *seltag; /* seltag is array of Bool */
Client *clients, *sel, *stack; /* global client list and stack */
Cursor cursor[CurLast];
DC dc; /* global draw context */
Display *dpy;
Layout *lt;
Window root, barwin;
/* client.c */
void attach(Client *c); /* attaches c to global client list */
void configure(Client *c); /* send synthetic configure event */
void detach(Client *c); /* detaches c from global client list */
void focus(Client *c); /* focus c, c may be NULL */
void killclient(const char *arg); /* kill c nicely */
void manage(Window w, XWindowAttributes *wa); /* manage new client */
void resize(Client *c, int x, int y,
int w, int h, Bool sizehints); /* resize with given coordinates c*/
void togglefloating(const char *arg); /* toggles focused client between floating/tiled state */
void updatesizehints(Client *c); /* update the size hint variables of c */
void updatetitle(Client *c); /* update the name of c */
void unmanage(Client *c); /* destroy c */
/* draw.c */
void drawstatus(void); /* draw the bar */
void drawtext(const char *text, unsigned long col[ColLast]); /* draw text */
unsigned int textw(const char *text); /* return the width of text in px*/
/* event.c */
void grabkeys(void); /* grab all keys defined in config.h */
/* layout.c */
void floating(void); /* arranges all windows floating */
void focusclient(const char *arg); /* focuses next(1)/previous(-1) visible client */
void incmasterw(const char *arg); /* increments the master width with arg's index value */
void incnmaster(const char *arg); /* increments nmaster with arg's index value */
void initlayouts(void); /* initialize layout array */
Client *nexttiled(Client *c); /* returns tiled successor of c */
void restack(void); /* restores z layers of all clients */
void setlayout(const char *arg); /* sets layout, -1 toggles */
void togglemax(const char *arg); /* toggles maximization of floating client */
void zoom(const char *arg); /* zooms the focused client to master area, arg is ignored */
/* main.c */
void quit(const char *arg); /* quit dwm nicely */
int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
/* tag.c */
void compileregs(void); /* initialize regexps of rules defined in config.h */
Bool isvisible(Client *c); /* returns True if client is visible */
void settags(Client *c, Client *trans); /* sets tags of c */
void tag(const char *arg); /* tags c with arg's index */
void toggletag(const char *arg); /* toggles c tags with arg's index */
void toggleview(const char *arg); /* toggles the tag with arg's index (in)visible */
void view(const char *arg); /* views the tag with arg's index */
/* util.c */
void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */
void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
void spawn(const char *arg); /* forks a new subprocess with arg's cmd */

@ -1,365 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdio.h>
#include <stdlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
/* static */
typedef struct {
unsigned long mod;
KeySym keysym;
void (*func)(const char *arg);
const char *arg;
} Key;
KEYS
#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
#define MOUSEMASK (BUTTONMASK | PointerMotionMask)
static Client *
getclient(Window w) {
Client *c;
for(c = clients; c && c->win != w; c = c->next);
return c;
}
static void
movemouse(Client *c) {
int x1, y1, ocx, ocy, di, nx, ny;
unsigned int dui;
Window dummy;
XEvent ev;
ocx = nx = c->x;
ocy = ny = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess)
return;
c->ismax = False;
XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
for(;;) {
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
switch (ev.type) {
case ButtonRelease:
XUngrabPointer(dpy, CurrentTime);
return;
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
XSync(dpy, False);
nx = ocx + (ev.xmotion.x - x1);
ny = ocy + (ev.xmotion.y - y1);
if(abs(wax + nx) < SNAP)
nx = wax;
else if(abs((wax + waw) - (nx + c->w + 2 * c->border)) < SNAP)
nx = wax + waw - c->w - 2 * c->border;
if(abs(way - ny) < SNAP)
ny = way;
else if(abs((way + wah) - (ny + c->h + 2 * c->border)) < SNAP)
ny = way + wah - c->h - 2 * c->border;
resize(c, nx, ny, c->w, c->h, False);
break;
}
}
}
static void
resizemouse(Client *c) {
int ocx, ocy;
int nw, nh;
XEvent ev;
ocx = c->x;
ocy = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
c->ismax = False;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
for(;;) {
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
switch(ev.type) {
case ButtonRelease:
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
c->w + c->border - 1, c->h + c->border - 1);
XUngrabPointer(dpy, CurrentTime);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
return;
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
XSync(dpy, False);
if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
nw = 1;
if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
nh = 1;
resize(c, c->x, c->y, nw, nh, True);
break;
}
}
}
static void
buttonpress(XEvent *e) {
static char buf[32];
unsigned int i, x;
Client *c;
XButtonPressedEvent *ev = &e->xbutton;
buf[0] = 0;
if(barwin == ev->window) {
x = 0;
for(i = 0; i < ntags; i++) {
x += textw(tags[i]);
if(ev->x < x) {
snprintf(buf, sizeof buf, "%d", i);
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(buf);
else
view(buf);
}
else if(ev->button == Button3) {
if(ev->state & MODKEY)
toggletag(buf);
else
toggleview(buf);
}
return;
}
}
if(ev->x < x + blw)
switch(ev->button) {
case Button1:
setlayout(NULL);
break;
}
}
else if((c = getclient(ev->window))) {
focus(c);
if(CLEANMASK(ev->state) != MODKEY)
return;
if(ev->button == Button1 && (lt->arrange == floating || c->isfloating)) {
restack();
movemouse(c);
}
else if(ev->button == Button2)
zoom(NULL);
else if(ev->button == Button3
&& (lt->arrange == floating || c->isfloating) && !c->isfixed)
{
restack();
resizemouse(c);
}
}
}
static void
configurerequest(XEvent *e) {
Client *c;
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
if((c = getclient(ev->window))) {
c->ismax = False;
if(ev->value_mask & CWBorderWidth)
c->border = ev->border_width;
if(c->isfixed || c->isfloating || (lt->arrange == floating)) {
if(ev->value_mask & CWX)
c->x = ev->x;
if(ev->value_mask & CWY)
c->y = ev->y;
if(ev->value_mask & CWWidth)
c->w = ev->width;
if(ev->value_mask & CWHeight)
c->h = ev->height;
if((ev->value_mask & (CWX | CWY))
&& !(ev->value_mask & (CWWidth | CWHeight)))
configure(c);
if(isvisible(c))
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
}
else
configure(c);
}
else {
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
wc.height = ev->height;
wc.border_width = ev->border_width;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
}
XSync(dpy, False);
}
static void
destroynotify(XEvent *e) {
Client *c;
XDestroyWindowEvent *ev = &e->xdestroywindow;
if((c = getclient(ev->window)))
unmanage(c);
}
static void
enternotify(XEvent *e) {
Client *c;
XCrossingEvent *ev = &e->xcrossing;
if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
return;
if((c = getclient(ev->window)) && isvisible(c))
focus(c);
else if(ev->window == root) {
selscreen = True;
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
}
static void
expose(XEvent *e) {
XExposeEvent *ev = &e->xexpose;
if(ev->count == 0) {
if(barwin == ev->window)
drawstatus();
}
}
static void
keypress(XEvent *e) {
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeySym keysym;
XKeyEvent *ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
for(i = 0; i < len; i++)
if(keysym == key[i].keysym
&& CLEANMASK(key[i].mod) == CLEANMASK(ev->state))
{
if(key[i].func)
key[i].func(key[i].arg);
}
}
static void
leavenotify(XEvent *e) {
XCrossingEvent *ev = &e->xcrossing;
if((ev->window == root) && !ev->same_screen) {
selscreen = False;
focus(NULL);
}
}
static void
mappingnotify(XEvent *e) {
XMappingEvent *ev = &e->xmapping;
XRefreshKeyboardMapping(ev);
if(ev->request == MappingKeyboard)
grabkeys();
}
static void
maprequest(XEvent *e) {
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
if(!XGetWindowAttributes(dpy, ev->window, &wa))
return;
if(wa.override_redirect)
return;
if(!getclient(ev->window))
manage(ev->window, &wa);
}
static void
propertynotify(XEvent *e) {
Client *c;
Window trans;
XPropertyEvent *ev = &e->xproperty;
if(ev->state == PropertyDelete)
return; /* ignore */
if((c = getclient(ev->window))) {
switch (ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(dpy, c->win, &trans);
if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL)))
lt->arrange();
break;
case XA_WM_NORMAL_HINTS:
updatesizehints(c);
break;
}
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
updatetitle(c);
if(c == sel)
drawstatus();
}
}
}
static void
unmapnotify(XEvent *e) {
Client *c;
XUnmapEvent *ev = &e->xunmap;
if((c = getclient(ev->window)))
unmanage(c);
}
/* extern */
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ConfigureRequest] = configurerequest,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[LeaveNotify] = leavenotify,
[Expose] = expose,
[KeyPress] = keypress,
[MappingNotify] = mappingnotify,
[MapRequest] = maprequest,
[PropertyNotify] = propertynotify,
[UnmapNotify] = unmapnotify
};
void
grabkeys(void) {
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeyCode code;
XUngrabKey(dpy, AnyKey, AnyModifier, root);
for(i = 0; i < len; i++) {
code = XKeysymToKeycode(dpy, key[i].keysym);
XGrabKey(dpy, code, key[i].mod, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | LockMask, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | numlockmask, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | numlockmask | LockMask, root, True,
GrabModeAsync, GrabModeAsync);
}
}

@ -1,255 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdlib.h>
unsigned int blw = 0;
Layout *lt = NULL;
/* static */
static unsigned int nlayouts = 0;
static unsigned int masterw = MASTERWIDTH;
static unsigned int nmaster = NMASTER;
static void
tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
/* window geoms */
mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1);
mw = (n > nmaster) ? (waw * masterw) / 1000 : waw;
th = (n > nmaster) ? wah / (n - nmaster) : 0;
tw = waw - mw;
for(i = 0, c = clients; c; c = c->next)
if(isvisible(c)) {
if(c->isbanned)
XMoveWindow(dpy, c->win, c->x, c->y);
c->isbanned = False;
if(c->isfloating)
continue;
c->ismax = False;
nx = wax;
ny = way;
if(i < nmaster) {
ny += i * mh;
nw = mw - 2 * BORDERPX;
nh = mh - 2 * BORDERPX;
}
else { /* tile window */
nx += mw;
nw = tw - 2 * BORDERPX;
if(th > 2 * BORDERPX) {
ny += (i - nmaster) * th;
nh = th - 2 * BORDERPX;
}
else /* fallback if th <= 2 * BORDERPX */
nh = wah - 2 * BORDERPX;
}
resize(c, nx, ny, nw, nh, False);
i++;
}
else {
c->isbanned = True;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
}
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
LAYOUTS
/* extern */
void
floating(void) {
Client *c;
for(c = clients; c; c = c->next) {
if(isvisible(c)) {
if(c->isbanned)
XMoveWindow(dpy, c->win, c->x, c->y);
c->isbanned = False;
resize(c, c->x, c->y, c->w, c->h, True);
}
else {
c->isbanned = True;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
}
}
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
void
focusclient(const char *arg) {
Client *c;
if(!sel || !arg)
return;
if(atoi(arg) < 0) {
for(c = sel->prev; c && !isvisible(c); c = c->prev);
if(!c) {
for(c = clients; c && c->next; c = c->next);
for(; c && !isvisible(c); c = c->prev);
}
}
else {
for(c = sel->next; c && !isvisible(c); c = c->next);
if(!c)
for(c = clients; c && !isvisible(c); c = c->next);
}
if(c) {
focus(c);
restack();
}
}
void
incmasterw(const char *arg) {
int i;
if(lt->arrange != tile)
return;
if(!arg)
masterw = MASTERWIDTH;
else {
i = atoi(arg);
if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX
|| waw * (masterw + i) / 1000 <= 2 * BORDERPX)
return;
masterw += i;
}
lt->arrange();
}
void
incnmaster(const char *arg) {
int i;
if(!arg)
nmaster = NMASTER;
else {
i = atoi(arg);
if((lt->arrange != tile) || (nmaster + i < 1)
|| (wah / (nmaster + i) <= 2 * BORDERPX))
return;
nmaster += i;
}
if(sel)
lt->arrange();
else
drawstatus();
}
void
initlayouts(void) {
unsigned int i, w;
lt = &layout[0];
nlayouts = sizeof layout / sizeof layout[0];
for(blw = i = 0; i < nlayouts; i++) {
w = textw(layout[i].symbol);
if(w > blw)
blw = w;
}
}
Client *
nexttiled(Client *c) {
for(; c && (c->isfloating || !isvisible(c)); c = c->next);
return c;
}
void
restack(void) {
Client *c;
XEvent ev;
drawstatus();
if(!sel)
return;
if(sel->isfloating || lt->arrange == floating)
XRaiseWindow(dpy, sel->win);
if(lt->arrange != floating) {
if(!sel->isfloating)
XLowerWindow(dpy, sel->win);
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
if(c == sel)
continue;
XLowerWindow(dpy, c->win);
}
}
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
setlayout(const char *arg) {
int i;
if(!arg) {
for(i = 0; i < nlayouts && lt != &layout[i]; i++);
if(i == nlayouts - 1)
lt = &layout[0];
else
lt = &layout[++i];
}
else {
i = atoi(arg);
if(i < 0 || i >= nlayouts)
return;
lt = &layout[i];
}
if(sel)
lt->arrange();
else
drawstatus();
}
void
togglemax(const char *arg) {
XEvent ev;
if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
return;
if((sel->ismax = !sel->ismax)) {
sel->rx = sel->x;
sel->ry = sel->y;
sel->rw = sel->w;
sel->rh = sel->h;
resize(sel, wax, way, waw - 2 * BORDERPX, wah - 2 * BORDERPX, True);
}
else
resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
drawstatus();
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
zoom(const char *arg) {
unsigned int n;
Client *c;
if(!sel || lt->arrange != tile || sel->isfloating)
return;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;
detach(c);
attach(c);
focus(c);
lt->arrange();
}

325
main.c

@ -1,325 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xproto.h>
/* extern */
char stext[256];
int screen, sx, sy, sw, sh, wax, way, waw, wah;
unsigned int bh, ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool *seltag;
Bool selscreen = True;
Client *clients = NULL;
Client *sel = NULL;
Client *stack = NULL;
Cursor cursor[CurLast];
Display *dpy;
DC dc = {0};
Window root, barwin;
/* static */
static int (*xerrorxlib)(Display *, XErrorEvent *);
static Bool otherwm, readin;
static Bool running = True;
static void
cleanup(void) {
close(STDIN_FILENO);
while(stack) {
if(stack->isbanned)
XMoveWindow(dpy, stack->win, stack->x, stack->y);
unmanage(stack);
}
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
XFreeFont(dpy, dc.font.xfont);
XUngrabKey(dpy, AnyKey, AnyModifier, root);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, barwin);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
free(seltag);
}
static unsigned long
initcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
XColor color;
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
eprint("error, cannot allocate color '%s'\n", colstr);
return color.pixel;
}
static void
initfont(const char *fontstr) {
char *def, **missing;
int i, n;
missing = NULL;
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) {
while(n--)
fprintf(stderr, "missing fontset: %s\n", missing[n]);
XFreeStringList(missing);
}
if(dc.font.set) {
XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
font_extents = XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
if(dc.font.ascent < (*xfonts)->ascent)
dc.font.ascent = (*xfonts)->ascent;
if(dc.font.descent < (*xfonts)->descent)
dc.font.descent = (*xfonts)->descent;
xfonts++;
}
}
else {
if(dc.font.xfont)
XFreeFont(dpy, dc.font.xfont);
dc.font.xfont = NULL;
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
eprint("error, cannot load font: '%s'\n", fontstr);
dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent;
}
dc.font.height = dc.font.ascent + dc.font.descent;
}
static void
scan(void) {
unsigned int i, num;
Window *wins, d1, d2;
XWindowAttributes wa;
wins = NULL;
if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
for(i = 0; i < num; i++) {
if(!XGetWindowAttributes(dpy, wins[i], &wa)
|| wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
continue;
if(wa.map_state == IsViewable)
manage(wins[i], &wa);
}
}
if(wins)
XFree(wins);
}
static void
setup(void) {
int i, j;
unsigned int mask;
Window w;
XModifierKeymap *modmap;
XSetWindowAttributes wa;
/* init atoms */
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) netatom, NetLast);
/* init cursors */
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
/* init modifier map */
numlockmask = 0;
modmap = XGetModifierMapping(dpy);
for (i = 0; i < 8; i++)
for (j = 0; j < modmap->max_keypermod; j++) {
if(modmap->modifiermap[i * modmap->max_keypermod + j]
== XKeysymToKeycode(dpy, XK_Num_Lock))
numlockmask = (1 << i);
}
XFreeModifiermap(modmap);
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask;
wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
grabkeys();
compileregs();
for(ntags = 0; tags[ntags]; ntags++);
seltag = emallocz(sizeof(Bool) * ntags);
seltag[0] = True;
/* style */
dc.norm[ColBorder] = initcolor(NORMBORDERCOLOR);
dc.norm[ColBG] = initcolor(NORMBGCOLOR);
dc.norm[ColFG] = initcolor(NORMFGCOLOR);
dc.sel[ColBorder] = initcolor(SELBORDERCOLOR);
dc.sel[ColBG] = initcolor(SELBGCOLOR);
dc.sel[ColFG] = initcolor(SELFGCOLOR);
initfont(FONT);
/* geometry */
sx = sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
initlayouts();
/* bar */
dc.h = bh = dc.font.height + 2;
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ButtonPressMask | ExposureMask;
barwin = XCreateWindow(dpy, root, sx, sy + (TOPBAR ? 0 : sh - bh), sw, bh, 0,
DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, barwin, cursor[CurNormal]);
XMapRaised(dpy, barwin);
strcpy(stext, "dwm-"VERSION);
/* windowarea */
wax = sx;
way = sy + (TOPBAR ? bh : 0);
wah = sh - bh;
waw = sw;
/* pixmap for everything */
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
if(!dc.font.set)
XSetFont(dpy, dc.gc, dc.font.xfont->fid);
/* multihead support */
selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
}
/*
* Startup Error handler to check if another window manager
* is already running.
*/
static int
xerrorstart(Display *dsply, XErrorEvent *ee) {
otherwm = True;
return -1;
}
/* extern */
void
quit(const char *arg) {
readin = running = False;
}
/* There's no way to check accesses to destroyed windows, thus those cases are
* ignored (especially on UnmapNotify's). Other types of errors call Xlibs
* default error handler, which may call exit.
*/
int
xerror(Display *dpy, XErrorEvent *ee) {
if(ee->error_code == BadWindow
|| (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
|| (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable)
|| (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable)
|| (ee->request_code == X_PolySegment && ee->error_code == BadDrawable)
|| (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch)
|| (ee->request_code == X_GrabKey && ee->error_code == BadAccess)
|| (ee->request_code == X_CopyArea && ee->error_code == BadDrawable))
return 0;
fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
ee->request_code, ee->error_code);
return xerrorxlib(dpy, ee); /* may call exit */
}
int
main(int argc, char *argv[]) {
char *p;
int r, xfd;
fd_set rd;
XEvent ev;
if(argc == 2 && !strncmp("-v", argv[1], 3))
eprint("dwm-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n");
else if(argc != 1)
eprint("usage: dwm [-v]\n");
setlocale(LC_CTYPE, "");
if(!(dpy = XOpenDisplay(0)))
eprint("dwm: cannot open display\n");
xfd = ConnectionNumber(dpy);
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
otherwm = False;
XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, root, SubstructureRedirectMask);
XSync(dpy, False);
if(otherwm)
eprint("dwm: another window manager is already running\n");
XSync(dpy, False);
XSetErrorHandler(NULL);
xerrorxlib = XSetErrorHandler(xerror);
XSync(dpy, False);
setup();
drawstatus();
scan();
/* main event loop, also reads status text from stdin */
XSync(dpy, False);
readin = True;
while(running) {
FD_ZERO(&rd);
if(readin)
FD_SET(STDIN_FILENO, &rd);
FD_SET(xfd, &rd);
if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
if(errno == EINTR)
continue;
eprint("select failed\n");
}
if(FD_ISSET(STDIN_FILENO, &rd)) {
switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)) {
case -1:
strncpy(stext, strerror(errno), sizeof stext - 1);
stext[sizeof stext - 1] = '\0';
readin = False;
break;
case 0:
strncpy(stext, "EOF", 4);
readin = False;
break;
default:
for(stext[r] = '\0', p = stext + strlen(stext) - 1; p >= stext && *p == '\n'; *p-- = '\0');
for(; p >= stext && *p != '\n'; --p);
if(p > stext)
strncpy(stext, p + 1, sizeof stext);
}
drawstatus();
}
while(XPending(dpy)) {
XNextEvent(dpy, &ev);
if(handler[ev.type])
(handler[ev.type])(&ev); /* call handler */
}
}
cleanup();
XCloseDisplay(dpy);
return 0;
}

154
tag.c

@ -1,154 +0,0 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xutil.h>
/* static */
typedef struct {
const char *prop;
const char *tags;
Bool isfloating;
} Rule;
typedef struct {
regex_t *propregex;
regex_t *tagregex;
} Regs;
TAGS
RULES
static Regs *regs = NULL;
static unsigned int nrules = 0;
/* extern */
void
compileregs(void) {
unsigned int i;
regex_t *reg;
if(regs)
return;
nrules = sizeof rule / sizeof rule[0];
regs = emallocz(nrules * sizeof(Regs));
for(i = 0; i < nrules; i++) {
if(rule[i].prop) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].prop, REG_EXTENDED))
free(reg);
else
regs[i].propregex = reg;
}
if(rule[i].tags) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].tags, REG_EXTENDED))
free(reg);
else
regs[i].tagregex = reg;
}
}
}
Bool
isvisible(Client *c) {
unsigned int i;
for(i = 0; i < ntags; i++)
if(c->tags[i] && seltag[i])
return True;
return False;
}
void
settags(Client *c, Client *trans) {
char prop[512];
unsigned int i, j;
regmatch_t tmp;
Bool matched = trans != NULL;
XClassHint ch = { 0 };
if(matched)
for(i = 0; i < ntags; i++)
c->tags[i] = trans->tags[i];
else {
XGetClassHint(dpy, c->win, &ch);
snprintf(prop, sizeof prop, "%s:%s:%s",
ch.res_class ? ch.res_class : "",
ch.res_name ? ch.res_name : "", c->name);
for(i = 0; i < nrules; i++)
if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) {
c->isfloating = rule[i].isfloating;
for(j = 0; regs[i].tagregex && j < ntags; j++) {
if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) {
matched = True;
c->tags[j] = True;
}
}
}
if(ch.res_class)
XFree(ch.res_class);
if(ch.res_name)
XFree(ch.res_name);
}
if(!matched)
for(i = 0; i < ntags; i++)
c->tags[i] = seltag[i];
}
void
tag(const char *arg) {
int i;
if(!sel)
return;
for(i = 0; i < ntags; i++)
sel->tags[i] = arg == NULL;
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
sel->tags[i] = True;
lt->arrange();
}
void
toggletag(const char *arg) {
int i, j;
if(!sel)
return;
i = arg ? atoi(arg) : 0;
sel->tags[i] = !sel->tags[i];
for(j = 0; j < ntags && !sel->tags[j]; j++);
if(j == ntags)
sel->tags[i] = True;
lt->arrange();
}
void
toggleview(const char *arg) {
int i, j;
i = arg ? atoi(arg) : 0;
seltag[i] = !seltag[i];
for(j = 0; j < ntags && !seltag[j]; j++);
if(j == ntags)
seltag[i] = True; /* cannot toggle last view */
lt->arrange();
}
void
view(const char *arg) {
int i;
for(i = 0; i < ntags; i++)
seltag[i] = arg == NULL;
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
seltag[i] = True;
lt->arrange();
}

@ -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);
}

@ -1,54 +1,35 @@
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
/* See LICENSE file for copyright and license details. */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
/* extern */
#include "util.h"
void *
emallocz(unsigned int size) {
void *res = calloc(1, size);
ecalloc(size_t nmemb, size_t size)
{
void *p;
if(!res)
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}
void
eprint(const char *errstr, ...) {
die(const char *fmt, ...) {
va_list ap;
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(EXIT_FAILURE);
}
void
spawn(const char *arg) {
static char *shell = NULL;
if(!shell && !(shell = getenv("SHELL")))
shell = "/bin/sh";
if(!arg)
return;
/* The double-fork construct avoids zombie processes and keeps the code
* clean from stupid signal handlers. */
if(fork() == 0) {
if(fork() == 0) {
if(dpy)
close(ConnectionNumber(dpy));
setsid();
execl(shell, shell, "-c", arg, (char *)NULL);
fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg);
perror(" failed");
}
exit(0);
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
} else {
fputc('\n', stderr);
}
wait(0);
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