From 20a64e67074460878a693c2d89842b1e1dad120c Mon Sep 17 00:00:00 2001 From: slotThe Date: Fri, 15 Jan 2021 08:35:19 +0100 Subject: Extract writing your own plugin into its own file --- contributing.org | 78 +++++--------------------------------------------------- 1 file changed, 6 insertions(+), 72 deletions(-) (limited to 'contributing.org') diff --git a/contributing.org b/contributing.org index 41c2af1..14bce0d 100644 --- a/contributing.org +++ b/contributing.org @@ -19,9 +19,10 @@ this case please don't merge any branches, but actually rebase! This is a very nifty feature that =git= offers in order to remain a clean history. -Give your commits descriptive names! Further, it's also highly recommended to -add a description of /why/ you made a certain change. The syntax for this is -*commit message*, blank line, *more description*. For example: +Give your commits descriptive names! Further, it's also highly +recommended to add a description of /why/ you made a certain change. +The syntax for this is *commit message*, blank line, *more description*. +For example: #+begin_src shell Commit Message (max. 50 characters) @@ -48,72 +49,5 @@ request: Please also remember to update the =changelog.md= file, as well as any other documentation that your pull request touches upon. For example, -if you add a new plugin you should update the [[./doc/plugins.org][plugins documentation]]. - -* Writing Your Own Plugin - -Writing a plugin for xmobar is very simple! - -First, you need to create a data type with at least one constructor. -Next you must declare this data type an instance of the =Exec= class, by -defining the one needed method (alternatively =start= or =run=) and 3 -optional ones (=alias=, =rate=, and =trigger=): - -#+begin_src haskell - start :: e -> (String -> IO ()) -> IO () - run :: e -> IO String - rate :: e -> Int - alias :: e -> String - trigger :: e -> (Maybe SignalType -> IO ()) -> IO () -#+end_src - -=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 to -perform asynchronous actions. See =src/Xmobar/Plugins/PipeReader.hs= for -an example. - -=run= can be used for simpler plugins. If you define only =run= the -plugin will be run every second. To overwrite this default you just need -to implement =rate=, which must return the number of tenth of seconds -between every successive runs. See [[https://github.com/jaor/xmobar/blob/master/examples/xmobar.hs][examples/xmobar.hs]] for an example of -a plugin that runs just once, and [[https://github.com/jaor/xmobar/blob/master/src/Xmobar/Plugins/Date.hs][src/Xmobar/Plugins/Date.hs]] for one -that implements =rate=. - -Notice that Date could be implemented as: - -#+begin_src 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 -#+end_src - -This implementation is equivalent to the one you can read in -=Plugins/Date.hs=. - -=alias= is the name to be used in the output template. Default alias -will be the data type constructor. - -After that your type constructor can be used as an argument for the -Runnable type constructor =Run= in the =commands= list of the -configuration options. - -** Using a Plugin - -To use your new plugin, you need to use a pure Haskell configuration for -xmobar, and load your definitions there. You can see an example in -[[./examples/xmobar.hs][examples/xmobar.hs]] showing you how to write a Haskell configuration that -uses a new plugin, all in one file. - -When xmobar runs with the full path to that Haskell file as its argument -(or if you put it in =~/.config/xmobar/xmobar.hs=), and with the xmobar -library installed (e.g., with =cabal install --lib xmobar=), the Haskell -code will be compiled as needed, and the new executable spawned for you. - -That's it! +if you add a new plugin (see [[./doc/write-your-own-plugin.org][here]] for more information) you should +update the [[./doc/plugins.org][plugins documentation]]. -- cgit v1.2.3