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: - -![types](./screenshots/variations.png) - -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: -![sink-sources](./screenshots/volume-sink-sources.png) - -### 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 |