Dump nixos config after scrubing
@@ -0,0 +1,159 @@
|
||||
# Volume widget
|
||||
|
||||
Volume widget based on [amixer](https://linux.die.net/man/1/amixer) (is used for controlling the audio volume) and [pacmd](https://linux.die.net/man/1/pacmd) (is used for selecting a sink/source). Also, the widget provides an easy way to customize how it looks, following types are supported out-of-the-box:
|
||||
|
||||

|
||||
|
||||
From left to right: `horizontal_bar`, `vertical_bar`, `icon`, `icon_and_text`, `arc`
|
||||
|
||||
A right-click on the widget opens a popup where you can choose a sink/source:
|
||||

|
||||
|
||||
Left click toggles mute and middle click opens a mixer ([pavucontrol](https://freedesktop.org/software/pulseaudio/pavucontrol/) by default).
|
||||
|
||||
### Features
|
||||
|
||||
- switch between sinks/sources by right click on the widget;
|
||||
- more responsive than previous versions of volume widget, which were refreshed once a second;
|
||||
- 5 predefined customizable looks;
|
||||
|
||||
## Installation
|
||||
|
||||
Clone the repo under **~/.config/awesome/** and add widget in **rc.lua**:
|
||||
|
||||
```lua
|
||||
local volume_widget = require('awesome-wm-widgets.volume-widget.volume')
|
||||
...
|
||||
s.mytasklist, -- Middle widget
|
||||
{ -- Right widgets
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
...
|
||||
-- default
|
||||
volume_widget(),
|
||||
-- customized
|
||||
volume_widget{
|
||||
widget_type = 'arc'
|
||||
},
|
||||
```
|
||||
|
||||
Note that the widget uses following command to get the current volume: `amixer -c 1 -D pulse sget Master`, so please make sure that it works for you, otherwise you need to set some parameters by entering this command in the terminal:
|
||||
|
||||
Command output:
|
||||
- Some data of a mixer: Override all parameters you've changed
|
||||
- Error `Invalid card number`: Change parameter `-c`/ `card`
|
||||
- Error `Mixer attach pulse error: No such file or directory`: Change parameter `-D`/ `device`
|
||||
- Error `Unable to find simple control 'Master',0`: Change parameter `mixctrl`
|
||||
|
||||
Note: `amixer[ -c ...][ -D ...]` returns a list of Mixers for the selected card/ device. omitting `-D` falls back to `default`.
|
||||
|
||||
### Shortcuts
|
||||
|
||||
To improve responsiveness of the widget when volume level is changed by a shortcut use corresponding methods of the widget:
|
||||
|
||||
```lua
|
||||
awful.key({ modkey }, "]", function() volume_widget:inc(5) end),
|
||||
awful.key({ modkey }, "[", function() volume_widget:dec(5) end),
|
||||
awful.key({ modkey }, "\\", function() volume_widget:toggle() end),
|
||||
```
|
||||
|
||||
You also can use Functional keycodes instead of symbols, e.g. `XF86AudioRaiseVolume` instead of `"]"`.
|
||||
|
||||
```lua
|
||||
awful.key({}, "XF86AudioRaiseVolume", function() volume_widget.inc() end),
|
||||
awful.key({}, "XF86AudioLowerVolume", function() volume_widget.dec() end),
|
||||
awful.key({}, "XF86AudioMute", function() volume_widget.toggle() end),
|
||||
```
|
||||
If you don't know the name of the key, you can use `xev` to find it out.
|
||||
Or you can use `amixer` and `playerctl` to control the volume and media players.
|
||||
|
||||
```lua
|
||||
awful.key({}, "XF86AudioLowerVolume", function ()
|
||||
awful.util.spawn("amixer -q -D pulse sset Master 5%-", false) end),
|
||||
awful.key({}, "XF86AudioRaiseVolume", function ()
|
||||
awful.util.spawn("amixer -q -D pulse sset Master 5%+", false) end),
|
||||
awful.key({}, "XF86AudioMute", function ()
|
||||
awful.util.spawn("amixer -D pulse set Master 1+ toggle", false) end),
|
||||
-- Media Keys
|
||||
awful.key({}, "XF86AudioPlay", function()
|
||||
awful.util.spawn("playerctl play-pause", false) end),
|
||||
awful.key({}, "XF86AudioNext", function()
|
||||
awful.util.spawn("playerctl next", false) end),
|
||||
awful.key({}, "XF86AudioPrev", function()
|
||||
awful.util.spawn("playerctl previous", false) end),
|
||||
```
|
||||
|
||||
## Customization
|
||||
|
||||
It is possible to customize the widget by providing a table with all or some of the following config parameters:
|
||||
|
||||
### Generic parameter
|
||||
|
||||
| Name | Default | Description |
|
||||
|---------------|-----------------|---------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `mixer_cmd` | `pavucontrol` | command to run on middle click (e.g. a mixer program) |
|
||||
| `toggle_cmd` | *nil* | Use custom command instead of `amixer ... toggle` because [amixer's unmute option seems to be broken](https://superuser.com/a/822085) |
|
||||
| `step` | 5 | How much the volume is raised or lowered at once (in %) |
|
||||
| `widget_type` | `icon_and_text` | Widget type, one of `horizontal_bar`, `vertical_bar`, `icon`, `icon_and_text`, `arc` |
|
||||
| `card` | 0 | Select the card name to control |
|
||||
| `device` | `pulse` | Select the device name to control |
|
||||
| `mixctrl` | `Master` | Select the mixer name to control |
|
||||
| `value_type` | `-M` | Select how the volume is increased/ decreased (intended for `-M`/ `-R` parameters). See `man amixer` for additional info |
|
||||
|
||||
Note: If unmuting or toggling using the default amixer command does not work, this command may work: `pactl set-sink-mute [card] toggle`
|
||||
|
||||
Depends on the chosen widget type add parameters from the corresponding section below:
|
||||
|
||||
#### `icon` parameters
|
||||
|
||||
| Name | Default | Description |
|
||||
|------------|----------------------|-----------------------------------------------|
|
||||
| `icon_dir` | `[widget_dir]/icons` | Path to the folder with icons (absolute path) |
|
||||
|
||||
_Note:_ if you are changing icons, the folder should contain following .svg images:
|
||||
- audio-volume-high-symbolic
|
||||
- audio-volume-medium-symbolic
|
||||
- audio-volume-low-symbolic
|
||||
- audio-volume-muted-symbolic
|
||||
|
||||
#### `icon_and_text` parameters
|
||||
|
||||
| Name | Default | Description |
|
||||
|------------|----------------------|-----------------------------------------------|
|
||||
| `icon_dir` | `[widget_dir]/icons` | Path to the folder with icons (absolute path) |
|
||||
| `font` | `beautiful.font` | Font name and size, like `Play 12` |
|
||||
|
||||
#### `arc` parameters
|
||||
|
||||
| Name | Default | Description |
|
||||
|---|---|---|
|
||||
| `thickness` | 2 | Thickness of the arc |
|
||||
| `main_color` | `beautiful.fg_color` | Color of the arc |
|
||||
| `bg_color` | `#ffffff11` | Color of the arc's background |
|
||||
| `mute_color` | `beautiful.fg_urgent` | Color of the arc when mute |
|
||||
| `size` | 18 | Size of the widget |
|
||||
|
||||
#### `horizontal_bar` parameters
|
||||
|
||||
| Name | Default | Description |
|
||||
|---|---|---|
|
||||
| `main_color` | `beautiful.fg_normal` | Color of the bar |
|
||||
| `mute_color` | `beautiful.fg_urgent` | Color of the bar when mute |
|
||||
| `bg_color` | `#ffffff11` | Color of the bar's background |
|
||||
| `width` | 50 | The bar width |
|
||||
| `margins` | 10 | Top and bottom margins (if your wibar is 22 px high, bar will be 2 px = 22 - 2*10) |
|
||||
| `shape` | `bar` | [gears.shape](https://awesomewm.org/doc/api/libraries/gears.shape.html), could be `octogon`, `hexagon`, `powerline`, etc |
|
||||
| `with_icon` | true | Show volume icon|
|
||||
|
||||
_Note:_ I didn't figure out how does the `forced_height` property of progressbar widget work (maybe it doesn't work at all), thus there is a workaround with margins.
|
||||
|
||||
#### `vertical_bar` parameters
|
||||
|
||||
| Name | Default | Description |
|
||||
|---|---|---|
|
||||
| `main_color` | `beautiful.fg_normal` | Color of the bar |
|
||||
| `mute_color` | `beautiful.fg_urgent` | Color of the bar when mute |
|
||||
| `bg_color` | `#ffffff11` | Color of the bar's background |
|
||||
| `width` | 10 | The bar width |
|
||||
| `margins` | 20 | Top and bottom margins (if your wibar is 22 px high, bar will be 2 px = 22 - 2*10) |
|
||||
| `shape` | `bar` | [gears.shape](https://awesomewm.org/doc/api/libraries/gears.shape.html), could be `octogon`, `hexagon`, `powerline`, etc |
|
||||
| `with_icon` | true | Show volume icon|
|
||||
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
viewBox="0 0 16 16"
|
||||
height="16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="audio-volume-high-symbolic.svg">
|
||||
<metadata
|
||||
id="metadata30">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
id="namedview28"
|
||||
showgrid="true"
|
||||
inkscape:zoom="38.125"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
showguides="true"
|
||||
inkscape:snap-intersection-paths="false"
|
||||
inkscape:object-paths="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4158" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4" />
|
||||
<path
|
||||
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="ssssccs" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||
id="path4508"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||
id="path4529"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||
id="path4569"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscccc" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
viewBox="0 0 16 16"
|
||||
height="16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="audio-volume-low-symbolic.svg">
|
||||
<metadata
|
||||
id="metadata30">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
id="namedview28"
|
||||
showgrid="true"
|
||||
inkscape:zoom="38.125"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
showguides="true"
|
||||
inkscape:snap-intersection-paths="false"
|
||||
inkscape:object-paths="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4158" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4" />
|
||||
<path
|
||||
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="ssssccs" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||
id="path4508"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||
id="path4529"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||
id="path4569"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscccc" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
viewBox="0 0 16 16"
|
||||
height="16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="audio-volume-medium-symbolic.svg">
|
||||
<metadata
|
||||
id="metadata30">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
id="namedview28"
|
||||
showgrid="true"
|
||||
inkscape:zoom="38.125"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
showguides="true"
|
||||
inkscape:snap-intersection-paths="false"
|
||||
inkscape:object-paths="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4158" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4" />
|
||||
<path
|
||||
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="ssssccs" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||
id="path4508"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||
id="path4529"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||
id="path4569"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscccc" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
viewBox="0 0 16 16"
|
||||
height="16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="audio-volume-muted-symbolic.svg">
|
||||
<metadata
|
||||
id="metadata30">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1215"
|
||||
inkscape:window-height="776"
|
||||
id="namedview28"
|
||||
showgrid="true"
|
||||
inkscape:zoom="38.125"
|
||||
inkscape:cx="3.4229508"
|
||||
inkscape:cy="7.947541"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
showguides="true"
|
||||
inkscape:snap-intersection-paths="false"
|
||||
inkscape:object-paths="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4158" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs4" />
|
||||
<path
|
||||
d="M 6,2 2,6 2,10 6,14 6,9 7,8 6,7 Z"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
d="M 1.300003,5 C 0.216589,5 0,6.163269 0,7.4 L 0,8.6 C 0,9.836747 0.24312,11 1.300003,11 L 3,11 3,5 Z"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#bebebe"
|
||||
sodipodi:nodetypes="ssssccs" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 13.140638,1 11.726417,2.413582 C 12.808349,3.4955144 13.990412,5.4467621 14,8 c 0,2.551493 -1.192916,4.505751 -2.273583,5.586418 L 13.140638,15 C 14.595711,13.544927 16.019176,11 16,8 16.035061,5 14.595117,2.4544787 13.140638,1 Z"
|
||||
id="path4508"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 11,3.1156678 9.5897193,4.5261118 C 10.372347,5.3087395 11,6.5690611 11,8 11,9.4309388 10.372767,10.690952 9.5897193,11.474 L 11,12.884 C 12.275645,11.608355 13,9.854095 13,8 13,6.1543677 12.273068,4.3887355 11,3.1156678 Z"
|
||||
id="path4529"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:0.3;fill:#bebebe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 8.629,5 7.2094668,6.4096296 C 8,7.05621 8,7.805653 8,8 8,8.1932576 7.982199,8.9408674 7.209,9.59 L 8.6289063,11 C 9.8466375,9.952694 10,8.5984701 10,8 10,7.400497 9.854476,6.062891 8.629,5 Z"
|
||||
id="path4569"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscccc" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 72 KiB |
@@ -0,0 +1,105 @@
|
||||
|
||||
|
||||
local utils = {}
|
||||
|
||||
local function split(string_to_split, separator)
|
||||
if separator == nil then separator = "%s" end
|
||||
local t = {}
|
||||
|
||||
for str in string.gmatch(string_to_split, "([^".. separator .."]+)") do
|
||||
table.insert(t, str)
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
function utils.extract_sinks_and_sources(pacmd_output)
|
||||
local sinks = {}
|
||||
local sources = {}
|
||||
local device
|
||||
local properties
|
||||
local ports
|
||||
local in_sink = false
|
||||
local in_source = false
|
||||
local in_device = false
|
||||
local in_properties = false
|
||||
local in_ports = false
|
||||
for line in pacmd_output:gmatch("[^\r\n]+") do
|
||||
if string.match(line, 'source%(s%) available.') then
|
||||
in_sink = false
|
||||
in_source = true
|
||||
end
|
||||
if string.match(line, 'sink%(s%) available.') then
|
||||
in_sink = true
|
||||
in_source = false
|
||||
end
|
||||
|
||||
if string.match(line, 'index:') then
|
||||
in_device = true
|
||||
in_properties = false
|
||||
device = {
|
||||
id = line:match(': (%d+)'),
|
||||
is_default = string.match(line, '*') ~= nil
|
||||
}
|
||||
if in_sink then
|
||||
table.insert(sinks, device)
|
||||
elseif in_source then
|
||||
table.insert(sources, device)
|
||||
end
|
||||
end
|
||||
|
||||
if string.match(line, '^\tproperties:') then
|
||||
in_device = false
|
||||
in_properties = true
|
||||
properties = {}
|
||||
device['properties'] = properties
|
||||
end
|
||||
|
||||
if string.match(line, 'ports:') then
|
||||
in_device = false
|
||||
in_properties = false
|
||||
in_ports = true
|
||||
ports = {}
|
||||
device['ports'] = ports
|
||||
end
|
||||
|
||||
if string.match(line, 'active port:') then
|
||||
in_device = false
|
||||
in_properties = false
|
||||
in_ports = false
|
||||
device['active_port'] = line:match(': (.+)'):gsub('<',''):gsub('>','')
|
||||
end
|
||||
|
||||
if in_device then
|
||||
local t = split(line, ': ')
|
||||
local key = t[1]:gsub('\t+', ''):lower()
|
||||
local value = t[2]:gsub('^<', ''):gsub('>$', '')
|
||||
device[key] = value
|
||||
end
|
||||
|
||||
if in_properties then
|
||||
local t = split(line, '=')
|
||||
local key = t[1]:gsub('\t+', ''):gsub('%.', '_'):gsub('-', '_'):gsub(':', ''):gsub("%s+$", "")
|
||||
local value
|
||||
if t[2] == nil then
|
||||
value = t[2]
|
||||
else
|
||||
value = t[2]:gsub('"', ''):gsub("^%s+", ""):gsub(' Analog Stereo', '')
|
||||
end
|
||||
properties[key] = value
|
||||
end
|
||||
|
||||
if in_ports then
|
||||
local t = split(line, ': ')
|
||||
local key = t[1]
|
||||
if key ~= nil then
|
||||
key = key:gsub('\t+', '')
|
||||
end
|
||||
ports[key] = t[2]
|
||||
end
|
||||
end
|
||||
|
||||
return sinks, sources
|
||||
end
|
||||
|
||||
return utils
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-volume-2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon><path d="M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"></path></svg>
|
||||
|
After Width: | Height: | Size: 354 B |
@@ -0,0 +1,311 @@
|
||||
-------------------------------------------------
|
||||
-- The Ultimate Volume Widget for Awesome Window Manager
|
||||
-- More details could be found here:
|
||||
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/volume-widget
|
||||
|
||||
-- @author Pavel Makhov
|
||||
-- @copyright 2020 Pavel Makhov
|
||||
-------------------------------------------------
|
||||
|
||||
local awful = require("awful")
|
||||
local wibox = require("wibox")
|
||||
local spawn = require("awful.spawn")
|
||||
local gears = require("gears")
|
||||
local beautiful = require("beautiful")
|
||||
local watch = require("awful.widget.watch")
|
||||
local utils = require("awesome-wm-widgets.volume-widget.utils")
|
||||
|
||||
local LIST_DEVICES_CMD = [[sh -c "pacmd list-sinks; pacmd list-sources"]]
|
||||
local function GET_VOLUME_CMD(card, device, mixctrl, value_type)
|
||||
return "amixer -c " .. card .. " -D " .. device .. " sget " .. mixctrl .. " " .. value_type
|
||||
end
|
||||
local function INC_VOLUME_CMD(card, device, mixctrl, value_type, step)
|
||||
return "amixer -c "
|
||||
.. card
|
||||
.. " -D "
|
||||
.. device
|
||||
.. " sset "
|
||||
.. mixctrl
|
||||
.. " "
|
||||
.. value_type
|
||||
.. " "
|
||||
.. step
|
||||
.. "%+"
|
||||
end -- luacheck: ignore
|
||||
local function DEC_VOLUME_CMD(card, device, mixctrl, value_type, step)
|
||||
return "amixer -c "
|
||||
.. card
|
||||
.. " -D "
|
||||
.. device
|
||||
.. " sset "
|
||||
.. mixctrl
|
||||
.. " "
|
||||
.. value_type
|
||||
.. " "
|
||||
.. step
|
||||
.. "%-"
|
||||
end -- luacheck: ignore
|
||||
local function TOG_VOLUME_CMD(card, device, mixctrl)
|
||||
return "amixer -c " .. card .. " -D " .. device .. " sset " .. mixctrl .. " toggle"
|
||||
end -- luacheck: ignore
|
||||
|
||||
local widget_types = {
|
||||
icon_and_text = require("awesome-wm-widgets.volume-widget.widgets.icon-and-text-widget"),
|
||||
icon = require("awesome-wm-widgets.volume-widget.widgets.icon-widget"),
|
||||
arc = require("awesome-wm-widgets.volume-widget.widgets.arc-widget"),
|
||||
horizontal_bar = require("awesome-wm-widgets.volume-widget.widgets.horizontal-bar-widget"),
|
||||
vertical_bar = require("awesome-wm-widgets.volume-widget.widgets.vertical-bar-widget"),
|
||||
}
|
||||
local volume = {}
|
||||
|
||||
local rows = { layout = wibox.layout.fixed.vertical }
|
||||
|
||||
local popup = awful.popup({
|
||||
bg = beautiful.bg_normal,
|
||||
fg = beautiful.fg_normal,
|
||||
ontop = true,
|
||||
visible = false,
|
||||
shape = gears.shape.rounded_rect,
|
||||
border_width = 1,
|
||||
border_color = beautiful.bg_focus,
|
||||
maximum_width = 400,
|
||||
offset = { y = 5 },
|
||||
widget = {},
|
||||
})
|
||||
|
||||
local function build_main_line(device)
|
||||
if device.active_port ~= nil and device.ports[device.active_port] ~= nil then
|
||||
return device.properties.device_description .. " · " .. device.ports[device.active_port]
|
||||
else
|
||||
return device.properties.device_description
|
||||
end
|
||||
end
|
||||
|
||||
local function build_rows(devices, on_checkbox_click, device_type)
|
||||
local device_rows = { layout = wibox.layout.fixed.vertical }
|
||||
for _, device in pairs(devices) do
|
||||
local checkbox = wibox.widget({
|
||||
checked = device.is_default,
|
||||
color = beautiful.fg_normal,
|
||||
paddings = 2,
|
||||
shape = gears.shape.circle,
|
||||
forced_width = 20,
|
||||
forced_height = 20,
|
||||
check_color = beautiful.fg_normal,
|
||||
widget = wibox.widget.checkbox,
|
||||
})
|
||||
|
||||
checkbox:connect_signal("button::press", function()
|
||||
spawn.easy_async(
|
||||
string.format([[sh -c 'pacmd set-default-%s "%s"']], device_type, device.name),
|
||||
function()
|
||||
on_checkbox_click()
|
||||
end
|
||||
)
|
||||
end)
|
||||
|
||||
local row = wibox.widget({
|
||||
{
|
||||
{
|
||||
{
|
||||
checkbox,
|
||||
valign = "center",
|
||||
layout = wibox.container.place,
|
||||
},
|
||||
{
|
||||
{
|
||||
text = build_main_line(device),
|
||||
align = "left",
|
||||
widget = wibox.widget.textbox,
|
||||
},
|
||||
left = 10,
|
||||
layout = wibox.container.margin,
|
||||
},
|
||||
spacing = 8,
|
||||
layout = wibox.layout.align.horizontal,
|
||||
},
|
||||
margins = 4,
|
||||
layout = wibox.container.margin,
|
||||
},
|
||||
bg = beautiful.bg_normal,
|
||||
fg = beautiful.fg_normal,
|
||||
widget = wibox.container.background,
|
||||
})
|
||||
|
||||
row:connect_signal("mouse::enter", function(c)
|
||||
checkbox:set_color(beautiful.fg_focus)
|
||||
checkbox:set_check_color(beautiful.fg_focus)
|
||||
c:set_fg(beautiful.fg_focus)
|
||||
c:set_bg(beautiful.bg_focus)
|
||||
end)
|
||||
row:connect_signal("mouse::leave", function(c)
|
||||
checkbox:set_color(beautiful.fg_normal)
|
||||
checkbox:set_check_color(beautiful.fg_normal)
|
||||
c:set_fg(beautiful.fg_normal)
|
||||
c:set_bg(beautiful.bg_normal)
|
||||
end)
|
||||
|
||||
local old_cursor, old_wibox
|
||||
row:connect_signal("mouse::enter", function()
|
||||
local wb = mouse.current_wibox
|
||||
old_cursor, old_wibox = wb.cursor, wb
|
||||
wb.cursor = "hand1"
|
||||
end)
|
||||
row:connect_signal("mouse::leave", function()
|
||||
if old_wibox then
|
||||
old_wibox.cursor = old_cursor
|
||||
old_wibox = nil
|
||||
end
|
||||
end)
|
||||
|
||||
row:connect_signal("button::press", function()
|
||||
spawn.easy_async(
|
||||
string.format([[sh -c 'pacmd set-default-%s "%s"']], device_type, device.name),
|
||||
function()
|
||||
on_checkbox_click()
|
||||
end
|
||||
)
|
||||
end)
|
||||
|
||||
table.insert(device_rows, row)
|
||||
end
|
||||
|
||||
return device_rows
|
||||
end
|
||||
|
||||
local function build_header_row(text)
|
||||
return wibox.widget({
|
||||
{
|
||||
markup = "<b>" .. text .. "</b>",
|
||||
align = "center",
|
||||
widget = wibox.widget.textbox,
|
||||
},
|
||||
bg = beautiful.bg_normal,
|
||||
fg = beautiful.fg_normal,
|
||||
widget = wibox.container.background,
|
||||
})
|
||||
end
|
||||
|
||||
local function rebuild_popup()
|
||||
spawn.easy_async(LIST_DEVICES_CMD, function(stdout)
|
||||
local sinks, sources = utils.extract_sinks_and_sources(stdout)
|
||||
|
||||
for i = 0, #rows do
|
||||
rows[i] = nil
|
||||
end
|
||||
|
||||
table.insert(rows, build_header_row("SINKS"))
|
||||
table.insert(
|
||||
rows,
|
||||
build_rows(sinks, function()
|
||||
rebuild_popup()
|
||||
end, "sink")
|
||||
)
|
||||
table.insert(rows, build_header_row("SOURCES"))
|
||||
table.insert(
|
||||
rows,
|
||||
build_rows(sources, function()
|
||||
rebuild_popup()
|
||||
end, "source")
|
||||
)
|
||||
|
||||
popup:setup(rows)
|
||||
end)
|
||||
end
|
||||
|
||||
local function worker(user_args)
|
||||
local args = user_args or {}
|
||||
|
||||
local mixer_cmd = args.mixer_cmd or "pavucontrol"
|
||||
local widget_type = args.widget_type
|
||||
local refresh_rate = args.refresh_rate or 1
|
||||
local step = args.step or 5
|
||||
local card = args.card or 0
|
||||
local device = args.device or "pulse"
|
||||
local mixctrl = args.mixctrl or "Master"
|
||||
local value_type = args.value_type or "-M"
|
||||
local toggle_cmd = args.toggle_cmd or nil
|
||||
|
||||
if widget_types[widget_type] == nil then
|
||||
volume.widget = widget_types["icon_and_text"].get_widget(args.icon_and_text_args)
|
||||
else
|
||||
volume.widget = widget_types[widget_type].get_widget(args)
|
||||
end
|
||||
|
||||
local function update_graphic(widget, stdout)
|
||||
local mute = string.match(stdout, "%[(o%D%D?)%]") -- \[(o\D\D?)\] - [on] or [off]
|
||||
if mute == "off" then
|
||||
widget:mute()
|
||||
elseif mute == "on" then
|
||||
widget:unmute()
|
||||
end
|
||||
local volume_level = string.match(stdout, "(%d?%d?%d)%%") -- (\d?\d?\d)\%)
|
||||
volume_level = string.format("% 3d", volume_level)
|
||||
widget:set_volume_level(volume_level)
|
||||
end
|
||||
|
||||
function volume:inc(s)
|
||||
spawn.easy_async(INC_VOLUME_CMD(card, device, mixctrl, value_type, s or step), function(stdout)
|
||||
update_graphic(volume.widget, stdout)
|
||||
end)
|
||||
end
|
||||
|
||||
function volume:dec(s)
|
||||
spawn.easy_async(DEC_VOLUME_CMD(card, device, mixctrl, value_type, s or step), function(stdout)
|
||||
update_graphic(volume.widget, stdout)
|
||||
end)
|
||||
end
|
||||
|
||||
function volume:toggle()
|
||||
if toggle_cmd == nil then
|
||||
spawn.easy_async(TOG_VOLUME_CMD(card, device, mixctrl), function(stdout)
|
||||
update_graphic(volume.widget, stdout)
|
||||
end)
|
||||
else
|
||||
spawn.easy_async(toggle_cmd, function(_stdout)
|
||||
spawn.easy_async(GET_VOLUME_CMD(card, device, mixctrl, value_type), function(stdout)
|
||||
update_graphic(volume.widget, stdout)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function volume:mixer()
|
||||
if mixer_cmd then
|
||||
spawn.easy_async(mixer_cmd)
|
||||
end
|
||||
end
|
||||
|
||||
volume.widget:buttons(awful.util.table.join(
|
||||
awful.button({}, 3, function()
|
||||
if popup.visible then
|
||||
popup.visible = not popup.visible
|
||||
else
|
||||
rebuild_popup()
|
||||
popup:move_next_to(mouse.current_widget_geometry)
|
||||
end
|
||||
end),
|
||||
awful.button({}, 4, function()
|
||||
volume:inc()
|
||||
end),
|
||||
awful.button({}, 5, function()
|
||||
volume:dec()
|
||||
end),
|
||||
awful.button({}, 2, function()
|
||||
volume:mixer()
|
||||
end),
|
||||
awful.button({}, 1, function()
|
||||
volume:toggle()
|
||||
end)
|
||||
))
|
||||
|
||||
watch(GET_VOLUME_CMD(card, device, mixctrl, value_type), refresh_rate, update_graphic, volume.widget)
|
||||
|
||||
return volume.widget
|
||||
end
|
||||
|
||||
return setmetatable(volume, {
|
||||
__call = function(_, ...)
|
||||
return worker(...)
|
||||
end,
|
||||
})
|
||||
@@ -0,0 +1,46 @@
|
||||
local wibox = require("wibox")
|
||||
local beautiful = require('beautiful')
|
||||
|
||||
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/volume-widget/icons/'
|
||||
|
||||
local widget = {}
|
||||
|
||||
function widget.get_widget(widgets_args)
|
||||
local args = widgets_args or {}
|
||||
|
||||
local thickness = args.thickness or 2
|
||||
local main_color = args.main_color or beautiful.fg_color
|
||||
local bg_color = args.bg_color or '#ffffff11'
|
||||
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||
local size = args.size or 18
|
||||
|
||||
return wibox.widget {
|
||||
{
|
||||
id = "icon",
|
||||
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||
resize = true,
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
max_value = 100,
|
||||
thickness = thickness,
|
||||
start_angle = 4.71238898, -- 2pi*3/4
|
||||
forced_height = size,
|
||||
forced_width = size,
|
||||
bg = bg_color,
|
||||
paddings = 2,
|
||||
widget = wibox.container.arcchart,
|
||||
set_volume_level = function(self, new_value)
|
||||
self.value = new_value
|
||||
end,
|
||||
mute = function(self)
|
||||
self.colors = { mute_color }
|
||||
end,
|
||||
unmute = function(self)
|
||||
self.colors = { main_color }
|
||||
end
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
|
||||
return widget
|
||||
@@ -0,0 +1,58 @@
|
||||
local wibox = require("wibox")
|
||||
local beautiful = require('beautiful')
|
||||
local gears = require("gears")
|
||||
|
||||
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/volume-widget/icons/'
|
||||
|
||||
local widget = {}
|
||||
|
||||
function widget.get_widget(widgets_args)
|
||||
local args = widgets_args or {}
|
||||
|
||||
local main_color = args.main_color or beautiful.fg_normal
|
||||
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||
local bg_color = args.bg_color or '#ffffff11'
|
||||
local width = args.width or 50
|
||||
local margins = args.margins or 10
|
||||
local shape = args.shape or 'bar'
|
||||
local with_icon = args.with_icon == true and true or false
|
||||
|
||||
local bar = wibox.widget {
|
||||
{
|
||||
{
|
||||
id = "icon",
|
||||
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||
resize = false,
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
valign = 'center',
|
||||
visible = with_icon,
|
||||
layout = wibox.container.place,
|
||||
},
|
||||
{
|
||||
id = 'bar',
|
||||
max_value = 100,
|
||||
forced_width = width,
|
||||
color = main_color,
|
||||
margins = { top = margins, bottom = margins },
|
||||
background_color = bg_color,
|
||||
shape = gears.shape[shape],
|
||||
widget = wibox.widget.progressbar,
|
||||
},
|
||||
spacing = 4,
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
set_volume_level = function(self, new_value)
|
||||
self:get_children_by_id('bar')[1]:set_value(tonumber(new_value))
|
||||
end,
|
||||
mute = function(self)
|
||||
self:get_children_by_id('bar')[1]:set_color(mute_color)
|
||||
end,
|
||||
unmute = function(self)
|
||||
self:get_children_by_id('bar')[1]:set_color(main_color)
|
||||
end
|
||||
}
|
||||
|
||||
return bar
|
||||
end
|
||||
|
||||
return widget
|
||||
@@ -0,0 +1,59 @@
|
||||
local wibox = require("wibox")
|
||||
local beautiful = require('beautiful')
|
||||
|
||||
local widget = {}
|
||||
|
||||
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/volume-widget/icons/'
|
||||
|
||||
function widget.get_widget(widgets_args)
|
||||
local args = widgets_args or {}
|
||||
|
||||
local font = args.font or beautiful.font
|
||||
local icon_dir = args.icon_dir or ICON_DIR
|
||||
|
||||
return wibox.widget {
|
||||
{
|
||||
{
|
||||
id = "icon",
|
||||
resize = false,
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
valign = 'center',
|
||||
layout = wibox.container.place
|
||||
},
|
||||
{
|
||||
id = 'txt',
|
||||
font = font,
|
||||
widget = wibox.widget.textbox
|
||||
},
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
set_volume_level = function(self, new_value)
|
||||
self:get_children_by_id('txt')[1]:set_text(new_value)
|
||||
local volume_icon_name
|
||||
if self.is_muted then
|
||||
volume_icon_name = 'audio-volume-muted-symbolic'
|
||||
else
|
||||
local new_value_num = tonumber(new_value)
|
||||
if (new_value_num >= 0 and new_value_num < 33) then
|
||||
volume_icon_name="audio-volume-low-symbolic"
|
||||
elseif (new_value_num < 66) then
|
||||
volume_icon_name="audio-volume-medium-symbolic"
|
||||
else
|
||||
volume_icon_name="audio-volume-high-symbolic"
|
||||
end
|
||||
end
|
||||
self:get_children_by_id('icon')[1]:set_image(icon_dir .. volume_icon_name .. '.svg')
|
||||
end,
|
||||
mute = function(self)
|
||||
self.is_muted = true
|
||||
self:get_children_by_id('icon')[1]:set_image(icon_dir .. 'audio-volume-muted-symbolic.svg')
|
||||
end,
|
||||
unmute = function(self)
|
||||
self.is_muted = false
|
||||
end
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
|
||||
return widget
|
||||
@@ -0,0 +1,46 @@
|
||||
local wibox = require("wibox")
|
||||
|
||||
local widget = {}
|
||||
|
||||
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/volume-widget/icons/'
|
||||
|
||||
function widget.get_widget(widgets_args)
|
||||
local args = widgets_args or {}
|
||||
|
||||
local icon_dir = args.icon_dir or ICON_DIR
|
||||
|
||||
return wibox.widget {
|
||||
{
|
||||
id = "icon",
|
||||
resize = false,
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
valign = 'center',
|
||||
layout = wibox.container.place,
|
||||
set_volume_level = function(self, new_value)
|
||||
local volume_icon_name
|
||||
if self.is_muted then
|
||||
volume_icon_name = 'audio-volume-muted-symbolic'
|
||||
else
|
||||
local new_value_num = tonumber(new_value)
|
||||
if (new_value_num >= 0 and new_value_num < 33) then
|
||||
volume_icon_name="audio-volume-low-symbolic"
|
||||
elseif (new_value_num < 66) then
|
||||
volume_icon_name="audio-volume-medium-symbolic"
|
||||
else
|
||||
volume_icon_name="audio-volume-high-symbolic"
|
||||
end
|
||||
end
|
||||
self:get_children_by_id('icon')[1]:set_image(icon_dir .. volume_icon_name .. '.svg')
|
||||
end,
|
||||
mute = function(self)
|
||||
self.is_muted = true
|
||||
self:get_children_by_id('icon')[1]:set_image(icon_dir .. 'audio-volume-muted-symbolic.svg')
|
||||
end,
|
||||
unmute = function(self)
|
||||
self.is_muted = false
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
return widget
|
||||
@@ -0,0 +1,64 @@
|
||||
local wibox = require("wibox")
|
||||
local beautiful = require('beautiful')
|
||||
local gears = require("gears")
|
||||
|
||||
local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/volume-widget/icons/'
|
||||
|
||||
local widget = {}
|
||||
|
||||
function widget.get_widget(widgets_args)
|
||||
local args = widgets_args or {}
|
||||
|
||||
local main_color = args.main_color or beautiful.fg_normal
|
||||
local mute_color = args.mute_color or beautiful.fg_urgent
|
||||
local bg_color = args.bg_color or '#ffffff11'
|
||||
local width = args.width or 10
|
||||
local margins = args.height or 2
|
||||
local shape = args.shape or 'bar'
|
||||
local with_icon = args.with_icon == true and true or false
|
||||
|
||||
local bar = wibox.widget {
|
||||
{
|
||||
{
|
||||
id = "icon",
|
||||
image = ICON_DIR .. 'audio-volume-high-symbolic.svg',
|
||||
resize = false,
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
valign = 'center',
|
||||
visible = with_icon,
|
||||
layout = wibox.container.place,
|
||||
},
|
||||
{
|
||||
{
|
||||
id = 'bar',
|
||||
max_value = 100,
|
||||
forced_width = width,
|
||||
forced_height = 5,
|
||||
margins = { top = margins, bottom = margins },
|
||||
color = main_color,
|
||||
background_color = bg_color,
|
||||
shape = gears.shape[shape],
|
||||
widget = wibox.widget.progressbar,
|
||||
},
|
||||
forced_width = width,
|
||||
direction = 'east',
|
||||
layout = wibox.container.rotate,
|
||||
},
|
||||
spacing = 4,
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
set_volume_level = function(self, new_value)
|
||||
self:get_children_by_id('bar')[1]:set_value(tonumber(new_value))
|
||||
end,
|
||||
mute = function(self)
|
||||
self:get_children_by_id('bar')[1]:set_color(mute_color)
|
||||
end,
|
||||
unmute = function(self)
|
||||
self:get_children_by_id('bar')[1]:set_color(main_color)
|
||||
end
|
||||
}
|
||||
|
||||
return bar
|
||||
end
|
||||
|
||||
return widget
|
||||