From 067430319865c7cee1eec588d0c6317aee6d2276 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Fri, 11 Nov 2016 15:36:26 +0100 Subject: Add email widget to mowedline --- mowedline/.config/mowedline/init.org | 173 +++++++++++++++++++++++------------ mowedline/GNUmakefile | 1 + 2 files changed, 115 insertions(+), 59 deletions(-) (limited to 'mowedline') diff --git a/mowedline/.config/mowedline/init.org b/mowedline/.config/mowedline/init.org index 623353e..b89e225 100644 --- a/mowedline/.config/mowedline/init.org +++ b/mowedline/.config/mowedline/init.org @@ -1,3 +1,5 @@ +#+TITLE: Mowedline init + Load the =matchable= module so I can use =match-lambda=. #+BEGIN_SRC scheme @@ -11,74 +13,127 @@ Set the default font and color to something nicer. (text-widget-color "#ededed") #+END_SRC -This formatter will parse the herbstluftwm tag status line, which -looks like this: - -#+BEGIN_EXAMPLE - #1 -2 :3 :4 :5 .6 .7 .8 .9 -#+END_EXAMPLE - -And turn it into something more useful. The symbols before the tag -names (numbers) have the following meaning: - -- =#= :: This tag is currently active. -- =-= :: This tag is visible on another monitor. -- =:= :: This tag isn't displayed, but has windows on it. -- =.= :: This tag isn't displayed and is empty. -- =!= :: This tag has an urgent window on it. - -First the tag line has to be split into separate parts. Each tag -status/name pair is split by a tab character and each status is only -one character. So I split the whole string on tabs and then make a -list out of each individual part, for easy access to the status -character. So we end up with something like: - -#+BEGIN_EXAMPLE - ((#\# #\1) (#\- #\2) (#\: #\3) ...) -#+END_EXAMPLE +Define a convenience function to check if a formatter's argument is +not some text. #+BEGIN_SRC scheme - (define (split-tag-list str) - (map string->list (string-split str "\t"))) + (define (not-text? text) + (or (null? text) (and (not (pair? text)) (string-null? text)))) #+END_SRC -Next we turn each part into something practical for display in -mowedline. +Define a convenience function that adds spaces around its argument if +its argument is text. #+BEGIN_SRC scheme - (define tag-display - (match-lambda - ((#\# . name-list) - (list '(color "#ececec" font "FontAwesome-10" "") - (string-append " " (list->string name-list) " "))) - ((#\- . _) '((color "#bfbfbf" font "FontAwesome-10" "") " ")) - ((#\: . _) '((color "#969696" font "FontAwesome-10" "") " ")) - ((#\! . _) '((color "#a85454" font "FontAwesome-10" "") " ")) - (_ '()))) - - (define (tag-list-display tag-list) - (map tag-display tag-list)) + (define (text-maybe-pad-both text) + (if (not-text? text) + text + (list " " text " "))) #+END_SRC -Finally, bring it all together in a function that can be used as a -mowedline text formatter. +Define a convenience function to add a Font Awesome icon to a widget. #+BEGIN_SRC scheme - (define (tag-list-formatter text) - (tag-list-display (split-tag-list text))) + (define (add-fa-icon icon) + (lambda (text) + (if (not-text? text) + text + (list (list 'font "FontAwesome-10" + (string-append " " icon " ")) + text)))) #+END_SRC -Create a mowedline window, put it at the bottom. - -#+BEGIN_SRC scheme - (window #:position 'bottom - #:width 1843 - #:margin-bottom 15 - #:margin-left 46 - #:margin-right 15 - #:background 'transparent - - (widget:text #:name "taglist" #:format tag-list-formatter) - (widget:spacer #:flex 1) - (widget:clock)) -#+END_SRC +* Tag list + + This formatter will parse the herbstluftwm tag status line, which + looks like this: + + #+BEGIN_EXAMPLE + #1 -2 :3 :4 :5 .6 .7 .8 .9 + #+END_EXAMPLE + + And turn it into something more useful. The symbols before the tag + names (numbers) have the following meaning: + + - =#= :: This tag is currently active. + - =-= :: This tag is visible on another monitor. + - =:= :: This tag isn't displayed, but has windows on it. + - =.= :: This tag isn't displayed and is empty. + - =!= :: This tag has an urgent window on it. + + First the tag line has to be split into separate parts. Each tag + status/name pair is split by a tab character and each status is only + one character. So I split the whole string on tabs and then make a + list out of each individual part, for easy access to the status + character. So we end up with something like: + + #+BEGIN_EXAMPLE + ((#\# #\1) (#\- #\2) (#\: #\3) ...) + #+END_EXAMPLE + + #+BEGIN_SRC scheme + (define (split-tag-list str) + (map string->list (string-split str "\t"))) + #+END_SRC + + Next we turn each part into something practical for display in + mowedline. + + #+BEGIN_SRC scheme + (define tag-display + (match-lambda + ((#\# . name-list) + (list '(color "#ececec" font "FontAwesome-10" "") + (string-append " " (list->string name-list) " "))) + ((#\- . _) '((color "#bfbfbf" font "FontAwesome-10" "") " ")) + ((#\: . _) '((color "#969696" font "FontAwesome-10" "") " ")) + ((#\! . _) '((color "#a85454" font "FontAwesome-10" "") " ")) + (_ '()))) + + (define (tag-list-display tag-list) + (map tag-display tag-list)) + #+END_SRC + + Finally, bring it all together in a function that can be used as a + mowedline text formatter. + + #+BEGIN_SRC scheme + (define (tag-list-formatter text) + (tag-list-display (split-tag-list text))) + #+END_SRC + + Define the widget to be used in the window. + + #+BEGIN_SRC scheme + (define taglist-widget + (widget:text #:name "taglist" #:format tag-list-formatter)) + #+END_SRC + +* Email + + Define a widget to show email notifications in. + + #+BEGIN_SRC scheme + (define email-widget + (widget:text + #:name "email" + #:format (compose text-maybe-pad-both (add-fa-icon "")))) + #+END_SRC + +* The window + + Create a mowedline window, put it at the bottom. + + #+BEGIN_SRC scheme + (window #:position 'bottom + #:width 1843 + #:margin-bottom 15 + #:margin-left 46 + #:margin-right 15 + #:background 'transparent + + taglist-widget + (widget:spacer #:flex 1) + email-widget + (widget:clock)) + #+END_SRC diff --git a/mowedline/GNUmakefile b/mowedline/GNUmakefile index e393a0b..ee829e6 100644 --- a/mowedline/GNUmakefile +++ b/mowedline/GNUmakefile @@ -2,5 +2,6 @@ include ../dotfiles.mk all: .config/mowedline/init.scm +%.scm: SCHEME_IMPLEMENTATION = chicken %.scm: %.org $(call tangle,scheme) -- cgit v1.2.3-54-g00ecf