diff options
-rw-r--r-- | readme.md | 457 |
1 files changed, 277 insertions, 180 deletions
@@ -182,11 +182,15 @@ Otherwise, you'll need to install them yourself. use the `xft:` prefix in the `font` configuration option. For instance: + ``` haskell font = "xft:Times New Roman-10:italic" + ``` Or to have fallback fonts, just separate them by commas: + ``` haskell font = "xft:Open Sans:size=9,WenQuanYi Zen Hei:size=9" + ``` - `with_mpd` Enables support for the [MPD] daemon. Requires the [libmpd] package. @@ -349,21 +353,29 @@ Other configuration options: For example: - position = BottomW C 75 + ``` haskell + position = BottomW C 75 + ``` to place xmobar at the bottom, centered with the 75% of the screen width. Or - position = BottomP 120 0 + ``` haskell + position = BottomP 120 0 + ``` to place xmobar at the bottom, with 120 pixel indent of the left. Or - position = Static { xpos = 0 , ypos = 0, width = 1024, height = 15 } + ``` haskell + position = Static { xpos = 0 , ypos = 0, width = 1024, height = 15 } + ``` or - position = Top + ``` haskell + position = Top + ``` - `textOffset` The vertical offset, in pixels, for the text baseline. If negative or not given, xmobar will try to center text @@ -467,40 +479,40 @@ file. Example: - xmobar -B white -a right -F blue -t '%LIPB%' -c '[Run Weather "LIPB" [] 36000]' + xmobar -B white -a right -F blue -t '%LIPB%' -c '[Run Weather "LIPB" [] 36000]' This is the list of command line options (the output of xmobar --help): - Usage: xmobar [OPTION...] [FILE] - Options: - -h, -? --help This help - -V --version Show version information - -v --verbose Emit verbose debugging messages - -r --recompile Force recompilation (for Haskell FILE) - -f font name --font=font name Font name - -N font name --add-font=font name Add to the list of additional fonts - -w class --wmclass=class X11 WM_CLASS property - -n name --wmname=name X11 WM_NAME property - -B bg color --bgcolor=bg color Background color. Default black - -F fg color --fgcolor=fg color Foreground color. Default grey - -A alpha --alpha=alpha Transparency: 0 is transparent - and 255 (the default) is opaque - -o --top Place xmobar at the top of the screen - -b --bottom Place xmobar at the bottom of the screen - -p --position=position Specify position, same as in config file - -d --dock Try to start xmobar as a dock - -a alignsep --alignsep=alignsep Separators for left, center and right text - alignment. Default: '}{' - -s char --sepchar=char Character used to separate commands in - the output template. Default '%' - -t template --template=template Output template - -i path --iconroot=path Default directory for icon pattern files - -c commands --commands=commands List of commands to be executed - -C command --add-command=command Add to the list of commands to be executed - -x screen --screen=screen On which X screen number to start - - Mail bug reports and suggestions to <mail@jao.io> + Usage: xmobar [OPTION...] [FILE] + Options: + -h, -? --help This help + -V --version Show version information + -v --verbose Emit verbose debugging messages + -r --recompile Force recompilation (for Haskell FILE) + -f font name --font=font name Font name + -N font name --add-font=font name Add to the list of additional fonts + -w class --wmclass=class X11 WM_CLASS property + -n name --wmname=name X11 WM_NAME property + -B bg color --bgcolor=bg color Background color. Default black + -F fg color --fgcolor=fg color Foreground color. Default grey + -A alpha --alpha=alpha Transparency: 0 is transparent + and 255 (the default) is opaque + -o --top Place xmobar at the top of the screen + -b --bottom Place xmobar at the bottom of the screen + -p --position=position Specify position, same as in config file + -d --dock Try to start xmobar as a dock + -a alignsep --alignsep=alignsep Separators for left, center and right text + alignment. Default: '}{' + -s char --sepchar=char Character used to separate commands in + the output template. Default '%' + -t template --template=template Output template + -i path --iconroot=path Default directory for icon pattern files + -c commands --commands=commands List of commands to be executed + -C command --add-command=command Add to the list of commands to be executed + -x screen --screen=screen On which X screen number to start + + Mail bug reports and suggestions to <mail@jao.io> ## The Output Template @@ -520,7 +532,7 @@ reported. It's possible to insert in the global templates icon directives of the form: - <icon=/path/to/bitmap.xbm/> + <icon=/path/to/bitmap.xbm/> which will produce the expected result. Accepted image formats are XBM and XPM (when `with_xpm` flag is enabled). If path does not start with @@ -528,7 +540,7 @@ and XPM (when `with_xpm` flag is enabled). If path does not start with It's also possible to use action directives of the form: - <action=`command` button=12345> + <action=`command` button=12345> which will be executed when clicked on with specified mouse buttons. This tag can be nested, allowing different commands to be run depending on button clicked. @@ -546,17 +558,23 @@ enclosed by square parenthesis. Example: - [Run Memory ["-t","Mem: <usedratio>%"] 10, Run Swap [] 10] + ``` haskell + [Run Memory ["-t","Mem: <usedratio>%"] 10, Run Swap [] 10] + ``` to run the Memory monitor plugin with the specified template, and the swap monitor plugin, with default options, every second. And here's an example of a template for the commands above using an icon: - template="<icon=/home/jao/.xmobar/mem.xbm/><memory> <swap>" + ``` haskell + template="<icon=/home/jao/.xmobar/mem.xbm/><memory> <swap>" + ``` This example will run "xclock" command when date is clicked: - template="<action=`xclock`>%date%</action> + ``` haskell + template="<action=`xclock`>%date%</action> + ``` The only internal available command is `Com` (see below Executing External Commands). All other commands are provided by plugins. xmobar @@ -587,11 +605,13 @@ as `"<icon=/path/to/icon_3.xpm/>"` when the value is `3`, also `"%"` is interpre as `"%"`, `"%%"` as `"3"`, `"%%%"` as `"3%"`, `"%%%%"` as `"33"` and so on). Essentially it allows to replace vertical bars with custom icons. For example, - Run Brightness - [ "-t", "<ipat>" - , "--" - , "--brightness-icon-pattern", "<icon=bright_%%.xpm/>" - ] 30 + ``` haskell + Run Brightness + [ "-t", "<ipat>" + , "--" + , "--brightness-icon-pattern", "<icon=bright_%%.xpm/>" + ] 30 + ``` Will display `bright_0.xpm` to `bright_8.xpm` depending on current brightness value. @@ -726,14 +746,16 @@ These are the options available for all monitors below: Commands' arguments must be set as a list. E.g.: - Run Weather "EGPF" ["-t", "<station>: <tempC>C"] 36000 + ``` haskell + Run Weather "EGPF" ["-t", "<station>: <tempC>C"] 36000 + ``` In this case xmobar will run the weather monitor, getting information for the weather station ID EGPF (Glasgow Airport, as a homage to GHC) every hour (36000 tenth of seconds), with a template that will output something like: - Glasgow Airport: 16.0C + Glasgow Airport: 16.0C ## `Uptime Args RefreshRate` @@ -781,24 +803,24 @@ something like: For example: -```haskell - WeatherX "LEBL" - [ ("clear", "🌣") - , ("sunny", "🌣") - , ("mostly clear", "🌤") - , ("mostly sunny", "🌤") - , ("partly sunny", "⛅") - , ("fair", "🌑") - , ("cloudy","☁") - , ("overcast","☁") - , ("partly cloudy", "⛅") - , ("mostly cloudy", "🌧") - , ("considerable cloudiness", "⛈")] - ["-t", "<fn=2><skyConditionS></fn> <tempC>° <rh>% <windKmh> (<hour>)" - , "-L","10", "-H", "25", "--normal", "black" - , "--high", "lightgoldenrod4", "--low", "darkseagreen4"] - 18000 -``` + ``` haskell + WeatherX "LEBL" + [ ("clear", "🌣") + , ("sunny", "🌣") + , ("mostly clear", "🌤") + , ("mostly sunny", "🌤") + , ("partly sunny", "⛅") + , ("fair", "🌑") + , ("cloudy","☁") + , ("overcast","☁") + , ("partly cloudy", "⛅") + , ("mostly cloudy", "🌧") + , ("considerable cloudiness", "⛈")] + ["-t", "<fn=2><skyConditionS></fn> <tempC>° <rh>% <windKmh> (<hour>)" + , "-L","10", "-H", "25", "--normal", "black" + , "--high", "lightgoldenrod4", "--low", "darkseagreen4"] + 18000 + ``` As mentioned, the replacement string can also be an icon specification, such as `("clear", "<icon=weather-clear.xbm/>")`. @@ -914,7 +936,11 @@ specification, such as `("clear", "<icon=weather-clear.xbm/>")`. ## `Battery Args RefreshRate` -- Same as `BatteryP ["BAT", "BAT0", "BAT1", "BAT2"] Args RefreshRate`. +- Same as + + ``` haskell + BatteryP ["BAT", "BAT0", "BAT1", "BAT2"] Args RefreshRate + ``` ## `BatteryP Dirs Args RefreshRate` @@ -966,15 +992,17 @@ specification, such as `("clear", "<icon=weather-clear.xbm/>")`. - Example (note that you need "--" to separate regular monitor options from Battery's specific ones): - Run BatteryP ["BAT0"] - ["-t", "<acstatus><watts> (<left>%)", - "-L", "10", "-H", "80", "-p", "3", - "--", "-O", "<fc=green>On</fc> - ", "-i", "", - "-L", "-15", "-H", "-5", - "-l", "red", "-m", "blue", "-h", "green" - "-a", "notify-send -u critical 'Battery running out!!'", - "-A", "3"] - 600 + ``` haskell + Run BatteryP ["BAT0"] + ["-t", "<acstatus><watts> (<left>%)", + "-L", "10", "-H", "80", "-p", "3", + "--", "-O", "<fc=green>On</fc> - ", "-i", "", + "-L", "-15", "-H", "-5", + "-l", "red", "-m", "blue", "-h", "green" + "-a", "notify-send -u critical 'Battery running out!!'", + "-A", "3"] + 600 + ``` In the above example, the thresholds before the "--" separator affect only the `<left>` and `<leftbar>` fields, while those after @@ -987,12 +1015,14 @@ specification, such as `("clear", "<icon=weather-clear.xbm/>")`. It is also possible to specify template variables in the `-O` and `-o` switches, as in the following example: - Run BatteryP ["BAT0"] - ["-t", "<acstatus>" - , "-L", "10", "-H", "80" - , "-l", "red", "-h", "green" - , "--", "-O", "Charging", "-o", "Battery: <left>%" - ] 10 + ``` haskell + Run BatteryP ["BAT0"] + ["-t", "<acstatus>" + , "-L", "10", "-H", "80" + , "-l", "red", "-h", "green" + , "--", "-O", "Charging", "-o", "Battery: <left>%" + ] 10 + ``` - The "idle" AC state is selected whenever the AC power entering the battery is zero. @@ -1048,9 +1078,11 @@ more than one battery. - Default template: none (you must specify a template for each file system). - Example: - DiskU [("/", "<used>/<size>"), ("sdb1", "<usedbar>")] - ["-L", "20", "-H", "50", "-m", "1", "-p", "3"] - 20 + ``` haskell + DiskU [("/", "<used>/<size>"), ("sdb1", "<usedbar>")] + ["-L", "20", "-H", "50", "-m", "1", "-p", "3"] + 20 + ``` ## `DiskIO Disks Args RefreshRate` @@ -1073,7 +1105,9 @@ more than one battery. - Default template: none (you must specify a template for each file system). - Example: - DiskIO [("/", "<read> <write>"), ("sdb1", "<total>")] [] 10 + ``` haskell + DiskIO [("/", "<read> <write>"), ("sdb1", "<total>")] [] 10 + ``` ## `ThermalZone Number Args RefreshRate` @@ -1090,7 +1124,9 @@ more than one battery. directory). - Example: - Run ThermalZone 0 ["-t","<id>: <temp>C"] 30 + ``` haskell + Run ThermalZone 0 ["-t","<id>: <temp>C"] 30 + ``` ## `Thermal Zone Args RefreshRate` @@ -1107,7 +1143,9 @@ more than one battery. Check directories in /proc/acpi/thermal_zone for possible values. - Example: - Run Thermal "THRM" ["-t","iwl4965-temp: <temp>C"] 50 + ``` haskell + Run Thermal "THRM" ["-t","iwl4965-temp: <temp>C"] 50 + ``` ## `CpuFreq Args RefreshRate` @@ -1120,8 +1158,10 @@ more than one battery. - This monitor requires acpi_cpufreq module to be loaded in kernel - Example: - Run CpuFreq ["-t", "Freq:<cpu0>|<cpu1>GHz", "-L", "0", "-H", "2", - "-l", "lightblue", "-n","white", "-h", "red"] 50 + ``` haskell + Run CpuFreq ["-t", "Freq:<cpu0>|<cpu1>GHz", "-L", "0", "-H", "2", + "-l", "lightblue", "-n","white", "-h", "red"] 50 + ``` ## `CoreTemp Args RefreshRate` @@ -1134,9 +1174,11 @@ more than one battery. - This monitor requires coretemp module to be loaded in kernel - Example: - Run CoreTemp ["-t", "Temp:<core0>|<core1>C", - "-L", "40", "-H", "60", - "-l", "lightblue", "-n", "gray90", "-h", "red"] 50 + ``` haskell + Run CoreTemp ["-t", "Temp:<core0>|<core1>C", + "-L", "40", "-H", "60", + "-l", "lightblue", "-n", "gray90", "-h", "red"] 50 + ``` ## `MultiCoreTemp Args RefreshRate` @@ -1170,10 +1212,12 @@ more than one battery. - This monitor requires coretemp module to be loaded in kernel - Example: - Run MultiCoreTemp ["-t", "Temp: <avg>°C | <avgpc>%", - "-L", "60", "-H", "80", - "-l", "green", "-n", "yellow", "-h", "red", - "--", "--mintemp", "20", "--maxtemp", "100"] 50 + ``` haskell + Run MultiCoreTemp ["-t", "Temp: <avg>°C | <avgpc>%", + "-L", "60", "-H", "80", + "-l", "green", "-n", "yellow", "-h", "red", + "--", "--mintemp", "20", "--maxtemp", "100"] 50 + ``` ## `Volume Mixer Element Args RefreshRate` @@ -1271,9 +1315,11 @@ following differences: - Example (note that you need "--" to separate regular monitor options from MPD's specific ones): - Run MPD ["-t", - "<composer> <title> (<album>) <track>/<plength> <statei> [<flags>]", - "--", "-P", ">>", "-Z", "|", "-S", "><"] 10 + ``` haskell + Run MPD ["-t", + "<composer> <title> (<album>) <track>/<plength> <statei> [<flags>]", + "--", "-P", ">>", "-Z", "|", "-S", "><"] 10 + ``` ## `MPDX Alias Args RefreshRate` @@ -1293,7 +1339,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". - Default template: `<artist> - <title>` - Example: - Run Mpris1 "clementine" ["-t", "<artist> - [<tracknumber>] <title>"] 10 + ``` haskell + Run Mpris1 "clementine" ["-t", "<artist> - [<tracknumber>] <title>"] 10 + ``` ## `Mpris2 PlayerName Args RefreshRate` @@ -1310,7 +1358,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". - Default template: `<artist> - <title>` - Example: - Run Mpris2 "spotify" ["-t", "<artist> - [<composer>] <title>"] 10 + ``` haskell + Run Mpris2 "spotify" ["-t", "<artist> - [<composer>] <title>"] 10 + ``` ## `Mail Args Alias` @@ -1322,9 +1372,11 @@ Like `MPD` but uses as alias its first argument instead of "mpd". during compilation. - Example: - Run Mail [("inbox", "~/var/mail/inbox"), - ("lists", "~/var/mail/lists")] - "mail" + ``` haskell + Run Mail [("inbox", "~/var/mail/inbox"), + ("lists", "~/var/mail/lists")] + "mail" + ``` ## `MailX Args Opts Alias` @@ -1344,11 +1396,12 @@ Like `MPD` but uses as alias its first argument instead of "mpd". during compilation. - Example: - Run MailX [("I", "inbox", "green"), - ("L", "lists", "orange")] - ["-d", "~/var/mail", "-p", " ", "-s", " "] - "mail" - + ``` haskell + Run MailX [("I", "inbox", "green"), + ("L", "lists", "orange")] + ["-d", "~/var/mail", "-p", " ", "-s", " "] + "mail" + ``` ## `MBox Mboxes Opts Alias` @@ -1374,8 +1427,10 @@ Like `MPD` but uses as alias its first argument instead of "mpd". (when it's not empty); it can be used in the template with the alias `mbox`: - Run MBox [("I ", "inbox", "red"), ("O ", "~/foo/mbox", "")] - ["-d", "/var/mail/", "-p", " "] "mbox" + ``` haskell + Run MBox [("I ", "inbox", "red"), ("O ", "~/foo/mbox", "")] + ["-d", "/var/mail/", "-p", " "] "mbox" + ``` ## `XPropertyLog PropName` @@ -1421,7 +1476,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". - Default template: `<percent>` - Example: - Run Brightness ["-t", "<bar>"] 60 + ``` haskell + Run Brightness ["-t", "<bar>"] 60 + ``` ## `Kbd Opts` @@ -1433,7 +1490,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". - second element of the tuple is the corresponding replacement - Example: - Run Kbd [("us(dvorak)", "DV"), ("us", "US")] + ``` haskell + Run Kbd [("us(dvorak)", "DV"), ("us", "US")] + ``` ## `Locks` @@ -1441,7 +1500,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". - Aliases to `locks` - Example: - Run Locks + ``` haskell + Run Locks + ``` ## `CatInt n filename` @@ -1451,7 +1512,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". have several. - Example: - Run CatInt 0 "/sys/devices/platform/thinkpad_hwmon/fan1_input" [] 50 + ``` haskell + Run CatInt 0 "/sys/devices/platform/thinkpad_hwmon/fan1_input" [] 50 + ``` ## `UVMeter` @@ -1470,7 +1533,9 @@ Like `MPD` but uses as alias its first argument instead of "mpd". http://www.arpansa.gov.au/uvindex/realtime/xml/uvvalues.xml - Example: + ``` haskell Run UVMeter "Brisbane" ["-H", "3", "-L", "3", "--low", "green", "--high", "red"] 900 + ``` # Executing External Commands @@ -1491,12 +1556,16 @@ option list with the Com template command: E.g.: - Run Com "uname" ["-s","-r"] "" 0 + ``` haskell + Run Com "uname" ["-s","-r"] "" 0 + ``` can be used in the output template as `%uname%` (and xmobar will call _uname_ only once), while - Run Com "date" ["+\"%a %b %_d %H:%M\""] "mydate" 600 + ``` haskell + Run Com "date" ["+\"%a %b %_d %H:%M\""] "mydate" 600 + ``` can be used in the output template as `%mydate%`. @@ -1509,7 +1578,9 @@ end, you can use the `ComX` variant: Works like `Com`, but displaying `ExitMessage` (a string) if the execution fails. For instance: - Run ComX "date" ["+\"%a %b %_d %H:%M\""] "N/A" "mydate" 600 + ``` haskell + Run ComX "date" ["+\"%a %b %_d %H:%M\""] "N/A" "mydate" 600 + ``` will display "N/A" if for some reason the `date` invocation fails. @@ -1541,7 +1612,11 @@ will display "N/A" if for some reason the `date` invocation fails. - Format is a time format string, as accepted by the standard ISO C `strftime` function (or Haskell's `formatCalendarTime`). - Timezone changes are picked up automatically every minute. -- Sample usage: `Run Date "%a %b %_d %Y <fc=#ee9a00>%H:%M:%S</fc>" "date" 10` +- Sample usage: + + ``` haskell + Run Date "%a %b %_d %Y <fc=#ee9a00>%H:%M:%S</fc>" "date" 10 + ``` ## `DateZone Format Locale Zone Alias RefreshRate` @@ -1554,7 +1629,10 @@ will display "N/A" if for some reason the `date` invocation fails. in /usr/share/zoneinfo/. If "" is given as Zone, the default system time is used. - Sample usage: - `Run DateZone "%a %H:%M:%S" "de_DE.UTF-8" "Europe/Vienna" "viennaTime" 10` + + ``` haskell + Run DateZone "%a %H:%M:%S" "de_DE.UTF-8" "Europe/Vienna" "viennaTime" 10 + ``` ## `CommandReader "/path/to/program" Alias` @@ -1572,7 +1650,9 @@ will display "N/A" if for some reason the `date` invocation fails. - Text is displayed as marquee with the specified length, rate in 10th seconds and separator when it wraps around + ``` haskell Run MarqueePipeReader "/tmp/testpipe" (10, 7, "+") "mpipe" + ``` - Expands environment variables in the first argument @@ -1592,10 +1672,12 @@ will display "N/A" if for some reason the `date` invocation fails. - Use it for OSD-like status bars e.g. for setting the volume or brightness: + ``` haskell Run BufferedPipeReader "bpr" [ ( 0, False, "/tmp/xmobar_window" ) , ( 15, True, "/tmp/xmobar_status" ) ] + ``` Have your window manager send window titles to `"/tmp/xmobar_window"`. They will always be shown and not reveal @@ -1615,11 +1697,14 @@ will display "N/A" if for some reason the `date` invocation fails. property by using `xmonadPropLog` as your log hook in xmonad's configuration, as in the following example (more info [here]): + ``` haskell main = do spawn "xmobar" xmonad $ defaultConfig { logHook = dynamicLogString defaultPP >>= xmonadPropLog } + ``` + This plugin can be used as a sometimes more convenient alternative to `StdinReader`. For instance, it allows you to (re)start xmobar outside xmonad. @@ -1634,10 +1719,12 @@ will display "N/A" if for some reason the `date` invocation fails. - It is advised that you still use `xmobarStrip` for the ppTitle in your logHook: + ``` haskell myPP = defaultPP { ppTitle = xmobarStrip } main = xmonad $ defaultConfig { logHook = dynamicLogString myPP >>= xmonadPropLog } + ``` ## `HandleReader Handle Alias` @@ -1648,12 +1735,14 @@ will display "N/A" if for some reason the `date` invocation fails. Handles. Pass the `read` Handle to HandleReader and write your output to the `write` Handle: + ``` haskell (readHandle, writeHandle) <- createPipe xmobarProcess <- forkProcess $ xmobar myConfig { commands = Run (HandleReader readHandle "handle") : commands myConfig } hPutStr writeHandle "Hello World" + ``` # The DBus Interface @@ -1699,7 +1788,9 @@ the command takes effect. 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 ()) + ``` haskell + ((0, xK_Alt_L ), return ()) + ``` Also, install `avoidStruts` layout modifier from `XMonad.Hooks.ManageDocks` @@ -1707,53 +1798,55 @@ 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 + ``` haskell + 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 + ``` # User plugins @@ -1766,10 +1859,12 @@ Next you must declare this data type an instance of the `Exec` class, by defining the 1 needed method (alternatively `start` or `run`) and 2 optional ones (alias and rate): - start :: e -> (String -> IO ()) -> IO () - run :: e -> IO String - rate :: e -> Int - alias :: e -> String + ``` haskell + start :: e -> (String -> IO ()) -> IO () + run :: e -> IO String + rate :: e -> Int + alias :: e -> String + ``` `start` must receive a callback to be used to display the `String` produced by the plugin. This method can be used for plugins that need @@ -1785,16 +1880,18 @@ example of a plugin that runs just once, and Notice that Date could be implemented as: - instance Exec Date where - alias (Date _ a _) = a - start (Date f _ r) = date f r - - date :: String -> Int -> (String -> IO ()) -> IO () - date format r callback = do go - where go = do - t <- toCalendarTime =<< getClockTime - callback $ formatCalendarTime defaultTimeLocale format t - tenthSeconds r >> go + ``` haskell + instance Exec Date where + alias (Date _ a _) = a + start (Date f _ r) = date f r + + date :: String -> Int -> (String -> IO ()) -> IO () + date format r callback = do go + where go = do + t <- toCalendarTime =<< getClockTime + callback $ formatCalendarTime defaultTimeLocale format t + tenthSeconds r >> go + ``` This implementation is equivalent to the one you can read in `Plugins/Date.hs`. |