Add detached_down option (#26)
And some other stuff I obviously forget to commit last time. Oh, that's just the RST port... okay :)
This commit is contained in:
parent
e9e6dd1bf6
commit
aa09079903
@ -1,15 +1,15 @@
|
||||
<!--
|
||||
Always edit README.tpl.md and create README.md by running
|
||||
python -m i3pystatus.mkdocs
|
||||
You can also let the maintainer do the latter :)
|
||||
-->
|
||||
.. Always edit README.tpl.md and create README.md by running
|
||||
python -m i3pystatus.mkdocs You can also let the maintainer do the
|
||||
latter :)
|
||||
|
||||
# i3pystatus
|
||||
i3pystatus
|
||||
==========
|
||||
|
||||
i3pystatus is a (hopefully growing) collection of python scripts for
|
||||
status output compatible to i3status / i3bar of the i3 window manager.
|
||||
|
||||
## Installation
|
||||
Installation
|
||||
------------
|
||||
|
||||
Note: i3pystatus requires Python 3.2 or newer and is not compatible with
|
||||
Python 2.x.
|
||||
@ -22,9 +22,11 @@ Python 2.x.
|
||||
|
||||
* [Arch Linux](https://aur.archlinux.org/packages/i3pystatus-git/)
|
||||
|
||||
### Release Notes
|
||||
Release Notes
|
||||
-------------
|
||||
|
||||
#### 3.28
|
||||
3.28 (not released yet)
|
||||
+++++++++++++++++++++++
|
||||
|
||||
* **If you're currently using the `i3pystatus` command to run your i3bar**:
|
||||
Replace `i3pystatus` command in your i3 configuration with `python ~/path/to/your/i3pystatus.py`
|
||||
@ -33,33 +35,40 @@ Python 2.x.
|
||||
* pulseaudio: changed context name to "i3pystatus_pulseaudio"
|
||||
* Code changes
|
||||
|
||||
#### 3.27
|
||||
3.27
|
||||
++++
|
||||
|
||||
* Add weather module
|
||||
* Add text module
|
||||
* PulseAudio module: Add muted/unmuted options
|
||||
|
||||
#### 3.26
|
||||
3.26
|
||||
++++
|
||||
|
||||
* Add mem module
|
||||
|
||||
#### 3.24
|
||||
3.24
|
||||
++++
|
||||
|
||||
**This release introduced changes that may require manual changes to your
|
||||
configuration file**
|
||||
|
||||
* Introduced TimeWrapper
|
||||
* battery module: removed remaining_\* formatters in favor of TimeWrapper,
|
||||
as it can not only reproduce all the variants removed, but can do much more.
|
||||
* battery module: removed remaining\_* formatters in favor of
|
||||
TimeWrapper, as it can not only reproduce all the variants removed,
|
||||
but can do much more.
|
||||
* mpd: Uses TimeWrapper for song_length, song_elapsed
|
||||
|
||||
## Configuration
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The config file is just a normal Python script.
|
||||
|
||||
A simple configuration file could look like this (note the additional dependencies
|
||||
from network, wireless and pulseaudio in this example):
|
||||
|
||||
::
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import subprocess
|
||||
@ -165,6 +174,8 @@ from network, wireless and pulseaudio in this example):
|
||||
|
||||
Also change your i3wm config to the following:
|
||||
|
||||
::
|
||||
|
||||
# i3bar
|
||||
bar {
|
||||
status_command python ~/.path/to/your/config/file.py
|
||||
@ -172,23 +183,26 @@ Also change your i3wm config to the following:
|
||||
workspace_buttons yes
|
||||
}
|
||||
|
||||
### Formatting
|
||||
Formatting
|
||||
++++++++++
|
||||
|
||||
All modules let you specifiy the exact output formatting using a
|
||||
[format string](http://docs.python.org/3/library/string.html#formatstrings), which
|
||||
gives you a great deal of flexibility.
|
||||
|
||||
Some common stuff:
|
||||
If a module gives you a float, it probably has a ton of
|
||||
uninteresting decimal places. Use `{somefloat:.0f}` to get the integer
|
||||
value, `{somefloat:0.2f}` gives you two decimal places after the
|
||||
decimal dot
|
||||
|
||||
* If a module gives you a float, it probably has a ton of uninteresting decimal
|
||||
places. Use `{somefloat:.0f}` to get the integer value, `{somefloat:0.2f}` gives
|
||||
you two decimal places after the decimal dot
|
||||
|
||||
#### formatp
|
||||
formatp
|
||||
~~~~~~~
|
||||
|
||||
Some modules use an extended format string syntax (the mpd module, for example).
|
||||
Given the format string below the output adapts itself to the available data.
|
||||
|
||||
::
|
||||
|
||||
[{artist}/{album}/]{title}{status}
|
||||
|
||||
Only if both the artist and album is known they're displayed. If only one or none
|
||||
@ -202,7 +216,8 @@ Inside a group always all format specifiers must evaluate to true (logical and).
|
||||
You can nest groups. The inner group will only become part of the output if both
|
||||
the outer group and the inner group are eligible for output.
|
||||
|
||||
#### TimeWrapper
|
||||
TimeWrapper
|
||||
~~~~~~~~~~~
|
||||
|
||||
Some modules that output times use TimeWrapper to format these. TimeWrapper is
|
||||
a mere extension of the standard formatting method.
|
||||
@ -211,54 +226,34 @@ The time format that should be used is specified using the format specifier, i.e
|
||||
with some_time being 3951 seconds a format string like `{some_time:%h:%m:%s}`
|
||||
would produce `1:5:51`
|
||||
|
||||
* `%h`, `%m` and `%s` are the hours, minutes and seconds without leading zeros
|
||||
(i.e. 0 to 59 for minutes and seconds)
|
||||
* `%H`, `%M` and `%S` are padded with a leading zero to two digits, i.e. 00 to 59
|
||||
* `%l` and `%L` produce hours non-padded and padded but only if hours is not zero.
|
||||
If the hours are zero it produces an empty string.
|
||||
* `%h`, `%m` and `%s` are the hours, minutes and seconds without
|
||||
leading zeros (i.e. 0 to 59 for minutes and seconds)
|
||||
* `%H`, `%M` and `%S` are padded with a leading zero to two digits,
|
||||
i.e. 00 to 59
|
||||
* `%l` and `%L` produce hours non-padded and padded but only if hours
|
||||
is not zero. If the hours are zero it produces an empty string.
|
||||
* `%%` produces a literal %
|
||||
* `%E` (only valid on beginning of the string) if the time is null, don't format
|
||||
anything but rather produce an empty string. If the time is non-null it is
|
||||
removed from the string.
|
||||
* When the module in question also uses formatp, 0 seconds counts as "not known".
|
||||
* The formatted time is stripped, i.e. spaces on both ends of the result are removed
|
||||
* `%E` (only valid on beginning of the string) if the time is null,
|
||||
don't format anything but rather produce an empty string. If the
|
||||
time is non-null it is removed from the string.
|
||||
* When the module in question also uses formatp, 0 seconds counts as
|
||||
"not known".
|
||||
* The formatted time is stripped, i.e. spaces on both ends of the
|
||||
result are removed
|
||||
|
||||
## Modules
|
||||
Modules
|
||||
-------
|
||||
|
||||
System:
|
||||
[Clock](#clock) -
|
||||
[Free space](#disk) -
|
||||
[System load](#load) -
|
||||
[Memory usage](#mem)
|
||||
|
||||
Audio:
|
||||
[ALSA](#alsa) -
|
||||
[PulseAudio](#pulseaudio)
|
||||
|
||||
Hardware:
|
||||
[Battery](#battery) -
|
||||
[Screen brightness](#backlight) -
|
||||
[CPU temperature (Intel)](#temp)
|
||||
|
||||
Network:
|
||||
[Wired](#network) -
|
||||
[Wireless](#wireless)
|
||||
|
||||
Other:
|
||||
[Unread mail](#mail) -
|
||||
[Tracking parcels](#parcel) -
|
||||
[pyLoad](#pyload) -
|
||||
[Weather](#weather) -
|
||||
[Music Player Daemon (MPD)](#mpd) -
|
||||
[Simple text](#text)
|
||||
|
||||
Advanced:
|
||||
[Rip info from files](#file) -
|
||||
[Regular expressions](#regex) -
|
||||
[Run watcher](#runwatch)
|
||||
:System: `clock`_ - `disk`_ - `load`_ - `mem`_
|
||||
:Audio: `alsa`_ - `pulseaudio`_
|
||||
:Hardware: `battery`_ - `backlight`_ - `temp`_
|
||||
:Network: `network`_ - `wireless`_
|
||||
:Other: `mail`_ - `parcel`_ - `pyload`_ - `weather`_ - `mpd`_ - `text`_
|
||||
:Advanced: `file`_ - `regex`_ - `runwatch`_
|
||||
|
||||
|
||||
### alsa
|
||||
alsa
|
||||
++++
|
||||
|
||||
|
||||
Shows volume of ALSA mixer. You can also use this for inputs, btw.
|
||||
@ -273,21 +268,22 @@ Available formatters:
|
||||
* `{mixer}` — the associated ALSA mixer
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — (default: `♪: {volume}`)
|
||||
* `mixer` — ALSA mixer (default: `Master`)
|
||||
* `mixer_id` — ALSA mixer id (default: `0`)
|
||||
* `card` — ALSA sound card (default: `0`)
|
||||
* `muted` — (default: `M`)
|
||||
* `unmuted` — (default: ``)
|
||||
* `color_muted` — (default: `#AAAAAA`)
|
||||
* `color` — (default: `#FFFFFF`)
|
||||
* `channel` — (default: `0`)
|
||||
:format: (default: '♪: {volume}')
|
||||
:mixer: ALSA mixer (default: 'Master')
|
||||
:mixer_id: ALSA mixer id (default: '0')
|
||||
:card: ALSA sound card (default: '0')
|
||||
:muted: (default: 'M')
|
||||
:unmuted: (default: '')
|
||||
:color_muted: (default: '#AAAAAA')
|
||||
:color: (default: '#FFFFFF')
|
||||
:channel: (default: '0')
|
||||
|
||||
|
||||
|
||||
### backlight
|
||||
backlight
|
||||
+++++++++
|
||||
|
||||
|
||||
Screen backlight info
|
||||
@ -298,15 +294,16 @@ Available formatters:
|
||||
* `{percentage}` — current brightness in percent
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — format string, formatters: brightness, max_brightness, percentage (default: `{brightness}/{max_brightness}`)
|
||||
* `backlight` — backlight, see `/sys/class/backlight/` (default: `acpi_video0`)
|
||||
* `color` — (default: `#FFFFFF`)
|
||||
:format: format string, formatters: brightness, max_brightness, percentage (default: '{brightness}/{max_brightness}')
|
||||
:backlight: backlight, see `/sys/class/backlight/` (default: 'acpi_video0')
|
||||
:color: (default: '#FFFFFF')
|
||||
|
||||
|
||||
|
||||
### battery
|
||||
battery
|
||||
+++++++
|
||||
|
||||
|
||||
This class uses the /sys/class/power_supply/…/uevent interface to check for the
|
||||
@ -322,32 +319,34 @@ Available formatters:
|
||||
* `{battery_ident}` — the same as the setting
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `battery_ident` — The name of your battery, usually BAT0 or BAT1 (default: `BAT0`)
|
||||
* `format` — (default: `{status} {remaining}`)
|
||||
* `alert` — Display a libnotify-notification on low battery (default: `False`)
|
||||
* `alert_percentage` — (default: `10`)
|
||||
* `alert_format_title` — The title of the notification, all formatters can be used (default: `Low battery`)
|
||||
* `alert_format_body` — The body text of the notification, all formatters can be used (default: `Battery {battery_ident} has only {percentage:.2f}% ({remaining:%E%hh:%Mm}) remaining!`)
|
||||
* `path` — Override the default-generated path (default: `None`)
|
||||
* `status` — A dictionary mapping ('DIS', 'CHR', 'FULL') to alternative names (default: `{'FULL': 'FULL', 'DIS': 'DIS', 'CHR': 'CHR'}`)
|
||||
:battery_ident: The name of your battery, usually BAT0 or BAT1 (default: 'BAT0')
|
||||
:format: (default: '{status} {remaining}')
|
||||
:alert: Display a libnotify-notification on low battery (default: 'False')
|
||||
:alert_percentage: (default: '10')
|
||||
:alert_format_title: The title of the notification, all formatters can be used (default: 'Low battery')
|
||||
:alert_format_body: The body text of the notification, all formatters can be used (default: 'Battery {battery_ident} has only {percentage:.2f}% ({remaining:%E%hh:%Mm}) remaining!')
|
||||
:path: Override the default-generated path (default: 'None')
|
||||
:status: A dictionary mapping ('DIS', 'CHR', 'FULL') to alternative names (default: '{'FULL': 'FULL', 'DIS': 'DIS', 'CHR': 'CHR'}')
|
||||
|
||||
|
||||
|
||||
### clock
|
||||
clock
|
||||
+++++
|
||||
|
||||
|
||||
This class shows a clock
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — stftime format string, `None` means to use the default, locale-dependent format (default: `None`)
|
||||
:format: stftime format string, `None` means to use the default, locale-dependent format (default: 'None')
|
||||
|
||||
|
||||
|
||||
### disk
|
||||
disk
|
||||
++++
|
||||
|
||||
|
||||
Gets `{used}`, `{free}`, `{available}` and `{total}` amount of bytes on the given mounted filesystem.
|
||||
@ -356,57 +355,62 @@ These values can also be expressed in percentages with the `{percentage_used}`,
|
||||
and `{percentage_avail}` formats.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — (default: `{free}/{avail}`)
|
||||
* `path` — (required)
|
||||
* `divisor` — divide all byte values by this value, commonly 1024**3 (gigabyte) (default: `1073741824`)
|
||||
:format: (default: '{free}/{avail}')
|
||||
:path: (required)
|
||||
:divisor: divide all byte values by this value, commonly 1024**3 (gigabyte) (default: '1073741824')
|
||||
|
||||
|
||||
|
||||
### file
|
||||
file
|
||||
++++
|
||||
|
||||
|
||||
Rip information from text files
|
||||
|
||||
components is a dict of pairs of the form:
|
||||
|
||||
::
|
||||
|
||||
name => (callable, file)
|
||||
|
||||
* Where `name` is a valid identifier, which is used in the format string to access
|
||||
the value of that component.
|
||||
the value of that component.
|
||||
* `callable` is some callable to convert the contents of `file`. A common choice is
|
||||
float or int.
|
||||
float or int.
|
||||
* `file` names a file, relative to `base_path`.
|
||||
|
||||
transforms is a optional dict of callables taking a single argument (a dictionary containing the values
|
||||
of all components). The return value is bound to the key.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — (required)
|
||||
* `components` — (required)
|
||||
* `transforms` — (default: `{}`)
|
||||
* `base_path` — (default: `/`)
|
||||
* `color` — (default: `#FFFFFF`)
|
||||
* `interval` — (default: `5`)
|
||||
:format: (required)
|
||||
:components: (required)
|
||||
:transforms: (default: '{}')
|
||||
:base_path: (default: '/')
|
||||
:color: (default: '#FFFFFF')
|
||||
:interval: (default: '5')
|
||||
|
||||
|
||||
|
||||
### load
|
||||
load
|
||||
++++
|
||||
|
||||
|
||||
Shows system load
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — format string used for output. {avg1}, {avg5} and {avg15} are the load average of the last one, five and fifteen minutes, respectively. {tasks} is the number of tasks (i.e. 1/285, which indiciates that one out of 285 total tasks is runnable). (default: `{avg1} {avg5}`)
|
||||
:format: format string used for output. {avg1}, {avg5} and {avg15} are the load average of the last one, five and fifteen minutes, respectively. {tasks} is the number of tasks (i.e. 1/285, which indiciates that one out of 285 total tasks is runnable). (default: '{avg1} {avg5}')
|
||||
|
||||
|
||||
|
||||
### mail
|
||||
mail
|
||||
++++
|
||||
|
||||
|
||||
Generic mail checker
|
||||
@ -414,73 +418,77 @@ Generic mail checker
|
||||
The `backends` setting determines the backends to use. Currently available are:
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `backends` — List of backends (instances of `i3pystatus.mail.xxx.zzz`)
|
||||
* `color` — (default: `#ffffff`)
|
||||
* `color_unread` — (default: `#ff0000`)
|
||||
* `format` — (default: `{unread} new email`)
|
||||
* `format_plural` — (default: `{unread} new emails`)
|
||||
* `hide_if_null` — Don't output anything if there are no new mails (default: `True`)
|
||||
:backends: List of backends (instances of `i3pystatus.mail.xxx.zzz`)
|
||||
:color: (default: '#ffffff')
|
||||
:color_unread: (default: '#ff0000')
|
||||
:format: (default: '{unread} new email')
|
||||
:format_plural: (default: '{unread} new emails')
|
||||
:hide_if_null: Don't output anything if there are no new mails (default: 'True')
|
||||
|
||||
|
||||
Currently available backends are:
|
||||
|
||||
|
||||
> ### imap.IMAP
|
||||
>
|
||||
>
|
||||
> Checks for mail on a IMAP server
|
||||
>
|
||||
>
|
||||
> __Settings:__
|
||||
>
|
||||
> * `host` — (required)
|
||||
> * `port` — (default: `993`)
|
||||
> * `username` — (required)
|
||||
> * `password` — (required)
|
||||
> * `ssl` — (default: `True`)
|
||||
> * `mailbox` — (default: `INBOX`)
|
||||
>
|
||||
>
|
||||
>
|
||||
> ### notmuchmail.Notmuch
|
||||
>
|
||||
>
|
||||
> This class uses the notmuch python bindings to check for the
|
||||
> number of messages in the notmuch database with the tags "inbox"
|
||||
> and "unread"
|
||||
>
|
||||
>
|
||||
> __Settings:__
|
||||
>
|
||||
> * `db_path` — (required)
|
||||
>
|
||||
>
|
||||
>
|
||||
> ### thunderbird.Thunderbird
|
||||
>
|
||||
>
|
||||
> This class listens for dbus signals emitted by
|
||||
> the dbus-sender extension for thunderbird.
|
||||
>
|
||||
> Requires
|
||||
> * python-dbus
|
||||
>
|
||||
>
|
||||
> __Settings:__
|
||||
>
|
||||
>
|
||||
>
|
||||
>
|
||||
>
|
||||
imap.IMAP
|
||||
~~~~~~~~~
|
||||
|
||||
### mem
|
||||
|
||||
Checks for mail on a IMAP server
|
||||
|
||||
|
||||
Settings:
|
||||
|
||||
:host: (required)
|
||||
:port: (default: '993')
|
||||
:username: (required)
|
||||
:password: (required)
|
||||
:ssl: (default: 'True')
|
||||
:mailbox: (default: 'INBOX')
|
||||
|
||||
|
||||
|
||||
notmuchmail.Notmuch
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
This class uses the notmuch python bindings to check for the
|
||||
number of messages in the notmuch database with the tags "inbox"
|
||||
and "unread"
|
||||
|
||||
|
||||
Settings:
|
||||
|
||||
:db_path: (required)
|
||||
|
||||
|
||||
|
||||
thunderbird.Thunderbird
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
This class listens for dbus signals emitted by
|
||||
the dbus-sender extension for thunderbird.
|
||||
|
||||
Requires python-dbus
|
||||
|
||||
|
||||
Settings:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
mem
|
||||
+++
|
||||
|
||||
|
||||
Shows memory load
|
||||
|
||||
Available formatters:
|
||||
|
||||
* {avail_mem}
|
||||
* {percent_used_mem}
|
||||
* {used_mem}
|
||||
@ -489,39 +497,42 @@ Available formatters:
|
||||
Requires psutil (from PyPI)
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — format string used for output. (default: `{avail_mem} MB`)
|
||||
:format: format string used for output. (default: '{avail_mem} MB')
|
||||
|
||||
|
||||
|
||||
### modsde
|
||||
modsde
|
||||
++++++
|
||||
|
||||
|
||||
This class returns i3status parsable output of the number of
|
||||
unread posts in any bookmark in the mods.de forums.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — Use {unread} as the formatter for number of unread posts (default: `{unread} new posts in bookmarks`)
|
||||
* `offset` — subtract number of posts before output (default: `0`)
|
||||
* `color` — (default: `#7181fe`)
|
||||
* `username` — (required)
|
||||
* `password` — (required)
|
||||
:format: Use {unread} as the formatter for number of unread posts (default: '{unread} new posts in bookmarks')
|
||||
:offset: subtract number of posts before output (default: '0')
|
||||
:color: (default: '#7181fe')
|
||||
:username: (required)
|
||||
:password: (required)
|
||||
|
||||
|
||||
|
||||
### mpd
|
||||
mpd
|
||||
+++
|
||||
|
||||
|
||||
Displays various information from MPD (the music player daemon)
|
||||
|
||||
Available formatters (uses formatp)
|
||||
Available formatters (uses `formatp`_)
|
||||
|
||||
* `{title}` — (the title of the current song)
|
||||
* `{album}` — (the album of the current song, can be an empty string (e.g. for online streams))
|
||||
* `{artist}` — (can be empty, too)
|
||||
* `{song_elapsed}` — (Position in the currently playing song, **uses TimeWrapper**, default is `%m:%S`)
|
||||
* `{song_elapsed}` — (Position in the currently playing song, uses `TimeWrapper`_, default is `%m:%S`)
|
||||
* `{song_length}` — (Length of the current song, same as song_elapsed)
|
||||
* `{pos}` — (Position of current song in playlist, one-based)
|
||||
* `{len}` — (Songs in playlist)
|
||||
@ -532,16 +543,17 @@ Available formatters (uses formatp)
|
||||
Left click on the module play/pauses, right click (un)mutes.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `host` — (default: `localhost`)
|
||||
* `port` — MPD port (default: `6600`)
|
||||
* `format` — formatp string (default: `{title} {status}`)
|
||||
* `status` — Dictionary mapping pause, play and stop to output (default: `{'pause': '▷', 'stop': '◾', 'play': '▶'}`)
|
||||
:host: (default: 'localhost')
|
||||
:port: MPD port (default: '6600')
|
||||
:format: formatp string (default: '{title} {status}')
|
||||
:status: Dictionary mapping pause, play and stop to output (default: '{'play': '▶', 'stop': '◾', 'pause': '▷'}')
|
||||
|
||||
|
||||
|
||||
### network
|
||||
network
|
||||
+++++++
|
||||
|
||||
|
||||
Display network information about a interface.
|
||||
@ -549,6 +561,7 @@ Display network information about a interface.
|
||||
Requires the PyPI package `netifaces-py3`.
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{interface}` — same as setting
|
||||
* `{name}` — same as setting
|
||||
* `{v4}` — IPv4 address
|
||||
@ -562,55 +575,61 @@ Available formatters:
|
||||
Not available addresses (i.e. no IPv6 connectivity) are replaced with empty strings.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `interface` — Interface to obtain information for (default: `eth0`)
|
||||
* `format_up` — (default: `{interface}: {v4}`)
|
||||
* `color_up` — (default: `#00FF00`)
|
||||
* `format_down` — (default: `{interface}`)
|
||||
* `color_down` — (default: `#FF0000`)
|
||||
* `name` — (default: `eth0`)
|
||||
:interface: Interface to obtain information for (default: 'eth0')
|
||||
:format_up: (default: '{interface}: {v4}')
|
||||
:color_up: (default: '#00FF00')
|
||||
:format_down: (default: '{interface}')
|
||||
:color_down: (default: '#FF0000')
|
||||
:detached_down: If the interface doesn't exist, display it as if it were down (default: 'False')
|
||||
:name: (default: 'eth0')
|
||||
|
||||
|
||||
|
||||
### parcel
|
||||
parcel
|
||||
++++++
|
||||
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `instance` — Tracker instance
|
||||
* `format` — (default: `{name}:{progress}`)
|
||||
* `name`
|
||||
:instance: Tracker instance
|
||||
:format: (default: '{name}:{progress}')
|
||||
:name:
|
||||
|
||||
|
||||
|
||||
### pulseaudio
|
||||
pulseaudio
|
||||
++++++++++
|
||||
|
||||
|
||||
Shows volume of default PulseAudio sink (output).
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{volume}` — volume in percent (0...100)
|
||||
* `{db}` — volume in decibels relative to 100 %, i.e. 100 % = 0 dB, 50 % = -18 dB, 0 % = -infinity dB
|
||||
(the literal value for -infinity is `-∞`)
|
||||
(the literal value for -infinity is `-∞`)
|
||||
* `{muted}` — the value of one of the `muted` or `unmuted` settings
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — (default: `♪: {volume}`)
|
||||
* `muted` — (default: `M`)
|
||||
* `unmuted` — (default: ``)
|
||||
:format: (default: '♪: {volume}')
|
||||
:muted: (default: 'M')
|
||||
:unmuted: (default: '')
|
||||
|
||||
|
||||
|
||||
### pyload
|
||||
pyload
|
||||
++++++
|
||||
|
||||
|
||||
Shows pyLoad status
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{captcha}` (see captcha_true and captcha_false, which are the values filled in for this formatter)
|
||||
* `{progress}` (average over all running downloads)
|
||||
* `{progress_all}` (percentage of completed files/links in queue)
|
||||
@ -620,20 +639,21 @@ Available formatters:
|
||||
* `{free_space}` (free space in download directory in gigabytes)
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `address` — Address of pyLoad webinterface (default: `http://127.0.0.1:8000`)
|
||||
* `format` — (default: `{captcha} {progress_all:.1f}% {speed:.1f} kb/s`)
|
||||
* `captcha_true` — (default: `Captcha waiting`)
|
||||
* `captcha_false` — (default: ``)
|
||||
* `download_true` — (default: `Downloads enabled`)
|
||||
* `download_false` — (default: `Downloads disabled`)
|
||||
* `username` — (required)
|
||||
* `password` — (required)
|
||||
:address: Address of pyLoad webinterface (default: 'http://127.0.0.1:8000')
|
||||
:format: (default: '{captcha} {progress_all:.1f}% {speed:.1f} kb/s')
|
||||
:captcha_true: (default: 'Captcha waiting')
|
||||
:captcha_false: (default: '')
|
||||
:download_true: (default: 'Downloads enabled')
|
||||
:download_false: (default: 'Downloads disabled')
|
||||
:username: (required)
|
||||
:password: (required)
|
||||
|
||||
|
||||
|
||||
### regex
|
||||
regex
|
||||
+++++
|
||||
|
||||
|
||||
Simple regex file watcher
|
||||
@ -641,16 +661,17 @@ Simple regex file watcher
|
||||
The groups of the regex are passed to the format string as positional arguments.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — format string used for output (default: `{0}`)
|
||||
* `regex` — (required)
|
||||
* `file` — file to search for regex matches
|
||||
* `flags` — Python.re flags (default: `0`)
|
||||
:format: format string used for output (default: '{0}')
|
||||
:regex: (required)
|
||||
:file: file to search for regex matches
|
||||
:flags: Python.re flags (default: '0')
|
||||
|
||||
|
||||
|
||||
### runwatch
|
||||
runwatch
|
||||
++++++++
|
||||
|
||||
|
||||
Expands the given path using glob to a pidfile and checks
|
||||
@ -662,18 +683,19 @@ such as a VPN client or your DHCP client is running.
|
||||
Available formatters are {pid} and {name}.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format_up` — (default: `{name}`)
|
||||
* `format_down` — (default: `{name}`)
|
||||
* `color_up` — (default: `#00FF00`)
|
||||
* `color_down` — (default: `#FF0000`)
|
||||
* `path` — (required)
|
||||
* `name` — (required)
|
||||
:format_up: (default: '{name}')
|
||||
:format_down: (default: '{name}')
|
||||
:color_up: (default: '#00FF00')
|
||||
:color_down: (default: '#FF0000')
|
||||
:path: (required)
|
||||
:name: (required)
|
||||
|
||||
|
||||
|
||||
### temp
|
||||
temp
|
||||
++++
|
||||
|
||||
|
||||
Shows CPU temperature of Intel processors
|
||||
@ -681,49 +703,53 @@ Shows CPU temperature of Intel processors
|
||||
AMD is currently not supported as they can only report a relative temperature, which is pretty useless
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `format` — format string used for output. {temp} is the temperature in degrees celsius, {critical} and {high} are the trip point temps. (default: `{temp} °C`)
|
||||
* `color` — (default: `#FFFFFF`)
|
||||
* `color_critical` — (default: `#FF0000`)
|
||||
* `high_factor` — (default: `0.7`)
|
||||
:format: format string used for output. {temp} is the temperature in degrees celsius, {critical} and {high} are the trip point temps. (default: '{temp} °C')
|
||||
:color: (default: '#FFFFFF')
|
||||
:color_critical: (default: '#FF0000')
|
||||
:high_factor: (default: '0.7')
|
||||
|
||||
|
||||
|
||||
### text
|
||||
text
|
||||
++++
|
||||
|
||||
|
||||
Display static, colored text.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `text` — (required)
|
||||
* `color` — HTML color code #RRGGBB (default: `None`)
|
||||
:text: (required)
|
||||
:color: HTML color code #RRGGBB (default: 'None')
|
||||
|
||||
|
||||
|
||||
### weather
|
||||
weather
|
||||
+++++++
|
||||
|
||||
|
||||
This module gets the weather from weather.com using pywapi module
|
||||
First, you need to get the code for the location from the www.weather.com
|
||||
Available formatters:
|
||||
{current_temp}
|
||||
{humidity}
|
||||
|
||||
* {current_temp}
|
||||
* {humidity}
|
||||
|
||||
Requires pywapi from PyPI.
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `location_code` — (required)
|
||||
* `units` — *C*elsius or *F*ahrenheit (default: `C`)
|
||||
* `format` — (default: `{current_temp}`)
|
||||
:location_code: (required)
|
||||
:units: Celsius (C) or Fahrenheit (F) (default: 'C')
|
||||
:format: (default: '{current_temp}')
|
||||
|
||||
|
||||
|
||||
### wireless
|
||||
wireless
|
||||
++++++++
|
||||
|
||||
|
||||
Display network information about a interface.
|
||||
@ -731,37 +757,41 @@ Display network information about a interface.
|
||||
Requires the PyPI packages `netifaces-py3` and `basiciw`.
|
||||
|
||||
This is based on the network module, so all options and formatters are
|
||||
the same, except for these additional formatters:
|
||||
the same, except for these additional formatters and that detached_down doesn't work.
|
||||
|
||||
* `{essid}` — ESSID of currently connected wifi
|
||||
* `{freq}` — Current frequency
|
||||
* `{quality}` — Link quality in percent
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
* `interface` — Interface to obtain information for (default: `wlan0`)
|
||||
* `format_up` — (default: `{interface}: {v4}`)
|
||||
* `color_up` — (default: `#00FF00`)
|
||||
* `format_down` — (default: `{interface}`)
|
||||
* `color_down` — (default: `#FF0000`)
|
||||
* `name` — (default: `eth0`)
|
||||
:interface: Interface to obtain information for (default: 'wlan0')
|
||||
:format_up: (default: '{interface}: {v4}')
|
||||
:color_up: (default: '#00FF00')
|
||||
:format_down: (default: '{interface}')
|
||||
:color_down: (default: '#FF0000')
|
||||
:detached_down: If the interface doesn't exist, display it as if it were down (default: 'False')
|
||||
:name: (default: 'eth0')
|
||||
|
||||
|
||||
|
||||
### xrandr
|
||||
xrandr
|
||||
++++++
|
||||
|
||||
|
||||
Do Not Publish, private hack of it's own
|
||||
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Contribute
|
||||
Contribute
|
||||
----------
|
||||
|
||||
To contribute a module, make sure it uses one of the Module classes. Most modules
|
||||
use IntervalModule, which just calls a function repeatedly in a specified interval.
|
||||
@ -771,8 +801,3 @@ the protocol is documented [here](http://i3wm.org/docs/i3bar-protocol.html).
|
||||
|
||||
**Patches and pull requests are very welcome :-)**
|
||||
|
||||
### The README
|
||||
|
||||
The README.md file is generated from the README.tpl.md file; only edit the latter
|
||||
and run `python -m i3pystatus.mkdocs`.
|
||||
|
@ -1,15 +1,15 @@
|
||||
<!--
|
||||
Always edit README.tpl.md and create README.md by running
|
||||
python -m i3pystatus.mkdocs
|
||||
You can also let the maintainer do the latter :)
|
||||
-->
|
||||
.. Always edit README.tpl.md and create README.md by running
|
||||
python -m i3pystatus.mkdocs You can also let the maintainer do the
|
||||
latter :)
|
||||
|
||||
# i3pystatus
|
||||
i3pystatus
|
||||
==========
|
||||
|
||||
i3pystatus is a (hopefully growing) collection of python scripts for
|
||||
status output compatible to i3status / i3bar of the i3 window manager.
|
||||
|
||||
## Installation
|
||||
Installation
|
||||
------------
|
||||
|
||||
Note: i3pystatus requires Python 3.2 or newer and is not compatible with
|
||||
Python 2.x.
|
||||
@ -22,9 +22,11 @@ Python 2.x.
|
||||
|
||||
* [Arch Linux](https://aur.archlinux.org/packages/i3pystatus-git/)
|
||||
|
||||
### Release Notes
|
||||
Release Notes
|
||||
-------------
|
||||
|
||||
#### 3.28
|
||||
3.28 (not released yet)
|
||||
+++++++++++++++++++++++
|
||||
|
||||
* **If you're currently using the `i3pystatus` command to run your i3bar**:
|
||||
Replace `i3pystatus` command in your i3 configuration with `python ~/path/to/your/i3pystatus.py`
|
||||
@ -33,33 +35,40 @@ Python 2.x.
|
||||
* pulseaudio: changed context name to "i3pystatus_pulseaudio"
|
||||
* Code changes
|
||||
|
||||
#### 3.27
|
||||
3.27
|
||||
++++
|
||||
|
||||
* Add weather module
|
||||
* Add text module
|
||||
* PulseAudio module: Add muted/unmuted options
|
||||
|
||||
#### 3.26
|
||||
3.26
|
||||
++++
|
||||
|
||||
* Add mem module
|
||||
|
||||
#### 3.24
|
||||
3.24
|
||||
++++
|
||||
|
||||
**This release introduced changes that may require manual changes to your
|
||||
configuration file**
|
||||
|
||||
* Introduced TimeWrapper
|
||||
* battery module: removed remaining_\* formatters in favor of TimeWrapper,
|
||||
as it can not only reproduce all the variants removed, but can do much more.
|
||||
* battery module: removed remaining\_* formatters in favor of
|
||||
TimeWrapper, as it can not only reproduce all the variants removed,
|
||||
but can do much more.
|
||||
* mpd: Uses TimeWrapper for song_length, song_elapsed
|
||||
|
||||
## Configuration
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The config file is just a normal Python script.
|
||||
|
||||
A simple configuration file could look like this (note the additional dependencies
|
||||
from network, wireless and pulseaudio in this example):
|
||||
|
||||
::
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import subprocess
|
||||
@ -165,6 +174,8 @@ from network, wireless and pulseaudio in this example):
|
||||
|
||||
Also change your i3wm config to the following:
|
||||
|
||||
::
|
||||
|
||||
# i3bar
|
||||
bar {
|
||||
status_command python ~/.path/to/your/config/file.py
|
||||
@ -172,23 +183,26 @@ Also change your i3wm config to the following:
|
||||
workspace_buttons yes
|
||||
}
|
||||
|
||||
### Formatting
|
||||
Formatting
|
||||
++++++++++
|
||||
|
||||
All modules let you specifiy the exact output formatting using a
|
||||
[format string](http://docs.python.org/3/library/string.html#formatstrings), which
|
||||
gives you a great deal of flexibility.
|
||||
|
||||
Some common stuff:
|
||||
If a module gives you a float, it probably has a ton of
|
||||
uninteresting decimal places. Use `{somefloat:.0f}` to get the integer
|
||||
value, `{somefloat:0.2f}` gives you two decimal places after the
|
||||
decimal dot
|
||||
|
||||
* If a module gives you a float, it probably has a ton of uninteresting decimal
|
||||
places. Use `{somefloat:.0f}` to get the integer value, `{somefloat:0.2f}` gives
|
||||
you two decimal places after the decimal dot
|
||||
|
||||
#### formatp
|
||||
formatp
|
||||
~~~~~~~
|
||||
|
||||
Some modules use an extended format string syntax (the mpd module, for example).
|
||||
Given the format string below the output adapts itself to the available data.
|
||||
|
||||
::
|
||||
|
||||
[{artist}/{album}/]{title}{status}
|
||||
|
||||
Only if both the artist and album is known they're displayed. If only one or none
|
||||
@ -202,7 +216,8 @@ Inside a group always all format specifiers must evaluate to true (logical and).
|
||||
You can nest groups. The inner group will only become part of the output if both
|
||||
the outer group and the inner group are eligible for output.
|
||||
|
||||
#### TimeWrapper
|
||||
TimeWrapper
|
||||
~~~~~~~~~~~
|
||||
|
||||
Some modules that output times use TimeWrapper to format these. TimeWrapper is
|
||||
a mere extension of the standard formatting method.
|
||||
@ -211,55 +226,35 @@ The time format that should be used is specified using the format specifier, i.e
|
||||
with some_time being 3951 seconds a format string like `{some_time:%h:%m:%s}`
|
||||
would produce `1:5:51`
|
||||
|
||||
* `%h`, `%m` and `%s` are the hours, minutes and seconds without leading zeros
|
||||
(i.e. 0 to 59 for minutes and seconds)
|
||||
* `%H`, `%M` and `%S` are padded with a leading zero to two digits, i.e. 00 to 59
|
||||
* `%l` and `%L` produce hours non-padded and padded but only if hours is not zero.
|
||||
If the hours are zero it produces an empty string.
|
||||
* `%h`, `%m` and `%s` are the hours, minutes and seconds without
|
||||
leading zeros (i.e. 0 to 59 for minutes and seconds)
|
||||
* `%H`, `%M` and `%S` are padded with a leading zero to two digits,
|
||||
i.e. 00 to 59
|
||||
* `%l` and `%L` produce hours non-padded and padded but only if hours
|
||||
is not zero. If the hours are zero it produces an empty string.
|
||||
* `%%` produces a literal %
|
||||
* `%E` (only valid on beginning of the string) if the time is null, don't format
|
||||
anything but rather produce an empty string. If the time is non-null it is
|
||||
removed from the string.
|
||||
* When the module in question also uses formatp, 0 seconds counts as "not known".
|
||||
* The formatted time is stripped, i.e. spaces on both ends of the result are removed
|
||||
* `%E` (only valid on beginning of the string) if the time is null,
|
||||
don't format anything but rather produce an empty string. If the
|
||||
time is non-null it is removed from the string.
|
||||
* When the module in question also uses formatp, 0 seconds counts as
|
||||
"not known".
|
||||
* The formatted time is stripped, i.e. spaces on both ends of the
|
||||
result are removed
|
||||
|
||||
## Modules
|
||||
Modules
|
||||
-------
|
||||
|
||||
System:
|
||||
[Clock](#clock) -
|
||||
[Free space](#disk) -
|
||||
[System load](#load) -
|
||||
[Memory usage](#mem)
|
||||
|
||||
Audio:
|
||||
[ALSA](#alsa) -
|
||||
[PulseAudio](#pulseaudio)
|
||||
|
||||
Hardware:
|
||||
[Battery](#battery) -
|
||||
[Screen brightness](#backlight) -
|
||||
[CPU temperature (Intel)](#temp)
|
||||
|
||||
Network:
|
||||
[Wired](#network) -
|
||||
[Wireless](#wireless)
|
||||
|
||||
Other:
|
||||
[Unread mail](#mail) -
|
||||
[Tracking parcels](#parcel) -
|
||||
[pyLoad](#pyload) -
|
||||
[Weather](#weather) -
|
||||
[Music Player Daemon (MPD)](#mpd) -
|
||||
[Simple text](#text)
|
||||
|
||||
Advanced:
|
||||
[Rip info from files](#file) -
|
||||
[Regular expressions](#regex) -
|
||||
[Run watcher](#runwatch)
|
||||
:System: `clock`_ - `disk`_ - `load`_ - `mem`_
|
||||
:Audio: `alsa`_ - `pulseaudio`_
|
||||
:Hardware: `battery`_ - `backlight`_ - `temp`_
|
||||
:Network: `network`_ - `wireless`_
|
||||
:Other: `mail`_ - `parcel`_ - `pyload`_ - `weather`_ - `mpd`_ - `text`_
|
||||
:Advanced: `file`_ - `regex`_ - `runwatch`_
|
||||
|
||||
!!module_doc!!
|
||||
|
||||
## Contribute
|
||||
Contribute
|
||||
----------
|
||||
|
||||
To contribute a module, make sure it uses one of the Module classes. Most modules
|
||||
use IntervalModule, which just calls a function repeatedly in a specified interval.
|
||||
@ -268,8 +263,3 @@ The output attribute should be set to a dictionary which represents your modules
|
||||
the protocol is documented [here](http://i3wm.org/docs/i3bar-protocol.html).
|
||||
|
||||
**Patches and pull requests are very welcome :-)**
|
||||
|
||||
### The README
|
||||
|
||||
The README.md file is generated from the README.tpl.md file; only edit the latter
|
||||
and run `python -m i3pystatus.mkdocs`.
|
@ -9,13 +9,15 @@ class File(IntervalModule):
|
||||
Rip information from text files
|
||||
|
||||
components is a dict of pairs of the form:
|
||||
|
||||
::
|
||||
|
||||
name => (callable, file)
|
||||
|
||||
* Where `name` is a valid identifier, which is used in the format string to access
|
||||
the value of that component.
|
||||
the value of that component.
|
||||
* `callable` is some callable to convert the contents of `file`. A common choice is
|
||||
float or int.
|
||||
float or int.
|
||||
* `file` names a file, relative to `base_path`.
|
||||
|
||||
transforms is a optional dict of callables taking a single argument (a dictionary containing the values
|
||||
|
@ -22,8 +22,7 @@ class Thunderbird(Backend):
|
||||
This class listens for dbus signals emitted by
|
||||
the dbus-sender extension for thunderbird.
|
||||
|
||||
Requires
|
||||
* python-dbus
|
||||
Requires python-dbus
|
||||
"""
|
||||
|
||||
_unread = set()
|
||||
|
@ -9,6 +9,7 @@ class Mem(IntervalModule):
|
||||
Shows memory load
|
||||
|
||||
Available formatters:
|
||||
|
||||
* {avail_mem}
|
||||
* {percent_used_mem}
|
||||
* {used_mem}
|
||||
|
@ -10,11 +10,12 @@ from .core.imputil import ClassFinder
|
||||
|
||||
IGNORE = ("__main__", "mkdocs", "core")
|
||||
MODULE_FORMAT = """
|
||||
{heading} {name}
|
||||
{name}
|
||||
{heading}
|
||||
|
||||
{doc}
|
||||
|
||||
__Settings:__
|
||||
Settings:
|
||||
|
||||
{settings}
|
||||
|
||||
@ -56,7 +57,7 @@ class Module:
|
||||
name=self.name,
|
||||
doc=textwrap.dedent(self.doc),
|
||||
settings=self.format_settings(),
|
||||
heading=self.heading,
|
||||
heading=self.heading * len(self.name),
|
||||
endstring=self.endstring
|
||||
)
|
||||
|
||||
@ -83,15 +84,11 @@ class Setting:
|
||||
if self.required:
|
||||
attrs.append("required")
|
||||
if self.default is not self.sentinel:
|
||||
attrs.append("default: `{default}`".format(default=self.default))
|
||||
attrs.append("default: '{default}'".format(default=self.default))
|
||||
|
||||
formatted = "* `{name}` ".format(name=self.name)
|
||||
if self.doc or attrs:
|
||||
formatted += "— "
|
||||
if self.doc:
|
||||
formatted += self.doc
|
||||
if attrs:
|
||||
formatted += " ({attrs})".format(attrs=", ".join(attrs))
|
||||
formatted = ":{name}: {doc}".format(name=self.name, doc=self.doc)
|
||||
if attrs:
|
||||
formatted += " ({attrs})".format(attrs=", ".join(attrs))
|
||||
|
||||
return formatted
|
||||
|
||||
@ -126,15 +123,15 @@ def get_all(module_path, heading, finder=None, ignore=None):
|
||||
return sorted(mods, key=lambda module: module.name)
|
||||
|
||||
|
||||
def generate_doc_for_module(module_path, heading="###", finder=None, ignore=None):
|
||||
def generate_doc_for_module(module_path, heading="+", finder=None, ignore=None):
|
||||
return "".join(map(str, get_all(module_path, heading, finder, ignore or [])))
|
||||
|
||||
with open("README.tpl.md", "r") as template:
|
||||
with open("README.tpl.rst", "r") as template:
|
||||
tpl = template.read()
|
||||
tpl = tpl.replace(
|
||||
"!!module_doc!!", generate_doc_for_module(i3pystatus.__path__))
|
||||
finder = ClassFinder(baseclass=i3pystatus.mail.Backend)
|
||||
tpl = tpl.replace("!!i3pystatus.mail!!", generate_doc_for_module(
|
||||
i3pystatus.mail.__path__, "###", finder, ["Backend"]).replace("\n", "\n> "))
|
||||
with open("README.md", "w") as output:
|
||||
i3pystatus.mail.__path__, "~", finder, ["Backend"]).replace("\n", "\n"))
|
||||
with open("README.rst", "w") as output:
|
||||
output.write(tpl + "\n")
|
||||
|
@ -14,11 +14,12 @@ class MPD(IntervalModule):
|
||||
"""
|
||||
Displays various information from MPD (the music player daemon)
|
||||
|
||||
Available formatters (uses formatp)
|
||||
Available formatters (uses `formatp`_)
|
||||
|
||||
* `{title}` — (the title of the current song)
|
||||
* `{album}` — (the album of the current song, can be an empty string (e.g. for online streams))
|
||||
* `{artist}` — (can be empty, too)
|
||||
* `{song_elapsed}` — (Position in the currently playing song, **uses TimeWrapper**, default is `%m:%S`)
|
||||
* `{song_elapsed}` — (Position in the currently playing song, uses `TimeWrapper`_, default is `%m:%S`)
|
||||
* `{song_length}` — (Length of the current song, same as song_elapsed)
|
||||
* `{pos}` — (Position of current song in playlist, one-based)
|
||||
* `{len}` — (Songs in playlist)
|
||||
|
@ -54,6 +54,7 @@ class Network(IntervalModule):
|
||||
Requires the PyPI package `netifaces-py3`.
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{interface}` — same as setting
|
||||
* `{name}` — same as setting
|
||||
* `{v4}` — IPv4 address
|
||||
@ -71,6 +72,7 @@ class Network(IntervalModule):
|
||||
("interface", "Interface to obtain information for"),
|
||||
"format_up", "color_up",
|
||||
"format_down", "color_down",
|
||||
("detached_down", "If the interface doesn't exist, display it as if it were down"),
|
||||
"name",
|
||||
)
|
||||
|
||||
@ -79,24 +81,28 @@ class Network(IntervalModule):
|
||||
format_down = "{interface}"
|
||||
color_up = "#00FF00"
|
||||
color_down = "#FF0000"
|
||||
detached_down = False
|
||||
|
||||
def init(self):
|
||||
if self.interface not in netifaces.interfaces():
|
||||
if self.interface not in netifaces.interfaces() and not self.detached_down:
|
||||
raise RuntimeError(
|
||||
"Unknown interface {iface}!".format(iface=self.interface))
|
||||
|
||||
self.baseinfo = {
|
||||
"interface": self.interface,
|
||||
"name": self.name,
|
||||
"mac": netifaces.ifaddresses(self.interface)[netifaces.AF_PACKET][0]["addr"],
|
||||
}
|
||||
|
||||
def collect(self):
|
||||
if self.interface not in netifaces.interfaces() and self.detached_down:
|
||||
self.format = self.format_down
|
||||
color = self.color_down
|
||||
return self.color_down, self.format_down, {"interface": self.interface, "name": self.name}, False
|
||||
|
||||
info = netifaces.ifaddresses(self.interface)
|
||||
up = netifaces.AF_INET in info or netifaces.AF_INET6 in info
|
||||
fdict = dict(
|
||||
zip_longest(["v4", "v4mask", "v4cidr", "v6", "v6mask", "v6cidr"], [], fillvalue=""))
|
||||
fdict.update(self.baseinfo)
|
||||
fdict.update({
|
||||
"interface": self.interface,
|
||||
"name": self.name,
|
||||
"mac": info[netifaces.AF_PACKET][0]["addr"],
|
||||
})
|
||||
|
||||
if up:
|
||||
format = self.format_up
|
||||
@ -115,7 +121,7 @@ class Network(IntervalModule):
|
||||
format = self.format_down
|
||||
color = self.color_down
|
||||
|
||||
return (color, format, fdict, up)
|
||||
return color, format, fdict, up
|
||||
|
||||
def run(self):
|
||||
color, format, fdict, up = self.collect()
|
||||
|
@ -9,9 +9,10 @@ class PulseAudio(Module):
|
||||
Shows volume of default PulseAudio sink (output).
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{volume}` — volume in percent (0...100)
|
||||
* `{db}` — volume in decibels relative to 100 %, i.e. 100 % = 0 dB, 50 % = -18 dB, 0 % = -infinity dB
|
||||
(the literal value for -infinity is `-∞`)
|
||||
(the literal value for -infinity is `-∞`)
|
||||
* `{muted}` — the value of one of the `muted` or `unmuted` settings
|
||||
"""
|
||||
|
||||
|
@ -15,6 +15,7 @@ class pyLoad(IntervalModule):
|
||||
Shows pyLoad status
|
||||
|
||||
Available formatters:
|
||||
|
||||
* `{captcha}` (see captcha_true and captcha_false, which are the values filled in for this formatter)
|
||||
* `{progress}` (average over all running downloads)
|
||||
* `{progress_all}` (percentage of completed files/links in queue)
|
||||
|
@ -9,8 +9,9 @@ class Weather(IntervalModule):
|
||||
This module gets the weather from weather.com using pywapi module
|
||||
First, you need to get the code for the location from the www.weather.com
|
||||
Available formatters:
|
||||
{current_temp}
|
||||
{humidity}
|
||||
|
||||
* {current_temp}
|
||||
* {humidity}
|
||||
|
||||
Requires pywapi from PyPI.
|
||||
"""
|
||||
@ -19,7 +20,7 @@ class Weather(IntervalModule):
|
||||
|
||||
settings = (
|
||||
"location_code",
|
||||
("units", "*C*elsius or *F*ahrenheit"),
|
||||
("units", "Celsius (C) or Fahrenheit (F)"),
|
||||
"format",
|
||||
)
|
||||
required = ("location_code",)
|
||||
|
@ -12,7 +12,8 @@ class Wireless(Network):
|
||||
Requires the PyPI packages `netifaces-py3` and `basiciw`.
|
||||
|
||||
This is based on the network module, so all options and formatters are
|
||||
the same, except for these additional formatters:
|
||||
the same, except for these additional formatters and that detached_down doesn't work.
|
||||
|
||||
* `{essid}` — ESSID of currently connected wifi
|
||||
* `{freq}` — Current frequency
|
||||
* `{quality}` — Link quality in percent
|
||||
@ -37,4 +38,4 @@ class Wireless(Network):
|
||||
fdict["essid"] = ""
|
||||
fdict["freq"] = fdict["quality"] = 0.0
|
||||
|
||||
return (color, format, fdict, up)
|
||||
return color, format, fdict, up
|
||||
|
Loading…
Reference in New Issue
Block a user