diff options
| author | Jochen Keil <jochen.keil@gmail.com> | 2012-08-22 21:27:57 +0200 | 
|---|---|---|
| committer | Jochen Keil <jochen.keil@gmail.com> | 2012-08-22 21:27:57 +0200 | 
| commit | a05c57f7aed141a8d6dc9038be177712be432b9d (patch) | |
| tree | 1d456df5ae4a49d63460102da13c2ec54421d8bd | |
| parent | fefeae79de28446d46dc21e193aa34fcd4fe9002 (diff) | |
| download | xmobar-a05c57f7aed141a8d6dc9038be177712be432b9d.tar.gz xmobar-a05c57f7aed141a8d6dc9038be177712be432b9d.tar.bz2 | |
Configuration example for XMonad using the DBus interface
Mainly code from my config which does the following:
When I press my modifier key (which is xK_Alt_L) then xmobar appears.
When I keep the key pressed for longer than 400ms (which is often the
when tabbing through windows, changing workspaces, etc), then upon
release xmobar will be hidden immediately. If I press xK_Alt_L for less
than 400ms (very briefly), then xmobar pops up, and will automatically
disappear after 2 seconds.
| -rw-r--r-- | readme.md | 61 | 
1 files changed, 61 insertions, 0 deletions
| @@ -345,6 +345,67 @@ It is also possible to send multiple signals at once:          dbus-send [..] \              "string:ChangeScreen" "string:Reveal 0" "string:TogglePersistent" +### Example for using the DBus IPC interface with XMonad + +Bind the key which should {,un}map xmobar to a dummy value. This is necessary +for {,un}grabKey in xmonad. + +    ((0, xK_Alt_L   ), return ()) + +Also, install `avoidStruts` layout modifier from `XMonad.Hooks.ManageDocks` + +Finally, install these two event hooks (`handleEventHook` in `XConfig`) +`myDocksEventHook` is a replacement for `docksEventHook` which reacts on unmap +events as well (which `docksEventHook` doesn't). + +    import qualified XMonad.Util.ExtensibleState as XS + +    data DockToggleTime = DTT { lastTime :: Time } deriving (Eq, Show, Typeable) + +    instance ExtensionClass DockToggleTime where +        initialValue = DTT 0 + +    toggleDocksHook :: Int -> KeySym -> Event -> X All +    toggleDocksHook to ks ( KeyEvent { ev_event_display = d +                                     , ev_event_type    = et +                                     , ev_keycode       = ekc +                                     , ev_time          = etime +                                     } ) = +            io (keysymToKeycode d ks) >>= toggleDocks >> return (All True) +        where +        toggleDocks kc +            | ekc == kc && et == keyPress = do +                safeSendSignal ["Reveal 0", "TogglePersistent"] +                XS.put ( DTT etime ) +            | ekc == kc && et == keyRelease = do +                gap <- XS.gets ( (-) etime . lastTime ) +                safeSendSignal [ "TogglePersistent" +                               , "Hide " ++ show (if gap < 400 then to else 0) +                               ] +            | otherwise = return () + +        safeSendSignal s = catchX (io $ sendSignal s) (return ()) +        sendSignal    = withSession . callSignal +        withSession mc = connectSession >>= \c -> callNoReply c mc >> disconnect c +        callSignal :: [String] -> MethodCall +        callSignal s = ( methodCall +                         ( objectPath_    "/org/Xmobar/Control" ) +                         ( interfaceName_ "org.Xmobar.Control"  ) +                         ( memberName_    "SendSignal"          ) +                       ) { methodCallDestination = Just $ busName_ "org.Xmobar.Control" +                         , methodCallBody        = map toVariant s +                         } + +    toggleDocksHook _ _ _ = return (All True) + +    myDocksEventHook :: Event -> X All +    myDocksEventHook e = do +        when (et == mapNotify || et == unmapNotify) $ +            whenX ((not `fmap` (isClient w)) <&&> runQuery checkDock w) refresh +        return (All True) +        where w  = ev_window e +              et = ev_event_type e +  ## The Output Template | 
