summaryrefslogtreecommitdiffhomepage
path: root/contributing.org
diff options
context:
space:
mode:
Diffstat (limited to 'contributing.org')
-rw-r--r--contributing.org119
1 files changed, 119 insertions, 0 deletions
diff --git a/contributing.org b/contributing.org
new file mode 100644
index 0000000..4a59145
--- /dev/null
+++ b/contributing.org
@@ -0,0 +1,119 @@
+* Contributing Changes/Patches to xmobar
+
+Want to contribute to xmobar? You've come to the right place! This
+document will help guide you in this endeavour.
+
+In case you want to make any non-trivial change to xmobar, it's always
+best to talk with the community first. Currently the best way to do that
+is to create an issue on GitHub. There, you can talk through the
+problems you are having, as well as the proposed solution.
+
+** Making the Change
+
+It's best to create a separate branch in your clone of the [[https://github.com/jaor/xmobar/][xmobar repo]]
+and then push this branch to your fork.
+
+If your pull request undergoes several iterations and =master= has
+changed in the meantime, you may be asked to rebase on top of it; in
+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:
+
+ #+begin_src shell
+ Commit Message (max. 50 characters)
+
+ Some more useful information of why this change was made; possibly
+ how it connects with other commits in this same pr (wrapped at 72
+ characters).
+ #+end_src
+
+** Opening a Pull Request
+
+Once you have pushed the branch to your fork, making a pull request is
+as easy as visiting that branch; GitHub will then even prompt you for
+it!
+
+Please include the following information in the description of your pull
+request:
+
+- Does your pull request close, or is related to, any existing issues?
+- What does your pull request do? If you add a new feature, an example
+ of how you would use it would be most appreciated.
+- A brief summary of how your commits fit together to achieve this (if
+ necessary).
+
+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 1 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!