Awesome configs for Ben.

This commit is contained in:
Derek Taylor
2023-04-05 14:32:50 -05:00
parent 1966d656c1
commit 6252ad30c1
608 changed files with 9300 additions and 3600 deletions

15
.config/awesome/lain/wiki/Home.md Executable file → Normal file
View File

@@ -1,16 +1,13 @@
Welcome to the Lain wiki!
If you spot a typo or have a suggestion to improve these pages, please notify me opening an [issue](https://github.com/lcpz/lain/issues) format. Thank you.
If you spot a typo or have a suggestion, please notify me opening an [issue](https://github.com/copycat-killer/lain/issues) format. Thank you.
Dependencies
Dependency
------------
Package | Requested by | Reasons of choice
--- | --- | ---
[curl](https://curl.haxx.se) | `imap`, `mpd`, and `weather` widgets | 1. faster and simpler to use than [LuaSocket](https://github.com/diegonehab/luasocket); 2. it's in the core of almost every distro; 3. can be called [asynchronously](https://awesomewm.org/doc/api/libraries/awful.spawn.html#easy_async)
GLib >= 2.54 | `fs` widget | Pure Awesome/Lua implementation.
The second dependency will be removed once all major distros update their Gio/Glib versions.
Installation
------------
@@ -22,7 +19,7 @@ Installation
### Other distributions
```shell
git clone https://github.com/lcpz/lain.git ~/.config/awesome/lain
git clone https://github.com/copycat-killer/lain.git ~/.config/awesome/lain
```
Also available via [LuaRocks](https://luarocks.org/modules/aajjbb/lain).
@@ -38,6 +35,6 @@ local lain = require("lain")
Then check out the submodules you want:
- [Layouts](https://github.com/lcpz/lain/wiki/Layouts)
- [Widgets](https://github.com/lcpz/lain/wiki/Widgets)
- [Utilities](https://github.com/lcpz/lain/wiki/Utilities)
- [Layouts](https://github.com/copycat-killer/lain/wiki/Layouts)
- [Widgets](https://github.com/copycat-killer/lain/wiki/Widgets)
- [Utilities](https://github.com/copycat-killer/lain/wiki/Utilities)

8
.config/awesome/lain/wiki/Layouts.md Executable file → Normal file
View File

@@ -222,12 +222,12 @@ Following are a couple of `uselesstile` variants that were not part of lain. The
Xmonad-like
-----------
If you want to have `awful.layout.suit.tile` behave like xmonad, with internal gaps two times wider than external ones, download [this](https://gist.github.com/lcpz/9e56dcfbe66bfe14967c) as `lain/layout/uselesstile`.
If you want to have `awful.layout.suit.tile` behave like xmonad, with internal gaps two times wider than external ones, download [this](https://gist.github.com/copycat-killer/9e56dcfbe66bfe14967c) as `lain/layout/uselesstile`.
Inverted master
---------------
Want to invert master window position? Use [this](https://gist.github.com/lcpz/c59dc59c9f99d98218eb) version. You can set `single_gap` with `width` and `height` in your `theme.lua`, in order to define the window geometry when there's only one client, otherwise it goes maximized. An example:
Want to invert master window position? Use [this](https://gist.github.com/copycat-killer/c59dc59c9f99d98218eb) version. You can set `single_gap` with `width` and `height` in your `theme.lua`, in order to define the window geometry when there's only one client, otherwise it goes maximized. An example:
theme.single_gap = { width = 600, height = 100 }
@@ -246,10 +246,10 @@ theme.layout_centerfair = theme.lain_icons .. "centerfair.png" -- termfair.cen
theme.layout_cascade = theme.lain_icons .. "cascade.png"
theme.layout_cascadetile = theme.lain_icons .. "cascadetile.png" -- cascade.tile
theme.layout_centerwork = theme.lain_icons .. "centerwork.png"
theme.layout_centerworkh = theme.lain_icons .. "centerworkh.png" -- centerwork.horizontal
theme.layout_centerhwork = theme.lain_icons .. "centerworkh.png" -- centerwork.horizontal
```
Credit goes to [Nicolas Estibals](https://github.com/nestibal) for creating
Credits go to [Nicolas Estibals](https://github.com/nestibal) for creating
layout icons for default theme.
You can use them as a template for your custom versions.

113
.config/awesome/lain/wiki/Utilities.md Executable file → Normal file
View File

@@ -40,12 +40,12 @@ Variable | Meaning | Type | Default
`name` | client name | string | "QuakeDD"
`argname` | how to specify client name | string | "-name %s"
`extra` | extra `app` arguments | string | empty string
`border` | border width | integer | 1
`border` | border width | number | 1
`visible` | initially visible | boolean | false
`followtag` | always spawn on currently focused screen | boolean | false
`overlap` | Overlap the wibox or not | boolean | false
`settings` | Additional settings to make on the client | function | `nil`
`screen` | screen where to spawn the client | integer | `awful.screen.focused()`
`settings` | Additional settings to make on the client | function | nil
`screen` | screen where to spawn the client | number | `awful.screen.focused()`
`height` | dropdown client height | float in [0,1] or exact pixels number | 0.25
`width` | dropdown client width | float in [0,1] or exact pixels number | 1
`vert` | vertical position | string, possible values: "top", "bottom", "center" | "top"
@@ -64,10 +64,10 @@ Read [here](https://awesomewm.org/doc/api/classes/client.html#Object_properties)
**Notes**
* [Does not work](https://github.com/lcpz/lain/issues/358) with `gnome-terminal`, `konsole`, or any other terminal which is strictly designed for a Desktop Environment. Just pick a better terminal, [there's plenty](https://wiki.archlinux.org/index.php/List_of_applications#Terminal_emulators).
* Set `followtag = true` if [experiencing issues with multiple screens](https://github.com/lcpz/lain/issues/346).
* [Does not work](https://github.com/copycat-killer/lain/issues/358) with `gnome-terminal`, `konsole`, or any other terminal which is strictly designed for a Desktop Environment. Just pick a better terminal, [there's plenty](https://wiki.archlinux.org/index.php/List_of_applications#Terminal_emulators).
* Set `followtag = true` if [experiencing issues with multiscreen setups](https://github.com/copycat-killer/lain/issues/346).
* If you have a `awful.client.setslave` rule for your application, ensure you use an exception for `QuakeDD` (or your defined `name`). Otherwise, you may run into problems with focus.
* If you are using a VTE-based terminal like `termite`, be sure to set [`argname = "--name %s"`](https://github.com/lcpz/lain/issues/211).
* If you are using a VTE-based terminal like `termite`, be sure to set [`argname = "--name %s"`](https://github.com/copycat-killer/lain/issues/211).
Separators
----------
@@ -170,17 +170,9 @@ Useless gaps resize
Changes `beautiful.useless_gaps` on the fly.
```lua
lain.util.useless_gap_resize(thatmuch, s, t)
```
The function takes an integer argument, being the amount of pixel to add/remove to gaps.
The argument `thatmuch` is the number of pixel to add to/substract from gaps (integer).
The arguments `s` and `t` are the `awful.screen` and `awful.tag` in which you want to change the gap. They are optional.
Following are example keybindings for changing client gaps on current screen and tag.
Example 1:
You could use it with these keybindings:
```lua
-- On the fly useless gaps change
@@ -188,7 +180,7 @@ awful.key({ altkey, "Control" }, "+", function () lain.util.useless_gaps_resize(
awful.key({ altkey, "Control" }, "-", function () lain.util.useless_gaps_resize(-1) end),
```
where `altkey = Mod1`. Example 2:
where `altkey = Mod1`, or you could use it like this:
```lua
mywidget:buttons(awful.util.table.join (
@@ -238,7 +230,7 @@ clientkeys = awful.util.table.join(
If you want to "de-magnify" it, just retype the keybinding.
If you want magnified client to respond to `incmwfact`, read [here](https://github.com/lcpz/lain/issues/195).
If you want magnified client to respond to `incmwfact`, read [here](https://github.com/copycat-killer/lain/issues/195).
menu\_clients\_current\_tags
----------------------------
@@ -251,88 +243,3 @@ awful.key({ "Mod1" }, "Tab", function()
lain.util.menu_clients_current_tags({ width = 350 }, { keygrabber = true })
end),
```
menu\_iterator
--------------
A generic menu utility which enables iteration over lists of possible
actions to execute. The perfect example is a menu for choosing what
configuration to apply to X with `xrandr`, as suggested on the [Awesome wiki page](https://awesomewm.org/recipes/xrandr).
<p align="center">
<img src="https://user-images.githubusercontent.com/4147254/36317474-3027f8b6-130b-11e8-9b6b-9a2cf55ae841.gif"/>
<br>An example Synergy menu, courtesy of <a href="https://github.com/sim590/dotfiles/blob/master/awesome/rc/xrandr.lua">sim590</a>
</p>
You can either manually create a menu by defining a table in this format:
```lua
{ { "choice description 1", callbackFuction1 }, { "choice description 2", callbackFunction2 }, ... }
```
or use `util.menu_iterator.menu`. Once you have your menu, use it with `lain.menu_iterator.iterate`.
### Input tables
**lain.menu_iterator.iterate**
| Argument | Description | Type
|---|---| ---
| `menu` | the menu to iterate on | table
| `timeout` | time (in seconds) to wait on a choice before the choice is accepted | integer (default: 4)
| `icon` | path to the icon to display in `naughty.notify` window | string
**lain.menu_iterator.menu**
| Argument | Description | Type
|---|---| ---
`choices` | list of choices (e.g., `{ "choice1", "choice2", ... }`) | array of strings
`name` | name of the program related to this menu | string
`selected_cb` | callback to execute for each selected choice, it takes one choice (string) as argument; can be `nil` (no action to execute) | function
`rejected_cb` | callback to execute for all rejected choices (the remaining choices, once one is selected), it takes one choice (string) as argument; can be `nil` (no action to execute) | function
`extra_choices` | more choices to be added to the menu; unlike `choices`, these ones won't trigger `rejected_cb` | array of `{ choice, callback }` pairs, where `choice` is a string and `callback` is a function
`combination` | how choices have to be combined in the menu; possible values are: "single" (default), the set of possible choices will simply be the input set ; "powerset", the set of possible choices will be the [power set](https://en.wikipedia.org/wiki/Power_set) of the input set | string
### Examples
A simple example is:
```lua
local mymenu_iterable = lain.util.menu_iterator.menu {
choices = {"My first choice", "My second choice"},
name = "My awesome program",
selected_cb = function(choice)
-- do something with selected choice
end,
rejected_cb = function(choice)
-- do something with every rejected choice
end
}
```
The variable `mymenu_iterable` is a menu compatible with the function `lain.util.menu_iterator.iterate`, which will iterate over it and displays notification with `naughty.notify` every time it is called. You can use it like this:
```lua
local confirm_timeout = 5 -- time to wait before confirming the menu selection
local my_notify_icon = "/path/to/icon" -- the icon to display in the notification
lain.util.menu_iterator.iterate(mymenu_iterable, confirm_timeout, my_notify_icon)
```
Once `confirm_timeout` has passed without anymore calls to `iterate`, the choice is made and the associated callbacks (both for selected and rejected choices) are spawned.
A useful practice is to add a `Cancel` option as an extra choice for canceling a menu selection. Extending the above example:
```lua
local mymenu_iterable = lain.util.menu_iterator.menu {
choices = {"My first choice", "My second choice"},
name = "My awesome program",
selected_cb = function(choice)
-- do something with selected choice
end,
rejected_cb = function(choice)
-- do something with every rejected choice
end
-- nil means no action to do
extra_choices = { {"Cancel"}, nil }
}
```

43
.config/awesome/lain/wiki/Widgets.md Executable file → Normal file
View File

@@ -4,7 +4,7 @@ Every lain widget is a table.
A lain widget is generated by a `function`.
The `function` signature, input and output arguments can be found in the [related wiki entry](https://github.com/lcpz/lain/wiki/Widgets#index).
The `function` signature, input and output arguments can be found in the [related wiki entry](https://github.com/copycat-killer/lain/wiki/Widgets#index).
Every lain widget contains a `wibox.widget`, which is updated by a timed function. To access the widget, use the field `widget`, while to access the timed function, use the field `update`. Some lain widgets may also have an `icon` field, which is a `wibox.widget.imagebox`, and/or a `timer` field, which is the `gears.timer` on `update`.
@@ -27,29 +27,30 @@ local cpu = lain.widget.cpu {
-- to access the widget: cpu.widget
```
If you want to see some applications, check [awesome-copycats](https://github.com/lcpz/awesome-copycats).
If you want to see some applications, check [awesome-copycats](https://github.com/copycat-killer/awesome-copycats).
# Index
- [alsa](https://github.com/lcpz/lain/wiki/alsa)
- [alsabar](https://github.com/lcpz/lain/wiki/alsabar)
- [bat](https://github.com/lcpz/lain/wiki/bat)
- [cal](https://github.com/lcpz/lain/wiki/cal)
- [cpu](https://github.com/lcpz/lain/wiki/cpu)
- [fs](https://github.com/lcpz/lain/wiki/fs)
- [imap](https://github.com/lcpz/lain/wiki/imap)
- [mem](https://github.com/lcpz/lain/wiki/mem)
- [mpd](https://github.com/lcpz/lain/wiki/mpd)
- [net](https://github.com/lcpz/lain/wiki/net)
- [pulse](https://github.com/lcpz/lain/wiki/pulse)
- [pulsebar](https://github.com/lcpz/lain/wiki/pulsebar)
- [sysload](https://github.com/lcpz/lain/wiki/sysload)
- [temp](https://github.com/lcpz/lain/wiki/temp)
- [weather](https://github.com/lcpz/lain/wiki/weather)
- [alsa](https://github.com/copycat-killer/lain/wiki/alsa)
- [alsabar](https://github.com/copycat-killer/lain/wiki/alsabar)
- [bat](https://github.com/copycat-killer/lain/wiki/bat)
- [calendar](https://github.com/copycat-killer/lain/wiki/calendar)
- [cpu](https://github.com/copycat-killer/lain/wiki/cpu)
- [fs](https://github.com/copycat-killer/lain/wiki/fs)
- [imap](https://github.com/copycat-killer/lain/wiki/imap)
- [mem](https://github.com/copycat-killer/lain/wiki/mem)
- [mpd](https://github.com/copycat-killer/lain/wiki/mpd)
- [net](https://github.com/copycat-killer/lain/wiki/net)
- [pulse](https://github.com/copycat-killer/lain/wiki/pulse)
- [pulsebar](https://github.com/copycat-killer/lain/wiki/pulsebar)
- [sysload](https://github.com/copycat-killer/lain/wiki/sysload)
- [temp](https://github.com/copycat-killer/lain/wiki/temp)
- [weather](https://github.com/copycat-killer/lain/wiki/weather)
## Users contributed
- [moc](https://github.com/lcpz/lain/wiki/moc)
- [redshift](https://github.com/lcpz/lain/wiki/redshift)
- [task](https://github.com/lcpz/lain/wiki/task)
- [tp_smapi](https://github.com/lcpz/lain/wiki/tp_smapi)
- [kbdlayout](https://github.com/copycat-killer/lain/wiki/kbdlayout)
- [moc](https://github.com/copycat-killer/lain/wiki/moc)
- [redshift](https://github.com/copycat-killer/lain/wiki/redshift)
- [task](https://github.com/copycat-killer/lain/wiki/task)
- [tpbat](https://github.com/copycat-killer/lain/wiki/tpbat)

2
.config/awesome/lain/wiki/_Footer.md Executable file → Normal file
View File

@@ -1 +1 @@
[Home](https://github.com/lcpz/lain/wiki) • [Layouts](https://github.com/lcpz/lain/wiki/Layouts) • [Widgets](https://github.com/lcpz/lain/wiki/Widgets) • [Utilities](https://github.com/lcpz/lain/wiki/Utilities)
[Home](https://github.com/copycat-killer/lain/wiki) • [Layouts](https://github.com/copycat-killer/lain/wiki/Layouts) • [Widgets](https://github.com/copycat-killer/lain/wiki/Widgets) • [Utilities](https://github.com/copycat-killer/lain/wiki/Utilities)

51
.config/awesome/lain/wiki/_Sidebar.md Executable file → Normal file
View File

@@ -1,26 +1,25 @@
* [Home](https://github.com/lcpz/lain/wiki/Home)
* [Layouts](https://github.com/lcpz/lain/wiki/Layouts)
* [Usage](https://github.com/lcpz/lain/wiki/Layouts#Usage)
* [How do layouts work?](https://github.com/lcpz/lain/wiki/Layouts#how-do-layouts-work)
* [termfair](https://github.com/lcpz/lain/wiki/Layouts#termfair)
* [centerfair](https://github.com/lcpz/lain/wiki/Layouts#termfaircenter)
* [cascade](https://github.com/lcpz/lain/wiki/Layouts#cascade)
* [cascadetile](https://github.com/lcpz/lain/wiki/Layouts#cascadetile)
* [centerwork](https://github.com/lcpz/lain/wiki/Layouts#centerwork)
* [centerworkh](https://github.com/lcpz/lain/wiki/Layouts#centerworkhorizontal)
* [Pre 4.0 uselesstile patches](https://github.com/lcpz/lain/wiki/Layouts#pre-40-uselesstile-patches)
* [What about layout icons?](https://github.com/lcpz/lain/wiki/Layouts#what-about-layout-icons)
* [Widgets](https://github.com/lcpz/lain/wiki/Widgets)
* [Usage](https://github.com/lcpz/lain/wiki/Widgets#usage)
* [Index](https://github.com/lcpz/lain/wiki/Widgets#index)
* [Users contributed](https://github.com/lcpz/lain/wiki/Widgets#users-contributed)
* [Utilities](https://github.com/lcpz/lain/wiki/Utilities)
* [quake](https://github.com/lcpz/lain/wiki/Utilities#quake)
* [separators](https://github.com/lcpz/lain/wiki/Utilities#separators)
* [markup](https://github.com/lcpz/lain/wiki/Utilities#markup)
* [dynamic tagging](https://github.com/lcpz/lain/wiki/Utilities#dynamic-tagging)
* [useless_gaps_resize](https://github.com/lcpz/lain/wiki/Utilities#useless-gaps-resize)
* [tag_view_non_empty](https://github.com/lcpz/lain/wiki/Utilities#tag_view_nonempty)
* [magnify_client](https://github.com/lcpz/lain/wiki/Utilities#magnify_client)
* [menu_clients_current_tags](https://github.com/lcpz/lain/wiki/Utilities#menu_clients_current_tags)
* [menu_iterator](https://github.com/lcpz/lain/wiki/Utilities#menu_iterator)
* [Home](https://github.com/copycat-killer/lain/wiki/Home)
* [Layouts](https://github.com/copycat-killer/lain/wiki/Layouts)
* [Usage](https://github.com/copycat-killer/lain/wiki/Layouts#Usage)
* [How do layouts work?](https://github.com/copycat-killer/lain/wiki/Layouts#how-do-layouts-work)
* [termfair](https://github.com/copycat-killer/lain/wiki/Layouts#termfair)
* [centerfair](https://github.com/copycat-killer/lain/wiki/Layouts#termfaircenter)
* [cascade](https://github.com/copycat-killer/lain/wiki/Layouts#cascade)
* [cascadetile](https://github.com/copycat-killer/lain/wiki/Layouts#cascadetile)
* [centerwork](https://github.com/copycat-killer/lain/wiki/Layouts#centerwork)
* [centerworkh](https://github.com/copycat-killer/lain/wiki/Layouts#centerworkhorizontal)
* [Pre 4.0 uselesstile patches](https://github.com/copycat-killer/lain/wiki/Layouts#pre-40-uselesstile-patches)
* [What about layout icons?](https://github.com/copycat-killer/lain/wiki/Layouts#what-about-layout-icons)
* [Widgets](https://github.com/copycat-killer/lain/wiki/Widgets)
* [Usage](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
* [Index](https://github.com/copycat-killer/lain/wiki/Widgets#index)
* [Users contributed](https://github.com/copycat-killer/lain/wiki/Widgets#users-contributed)
* [Utilities](https://github.com/copycat-killer/lain/wiki/Utilities)
* [quake](https://github.com/copycat-killer/lain/wiki/Utilities#quake)
* [separators](https://github.com/copycat-killer/lain/wiki/Utilities#separators)
* [markup](https://github.com/copycat-killer/lain/wiki/Utilities#markup)
* [dynamic tagging](https://github.com/copycat-killer/lain/wiki/Utilities#dynamic-tagging)
* [useless_gaps_resize](https://github.com/copycat-killer/lain/wiki/Utilities#useless-gaps-resize)
* [tag_view_non_empty](https://github.com/copycat-killer/lain/wiki/Utilities#tag_view_nonempty)
* [magnify_client](https://github.com/copycat-killer/lain/wiki/Utilities#magnify_client)
* [menu_clients_current_tags](https://github.com/copycat-killer/lain/wiki/Utilities#menu_clients_current_tags)

16
.config/awesome/lain/wiki/alsa.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,7 +14,7 @@ local volume = lain.widget.alsa()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 5
`timeout` | Refresh timeout seconds | number | 5
`cmd` | Alsa mixer command | string | "amixer"
`channel` | Mixer channel | string | "Master"
`togglechannel` | Toggle channel | string | `nil`
@@ -26,7 +26,7 @@ Variable | Meaning | Type | Default
Variable | Meaning | Type | Values
--- | --- | --- | ---
`volume_now.level` | Volume level | integer | 0-100
`volume_now.level` | Volume level | number | 0-100
`volume_now.status` | Device status | string | "on", "off"
## Output table
@@ -82,19 +82,19 @@ volume.widget:buttons(awful.util.table.join(
awful.spawn(string.format("%s -e alsamixer", terminal))
end),
awful.button({}, 2, function() -- middle click
os.execute(string.format("%s set %s 100%%", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 100%%", volume.cmd, volume.channel))
volume.update()
end),
awful.button({}, 3, function() -- right click
os.execute(string.format("%s set %s toggle", volume.cmd, volume.togglechannel or volume.channel))
awful.spawn(string.format("%s set %s toggle", volume.cmd, volume.togglechannel or volume.channel))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
os.execute(string.format("%s set %s 1%%+", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 1%%+", volume.cmd, volume.channel))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
os.execute(string.format("%s set %s 1%%-", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 1%%-", volume.cmd, volume.channel))
volume.update()
end)
))
@@ -133,4 +133,4 @@ awful.key({ altkey, "Control" }, "0",
end),
```
where `altkey = "Mod1"`.
where `altkey = "Mod1"`.

30
.config/awesome/lain/wiki/alsabar.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,33 +14,31 @@ local volume = lain.widget.alsabar()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 5
`timeout` | Refresh timeout seconds | number | 5
`settings` | User settings | function | empty function
`width` | Bar width | number | 63
`height` | Bar height | number | 1
`margins` | Bar margins | number | 1
`paddings` | Bar paddings | number | 1
`ticks` | Set bar ticks on | boolean | false
`ticks_size` | Ticks size | integer | 7
`ticks_size` | Ticks size | number | 7
`cmd` | ALSA mixer command | string | "amixer"
`channel` | Mixer channel | string | "Master"
`togglechannel` | Toggle channel | string | `nil`
`colors` | Bar colors | table | see [Default colors](https://github.com/lcpz/lain/wiki/alsabar#default-colors)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/alsabar#default-notification_preset)
`colors` | Bar colors | table | see [Default colors](https://github.com/copycat-killer/lain/wiki/alsabar#default-colors)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/copycat-killer/lain/wiki/alsabar#default-notification_preset)
`followtag` | Display the notification on currently focused screen | boolean | false
`cmd` is useful if you need to pass additional arguments to `amixer`. For instance, you may want to define `cmd = "amixer -c X"` in order to set amixer with card `X`.
`cmd` is useful if you need to pass additional arguments to `amixer`. For instance, you may want to define `command = "amixer -c X"` in order to set amixer with card `X`.
In case mute toggling can't be mapped to master channel (this happens, for instance, when you are using an HDMI output), define `togglechannel` as your S/PDIF device. Read [`alsa`](https://github.com/lcpz/lain/wiki/alsa#toggle-channel) page to know how.
In case mute toggling can't be mapped to master channel (this happens, for instance, when you are using an HDMI output), define `togglechannel` as your S/PDIF device. Read [`alsa`](https://github.com/copycat-killer/lain/wiki/alsa#toggle-channel) page to know how.
`settings` can use the following variables:
Variable | Meaning | Type | Values
--- | --- | --- | ---
`volume_now.level` | Volume level | integer | 0-100
`volume_now.level` | Volume level | number | 0-100
`volume_now.status` | Device status | string | "on", "off"
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
### Default colors
@@ -79,19 +77,19 @@ volume.bar:buttons(awful.util.table.join(
awful.spawn(string.format("%s -e alsamixer", terminal))
end),
awful.button({}, 2, function() -- middle click
os.execute(string.format("%s set %s 100%%", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 100%%", volume.cmd, volume.channel))
volume.update()
end),
awful.button({}, 3, function() -- right click
os.execute(string.format("%s set %s toggle", volume.cmd, volume.togglechannel or volume.channel))
awful.spawn(string.format("%s set %s toggle", volume.cmd, volume.togglechannel or volume.channel))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
os.execute(string.format("%s set %s 1%%+", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 1%%+", volume.cmd, volume.channel))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
os.execute(string.format("%s set %s 1%%-", volume.cmd, volume.channel))
awful.spawn(string.format("%s set %s 1%%-", volume.cmd, volume.channel))
volume.update()
end)
))
@@ -99,4 +97,4 @@ volume.bar:buttons(awful.util.table.join(
## Keybindings
Read [here](https://github.com/lcpz/lain/wiki/alsa#keybindings). If you want notifications, use `volume.notify()` instead of `volume.update()`.
Read [here](https://github.com/copycat-killer/lain/wiki/alsa#keybindings). If you want notifications, use `volume.notify()` instead of `volume.update()`.

66
.config/awesome/lain/wiki/bat.md Executable file → Normal file
View File

@@ -1,13 +1,13 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Shows the remaining time and percentage capacity of your laptop battery, as well
as the current wattage. Multiple batteries are supported.
Shows the remaining time and percentage capacity of your laptop battery, as well as
the current wattage. Multiple batteries are supported.
Displays a notification when battery is fully charged, low, or critical.
Displays a notification when battery is low or critical.
```lua
local mybattery = lain.widget.bat()
@@ -17,54 +17,35 @@ local mybattery = lain.widget.bat()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 30
`pspath` | Power supply directory path | string | "/sys/class/power_supply/"
`battery` | Single battery id | string | autodetected
`batteries` | Multiple batteries id table | table of strings | autodetected
`ac` | AC | string | autodetected
`timeout` | Refresh timeout seconds | number | 30
`battery` | Single battery id | string | "BAT0"
`batteries` | Multiple batteries id table | table of strings | `{"BAT0"}`
`ac` | AC | string | "AC0"
`notify` | Show notification popups | string | "on"
`n_perc` | Percentages assumed for critical and low battery levels | table of integers | `{5, 15}`
`settings` | User settings | function | empty function
The widget will try to autodetect `battery`, `batteries` and `ac`. If something
goes wrong, you will have to define them manually. In that case, you only have
to define one between `battery` and `batteries`. If you have one battery, you
can either use `args.battery = "BAT*"` or `args.batteries = {"BAT*"}`, where `BAT*`
is the identifier of your battery in `pspath` (do not use it as a wildcard).
Of course, if you have multiple batteries, you need to use the latter option.
You only have to define one between `battery` and `batteries`.
To disable notifications, set `notify` to `"off"`.
If you have one battery, you can either use `args.battery = "BAT*"` or `args.batteries = {"BAT*"}`. Of course, if you have multiple batteries, you need to use the latter option.
If you define `pspath`, **be sure** to not forget the final slash (/).
To disable warning notifications, set `notify` to `"off"`.
`settings` can use the `bat_now` table, which contains the following strings:
- `status`, general status ("N/A", "Discharging", "Charging", "Full");
- `status`, battery status ("N/A", "Discharging", "Charging", "Full");
- `n_status[i]`, i-th battery status (like above);
- `ac_status`, AC-plug flag (0 if cable is unplugged, 1 if plugged, "N/A" otherwise);
- `perc`, total charge percentage (integer between 0 and 100 or "N/A");
- `n_perc[i]`, i-th battery charge percentage (like above);
- `time`, time remaining until charge if charging, until discharge if discharging (HH:MM string or "N/A");
- `n_perc`, i-th battery charge percentage (like above);
- `time`, time remaining until charge if charging, until discharge if discharging (HH:SS string or "N/A");
- `watt`, battery watts (float with 2 decimals).
and can modify the following three tables, which will be the preset for the naughty notifications:
* `bat_notification_charged_preset` (used if battery is fully charged and connected to AC)
* `bat_notification_low_preset` (used if battery charge level <= 15)
and can modify the following two tables, which will be the preset for the naughty notifications:
* `bat_notification_low_preset`(used if battery charge level <= 15)
* `bat_notification_critical_preset` (used if battery charge level <= 5)
Check [here](https://awesomewm.org/doc/api/libraries/naughty.html#notify) for
the list of variables they can contain. Default definitions:
```lua
bat_notification_charged_preset = {
title = "Battery full",
text = "You can unplug the cable",
timeout = 15,
fg = "#202020",
bg = "#CDCDCD"
}
```
Check [here](https://awesomewm.org/doc/api/libraries/naughty.html#notify) for the list of variables they can contain. Default definitions:
```lua
bat_notification_low_preset = {
@@ -94,6 +75,15 @@ Variable | Meaning | Type
The `update` function can be used to refresh the widget before `timeout` expires.
## Note
## Notes
* Another common identifier for `ac` is `ACAD`.
* If your widget is always on "N/A" with default settings, and you have a single battery, then `BAT0` is not your battery file. Locate the right one in `/sys/class/power_supply/` and set `battery` properly. For instance, with `BAT1`:
Alternatively, you can try the [`upower` recipe](https://awesomewm.org/recipes/watch).
```lua
batwidget = lain.widget.bat({
battery = "BAT1",
-- [...]
})
```
* Alternatively, you can try the `upower` widget [here](https://awesomewm.org/recipes/watch).

View File

@@ -1,81 +0,0 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
### Description
Creates a calendar notification that can be attached to widgets.
This is a simpler but [faster](https://github.com/awesomeWM/awesome/issues/1861)
alternative to [`awful.widget.calendar_popup`](https://awesomewm.org/doc/api/classes/awful.widget.calendar_popup.html), which emulates UNIX's `cal`.
```lua
local mycal = lain.widget.cal()
```
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`attach_to` | List of widgets | table | empty table
`week_start` | First day of the week | integer | 2 (Monday)
`three` | Display three months spanning the date | boolean | false
`followtag` | Display the notification on currently focused screen | boolean | false
`icons` | Path to calendar icons | string | [icons/cal/white/](https://github.com/lcpz/lain/tree/master/icons/cal/white)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/calendar#default-notification_preset)
Set `attach_to` as the list of widgets to which you want to attach the calendar, like this:
```lua
local mycal = lain.widget.cal {
attach_to = { mywidget1, mywidget2, ... },
-- [...]
}
```
For every widget in `attach_to`:
- Left click / scroll down: switch to previous month.
- Middle click show current month.
- Right click / scroll up: switch to next month.
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
### Default `notification_preset`
```lua
notification_preset = {
font = "Monospace 10",
fg = "#FFFFFF",
bg = "#000000"
}
```
## Output table
Variable | Meaning | Type
--- | --- | ---
`attach` | Attach the calendar to an input widget | function
`show` | Show calendar | function
`hide` | Hide calendar | function
`attach` takes as argument any widget you want to attach the calendar to, while
`show` takes as optional argument an integer to indicate the seconds to timeout.
## Keybinding
```lua
awful.key({ altkey }, "c", function () mycal.show(7) end)
```
Where `altkey = "Mod1"`.
## Notes
* Naughty notifications require `notification_preset.font` to be **monospaced**, in order to correctly display the output.
* If you want to [disable notification icon](https://github.com/lcpz/lain/pull/351), set `icons = ""` in the input table.
* If you want to localise the calendar, put `os.setlocale(os.getenv("LANG"))` in your `rc.lua`.
* If you want to get notifications [only with mouse clicks](https://github.com/lcpz/lain/issues/320) on a given widget, use this code:
```lua
yourwidget:disconnect_signal("mouse::enter", mycal.hover_on)
```

View File

@@ -0,0 +1,105 @@
## Usage
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Attaches a calendar notification to a widget.
This is a simpler but [faster](https://github.com/awesomeWM/awesome/issues/1861)
alternative to [`awful.widget.calendar_popup](https://awesomewm.org/doc/api/classes/awful.widget.calendar_popup.html).
```lua
local calendar = lain.widget.calendar()
```
- Left click / scroll down: switch to previous month.
- Right click / scroll up: switch to next month.
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`cal` | custom call for `cal` | string | "/usr/bin/cal"
`attach_to` | Array of widgets | array | empty array
`followtag` | Display the notification on currently focused screen | boolean | false
`icons` | Path to calendar icons | string | [lain/icons/cal/white](https://github.com/copycat-killer/lain/tree/master)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/copycat-killer/lain/wiki/calendar#default-notification_preset)
You can reset `cal` any way you like (using `-w` to display weeks as well, for instance). If the current day is not highlighted, you can reset `cal` to also include the proper coloring flag. For instance, under Arch Linux it's `/usr/bin/cal --color=always`, while under Ubuntu it's `/usr/bin/cal -h`.
You can set `attach_to` as the array of widgets to which you want to attach the calendar, for instance:
```lua
lain.widget.calendar({
`attach_to = { mywidget1, mywidget2, ... }`,
-- [...]
})
```
The notification will show an icon of the current day number, and output from ``cal`` with current day highlighted.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
### Default `notification_preset`
```lua
notification_preset = {
font = "Monospace 10",
fg = "#FFFFFF",
bg = "#000000"
}
```
## Output table
Variable | Meaning | Type
--- | --- | ---
`attach` | Attach the calendar to an input widget | function
`show` | Show calendar | function
`hide` | Hide calendar | function
`attach` takes as argument the widget you want to attach the calendar to: `calendar.attach(widget)`.
## Keybindings
You can call the notification with a key binding like this:
```lua
awful.key({ altkey }, "c", function ()
calendar:show(7)
end),
```
where ``altkey = "Mod1"`` and ``show`` argument is an optional integer, meaning timeout seconds.
You can also call it defining a notification screen with a third argument like this:
```lua
awful.key({ altkey }, "c", function ()
calendar:show(7, 0, my_scr_number)
end),
```
## Notes
* Naughty notifications require `notification_preset.font` to be **monospaced**, in order to correctly display the output.
* In case current day is not being highlighted in notifications, try setting `cal` specifying your environment. For instance: `cal = "/usr/bin/env TERM=linux /usr/bin/cal --your-coloring-flag-here"`.
* If you want to [disable notification icon](https://github.com/copycat-killer/lain/pull/351), set `icons = ""` in the input table.
* In order to have [khal](https://github.com/pimutils/khal) agenda output combined with the widget you can use this script as `cal`:
```shell
#!/bin/bash
days=3 # days to show
cal_flag="--color=always" # colorizing flag
if [ $# -eq 0 ]; then
awk '{max = 21}
FNR==NR{s1[FNR]=$0; next}{s2[FNR]=$0}
END { format = "%-" max "s\t%-" max "s\n";
numlines=(NR-FNR)>FNR?NR-FNR:FNR;
for (i=1; i<=numlines; i++) { printf format, s1[i]?s1[i]:"", s2[i]?s2[i]:"" }
}' <(/usr/bin/cal $cal_flag) <(/usr/bin/khal list today $(date -d "+$days days" "+%d.%m.%Y"))
else
/usr/bin/cal $@
fi
```

4
.config/awesome/lain/wiki/cpu.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,7 +14,7 @@ local mycpu = lain.widget.cpu()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`timeout` | Refresh timeout seconds | number | 2
`settings` | User settings | function | empty function
`settings` can use these strings:

58
.config/awesome/lain/wiki/fs.md Executable file → Normal file
View File

@@ -1,12 +1,12 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Shows file systems informations.
Shows disk space usage for a set partition.
If a partition is given in input, a notification will be displayed when it is almost full.
Displays a notification when the partition is full or has low space.
```lua
local mypartition = lain.widget.fs()
@@ -16,38 +16,52 @@ local mypartition = lain.widget.fs()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 600
`partition` | (Optional) Partition to watch: a notification will be displayed when full | string | `nil`
`threshold` | Percentage threshold at which the notification is triggered | integer | 99
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/fs#default-notification_preset)
`timeout` | Refresh timeout seconds -| number | 600
`partition` | Partition to monitor | string | "/"
`options` | Additional options to pass to [`dfs`](https://github.com/copycat-killer/lain/blob/master/scripts/dfs) | string, in the form `--type='fstype' | --exclude-type='fstype'` | nil
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/copycat-killer/lain/wiki/fs#default-notification_preset)
`followtag` | Display the notification on currently focused screen | boolean | false
`notify` | Display notifications | string | "on"
`showpopup` | Display popups with mouse hovering | string, possible values: "on", "off" | "on"
`settings` | User settings | function | empty function
`settings` can use the table `fs_now`, which contains a string entry for each file system path available. For instance, root infos are located in the variable `fs_now["/"]`. Every entry in this table have the following variables:
`settings` can use the following `partition` related strings:
Variable | Meaning | Type
--- | --- | ---
`units` | (multiple of) units used | string ("Kb", "Mb", "Gb", and so on)
`percentage` | the used percentage | integer
`size` | size in `units` of the given fs | float
`used` | amount of space used in the given fs, expressed in `units` | float
`free` | amount of free space in the given fs, expressed in `units` | float
* `fs_now.size_mb`
* `fs_now.size_gb`
* `fs_now.used`
* `fs_now.used_mb`
* `fs_now.used_gb`
* `fs_now.available`
* `fs_now.available_mb`
* `fs_now.available_gb`
Usage example:
Within `settings`, you can obtain other partition values from internal `fs_info` table. For each partition, the following indexes are available:
* `fs_info[other_partition .. " size_mb"]`
* `fs_info[other_partition .. " size_gb"]`
* `fs_info[other_partition .. " used_p"]`
* `fs_info[other_partition .. " used_mb"]`
* `fs_info[other_partition .. " used_gb"]`
* `fs_info[other_partition .. " avail_p"]`
* `fs_info[other_partition .. " avail_mb"]`
* `fs_info[other_partition .. " avail_gb"]`
just like the variables of `fs_now`. Example:
```lua
-- shows used (percentage) and remaining space in home partition
-- shows root and home partitions percentage used
local fsroothome = lain.widget.fs({
settings = function()
widget:set_text("/home: " .. fs_now["/home"].percentage .. "% (" ..
fs_now["/home"].free .. " " .. fs_now["/home"].units .. " left)")
local home_used = tonumber(fs_info["/home used_p"]) or 0
widget:set_text("/ " .. fs_now.used .. "% | /home " .. home_used .. "% ")
end
})
-- output example: "/home: 37% (239.4 Gb left)"
```
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
Also, `settings` can modify `notification_preset` table. This table will be the preset for the naughty notifications. Check [here](https://awesomewm.org/doc/api/libraries/naughty.html#notify) for the list of variables it can contain.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
### Default `notification_preset`
@@ -79,4 +93,4 @@ where ``altkey = "Mod1"`` and ``show`` arguments, both optionals, are:
## Note
Naughty notifications require `notification_preset.font` to be **monospaced**, in order to correctly display the output.
Naughty notifications require `notification_preset.font` to be **monospaced**, in order to correctly display the output.

83
.config/awesome/lain/wiki/imap.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -32,75 +32,55 @@ while the optional are:
Variable | Meaning | Type | Default
--- | --- | --- | ---
`port` | IMAP port | integer | 993
`timeout` | Refresh timeout (in seconds) | integer | 60
`pwdtimeout` | Timeout for password retrieval function (see [here](https://github.com/lcpz/lain/wiki/imap#password-security)) | integer | 10
`port` | IMAP port | number | 993
`timeout` | Refresh timeout seconds | number | 60
`is_plain` | Define whether `password` is a plain password (true) or a command that retrieves it (false) | boolean | false
`followtag` | Notification behaviour | boolean | false
`notify` | Show notification popups | string | "on"
`settings` | User settings | function | empty function
`settings` can use `imap_now` table, which contains the following non negative integers:
The reason why `is_plain` is false by default is to discourage the habit of storing passwords in plain.
- `["MESSAGES"]`
- `["RECENT"]`
- `["UNSEEN"]`
So, you can set your password in plain like this:
example of fetch: `total = imap_now["MESSAGES"]`. For backwards compatibility, `settings` can also use `mailcount`, a pointer to `imap_now["UNSEEN"]`.
```lua
myimapcheck = lain.widget.imap({
is_plain = true,
password = "mymailpassword",
-- [...]
})
```
Also, `settings` can modify `mail_notification_preset` table, which will be the preset for the naughty notifications. Check [here](https://awesomewm.org/apidoc/libraries/naughty.html#notify) for the list of variables it can contain. Default definition:
and you'll have the same security provided by `~/.netrc`.
**Or you can use a password manager**, like [spm](https://notabug.org/kl3/spm) or [pass](https://www.passwordstore.org):
```lua
myimapcheck = lain.widget.imap({
password = function()
-- return the output of "spm show mymail"
end,
-- [...]
})
```
When `is_plain == false` (default), `password` can be either a string, a table or a function: the widget will execute it asynchronously in the first two cases.
`settings` can use the value `mailcount`, an integer greater or equal to zero, and can modify `mail_notification_preset` table, which will be the preset for the naughty notifications. Check [here](https://awesomewm.org/apidoc/libraries/naughty.html#notify) for the list of variables it can contain. Default definition:
```lua
mail_notification _preset = {
icon = "lain/icons/mail.png",
icon = lain/icons/mail.png,
position = "top_left"
}
```
Note that `mailcount` and `imap_now` elements are equals to 0 either if there are no new mails or credentials are invalid, so make sure that your settings are correct.
Note that `mailcount` is 0 either if there are no new mails or credentials are invalid, so make sure you get the right settings.
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
You can have multiple instances of this widget at the same time.
## Password security
The reason why `is_plain` is false by default is to discourage the habit of storing passwords in plain.
In general, when `is_plain == false`, `password` can be either a string, a table or a function: the widget will execute it asynchronously in the first two cases.
### Using plain passwords
You can set your password in plain like this:
```lua
myimapcheck = lain.widget.imap {
is_plain = true,
password = "mymailpassword",
-- [...]
}
```
and you will have the same security provided by `~/.netrc`.
### Using a password manager
I recommend to use [spm](https://notabug.org/kl3/spm) or [pass](https://www.passwordstore.org). In this case, `password` has to be a function. Example stub:
```lua
myimapcheck = lain.widget.imap {
password = function()
-- do your retrieval
return retrieved_password, try_again
end,
-- [...]
}
```
Where `retrieved_password` is the password retrieved from the manager, and `try_again` supports [DBus Secret Service](https://specifications.freedesktop.org/secret-service).
The process flow is that the first `password()` call spawns the unlock prompt, then the second call retrieves the password. [Here](https://gist.github.com/lcpz/1854fc4320f4701957cd5309c8eed4a6) is an example of `password` function.
## Output table
Variable | Meaning | Type
@@ -108,7 +88,6 @@ Variable | Meaning | Type
`widget` | The widget | `wibox.widget.textbox`
`update` | Update `widget` | function
`timer` | The widget timer | [`gears.timer`](https://awesomewm.org/doc/api/classes/gears.timer.html)
`pwdtimer` | Password retrieval timer (available only if `password` is a function)| [`gears.timer`](https://awesomewm.org/doc/api/classes/gears.timer.html)
The `update` function can be used to refresh the widget before `timeout` expires.

View File

@@ -0,0 +1,75 @@
## Usage
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Shows and controls keyboard layouts and variants using `setxkbmap`. This is a simpler but asynchronous alternative to [awful.widget.kbdlayout](https://awesomewm.org/apidoc/classes/awful.widget.keyboardlayout.html).
```lua
local mykbdlayout = lain.widget.contrib.kbdlayout()
```
Left/right click switches to next/previous keyboard layout.
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`layouts` | Keyboard layouts and variants to switch between | table | **nil**
`add_us_secondary` | Whether to add `us` as a secondary layout | boolean | true
`timeout` | Refresh timeout (in seconds) | number | 10
`settings` | User settings | function | empty function
- `layouts`
A table (array) which contains tables with keys indicating layout and (optionally) variant. This argument is **mandatory**.
- `add_us_secondary`
A boolean controlling whether to add `us` as a secondary layout. This is needed in order for keyboard shortcuts to work in certain applications, i.e. Firefox, while using a non-US keyboard layout.
- `timeout`
An integer which determines the interval at which the widget will be updated, in case the keyboard layout was changed by other means.
- `settings`
A "callback" function in which the user is expected to set the text widget up. The widget itself is available as the global variable `widget`, while layout information is available as `kbdlayout_now`. `kbdlayout_now` contains two keys, `layout` containing the primary layout, and `variant`, containing the variant. If there is no variant, `variant` is `nil`.
## Output table
Variable | Meaning | Type
--- | --- | ---
`widget` | The widget (textbox) | `wibox.widget.textbox`
`update` | Function to update the widget and call `settings` | function
`set` | Function taking an index as an argument to manually set the layout given by that index | function
`next` | Change to the next layout | function
`prev` | Change to the prev layout | function
The textbox can be added to the layout via standard means.
By default, left-clicking the textbox calls `next`, and right-clicking calls `prev`. You can set up additional key- or mouse-bindings. See the example below.
## Example
```lua
-- Switch between US Dvorak and DE layouts.
mykbdlayout = lain.widget.contrib.kbdlayout({
layouts = { { layout = "us", variant = "dvorak" },
{ layout = "de" } },
settings = function()
if kbdlayout_now.variant then
widget:set_text(string.format("%s/%s", kbdlayout_now.layout,
kbdlayout_now.variant))
else
widget:set_text(kbdlayout_now.layout)
end
end
})
-- [...]
-- Add key binding (traditional Alt+Shift switching)
awful.key({ "Mod1" }, "Shift_L", function () mykbdlayout.next() end),
```

6
.config/awesome/lain/wiki/mem.md Executable file → Normal file
View File

@@ -1,10 +1,10 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Shows memory status in MiB, [like `top` and `free -h`](https://github.com/lcpz/lain/issues/271).
Shows memory status (in MiB).
```lua
local mymem = lain.widget.mem()
@@ -14,7 +14,7 @@ local mymem = lain.widget.mem()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`timeout` | Refresh timeout seconds | number | 2
`settings` | User settings | function | empty function
in `settings` you can use the following variables:

18
.config/awesome/lain/wiki/moc.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -24,9 +24,9 @@ Now playing songs are notified like this:
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 1
`timeout` | Refresh timeout seconds | number | 1
`music_dir` | Music directory | string | "~/Music"
`cover_size` | Album art notification size (both height and width) | integer | 100
`cover_size` | Album art notification size | number | 100
`cover_pattern` | Pattern for the album art file | string | `*\\.(jpg|jpeg|png|gif)`*
`default_art` | Default art | string | ""
`followtag` | Display the notification on currently focused screen | boolean | false
@@ -59,7 +59,7 @@ moc_notification_preset = {
}
```
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
## Output table
@@ -81,22 +81,22 @@ You can control the widget with key bindings like these:
-- MOC control
awful.key({ altkey, "Control" }, "Up",
function ()
os.execute("mocp -G") -- toggle
awful.spawn.with_shell("mocp -G")
moc.update()
end),
awful.key({ altkey, "Control" }, "Down",
function ()
os.execute("mocp -s") -- stop
awful.spawn.with_shell("mocp -s")
moc.update()
end),
awful.key({ altkey, "Control" }, "Left",
function ()
os.execute("mocp -r") -- previous
awful.spawn.with_shell("mocp -r")
moc.update()
end),
awful.key({ altkey, "Control" }, "Right",
function ()
os.execute("mocp -f") -- next
awful.spawn.with_shell("mocp -f")
moc.update()
end),
```
@@ -119,4 +119,4 @@ awful.key({ altkey }, "0",
end
naughty.notify(common)
end),
```
```

32
.config/awesome/lain/wiki/mpd.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -26,13 +26,13 @@ Now playing songs are notified like this:
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`timeout` | Refresh timeout seconds | number | 2
`password` | MPD password | string | ""
`host` | MPD server | string | "127.0.0.1"
`port` | MPD port | string | "6600"
`music_dir` | Music directory | string | "~/Music"
`cover_size` | Album art notification size (both height and width) | integer | 100
`cover_pattern` | Pattern for the album art file | string | `*.(jpg\|jpeg\|png\|gif)$`
`cover_size` | Album art notification size | number | 100
`cover_pattern` | Pattern for the album art file | string | `*\\.(jpg|jpeg|png|gif)`*
`default_art` | Default art | string | `nil`
`notify` | Show notification popups | string | "on"
`followtag` | Notification behaviour | boolean | false
@@ -46,7 +46,7 @@ Pay attention to case sensitivity when defining `music_dir`.
`settings` can use `mpd_now` table, which contains the following values:
(**note:** the first four are boolean [flags](https://github.com/lcpz/lain/pull/205), the remaining are all strings)
(**note:** the first four are boolean [flags](https://github.com/copycat-killer/lain/pull/205), the remaining are all strings)
- random_mode
- single_mode
@@ -63,8 +63,8 @@ Pay attention to case sensitivity when defining `music_dir`.
- track
- genre
- date
- [time](https://github.com/lcpz/lain/pull/90) (length of current song, in seconds)
- [elapsed](https://github.com/lcpz/lain/pull/90) (elapsed time of current song, in seconds)
- [time](https://github.com/copycat-killer/lain/pull/90) (length of current song, in seconds)
- [elapsed](https://github.com/copycat-killer/lain/pull/90) (elapsed time of current song, in seconds)
and can modify `mpd_notification_preset` table, which will be the preset for the naughty notifications. Check [here](https://awesomewm.org/doc/api/libraries/naughty.html#notify) for the list of variables it can contain. Default definition:
@@ -77,7 +77,7 @@ mpd_notification_preset = {
}
```
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
## Output table
@@ -145,28 +145,20 @@ awful.key({ altkey }, "0",
## Notes
### Cover not showing in notifications
If the cover file is existent but not showed in notifications, [try](https://github.com/lcpz/lain/issues/393) setting `music_dir` to a symlink of your music folder, rather than to a physical path. This can be easily done through
```shell
ln -s /the/real_path_to_your_music/ /home/username/Music
```
However, this only applies if the music is stored outside your user-specific folder, for instance in an external partition.
### Always use `set_markup`
In `settings`, if you use `widget:set_text`, [it will ignore Pango markup](https://github.com/lcpz/lain/issues/258), so be sure to always use `widget:set_markup`.
In `settings`, if you use `widget:set_text`, [it will ignore Pango markup](https://github.com/copycat-killer/lain/issues/258), so be sure to always use `widget:set_markup`.
### Volume fade in toggling MPD
If you want a fade in/out in toggling MPD, you can put [this script](https://gist.github.com/lcpz/76e315bc27c6cdf7edd5021964b88df1) in your local `bin` directory:
If you want a fade in/out in toggling MPD, you can put [this script](https://gist.github.com/copycat-killer/76e315bc27c6cdf7edd5021964b88df1) in your local `bin` directory:
```shell
$ curl https://gist.githubusercontent.com/lcpz/76e315bc27c6cdf7edd5021964b88df1/raw/97f7ba586418a4e07637cfbc91d2974278dfa623/mpd-fade -o ~/bin/mpc-fade
$ curl https://gist.githubusercontent.com/copycat-killer/76e315bc27c6cdf7edd5021964b88df1/raw/97f7ba586418a4e07637cfbc91d2974278dfa623/mpd-fade -o ~/bin/mpc-fade
$ chmod +x ~/bin/mpc-fade
```
Set your 1% decrease/increase commands [here](https://gist.github.com/lcpz/76e315bc27c6cdf7edd5021964b88df1#file-mpd-fade-L8-L9), then use a keybinding like this:
Set your 1% decrease/increase commands [here](https://gist.github.com/copycat-killer/76e315bc27c6cdf7edd5021964b88df1#file-mpd-fade-L8-L9), then use a keybinding like this:
```lua
-- MPD toggle with volume fading

68
.config/awesome/lain/wiki/net.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,16 +14,14 @@ local mynet = lain.widget.net()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`iface` | Network device(s) | string (single interface) or table of strings (multiple interfaces) | autodetected
`units` | Units | integer | 1024 (kilobytes)
`timeout` | Refresh timeout seconds | number | 2
`iface` | Network device(s) | string (single interface) or array of strings (multiple interfaces) | autodetected
`units` | Units | number | 1024 (kilobytes)
`notify` | Display "no carrier" notifications | string | "on"
`wifi_state` | Get wifi connection status | string | "off"
`eth_state` | Get ethernet connection status | string | "off"
`screen` | Notifications screen | integer | 1
`screen` | Notifications screen | number | 1
`settings` | User settings | function | empty function
`iface` can be a string or an table of the form `{ "eth0", "eth1", ... }` containing a list of the devices to collect data on.
`iface` can be a string or an array of the form `{ "eth0", "eth1", ... }` containing a list of the devices to collect data on.
If more than one device is included, `net_now.sent` and `net_now.received` will contain cumulative values over all given devices.
Use `net_now.devices["eth0"]` to access `sent`, `received`, `state` or `carrier` per device.
@@ -39,13 +37,7 @@ If `notify = "off"` is set, the widget won't display a notification when there's
- `net_now.sent` and `net_now.received` (numbers) will be the sum across all specified interfaces;
- `net_now.devices["interface"]` contains the same attributes as the old api for each interface. More on this in the "Multiple devices" section below.
If `wifi_state = "on"` is set, `settings` can use the following extra strings attached to `net_now.devices["wireless interface"]`:
- `wifi` (true, false) indicates if the interface is connected to a network;
- `signal` (number) is the connection signal strength in dBm;
If `eth_state = "on"` is set, `settings` can use the following extra string: `net_now.devices["ethernet interface"].ethernet`, which is a boolean indicating if an ethernet connection's active.
For compatibility reasons, if multiple devices are given, `net_now.carrier` and `net_now.state` correspond to the last interface in the iface table and should not be relied upon (deprecated).
For compatibility reasons, if multiple devices are given, `net_now.carrier` and `net_now.state` correspond to the last interface in the iface array and should not be relied upon (deprecated).
## Output table
@@ -58,58 +50,20 @@ Variable | Meaning | Type
### Setting `iface` manually
If the widget [spawns a "no carrier" notification and you are sure to have an active network device](https://github.com/lcpz/lain/issues/102), then autodetection is probably not working. This may due to [your user privileges](https://github.com/lcpz/lain/issues/102#issuecomment-246470526). In this case you can set `iface` manually. You can see which device is **UP,LOWER_UP** with the following command:
If the widget [spawns a "no carrier" notification and you are sure to have an active network device](https://github.com/copycat-killer/lain/issues/102), then autodetection is probably not working. This may due to [your user privileges](https://github.com/copycat-killer/lain/issues/102#issuecomment-246470526). In this case you can set `iface` manually. You can see which device is **UP,LOWER_UP** with the following command:
```shell
ip link show
```
## Usage examples
### Two widgets for upload/download rates from the same `iface`
```lua
local mynetdown = wibox.widget.textbox()
local mynetup = lain.widget.net {
local mynetup = lain.widgets.net {
settings = function()
widget:set_markup(net_now.sent)
netdowninfo:set_markup(net_now.received)
end
}
```
### Wifi connection + signal strength indicator and ethernet connection indicator
```lua
local wifi_icon = wibox.widget.imagebox()
local eth_icon = wibox.widget.imagebox()
local net = lain.widget.net {
notify = "off",
wifi_state = "on",
eth_state = "on",
settings = function()
local eth0 = net_now.devices.eth0
if eth0 then
if eth0.ethernet then
eth_icon:set_image(ethernet_icon_filename)
else
eth_icon:set_image()
end
end
local wlan0 = net_now.devices.wlan0
if wlan0 then
if wlan0.wifi then
local signal = wlan0.signal
if signal < -83 then
wifi_icon:set_image(wifi_weak_filename)
elseif signal < -70 then
wifi_icon:set_image(wifi_mid_filename)
elseif signal < -53 then
wifi_icon:set_image(wifi_good_filename)
elseif signal >= -53 then
wifi_icon:set_image(wifi_great_filename)
end
else
wifi_icon:set_image()
end
end
end
}
```
```

26
.config/awesome/lain/wiki/pulse.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,9 +14,9 @@ local volume = lain.widget.pulse()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 5
`timeout` | Refresh timeout seconds | number | 5
`devicetype` | PulseAudio device type | string ("sink", "source") | "sink"
`cmd` | PulseAudio command | string or function | see [here](https://github.com/lcpz/lain/blob/master/widget/pulse.lua#L26)
`cmd` | PulseAudio command | string or function | see [here](https://github.com/copycat-killer/lain/blob/master/widget/pulse.lua#L26)
`settings` | User settings | function | empty function
`cmd` is a terminal command to catch infos from current default device. You can redefine it, being sure that the ouput is something like this:
@@ -28,7 +28,7 @@ Variable | Meaning | Type | Default
device.string = "front:1"
```
If your devices change dynamically, you can define it as a function which returns a command string.
If your devices change dinamically, you can define it as a function which returns a command string.
If sed doesn't work, you can try with a grep variant:
@@ -68,19 +68,19 @@ volume.widget:buttons(awful.util.table.join(
awful.spawn("pavucontrol")
end),
awful.button({}, 2, function() -- middle click
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.button({}, 3, function() -- right click
os.execute(string.format("pactl set-sink-mute %d toggle", volume.device))
awful.spawn(string.format("pactl set-sink-mute %d toggle", volume.sink))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
os.execute(string.format("pactl set-sink-volume %d +1%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d +1%%", volume.sink))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
os.execute(string.format("pactl set-sink-volume %d -1%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d -1%%", volume.sink))
volume.update()
end)
))
@@ -92,27 +92,27 @@ volume.widget:buttons(awful.util.table.join(
-- PulseAudio volume control
awful.key({ altkey }, "Up",
function ()
os.execute(string.format("pactl set-sink-volume %d +1%%", volume.device))
os.execute(string.format("pactl set-sink-volume %d +1%%", volume.sink))
volume.update()
end),
awful.key({ altkey }, "Down",
function ()
os.execute(string.format("pactl set-sink-volume %d -1%%", volume.device))
os.execute(string.format("pactl set-sink-volume %d -1%%", volume.sink))
volume.update()
end),
awful.key({ altkey }, "m",
function ()
os.execute(string.format("pactl set-sink-mute %d toggle", volume.device))
os.execute(string.format("pactl set-sink-mute %d toggle", volume.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "m",
function ()
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.device))
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "0",
function ()
os.execute(string.format("pactl set-sink-volume %d 0%%", volume.device))
os.execute(string.format("pactl set-sink-volume %d 0%%", volume.sink))
volume.update()
end),
```

View File

@@ -1,150 +0,0 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
### Description
Shows and controls PulseAudio volume.
```lua
local volume = lain.widget.pulseaudio()
```
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout seconds | number | 5
`devicetype | PulseAudio device type | string ("sink", "source") | "sink"
`cmd` | PulseAudio command | string | [link](https://github.com/lcpz/lain/blob/master/widget/pulseaudio.lua#L28)
`scallback` | PulseAudio sink callback | function | `nil`
`settings` | User settings | function | empty function
`cmd` catch infos from current default sink. You can redefine it, being sure that the ouput is something like this:
```shell
* index: 0
volume: front-left: 18340 / 28% / -33.18 dB, front-right: 18340 / 28% / -33.18 dB
muted: no
device.string = "front:1"
```
**Note:** you can set PulseAudio default sink like this: `pacmd set-default-sink #sink`.
If [`sed`](https://github.com/lcpz/lain/blob/master/widget/pulseaudio.lua#L28) doesn't work, you can try with `grep`:
```shell
pacmd list-sinks | grep -e $(pactl info | grep -e 'ink' | cut -d' ' -f3) -e 'volume: front' -e 'muted'
```
`scallback` is a callback function to update `cmd`, in case you switch between audio channels and therefore PulseAudio sink changes. If default `cmd` works for you, you can tell `scallback` to work in the same way:
```lua
scallback = function()
devicetype = "sink"
return "pacmd list-" .. devicetype .. "s | sed -n -e '0,/*/d' -e '/base volume/d' -e '/volume:/p' -e '/muted:/p' -e '/device\\.string/p'"
end
```
### `settings` variables
`settings` can use the following variables:
Variable | Meaning | Type | Values
--- | --- | --- | ---
`volume_now.index` | Sink index | string | >= "0"
`volume_now.sink` | Sink name | string | sink name or "N/A"
`volume_now.muted` | Sink mute status | string | "yes", "no", "N/A"
`volume_now.channel` | Sink channels | table of string integers | `volume_now.channel[i]`, where `i >= 1`
`volume_now.left` | Front left level | string | "0"-"100"
`volume_now.right` | Front right level | string | "0"-"100"
`volume_now.channel` is a table of your pulseaudio sink channels. Fetch a channel level like this: `volume_now.channel[i]`, where `i >= 1`.
`volume_now.{left,right}` are pointers for `volume_now.{channel[1], channel[2]}` (stereo).
## Output table
Variable | Meaning | Type
--- | --- | ---
`widget` | The widget | `wibox.widget.textbox`
`update` | Update `widget` | function
## Buttons
If you want buttons, just add the following after your widget in `rc.lua`.
```lua
volume.widget:buttons(awful.util.table.join(
awful.button({}, 1, function() -- left click
awful.spawn("pavucontrol")
end),
awful.button({}, 2, function() -- middle click
awful.spawn(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.button({}, 3, function() -- right click
awful.spawn(string.format("pactl set-sink-mute %d toggle", volume.sink))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
awful.spawn(string.format("pactl set-sink-volume %d +1%%", volume.sink))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
awful.spawn(string.format("pactl set-sink-volume %d -1%%", volume.sink))
volume.update()
end)
))
```
## Keybindings
You can control the widget with key bindings like these:
```lua
-- PulseAudio volume control
awful.key({ altkey }, "Up",
function ()
os.execute(string.format("pactl set-sink-volume %d +1%%", volumewidget.sink))
volume.update()
end),
awful.key({ altkey }, "Down",
function ()
os.execute(string.format("pactl set-sink-volume %d -1%%", volumewidget.sink))
volume.update()
end),
awful.key({ altkey }, "m",
function ()
os.execute(string.format("pactl set-sink-mute %d toggle", volumewidget.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "m",
function ()
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.key({ altkey, "Control" }, "0",
function ()
os.execute(string.format("pactl set-sink-volume %d 0%%", volume.sink))
volume.update()
end),
```
where `altkey = "Mod1"`.
## Example
```lua
-- PulseAudio volume (based on multicolor theme)
local volume = lain.widget.pulseaudio({
settings = function()
vlevel = volume_now.left .. "-" .. volume_now.right .. "% | " .. volume_now.sink
if volume_now.muted == "yes" then
vlevel = vlevel .. " M"
end
widget:set_markup(lain.util.markup("#7493d2", vlevel))
end
})
```

29
.config/awesome/lain/wiki/pulsebar.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,26 +14,21 @@ local volume = lain.widget.pulsebar()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 5
`timeout` | Refresh timeout seconds | number | 5
`settings` | User settings | function | empty function
`width` | Bar width | number | 63
`height` | Bar height | number | 1
`margins` | Bar margins | number | 1
`paddings` | Bar paddings | number | 1
`ticks` | Set bar ticks on | boolean | false
`ticks_size` | Ticks size | number | 7
`scallback` | [PulseAudio sink callback](https://github.com/lcpz/lain/wiki/pulseaudio/) | function | `nil`
`sink` | Mixer sink | number | 0
`colors` | Bar colors | table | see [Default colors](https://github.com/lcpz/lain/wiki/pulsebar#default-colors)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/pulsebar#default-notification_preset)
`colors` | Bar colors | table | see [Default colors](https://github.com/copycat-killer/lain/wiki/pulsebar#default-colors)
`followtag` | Display the notification on currently focused screen | boolean | false
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/pulsebar#default-notification_preset)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/copycat-killer/lain/wiki/pulsebar#default-notification_preset)
`devicetype` | PulseAudio device type | string ("sink", "source") | "sink"
`cmd` | PulseAudio command | string or function | see [here](https://github.com/lcpz/lain/blob/master/widget/pulsebar.lua#L48)
`cmd` | PulseAudio command | string or function | see [here](https://github.com/copycat-killer/lain/blob/master/widget/pulsebar.lua#L48)
Read [pulse](https://github.com/lcpz/lain/wiki/pulse) page for `cmd` settings.
Read [pulse](https://github.com/copycat-killer/lain/wiki/pulse) page for `cmd` settings.
`settings` can use [these variables](https://github.com/lcpz/lain/wiki/pulse#settings-variables).
`settings` can use [these variables](https://github.com/copycat-killer/lain/wiki/pulse#settings-variables).
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
@@ -71,19 +66,19 @@ volume.bar:buttons(awful.util.table.join(
awful.spawn("pavucontrol")
end),
awful.button({}, 2, function() -- middle click
os.execute(string.format("pactl set-sink-volume %d 100%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d 100%%", volume.sink))
volume.update()
end),
awful.button({}, 3, function() -- right click
os.execute(string.format("pactl set-sink-mute %d toggle", volume.device))
awful.spawn(string.format("pactl set-sink-mute %d toggle", volume.sink))
volume.update()
end),
awful.button({}, 4, function() -- scroll up
os.execute(string.format("pactl set-sink-volume %d +1%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d +1%%", volume.sink))
volume.update()
end),
awful.button({}, 5, function() -- scroll down
os.execute(string.format("pactl set-sink-volume %d -1%%", volume.device))
awful.spawn(string.format("pactl set-sink-volume %d -1%%", volume.sink))
volume.update()
end)
))
@@ -91,4 +86,4 @@ volume.bar:buttons(awful.util.table.join(
## Keybindings
Same as [here](https://github.com/lcpz/lain/wiki/pulse#keybindings). If you want notifications, use `volume.notify()` instead of `volume.update()`.
Same as [here](https://github.com/copycat-killer/lain/wiki/pulse#keybindings). If you want notifications, use `volume.notify()` instead of `volume.update()`.

4
.config/awesome/lain/wiki/redshift.md Executable file → Normal file
View File

@@ -3,9 +3,9 @@
[**Project homepage**](http://jonls.dk/redshift/)
>**Redshift** is an application that adjusts the computer display's color temperature based upon the Sun's apparent position in relation to the user's location on Earth.
>
>The program is free software, inspired by the proprietary f.lux, and can be used to reduce eye strain as well as insomnia and delayed sleep phase syndrome.
>
>The computer display's color temperature transitions evenly from night to daytime temperature to allow the user's eyes to slowly adapt. At night, the color temperature is low and is typically 30004000 K (default is 3500 K), preferably matching the room's lighting temperature. Typical color temperature during the daytime is 55006500 K (default is 5500 K).
**Source:** [Wikipedia](https://en.wikipedia.org/wiki/Redshift_%28software%29)

4
.config/awesome/lain/wiki/sysload.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,7 +14,7 @@ mysysload = lain.widget.sysload()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`timeout` | Refresh timeout seconds | number | 2
`settings` | User settings | function | empty function
`settings` can use strings `load_1`, `load_5` and `load_15`, which are the load averages over 1, 5, and 15 minutes.

8
.config/awesome/lain/wiki/task.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -17,11 +17,11 @@ Variable | Meaning | Type | Default
`show_cmd` | Taskwarrior command to show in the popup | string | "task next"
`prompt_text` | Prompt text | string | "Enter task command: "
`followtag` | Display the notification on currently focused screen | boolean | false
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/lcpz/lain/wiki/task#default-notification_preset)
`notification_preset` | Notification preset | table | See [default `notification_preset`](https://github.com/copycat-killer/lain/wiki/task#default-notification_preset)
The tasks are shown in a notification popup when the mouse is moved over the attached `widget`, and the popup is hidden when the mouse is moved away. By default, the notification will show the output of `task next`. With `show_cmd`, the `task` popup command can be customized, for example if you want to [filter the tasks](https://taskwarrior.org/docs/filter.html) or show a [custom report](https://github.com/lcpz/lain/pull/213).
The tasks are shown in a notification popup when the mouse is moved over the attached `widget`, and the popup is hidden when the mouse is moved away. By default, the notification will show the output of `task next`. With `show_cmd`, the `task` popup command can be customized, for example if you want to [filter the tasks](https://taskwarrior.org/docs/filter.html) or show a [custom report](https://github.com/copycat-killer/lain/pull/213).
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
You can call the notification with a keybinding like this:

6
.config/awesome/lain/wiki/temp.md Executable file → Normal file
View File

@@ -1,6 +1,6 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
@@ -14,7 +14,7 @@ local mytemp = lain.widget.temp()
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout (in seconds) | integer | 2
`timeout` | Refresh timeout seconds | number | 2
`tempfile` | Path of file which stores core temperature value | string | "/sys/class/thermal/thermal_zone0/temp"
`settings` | User settings | function | empty function
@@ -29,4 +29,4 @@ Variable | Meaning | Type
## Note
Depending on the architecture, note that your temp files location [might vary](https://github.com/lcpz/lain/issues/84#issuecomment-72751763).
Depending on the architecture, note that your temp files location [might vary](https://github.com/copycat-killer/lain/issues/84#issuecomment-72751763).

View File

@@ -1,103 +0,0 @@
# Description
[`tp_smapi`](http://www.thinkwiki.org/wiki/Tp_smapi) interface and widget creator.
```lua
local tp_smapi = lain.widget.contrib.tp_smapi(apipath)
```
The argument `apipath` is an optional string which defines the API path. Its default value is `"/sys/devices/platform/smapi"`.
# Functions
## tp_smapi.get(batid, feature)
Gets the `feature` of battery `batid`. Returns a string. The list of available features is available at [this page](https://www.thinkwiki.org/wiki/Tp_smapi#Battery_status_features).
## tp_smapi.installed(batid)
Checks if battery `batid` is installed. Returns a boolean.
## tp_smapi.status(batid)
Gets the status of battery `batid`. Returns a string ("charging", "discharging", or "full").
## tp_smapi.percentage(batid)
Gets the percentage of battery `batid`. Returns a numeric string.
## tp_smapi.time(batid)
Gets the time of battery `batid`. Depending on the current status, it can be either running or charging time. Returns a string of the format `HH:MM`.
## tp_smapi.hide()
Removes any notification spawned by `tp_smapi.show`.
## tp_smapi.show(batid, seconds, scr)
Notifies the current information of battery `batid` for `seconds` seconds on screen `scr`.
The argument `scr` is optional, and if missing, the notification will be displayed on the currently focused screen.
## tp_smapi.create_widget(args)
Creates a [lain widget](https://github.com/lcpz/lain/wiki/Widgets#usage) of the available ThinkPad batteries.
```lua
local tpbat = tp_smapi.create_widget()
```
### Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`widget` | The widget type to use | [`wibox.widget`](https://awesomewm.org/doc/api/classes/wibox.widget.html) | [`wibox.widget.textbox`](https://awesomewm.org/doc/api/classes/wibox.widget.textbox.html)
`timeout` | Refresh timeout (in seconds) | integer | 30
`pspath` | Power supply directory path | string | "/sys/class/power_supply/"
`battery` | Single battery id | string | autodetected
`batteries` | Multiple batteries id table | table of strings | autodetected
`settings` | User settings | function | empty function
The widget will try to autodetect `battery` and `batteries`. If something
goes wrong, you will have to define them manually. In that case, you only have
to define one between `battery` and `batteries`. If you have one battery, you
can either use `args.battery = "BAT*"` or `args.batteries = {"BAT*"}`, where `BAT*`
is the identifier of your battery in `pspath` (do not use it as a wildcard).
Of course, if you have multiple batteries, you need to use the latter option.
If you define `pspath`, **be sure** to not forget the final slash (/).
`settings` can use the `tpbat_now` table, which contains the following strings:
- `status`, general status ("N/A", "discharging", "charging", "full");
- `n_status[i]`, i-th battery status (like above);
- `n_perc[i]`, i-th battery charge percentage (like above);
- `n_time[i]`, i-th battery running or charging time (HH:MM string or "N/A");
`n_time[i]` is the running time of battery `i` when it is discharging, and the charging time otherwise.
### Output table
Variable | Meaning | Type
--- | --- | ---
`widget` | The widget | [`wibox.widget`](https://awesomewm.org/doc/api/classes/wibox.widget.html) | [textbox](https://awesomewm.org/doc/api/classes/wibox.widget.textbox.html)
`batteries` | Battery identifiers | Table of strings
`update` | Update `widget` | function
`timer` | The widget timer | [`gears.timer`](https://awesomewm.org/doc/api/classes/gears.timer.html)
The `update` function can be used to refresh the widget before `timeout` expires.
### Usage example
```lua
local tp_smapi = lain.widget.contrib.tp_smapi()
local bat = tp_smapi.create_widget {
battery = "BAT0",
settings = function()
widget:set_markup(tpbat_now.n_perc[1] .. "%")
end
}
bat.widget:connect_signal("mouse::enter", function () tp_smapi.show("BAT0") end)
bat.widget:connect_signal("mouse::leave", function () tp_smapi.hide() end)
```

View File

@@ -0,0 +1,30 @@
## Usage
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
A battery widget that works with Lenovo ThinkPad laptops using [tp_smapi](http://www.thinkwiki.org/wiki/Tp_smapi).
Includes hover notification with more details.
```lua
local mytpbat = lain.widget.contrib.tpbat()
```
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`timeout` | Refresh timeout seconds | number | 30
`battery` | Single battery id | string | "BAT0"
`settings` | User settings | function | empty function
## Output table
Variable | Meaning | Type
--- | --- | ---
`widget` | The widget | `wibox.widget.textbox`
`update` | Update `widget` | function
The `update` function can be used to refresh the widget before `timeout` expires.

View File

@@ -1,222 +0,0 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
### Description
Template for asynchronous watcher widgets.
Executes an input command and makes the user feed a `wibox.widget` with the output.
```lua
local mywatch = lain.widget.watch()
```
This has been implemented in Awesome 4.0 as [`awful.widget.watch`](https://awesomewm.org/doc/api/classes/awful.widget.watch.html). But while Awesome `watch` returns only the widget, Lain one returns a table including its timer and internal update function too.
## Input table
Variable | Meaning | Type | Default
--- | --- | --- | ---
`widget` | Widget to feed | `wibox.widget` | `wibox.widget.textbox`
`timeout` | Refresh timeout seconds | number | 5
`cmd` | The command to execute | string **or** table | `nil`
`nostart` | Widget timer doesn't start immediately | boolean | false
`stoppable` | Widget timer is stoppable | boolean | false
`settings` | User settings | function | see [Default `settings` function](https://github.com/lcpz/lain/wiki/watch#default-settings-function)
If your command needs a shell, you need to set `cmd` as an array of 3 strings, where the first contains the shell, the second contains `-c`, and the third contains the actual command. Example:
```lua
cmd = { awful.util.shell, "-c", "myactualcommand" }
```
`settings` can use the string `output`, which is the output of `cmd`.
### Default `settings` function
```lua
settings = function() widget:set_text(output) end
```
## Output table
Variable | Meaning | Type
--- | --- | ---
`widget` | The widget | input widget type or `wibox.widget.textbox`
`update` | Update `widget` | function
`timer` | The widget timer | [`gears.timer`](https://awesomewm.org/doc/api/classes/gears.timer.html) or `nil`
The `update` function can be used to refresh the widget before `timeout` expires.
If `stoppable == true`, the widget will have an ad-hoc timer, which you can control though `timer` variable.
## Use case examples
### bitcoin
```lua
-- Bitcoin to USD current price, using Coinbase V1 API
local bitcoin = lain.widget.watch({
timeout = 43200, -- half day
stoppable = true,
cmd = "curl -m5 -s 'https://coinbase.com/api/v1/prices/buy'",
settings = function()
local btc, pos, err = require("lain.util").dkjson.decode(output, 1, nil)
local btc_price = (not err and btc and btc["subtotal"]["amount"]) or "N/A"
-- customize here
widget:set_text(btc_price)
end
})
```
### btrfs
```lua
-- btrfs root df
local myrootfs = lain.widget.watch({
timeout = 600,
cmd = "btrfs filesystem df -g /",
settings = function()
local total, used = string.match(output, "Data.-total=(%d+%.%d+)GiB.-used=(%d+%.%d+)GiB")
local percent_used = math.ceil((tonumber(used) / tonumber(total)) * 100)
-- customize here
widget:set_text(" [/: " .. percent_used .. "%] ")
end
})
```
### cmus
```lua
-- cmus audio player
local cmus = lain.widget.watch({
timeout = 2,
stoppable = true,
cmd = "cmus-remote -Q",
settings = function()
local cmus_now = {
state = "N/A",
artist = "N/A",
title = "N/A",
album = "N/A"
}
for w in string.gmatch(output, "(.-)tag") do
a, b = w:match("(%w+) (.-)\n")
cmus_now[a] = b
end
-- customize here
widget:set_text(cmus_now.artist .. " - " .. cmus_now.title)
end
})
```
### maildir
```lua
-- checks whether there are files in the "new" directories of a mail dirtree
local mailpath = "~/Mail"
local mymaildir = lain.widget.watch({
timeout = 60,
stoppable = true,
cmd = { awful.util.shell, "-c", string.format("ls -1dr %s/*/new/*", mailpath) },
settings = function()
local inbox_now = { digest = "" }
for dir in output:gmatch(".-/(%w+)/new") do
inbox_now[dir] = 1
for _ in output:gmatch(dir) do
inbox_now[dir] = inbox_now[dir] + 1
end
if #inbox_now.digest > 0 then inbox_now.digest = inbox_now.digest .. ", " end
inbox_now.digest = inbox_now.digest .. string.format("%s (%d)", dir, inbox_now[dir])
end
-- customize here
widget:set_text("mail: " .. inbox_now.digest)
end
})
```
### mpris
```lua
-- infos from mpris clients such as spotify and VLC
-- based on https://github.com/acrisci/playerctl
local mpris = lain.widget.watch({
cmd = "playerctl status && playerctl metadata",
timeout = 2,
stoppable = true,
settings = function()
local escape_f = require("awful.util").escape
local mpris_now = {
state = "N/A",
artist = "N/A",
title = "N/A",
art_url = "N/A",
album = "N/A",
album_artist = "N/A"
}
mpris_now.state = string.match(output, "Playing") or
string.match(output, "Paused") or "N/A"
for k, v in string.gmatch(output, "'[^:]+:([^']+)':[%s]<%[?'([^']+)'%]?>")
do
if k == "artUrl" then mpris_now.art_url = v
elseif k == "artist" then mpris_now.artist = escape_f(v)
elseif k == "title" then mpris_now.title = escape_f(v)
elseif k == "album" then mpris_now.album = escape_f(v)
elseif k == "albumArtist" then mpris_now.album_artist = escape_f(v)
end
end
-- customize here
widget:set_text(mpris_now.artist .. " - " .. mpris_now.title)
end
})
```
### upower
```lua
-- battery infos from freedesktop upower
local mybattery = lain.widget.watch({
timeout = 30,
cmd = { awful.util.shell, "-c", "upower -i /org/freedesktop/UPower/devices/battery_BAT | sed -n '/present/,/icon-name/p'" },
settings = function()
local bat_now = {
present = "N/A",
state = "N/A",
warninglevel = "N/A",
energy = "N/A",
energyfull = "N/A",
energyrate = "N/A",
voltage = "N/A",
percentage = "N/A",
capacity = "N/A",
icon = "N/A"
}
for k, v in string.gmatch(output, '([%a]+[%a|-]+):%s*([%a|%d]+[,|%a|%d]-)') do
if k == "present" then bat_now.present = v
elseif k == "state" then bat_now.state = v
elseif k == "warning-level" then bat_now.warninglevel = v
elseif k == "energy" then bat_now.energy = string.gsub(v, ",", ".") -- Wh
elseif k == "energy-full" then bat_now.energyfull = string.gsub(v, ",", ".") -- Wh
elseif k == "energy-rate" then bat_now.energyrate = string.gsub(v, ",", ".") -- W
elseif k == "voltage" then bat_now.voltage = string.gsub(v, ",", ".") -- V
elseif k == "percentage" then bat_now.percentage = tonumber(v) -- %
elseif k == "capacity" then bat_now.capacity = string.gsub(v, ",", ".") -- %
elseif k == "icon-name" then bat_now.icon = v
end
end
-- customize here
widget:set_text("Bat: " .. bat_now.percentage .. " " .. bat_now.state)
end
})
```

13
.config/awesome/lain/wiki/weather.md Executable file → Normal file
View File

@@ -1,12 +1,12 @@
## Usage
[Read here.](https://github.com/lcpz/lain/wiki/Widgets#usage)
[Read here.](https://github.com/copycat-killer/lain/wiki/Widgets#usage)
### Description
Provides current weather status widgets and X-days forecast popup notifications.
Powered by [OpenWeatherMap](http://openweathermap.org/api) API.
Uses [OpenWeatherMap](http://openweathermap.org/api) API.
By default, it uses [current](http://openweathermap.org/current) for current weather data and [forecast16](http://openweathermap.org/forecast16) for forecasts.
@@ -23,14 +23,13 @@ Variable | Meaning | Type | Default
`current_call` | Command to fetch weather status data from the API | string | see `default_current_call`
`forecast_call` | Command to fetch forecast data from the API | string | see `default_forecast_call`
`city_id` | API city code | number | not set
`utc_offset` | UTC time offset | function | see [here](https://github.com/lcpz/lain/blob/master/widget/weather.lua#L35-L39)
`units` | Temperature units system | string | "metric"
`lang` | API data localization | string | "en"
`cnt` | Forecast days interval | integer | 5
`cnt` | Forecast days interval | number | 5
`date_cmd` | Forecast notification format style | string | "date -u -d @%d +'%%a %%d'"
`icons_path` | Icons path | string | `lain/icons/openweathermap`
`notification_preset` | Preset for notifications | table | empty table
`notification_text_fun` | Function to format forecast notifications | function | see `notification_text_fun` below
`notification_text_fun` | Function to format forecast notifications | function | see `notification_text_fun`
`weather_na_markup` | Markup to be used when weather textbox is not available | text | " N/A "
`followtag` | Display the notification on currently focused screen | boolean | false
`showpopup` | Display popups with mouse hovering | string, possible values: "on", "off" | "on"
@@ -104,11 +103,11 @@ Variable | Meaning | Type | Default
return string.format("<b>%s</b>: %s, %d - %d ", day, desc, tmin, tmax)
end
```
See [here](https://github.com/lcpz/lain/issues/186#issuecomment-203400918) for a complete customization example.
See [here](https://github.com/copycat-killer/lain/issues/186#issuecomment-203400918) for a complete customization example.
- ``followtag``
With multiple screens, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followtag` to `true` it will be shown on the currently focused tag screen.
- ``settings``