Age | Commit message (Collapse) | Author |
|
Moving initColor to Operations allows it to be used by extensions.
The Pixel component of the color is the only thing we need, so it's simpler
just to deal with that.
darcs-hash:20070613234501-b9aa7-5b39416db9f9d5ac42692262c233179baeb2540f
|
|
darcs-hash:20070613185902-32816-b7cd7a5c14e111abfe52918612bd6a9ee6a0c90b
|
|
darcs-hash:20070613043018-a5988-fac19281fc680eb1dd346d42b7d03f6c7928c18c
|
|
darcs-hash:20070612154253-72aca-b2c7e24b5e70a09feaebccd443aebbe37b568efa
|
|
This is a rerun of my change to make (Stack a) never be empty. Gives
us more type-safety.
darcs-hash:20070612150555-72aca-5f6e43aa33979c71679a73b44d93f9e2b8f9d2a8
|
|
darcs-hash:20070611182629-a5988-384e2f82340497c833a68d909ea485017803fe9b
|
|
darcs-hash:20070611161152-a5988-1311671abda1c7edfa223255dff0128860b30d38
|
|
darcs-hash:20070611160608-a5988-a042d190c15b993b15da274db915ca73d9c8e089
|
|
darcs-hash:20070611153650-72aca-c802f2ac167c0e9232d17a2897163aca5a5479f0
|
|
darcs-hash:20070610012237-72aca-4c5873773e58103f57f7a0b232da58c269248fa7
|
|
darcs-hash:20070610123746-32816-e5a1b61d81fa52f608d7936f900431bd6620c3c7
|
|
darcs-hash:20070610061932-9c5c1-9a08992ef555f086007474e64d5ae9d835e9677e
|
|
darcs-hash:20070610045551-9c5c1-a1604a4e90d160728b3c5cd12acb3b4febc3625a
|
|
easier format to parse, than 'show' produces
darcs-hash:20070609131716-9c5c1-ac6b3d7e8193b16ca9ae65f32d5373090107eca1
|
|
According to the ICCCM, clients should send a synthetic unmap event when they
initiate an unmap. The old code waited for these synthetic unmaps to unmanage
windows. However, certain 'obsolete' clients do not send synthetic unmaps
(notably xpdf's find dialog). These windows entered a zombified state: xmonad
does not manage them, yet they are still mapped and raised on screen.
The new algorithm (derived from wmii):
- track windows that are mapped on screen
- track the number of expected unmap events for each window, increment every
time 'hide' is called on a window that is not mapped.
- decrement the expected unmap counter on each unmap event
- treat an unmap event as genuine (ie. unmap the window) when:
- the event is synthetic (per ICCCM)
- OR there are no expected unmap events for this window
darcs-hash:20070606214006-a5988-7c2eced85319ff506a9b7c9dc86d5946ca0da8e5
|
|
darcs-hash:20070604044715-e3110-7bd7ba2b78f80046e2148fb37aa0f5fe3eca08c6
|
|
Note that this breaks compatibility with certain programs described as
"obsolete" in the ICCCM (1994). See the command above the UnmapEvent handler
for details.
darcs-hash:20070604042343-e3110-4766eafca2875091189159f6a1df29eac3c21387
|
|
darcs-hash:20070604015532-9c5c1-1fda0e7e7cf686dc71785d3877a51d23f42b5919
|
|
darcs-hash:20070604014630-9c5c1-4cd761ffdf2caab60d490fdc1fe189577a59272b
|
|
(a documented feature)
darcs-hash:20070604013938-e3110-8dc84f03278c55076a5cf83013974689c4861ffc
|
|
darcs-hash:20070601001325-64353-3ea08019b13ac470d7d2c60cbdea61de7d580c8c
|
|
darcs-hash:20070530181006-a5988-96541d0d2832c8f248e47957e8398a01d57545f9
|
|
I found it difficult to track down a problem in the restart code where xmonad was silently not restarting. This will log the error to stderr, which should show up in .xsession-errors
darcs-hash:20070530171024-01341-e8d0657705a1236dec13d1a6932d0c45b6523322
|
|
screens now
darcs-hash:20070528031501-9c5c1-beaadbacb5efc1ce5998aba41fbb3b2c68cdf0d1
|
|
darcs-hash:20070528025135-9c5c1-3c0f63ac557da57cd268cd0129b9ce90692631e4
|
|
darcs-hash:20070527125928-9c5c1-a16246810db9d4abfe81d0d5814721b64f59a14c
|
|
darcs-hash:20070527072652-9c5c1-be19c516b63614dcf81ce37f8c564184c67ea9f6
|
|
darcs-hash:20070522060357-a5988-037eb7484106de44a541f21c41d15c2050e94760
|
|
darcs-hash:20070522043758-a5988-7738168ac829a9b2cf79e6866072cccde379a977
|
|
darcs-hash:20070521232427-a5988-f7c747a1bfcc2a6ad38d5c47c3ecf195d1e4a6b5
|
|
darcs-hash:20070521194653-a5988-b6725cc0d73fc6b726dc41284eef9303a7e59a1e
|
|
darcs-hash:20070521191900-a5988-ef2361014d1d8c27cd8c73d290cdeff13ee38df6
|
|
darcs-hash:20070521190749-a5988-1c95a0491806b06a32e7fe8bd6bcac31ebc7ad6b
|
|
darcs-hash:20070521190704-a5988-24dfb3b96a551ee2a27c9dd09461ddd260db8e64
|
|
darcs-hash:20070521162809-a5988-fbabe930a50582fb828cd3683167e158bec904ad
|
|
darcs-hash:20070521152759-a5988-736e7caea5252a77bb01d7631cce0db4287ff6f2
|
|
darcs-hash:20070521040330-b9aa7-5a36f8a4f90cc4116ffa3532a14bf405bfb942bb
|
|
In order to give a better account of how focus and master interact, and
how each operation affects focus, we reimplement the StackSet type as a
two level nested 'Zipper'. To quote Oleg:
A Zipper is essentially an `updateable' and yet pure functional
cursor into a data structure. Zipper is also a delimited
continuation reified as a data structure.
That is, we use the Zipper as a cursor which encodes the window which is
in focus. Thus our data structure tracks focus correctly by
construction! We then get simple, obvious semantics for e.g. insert, in
terms of how it affects focus/master. Our transient-messes-with-focus
bug evaporates. 'swap' becomes trivial.
By moving focus directly into the stackset, we can toss some QC
properties about focus handling: it is simply impossible now for focus
to go wrong. As a benefit, we get a dozen new QC properties for free,
governing how master and focus operate.
The encoding of focus in the data type also simplifies the focus
handling in Operations: several operations affecting focus are now
simply wrappers over StackSet.
For the full story, please read the StackSet module, and the QC
properties.
Finally, we save ~40 lines with the simplified logic in Operations.hs
For more info, see the blog post on the implementation,
http://cgi.cse.unsw.edu.au/~dons/blog/2007/05/17#xmonad_part1b_zipper
darcs-hash:20070520070053-9c5c1-241f7ee7793f5db2b9e33d375965cdc21b26cbd7
|
|
darcs-hash:20070512215301-72aca-59213ac37c38e57d6ffed1d518afd4729f1744c9
|
|
darcs-hash:20070514044547-a5988-0e3c07a629fd1a28e11ee9ae1395086a5477dae2
|
|
darcs-hash:20070504094143-9c5c1-44d5edcd4b261a2d93b054f48e7818b0c9e58db2
|
|
Using Typeables as the only constraint on layout messages is a bit
scary, as a user can send arbitrary values to layoutMsg, whether they
make sense or not: there's basically no type feedback on the values you
supply to layoutMsg.
Folloing Simon Marlow's dynamically extensible exceptions paper, we use
an existential type, and a Message type class, to constrain valid
arguments to layoutMsg to be valid members of Message.
That is, a user writes some data type for messages their layout
algorithm accepts:
data MyLayoutEvent = Zoom
| Explode
| Flaming3DGlassEffect
deriving (Typeable)
and they then add this to the set of valid message types:
instance Message MyLayoutEvent
Done. We also reimplement the dynamic type check while we're here, to
just directly use 'cast', rather than expose a raw fromDynamic/toDyn.
With this, I'm much happier about out dynamically extensible layout
event subsystem.
darcs-hash:20070504081649-9c5c1-954b406e8c21c2ca4428960e4fc1f9ffb17fb296
|
|
darcs-hash:20070504045644-a5988-68a6d650bacab936f893b96bf866696da3f73436
|
|
darcs-hash:20070504023618-9c5c1-4b5a4021212b08fedff7f8ec3d8b4234431aada3
|
|
darcs-hash:20070503144750-72aca-f44bca4573837e12fc1f89333b55e04abd52787c
|
|
darcs-hash:20070503075821-9c5c1-d5bc043872adb9f95c23e0fde87ae11f16108785
|
|
darcs-hash:20070430162647-a5988-70420c2db283eb1585c96d977e5ac5ca3d0d1532
|
|
darcs-hash:20070430161635-a5988-ee0abcdeff2aa92df2d593de488797015c0fc7e7
|
|
darcs-hash:20070430161511-a5988-2196c16d0c2d0d5207b68a6b27d66b11b4fe0014
|
|
darcs-hash:20070430054715-a5988-a74f5e2868f47443a69b0cd821fa690e43a4a7e1
|