<!-- * ======================== * ===== =============== * ====== ================ * ====== ================ * ====== ==== ==== == * ====== === == = = * ====== === = == = * = === === = == ==== * = === === = == = = * == ===== ==== == * ======================== * * jozanofastora.xyz: projects/lowbat.html * Mon Apr 18 18:23:21 CEST 2022 * Joe --> <style type="text/css"> <!--/*--><![CDATA[/*><!--*/ .title { text-align: center; margin-bottom: .2em; } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top:0; } .todo { font-family: monospace; color: red; } .done { font-family: monospace; color: green; } .priority { font-family: monospace; color: orange; } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal; } .timestamp { color: #bebebe; } .timestamp-kwd { color: #5f9ea0; } .org-right { margin-left: auto; margin-right: 0px; text-align: right; } .org-left { margin-left: 0px; margin-right: auto; text-align: left; } .org-center { margin-left: auto; margin-right: auto; text-align: center; } .underline { text-decoration: underline; } #postamble p, #preamble p { font-size: 90%; margin: .2em; } p.verse { margin-left: 3%; } pre { border: 1px solid #ccc; box-shadow: 3px 3px 3px #eee; padding: 8pt; font-family: monospace; overflow: auto; margin: 1.2em; } pre.src { position: relative; overflow: visible; padding-top: 1.2em; } pre.src:before { display: none; position: absolute; background-color: white; top: -10px; right: 10px; padding: 3px; border: 1px solid black; } pre.src:hover:before { display: inline;} /* Languages per Org manual */ pre.src-asymptote:before { content: 'Asymptote'; } pre.src-awk:before { content: 'Awk'; } pre.src-C:before { content: 'C'; } /* pre.src-C++ doesn't work in CSS */ pre.src-clojure:before { content: 'Clojure'; } pre.src-css:before { content: 'CSS'; } pre.src-D:before { content: 'D'; } pre.src-ditaa:before { content: 'ditaa'; } pre.src-dot:before { content: 'Graphviz'; } pre.src-calc:before { content: 'Emacs Calc'; } pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } pre.src-fortran:before { content: 'Fortran'; } pre.src-gnuplot:before { content: 'gnuplot'; } pre.src-haskell:before { content: 'Haskell'; } pre.src-hledger:before { content: 'hledger'; } pre.src-java:before { content: 'Java'; } pre.src-js:before { content: 'Javascript'; } pre.src-latex:before { content: 'LaTeX'; } pre.src-ledger:before { content: 'Ledger'; } pre.src-lisp:before { content: 'Lisp'; } pre.src-lilypond:before { content: 'Lilypond'; } pre.src-lua:before { content: 'Lua'; } pre.src-matlab:before { content: 'MATLAB'; } pre.src-mscgen:before { content: 'Mscgen'; } pre.src-ocaml:before { content: 'Objective Caml'; } pre.src-octave:before { content: 'Octave'; } pre.src-org:before { content: 'Org mode'; } pre.src-oz:before { content: 'OZ'; } pre.src-plantuml:before { content: 'Plantuml'; } pre.src-processing:before { content: 'Processing.js'; } pre.src-python:before { content: 'Python'; } pre.src-R:before { content: 'R'; } pre.src-ruby:before { content: 'Ruby'; } pre.src-sass:before { content: 'Sass'; } pre.src-scheme:before { content: 'Scheme'; } pre.src-screen:before { content: 'Gnu Screen'; } pre.src-sed:before { content: 'Sed'; } pre.src-sh:before { content: 'shell'; } pre.src-sql:before { content: 'SQL'; } pre.src-sqlite:before { content: 'SQLite'; } /* additional languages in org.el's org-babel-load-languages alist */ pre.src-forth:before { content: 'Forth'; } pre.src-io:before { content: 'IO'; } pre.src-J:before { content: 'J'; } pre.src-makefile:before { content: 'Makefile'; } pre.src-maxima:before { content: 'Maxima'; } pre.src-perl:before { content: 'Perl'; } pre.src-picolisp:before { content: 'Pico Lisp'; } pre.src-scala:before { content: 'Scala'; } pre.src-shell:before { content: 'Shell Script'; } pre.src-ebnf2ps:before { content: 'ebfn2ps'; } /* additional language identifiers per "defun org-babel-execute" in ob-*.el */ pre.src-cpp:before { content: 'C++'; } pre.src-abc:before { content: 'ABC'; } pre.src-coq:before { content: 'Coq'; } pre.src-groovy:before { content: 'Groovy'; } /* additional language identifiers from org-babel-shell-names in ob-shell.el: ob-shell is the only babel language using a lambda to put the execution function name together. */ pre.src-bash:before { content: 'bash'; } pre.src-csh:before { content: 'csh'; } pre.src-ash:before { content: 'ash'; } pre.src-dash:before { content: 'dash'; } pre.src-ksh:before { content: 'ksh'; } pre.src-mksh:before { content: 'mksh'; } pre.src-posh:before { content: 'posh'; } /* Additional Emacs modes also supported by the LaTeX listings package */ pre.src-ada:before { content: 'Ada'; } pre.src-asm:before { content: 'Assembler'; } pre.src-caml:before { content: 'Caml'; } pre.src-delphi:before { content: 'Delphi'; } pre.src-html:before { content: 'HTML'; } pre.src-idl:before { content: 'IDL'; } pre.src-mercury:before { content: 'Mercury'; } pre.src-metapost:before { content: 'MetaPost'; } pre.src-modula-2:before { content: 'Modula-2'; } pre.src-pascal:before { content: 'Pascal'; } pre.src-ps:before { content: 'PostScript'; } pre.src-prolog:before { content: 'Prolog'; } pre.src-simula:before { content: 'Simula'; } pre.src-tcl:before { content: 'tcl'; } pre.src-tex:before { content: 'TeX'; } pre.src-plain-tex:before { content: 'Plain TeX'; } pre.src-verilog:before { content: 'Verilog'; } pre.src-vhdl:before { content: 'VHDL'; } pre.src-xml:before { content: 'XML'; } pre.src-nxml:before { content: 'XML'; } /* add a generic configuration mode; LaTeX export needs an additional (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */ pre.src-conf:before { content: 'Configuration File'; } table { border-collapse:collapse; } caption.t-above { caption-side: top; } caption.t-bottom { caption-side: bottom; } td, th { vertical-align:top; } th.org-right { text-align: center; } th.org-left { text-align: center; } th.org-center { text-align: center; } td.org-right { text-align: right; } td.org-left { text-align: left; } td.org-center { text-align: center; } dt { font-weight: bold; } .footpara { display: inline; } .footdef { margin-bottom: 1em; } .figure { padding: 1em; } .figure p { text-align: center; } .inlinetask { padding: 10px; border: 2px solid gray; margin: 10px; background: #ffffcc; } #org-div-home-and-up { text-align: right; font-size: 70%; white-space: nowrap; } textarea { overflow-x: auto; } .linenr { font-size: smaller } .code-highlighted { background-color: #ffff00; } .org-info-js_info-navigation { border-style: none; } #org-info-js_console-label { font-size: 10px; font-weight: bold; white-space: nowrap; } .org-info-js_search-highlight { background-color: #ffff00; color: #000000; font-weight: bold; } .org-svg { width: 90%; } /*]]>*/--> </style> <script type="text/javascript"> /* @licstart The following is the entire license notice for the JavaScript code in this tag. Copyright (C) 2012-2019 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source. @licend The above is the entire license notice for the JavaScript code in this tag. */ <!--/*--><![CDATA[/*><!--*/ function CodeHighlightOn(elem, id) { var target = document.getElementById(id); if(null != target) { elem.cacheClassElem = elem.className; elem.cacheClassTarget = target.className; target.className = "code-highlighted"; elem.className = "code-highlighted"; } } function CodeHighlightOff(elem, id) { var target = document.getElementById(id); if(elem.cacheClassElem) elem.className = elem.cacheClassElem; if(elem.cacheClassTarget) target.className = elem.cacheClassTarget; } /*]]>*///--> </script> <html> <head> <title>Joe's own website - project: lowbat</title> <link rel="stylesheet" type="text/css" href="../css/site.css"> <meta charset="UTF-8"> </head> <body> <div class="fullpage"> <header> <h1><a href="../index.html">Joe's dev blog - project: lowbat</a></h1> </header> <div class="sidebar"> <ul> <li><a href="../index.html">home</a></li> <li><a href="../projects/">my projects</a></li> <li><a href="../files.html">files</a></li> <li><a href="../links.html">links</a></li> <hr> <li><a href="https://gitjoe.xyz/">GitJoe</a></li> <li><a href="https://fossil.jozanofastora.xyz/">FossilJoe</a></li> </ul> </div> <div class="body-contents"> <h1 class="title">lowbat - lightweight low battery notifier</h1> <div id="table-of-contents"> <h2>Table of Contents</h2> <div id="text-table-of-contents"> <ul> <li><a href="#orgfe852df">1. Why lowbat?</a></li> <li><a href="#orgf2afc19">2. History of lowbat</a></li> <li><a href="#org89620d6">3. How it works</a> <ul> <li><a href="#org6b0c50b">3.1. libnotify lowbat</a></li> <li><a href="#orgbd041b0">3.2. espeak lowbat</a></li> <li><a href="#org3a44c6a">3.3. unknown lowbat</a></li> </ul> </li> <li><a href="#org4bfb234">4. Links to lowbat</a></li> </ul> </div> </div> <div id="outline-container-orgfe852df" class="outline-2"> <h2 id="orgfe852df"><span class="section-number-2">1</span> Why lowbat?</h2> <div class="outline-text-2" id="text-1"> <p> I've been using minimalist OS installations for work, personnal computing and playing video games for a while now. I used <a href="https://www.archlinux.org/" target="_blank">Arch Linux</a>, I still use <a href="https://gentoo.org/" target="_blank">Gentoo Linux</a> - which is by far my favorite Linux distribution - as a desktop OS, and now I am using <a href="https://www.freebsd.org/" target="_blank">FreeBSD</a> on my workstation. </p> <p> Those operating systems and distributions basically come with a kernel, coreutils, a shell and that's pretty much it. Everything else has to be installed manually. I love this philosophy, the simplicity behind it and the fact that you know exactly what's on your system at any moment. </p> <p> As window managers, I used <a href="http://dwm.suckless.org/" target="_blank">dwm</a> for a while, and I am now using <a href="https://github.com/baskerville/bspwm" target="_blank">bspwm</a>. They are ultra-fast, very lightweight and do not bring extra bloatware to my systems. I do not use a status bar as well, I like my applications to use the full screen space available. </p> <p> A big problem for me with this setup for me was that they do not come with some kind of warning or notification system, like fancier desktop environments would, when my laptop battery is low. That also was before I started using <b>Emacs</b>, discovering the battery level indicator in the modeline. Ultimatly the frustration was too important when the computer kept shutting down in the middle of important work too many time. Then I decided to create <b>lowbat</b> to cure this issue. </p> </div> </div> <div id="outline-container-orgf2afc19" class="outline-2"> <h2 id="orgf2afc19"><span class="section-number-2">2</span> History of lowbat</h2> <div class="outline-text-2" id="text-2"> <p> It started as a very short <code>dash</code> shell (get <a href="https://github.com/tklauser/dash" target="_blank">dash</a> here) script that was working fine but I wanted to experiment a little bit with this. It turned into a <code>C++</code> program, which is still the case for the GNU/Linux version. Switching to FreeBSD, I exerimented again by turning it into an <code>x64 assembly</code> program, following the <b>Intel</b> syntax. In that way <b>lowbat</b> is even more lightweight and consumes less battery power. These days, I am rewriting it in the <b>AT&T</b> syntax. </p> </div> </div> <div id="outline-container-org89620d6" class="outline-2"> <h2 id="org89620d6"><span class="section-number-2">3</span> How it works</h2> <div class="outline-text-2" id="text-3"> </div> <div id="outline-container-org6b0c50b" class="outline-3"> <h3 id="org6b0c50b"><span class="section-number-3">3.1</span> libnotify lowbat</h3> <div class="outline-text-3" id="text-3-1"> <p> The principle of <b>lowbat</b> is rather simple. When it's running in the background, it checks every 4 minutes whether your battery is above 15%. If that is the case, it sleeps for another 4 minutes. When your battery runs bellow 15%, <b>lowbat</b> checks your battery level every 20 seconds as well as sending you a <b>notification</b> using <code>libnotify</code>. You can display live notifications on your desktop using <code>dunst</code> for example, as well as many other I'm sure. </p> <div id="org89a6eb3" class="figure"> <p><img src="../img/projects/lowbat-01.jpg" alt="lowbat-01.jpg"> </p> <p><span class="figure-number">Figure 1: </span>A notification generated by lowbat, displayed by dunst</p> </div> </div> </div> <div id="outline-container-orgbd041b0" class="outline-3"> <h3 id="orgbd041b0"><span class="section-number-3">3.2</span> espeak lowbat</h3> <div class="outline-text-3" id="text-3-2"> <p> <b>lowbat</b> also has an option to send a custom voice message to the use using <code>espeak</code>. Very handy if you are not in front of your computer or if you want to bring joy to this dramatic event. </p> </div> </div> <div id="outline-container-org3a44c6a" class="outline-3"> <h3 id="org3a44c6a"><span class="section-number-3">3.3</span> unknown lowbat</h3> <div class="outline-text-3" id="text-3-3"> <p> Sadly, I wasn't able to test lowbat on machines with more that one battery. My call is that it will only warn you for the <i>first</i> battery, but I can't be sure. Try it and tell me! </p> </div> </div> </div> <div id="outline-container-org4bfb234" class="outline-2"> <h2 id="org4bfb234"><span class="section-number-2">4</span> Links to lowbat</h2> <div class="outline-text-2" id="text-4"> <p> <ul class="org-ul"> <li>GNU/Linux: <a href="https://github.com/JozanLeClerc/lowbat" target="_blank">lowbat's GitHub GNU/Linux repository</a></li> <li>BSD: <a href="https://github.com/JozanLeClerc/lowbat-bsd" target="_blank">lowbat's GitHub BSD repository</a></li> </ul> </p> </div> </div> </div> <footer> <p> Copyright © 2020-2022, Joe - see <a href="license.html">LICENSE</a> - this website does not use cookies or php or js </p> </footer> </div> </body> </html>