diff options
| author | streetturtle <streetturtle@gmail.com> | 2021-03-19 20:49:00 -0400 | 
|---|---|---|
| committer | streetturtle <streetturtle@gmail.com> | 2021-03-19 20:49:00 -0400 | 
| commit | 25d9eecfc68df3251dc96008aaa4cd7c81900da6 (patch) | |
| tree | 7f0b6a6c125ea622e099e5b569115b80dcad3753 /experiments/volume | |
| parent | a37e0a673ee3e6655f3d4be2c5a2f6c832476456 (diff) | |
[volume] BREAKING CHANGE - new widget instead of old ones
Having three widgets for volume led to a problem of code duplication -
same logic was duplicated three times. However when an issue was
discovered and fixed, it was fixed in only one of three widgets.
So I decided to create a volume widget from scratch, adding new
features, such as selecting input/output, better responsiveness,
easily customizable widget ui (bar, text, icon, icon and text, arc).
Should close #199, #198, #185, #182, #47, #122, #183.
Diffstat (limited to 'experiments/volume')
| -rw-r--r-- | experiments/volume/README.md | 112 | ||||
| -rw-r--r-- | experiments/volume/icons/audio-volume-high-symbolic.svg | 88 | ||||
| -rw-r--r-- | experiments/volume/icons/audio-volume-low-symbolic.svg | 88 | ||||
| -rw-r--r-- | experiments/volume/icons/audio-volume-medium-symbolic.svg | 88 | ||||
| -rw-r--r-- | experiments/volume/icons/audio-volume-muted-symbolic.svg | 88 | ||||
| -rw-r--r-- | experiments/volume/screenshots/variations.png | bin | 9153 -> 0 bytes | |||
| -rw-r--r-- | experiments/volume/screenshots/volume-sink-sources.png | bin | 74043 -> 0 bytes | |||
| -rw-r--r-- | experiments/volume/utils.lua | 105 | ||||
| -rw-r--r-- | experiments/volume/volume-2.svg | 1 | ||||
| -rw-r--r-- | experiments/volume/volume.lua | 218 | ||||
| -rw-r--r-- | experiments/volume/widgets/arc-widget.lua | 46 | ||||
| -rw-r--r-- | experiments/volume/widgets/horizontal-bar-widget.lua | 58 | ||||
| -rw-r--r-- | experiments/volume/widgets/icon-and-text-widget.lua | 59 | ||||
| -rw-r--r-- | experiments/volume/widgets/icon-widget.lua | 46 | ||||
| -rw-r--r-- | experiments/volume/widgets/vertical-bar-widget.lua | 64 | 
15 files changed, 0 insertions, 1061 deletions
diff --git a/experiments/volume/README.md b/experiments/volume/README.md deleted file mode 100644 index 973bb49..0000000 --- a/experiments/volume/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# 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:   - - -### Features - - - switch between sinks/sources by right clicking 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.experiments.volume.volume') -... -s.mytasklist, -- Middle widget -	{ -- Right widgets -    	layout = wibox.layout.fixed.horizontal, -        ... -        -- default -        volume_widget(), -        -- customized -        volume_widget{ -            type = 'arc' -        }, -``` - -### 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() end), -awful.key({ modkey }, "[", function() volume_widget:dec() end), -awful.key({ modkey }, "\\", function() volume_widget:toggle() 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 | -|---|---|---| -| `type`| `icon_and_text`| Widget type, one of `horizontal_bar`, `vertical_bar`, `icon`, `icon_and_text`, `arc` |  - -Depending on the chosen widget type add parameters from the corresponding section below: - -#### `icon` parameters - -| Name | Default | Description | -|---|---|---| -| `icon_dir`| `./icons`| Path to the folder with icons |  - -_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`| `./icons`| Path to the folder with icons |  -| `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|  diff --git a/experiments/volume/icons/audio-volume-high-symbolic.svg b/experiments/volume/icons/audio-volume-high-symbolic.svg deleted file mode 100644 index 985c107..0000000 --- a/experiments/volume/icons/audio-volume-high-symbolic.svg +++ /dev/null @@ -1,88 +0,0 @@ -<?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> diff --git a/experiments/volume/icons/audio-volume-low-symbolic.svg b/experiments/volume/icons/audio-volume-low-symbolic.svg deleted file mode 100644 index 7eb4531..0000000 --- a/experiments/volume/icons/audio-volume-low-symbolic.svg +++ /dev/null @@ -1,88 +0,0 @@ -<?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> diff --git a/experiments/volume/icons/audio-volume-medium-symbolic.svg b/experiments/volume/icons/audio-volume-medium-symbolic.svg deleted file mode 100644 index 11e44fe..0000000 --- a/experiments/volume/icons/audio-volume-medium-symbolic.svg +++ /dev/null @@ -1,88 +0,0 @@ -<?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> diff --git a/experiments/volume/icons/audio-volume-muted-symbolic.svg b/experiments/volume/icons/audio-volume-muted-symbolic.svg deleted file mode 100644 index e577d05..0000000 --- a/experiments/volume/icons/audio-volume-muted-symbolic.svg +++ /dev/null @@ -1,88 +0,0 @@ -<?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> diff --git a/experiments/volume/screenshots/variations.png b/experiments/volume/screenshots/variations.png Binary files differdeleted file mode 100644 index 21d7ead..0000000 --- a/experiments/volume/screenshots/variations.png +++ /dev/null diff --git a/experiments/volume/screenshots/volume-sink-sources.png b/experiments/volume/screenshots/volume-sink-sources.png Binary files differdeleted file mode 100644 index 7d010bc..0000000 --- a/experiments/volume/screenshots/volume-sink-sources.png +++ /dev/null diff --git a/experiments/volume/utils.lua b/experiments/volume/utils.lua deleted file mode 100644 index 417a666..0000000 --- a/experiments/volume/utils.lua +++ /dev/null @@ -1,105 +0,0 @@ - - -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
\ No newline at end of file diff --git a/experiments/volume/volume-2.svg b/experiments/volume/volume-2.svg deleted file mode 100644 index 10f1c67..0000000 --- a/experiments/volume/volume-2.svg +++ /dev/null @@ -1 +0,0 @@ -<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>
\ No newline at end of file diff --git a/experiments/volume/volume.lua b/experiments/volume/volume.lua deleted file mode 100644 index 7bdda1c..0000000 --- a/experiments/volume/volume.lua +++ /dev/null @@ -1,218 +0,0 @@ -------------------------------------------------- --- 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.experiments.volume.utils") - - -local LIST_DEVICES_CMD = [[sh -c "pacmd list-sinks; pacmd list-sources"]] -local GET_VOLUME_CMD = 'amixer -D pulse sget Master' -local INC_VOLUME_CMD = 'amixer -D pulse sset Master 5%+' -local DEC_VOLUME_CMD = 'amixer -D pulse sset Master 5%-' -local TOG_VOLUME_CMD = 'amixer -D pulse sset Master toggle' - - -local widget_types = { -    icon_and_text = require("awesome-wm-widgets.experiments.volume.widgets.icon-and-text-widget"), -    icon = require("awesome-wm-widgets.experiments.volume.widgets.icon-widget"), -    arc = require("awesome-wm-widgets.experiments.volume.widgets.arc-widget"), -    horizontal_bar = require("awesome-wm-widgets.experiments.volume.widgets.horizontal-bar-widget"), -    vertical_bar = require("awesome-wm-widgets.experiments.volume.widgets.vertical-bar-widget") -} -local volume = {} - -local rows  = { layout = wibox.layout.fixed.vertical } - -local popup = awful.popup{ -    bg = beautiful.bg_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.bg_normal, -            paddings = 2, -            shape = gears.shape.circle, -            forced_width = 20, -            forced_height = 20, -            check_color = beautiful.fg_urgent, -            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, -            widget = wibox.container.background -        } - -        row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end) -        row:connect_signal("mouse::leave", function(c) 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, -        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 widget_type = args.widget_type -    local refresh_rate = args.refresh_rate or 1 - -    if widget_types[widget_type] == nil then -        volume.widget = widget_types['icon_and_text'].get_widget(user_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() -        spawn.easy_async(INC_VOLUME_CMD, function(stdout) update_graphic(volume.widget, stdout) end) -    end - -    function volume:dec() -        spawn.easy_async(DEC_VOLUME_CMD, function(stdout) update_graphic(volume.widget, stdout) end) -    end - -    function volume:toggle() -        spawn.easy_async(TOG_VOLUME_CMD, function(stdout) update_graphic(volume.widget, stdout) 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({}, 1, function() volume:toggle() end) -            ) -    ) - -    watch(GET_VOLUME_CMD, refresh_rate, update_graphic, volume.widget) - -    return volume.widget -end - -return setmetatable(volume, { __call = function(_, ...) return worker(...) end }) diff --git a/experiments/volume/widgets/arc-widget.lua b/experiments/volume/widgets/arc-widget.lua deleted file mode 100644 index b6c9d22..0000000 --- a/experiments/volume/widgets/arc-widget.lua +++ /dev/null @@ -1,46 +0,0 @@ -local wibox = require("wibox") -local beautiful = require('beautiful') - -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/experiments/volume/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
\ No newline at end of file diff --git a/experiments/volume/widgets/horizontal-bar-widget.lua b/experiments/volume/widgets/horizontal-bar-widget.lua deleted file mode 100644 index 1a1c8a4..0000000 --- a/experiments/volume/widgets/horizontal-bar-widget.lua +++ /dev/null @@ -1,58 +0,0 @@ -local wibox = require("wibox") -local beautiful = require('beautiful') -local gears = require("gears") - -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/experiments/volume/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 diff --git a/experiments/volume/widgets/icon-and-text-widget.lua b/experiments/volume/widgets/icon-and-text-widget.lua deleted file mode 100644 index 0ee8d16..0000000 --- a/experiments/volume/widgets/icon-and-text-widget.lua +++ /dev/null @@ -1,59 +0,0 @@ -local wibox = require("wibox") -local beautiful = require('beautiful') - -local widget = {} - -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/experiments/volume/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
\ No newline at end of file diff --git a/experiments/volume/widgets/icon-widget.lua b/experiments/volume/widgets/icon-widget.lua deleted file mode 100644 index f2aca26..0000000 --- a/experiments/volume/widgets/icon-widget.lua +++ /dev/null @@ -1,46 +0,0 @@ -local wibox = require("wibox") - -local widget = {} - -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/experiments/volume/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
\ No newline at end of file diff --git a/experiments/volume/widgets/vertical-bar-widget.lua b/experiments/volume/widgets/vertical-bar-widget.lua deleted file mode 100644 index 82f4b8a..0000000 --- a/experiments/volume/widgets/vertical-bar-widget.lua +++ /dev/null @@ -1,64 +0,0 @@ -local wibox = require("wibox") -local beautiful = require('beautiful') -local gears = require("gears") - -local ICON_DIR = os.getenv("HOME") .. '/.config/awesome/awesome-wm-widgets/experiments/volume/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  | 
