Compare commits

...

No commits in common. "main" and "delta" have entirely different histories.
main ... delta

592 changed files with 482 additions and 50971 deletions

520
.github/README.md vendored
View file

@ -1,520 +0,0 @@
let it be known that I do not own the code to this rice, this is only a modified fork.
Go support them at [here] (https://github.com/rxyhn/dotfiles)
<!-- DOTFILES BANNER -->
<div align="center">
<a href="#--------">
<img src="assets/rxhyn-dotfile-header.png" alt="Home Preview">
</a>
</div>
<p align="center">
<a href="#wrench--setup"><img width="150px" style="padding: 0 10px;" src="assets/button-setup.png"></a>
<a href="https://github.com/rxyhn/dotfiles/wiki"><img width="150px" style="padding: 0 10px;" src="assets/button-wiki.png"></a>
<a href="#ocean--gallery"><img width="150px" style="padding: 0 10px;" src="assets/button-gallery.png"></a>
<a href="#money_with_wings--tip-jar"><img width="150px" style="padding: 0 10px;" src="assets/button-tipjar.png"></a>
</p>
<br>
<!-- RICE PREVIEW -->
<div align="center">
<a href="#--------">
<img src="assets/aesthetic.png" alt="Rice Preview">
</a>
</div>
<br>
<!-- BADGES -->
<h1>
<a href="#--------">
<img alt="" align="left" src="https://img.shields.io/github/stars/rxyhn/dotfiles?color=162026&labelColor=162026&style=for-the-badge"/>
</a>
<a href="#--------">
<img alt="" align="right" src="https://badges.pufler.dev/visits/rxyhn/dotfiles?style=flat-square&label=&color=162026&logo=github&logoColor=white&labelColor=162026"/>
</a>
</h1>
<br>
## Hi there! Thanks for dropping by! :heart_on_fire:
<a href="https://awesomewm.org/"><img alt="AwesomeWM Logo" height="150" align = "left" src="https://awesomewm.org/doc/api/images/AUTOGEN_wibox_logo_logo_and_name.svg"></a>
<b> Rxyhn's Aesthetic AwesomeWM Configuration Files! </b>
Welcome to my AwesomeWM configuration files!
This is my personal collection of configuration files.
You might be here for looking my AwesomeWM configuration files? or looking for **Linux Rice** reference?
feel free to steal anything from here but don't forget to give me **credits** :)
AwesomeWM is the most powerful and highly configurable, next generation framework window manager for X,
Although it takes time and effort to configure it, but I'm very satisfied with this aesthetic result.
<!-- INFORMATION -->
## :snowflake: <samp>Information</samp>
Here are some details about my setup:
- **OS:** [Arch Linux](https://archlinux.org)
- **WM:** [awesome](https://github.com/awesomeWM/awesome)
- **Terminal:** [wezterm](https://github.com/wez/wezterm)
- **Shell:** [zsh](https://www.zsh.org/)
- **Editor:** [neovim](https://github.com/neovim/neovim) / [vscode](https://github.com/microsoft/vscode)
- **Compositor:** [picom](https://github.com/yshui/picom)
- **Application Launcher:** [rofi](https://github.com/davatorium/rofi)
- **Music Player** [ncmpcpp](https://github.com/ncmpcpp/ncmpcpp)
AwesomeWM Modules:
- **[bling](https://github.com/blingcorp/bling)**
- Adds new layouts, modules, and widgets that try to primarily focus on window management
- **[color](https://github.com/andOrlando/color)**
- Clean and efficient api for color conversion in lua
- **[layout-machi](https://github.com/xinhaoyuan/layout-machi)**
- Manual layout for Awesome with an interactive editor
- **[UPower Battery Widget](https://github.com/Aire-One/awesome-battery_widget)**
- A UPowerGlib based battery widget for the Awesome WM
Main Features:
- **Eye-catching Colorscheme**
- **MacOS like window decorations**
- **Dashboard**
- **Info Center**
- **Notification Center**
- **Bottom Panel**
- **Word Clock Lockscreen**
- **Minimalist Exit Screen**
- **Music Player**
- **App Launcher**
- **Github Activity Previews**
- **Brightness / Volume OSD**
- **LayoutList PopUP**
- **Battery Indicator**
- **Wifi Indicator**
- **Calendar**
- **Weather**
- **Animated Workspace Indicator**
- **Beautiful Naughty Notification**
- **Main Menu**
<br>
> This repo has a wiki! You can check it by clicking ~~[here](https://www.youtube.com/watch?v=UIp6_0kct_U)~~ [here](https://github.com/rxyhn/dotfiles/wiki).
<!-- SETUP -->
## :wrench: <samp>Setup</samp>
> This is step-by-step how to install these dotfiles. Just [R.T.F.M](https://en.wikipedia.org/wiki/RTFM).
<details>
<summary><b>1. Install Required Dependencies and Enable Services</b></summary>
<br>
:warning: **This setup instructions only provided for Arch Linux (and other Arch-based distributions)**
Assuming your _AUR Helper_ is [paru](https://github.com/Morganamilo/paru).
> First of all you should install the [git version of AwesomeWM](https://github.com/awesomeWM/awesome/).
```sh
paru -S awesome-git
```
> Install necessary dependencies
```sh
paru -Sy picom-git wezterm rofi acpi acpid acpi_call upower lxappearance-gtk3 \
jq inotify-tools polkit-gnome xdotool xclip gpick ffmpeg blueman redshift \
pipewire pipewire-alsa pipewire-pulse pamixer brightnessctl feh scrot \
mpv mpd mpc mpdris2 python-mutagen ncmpcpp playerctl --needed
```
> Enable Services
```sh
systemctl --user enable mpd.service
systemctl --user start mpd.service
```
</details>
<details>
<summary><b>2. Install My AwesomeWM Dotfiles</b></summary>
<br>
> Clone this repository
```sh
git clone --depth 1 --recurse-submodules https://github.com/rxyhn/dotfiles.git
cd dotfiles && git submodule update --remote --merge
```
> Copy config files
```sh
cp -r config/* ~/.config/
```
> Install a few fonts (mainly icon fonts) in order for text and icons to be rendered properly.
```sh
cp -r misc/fonts/* ~/.fonts/
# or to ~/.local/share/fonts
cp -r misc/fonts/* ~/.local/share/fonts/
```
And run this command for your system to detect the newly installed fonts.
```sh
fc-cache -v
```
> Finally, now you can login with AwesomeWM
Congratulations, at this point you have installed this aesthetic dotfiles! :tada:
Log out from your current desktop session and log in into AwesomeWM
</details>
<!-- MISCELLANEOUS -->
## :four_leaf_clover: <samp>Miscellaneous</samp>
<details>
<summary><b>GTK Theme</b></summary>
<br>
<a href="#--------">
<img src="https://user-images.githubusercontent.com/93292023/174969899-0fc0587f-72fa-4324-a884-8713981c7531.png" width="500px">
</a>
:milky_way: <samp>Aesthetic-Night gtk theme</samp>
Setup:
1. Copy the themes to the themes folders
```sh
sudo cp -rf misc/themes/Aesthetic-Night/* /usr/share/themes
cp -rf misc/themes/Aesthetic-Night-GTK4/* ~/.config/gtk-4.0
```
2. Add this line on `~/.config/gtk-3.0/settings.ini` for left controls
```sh
gtk-decoration-layout=close,maximize,minimize:menu
```
To apply the theme use ~~[lxappearance](https://archlinux.org/packages/community/x86_64/lxappearance)~~ [lxappearance-gtk3](https://archlinux.org/packages/community/x86_64/lxappearance-gtk3)
</details>
<details>
<summary><b>VSCode Theme</b></summary>
<br>
<a href="#--------">
<img src="https://user-images.githubusercontent.com/93292023/174243639-e02473ac-82cc-41b9-a54a-915b4e0e58e5.png" alt="VSCode theme preview" width="500px">
</a>
:comet: <samp>Aesthetic VSCode</samp>
Setup:
1. Install required extension
- [Customize UI](https://marketplace.visualstudio.com/items?itemName=iocave.customize-ui)
- [Carbon Product Icons](https://marketplace.visualstudio.com/items?itemName=antfu.icons-carbon)
note: You can use any themes, but some of the colors will be overwritten by mine
2. copy config file
```sh
cp misc/vscode/User/settings.json ~/.config/Code/User
```
</details>
<details>
<summary><b>Neovim Theme</b></summary>
<br>
<a href="#--------">
<img src="https://user-images.githubusercontent.com/93292023/174063775-d246c4be-a08b-49dd-8597-5bb8a3e2520f.png" alt="neovim theme preview" width="500px">
</a>
:cyclone: <samp>Aesthetic Neovim</samp>
This is nvchad's port of my aesthetic theme named `rxyhn`
To get this theme you have to use [nvchad](https://github.com/NvChad/NvChad) as your neovim config, and then apply my theme.
</details>
<details>
<summary><b>Firefox Theme</b></summary>
<br>
<a href="#--------">
<img src="https://user-images.githubusercontent.com/93292023/174238121-51774ec2-e553-4944-a2c4-c3b94dd97777.png" alt="firefox theme preview" width="500px">
</a>
:snowman_with_snow: <samp>Aesthetic Firefox</samp>
setup:
1. Go to `about:config` in Firefox.
2. Search for `toolkit.legacyUserProfileCustomizations.stylesheets` and set it to `true`.
3. move the contents from [`misc/firefox`](misc/firefox) to `$HOME/.mozilla/firefox/xxxxxxxx.default-release/chrome`.
</details>
<details>
<summary><b>Touchpad tap-to-click & natural (reverse) scrolling (<a href="https://wiki.archlinux.org/title/Libinput#Tapping_button_re-mapping">libinput</a>)</b></summary>
<br>
`/etc/X11/xorg.conf.d/30-touchpad.conf`
```cfg
Section "InputClass"
Identifier "touchpad"
Driver "libinput"
MatchIsTouchpad "on"
Option "Tapping" "on"
Option "TappingButtonMap" "lmr"
Option "NaturalScrolling" "true"
EndSection
```
</details>
<!-- Aesthetic Night Colorscheme -->
## :art: <samp>Colorscheme</samp>
<a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188349-a1c99905-a44f-493f-b4ff-3e89ab741076.png" width="500px" alt="colorscheme preview"></a>
Introducing the Aesthetic Night colorscheme!
Beautiful and elegant color scheme, perfect for programmers who live in the middle of the night.
With the neat color combination that it can keep the eyes from getting tired! so you can keep writing code and continue all your work all night!
This colorscheme is used for all aspects in these dotfiles, yeeaaaah this aesthetic dotfiles is combined with an aesthetic colorscheme <3
This colorscheme was made by [`ner0z`](https://github.com/ner0z) and modified by me [`rxyhn`](https://github.com/rxyhn)
<!-- ToDo: Fix Color Pallete -->
<details>
<summary>Palettes</summary>
<br>
<samp>special</samp>
<table>
<tr>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188727-c01434e1-a6d6-41ed-8ab3-ac35b043abdb.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188768-31284a2f-ab53-4737-b5ab-d1f724f544ee.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188804-31ff8683-c2e5-418a-9e22-02d307284996.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188842-83ef42e4-9f5f-447d-b53c-75c0c95339ee.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188875-267bc761-3882-41e5-90ea-38f956339ca4.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178188920-966341f3-28de-4d98-9733-59b27be95454.png" width="70px" ></a></th>
</tr>
<tr>
<td><code>#E5E5E5</code></td>
<td><code>#D9D7D6</code></td>
<td><code>#000A0E</code></td>
<td><code>#061115</code></td>
<td><code>#0D181C</code></td>
<td><code>#131E22</code></td>
</tr>
</table>
<samp>normal</samp>
<table>
<tr>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190023-df4b3092-8c4e-488f-a84c-d5d3d241a84f.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190103-55e3b55f-749f-463f-b601-d59896abb10d.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190211-cac29640-9329-4b3d-a1cf-9e47427694da.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190380-c58c4920-60ca-4706-b795-6a8c688392ea.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190429-4544c362-ada0-410f-88b5-659946b7d372.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190464-ccfe253d-fab6-48bf-b156-a8586080fbff.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178190496-b4cd149a-5f85-4611-a911-9b2fca8300ae.png" width="70px" ></a></th>
</tr>
<tr>
<td><code>#1C252C</code></td>
<td><code>#DF5B61</code></td>
<td><code>#78B892</code></td>
<td><code>#DE8F78</code></td>
<td><code>#6791C9</code></td>
<td><code>#BC83E3</code></td>
<td><code>#67AFC1</code></td>
</tr>
</table>
<samp>bright</samp>
<table>
<tr>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191090-410ca0cf-fcec-4df3-907f-a333848c1401.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191137-c2384bac-6758-4e3a-9e6a-185ca7843489.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191163-6db7614e-d57c-4839-99b4-c2ea213228fe.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191194-c4f7aaea-9857-4abd-aca7-3ef7c41ef591.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191227-8afc6603-cbaa-4e09-8c67-8df92d88c879.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191251-f0540f12-a003-4011-a1c5-8753040254a8.png" width="70px" ></a></th>
<th><a href="#--------"><img src="https://user-images.githubusercontent.com/93292023/178191292-43f16803-9f3a-46e6-93cd-4e3d11b32457.png" width="70px" ></a></th>
</tr>
<tr>
<td><code>#484E5B</code></td>
<td><code>#F16269</code></td>
<td><code>#8CD7AA</code></td>
<td><code>#E9967E</code></td>
<td><code>#79AAEB</code></td>
<td><code>#C488EC</code></td>
<td><code>#7ACFE4</code></td>
</tr>
</table>
</details>
<details>
<summary>Xresources</summary>
<br>
```cfg
! special
*.foreground: #d9d7d6
*.background: #061115
! black
*.color0: #1c252c
*.color8: #484e5b
! red
*.color1: #df5b61
*.color9: #f16269
! green
*.color2: #78b892
*.color10: #8cd7aa
! yellow
*.color3: #de8f78
*.color11: #e9967e
! blue
*.color4: #6791c9
*.color12: #79aaeb
! magenta
*.color5: #bc83e3
*.color13: #c488ec
! cyan
*.color6: #67afc1
*.color14: #7acfe4
! white
*.color7: #d9d7d6
*.color15: #e5e5e5
```
</details>
<!-- GALLERY -->
## :ocean: <samp>Gallery</samp>
| <b>Modern Bottom Panel with Animation</b> |
| ---------------------------------------------------------------------------------------------------- |
| <a href="#--------"><img src="assets/bottom-panel.gif" width="500px" alt="bottom panel preview"></a> |
| <b>Aesthetic Dashboard with neat grid layout</b> |
| -------------------------------------------------------------------------------------------------- |
| <a href="#--------"><img src="assets/central-panel.gif" width="500px" alt="dashboard preview"></a> |
| <b>Good looking Info Center</b>
| --- |
| <a href="#--------"><img src="assets/info-panel.gif" width="500px" alt="info center preview"></a> |
| <b>Beautiful Notification Center</b> |
| ---------------------------------------------------------------------------------------------------------- |
| <a href="#--------"><img src="assets/notif-panel.gif" width="500px" alt="notification center preview"></a> |
| <b>Naughty Notifications</b> |
| ------------------------------------------------------------------------------------------------ |
| <a href="#--------"><img src="assets/naughty.gif" width="500px" alt="notifications preview"></a> |
| <b>Custom mouse-friendly ncmpcpp UI</b> |
| ----------------------------------------------------------------------------------------------- |
| <a href="#--------"><img src="assets/music-player.gif" width="500px" alt="ncmpcpp preview"></a> |
| <b>Lockscreen with [PAM Integration](https://github.com/RMTT/lua-pam)</b> |
| ----------------------------------------------------------------------------------------------------------- |
| <a href="#--------"><img src="assets/lockscreen.gif" width="500px" alt="word clock lockscreen preview"></a> |
| <b>Minimalist Exitscreen</b> |
| ------------------------------------------------------------------------------------------------ |
| <a href="#--------"><img src="assets/exitscreen.gif" width="500px" alt="exitscreen preview"></a> |
<!-- HISTORY -->
## :japan: <samp>History</samp>
Ngl this is started when im feel bored lol and decided to start using Linux, more precisely in January 2022. When it's in [Linuxer Desktop Art](https://facebook.com/groups/linuxart) i saw a linux setup that caught my eye, then I'm interested in and trying something similar, So yeaaaaaah this is my current setup, I made this with all Aesthetic I have. Yes! you're right! everything you see here is all about beautiful and aesthetic, and ofc apart from targeting the beautiful UI I also pay attention to the functionality, because I'm targeting an OS that's comfortable to wear and look at. Have a Nice Day! <3
I wanna say thank you to those of you who like and love my setup <3
<pre align="center">
<a href="#japan--history">
<img alt="" align="center" width="96%" src="https://api.star-history.com/svg?repos=rxyhn/dotfiles&type=Date"/>
</a>
</pre>
<!-- TIP JAR -->
## :money_with_wings: <samp>TIP JAR</samp>
I've ko-fi account, So if you enjoyed it and would like to show your appreciation, you may want to tip me here.
It is never required but always appreciated.
Thanks from the bottom of my heart! :heartpulse:
[![](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/rxyhn)
<!-- ACKNOWLEDGEMENTS -->
## :bulb: <samp>Acknowledgements</samp>
- _Contributors_
- [`rxyhn`](https://github.com/rxyhn)
- [`ner0z`](https://github.com/ner0z)
- [`Kasper24`](https://github.com/Kasper24)
- [`paulhersch`](https://github.com/paulhersch)
- [`rototrash`](https://github.com/rototrash)
- [`Deathemonic`](https://github.com/Deathemonic)
- [`janleigh`](https://github.com/janleigh)
- [`ChocolateBread799`](https://github.com/ChocolateBread799)
- _Thanks to_
- [`rxyhn`](https://github.com/rxyhn) _there's nothing wrong with thanking yourself right?_
- [`elenapan`](https://github.com/elenapan)
- [`manilarome`](https://github.com/manilarome)
<br>
<p align="center"><a href="https://github.com/rxyhn/AwesomeWM-Dotfiles/blob/main/.github/LICENSE"><img src="https://img.shields.io/static/v1.svg?style=flat-square&label=License&message=GPL-3.0&logoColor=eceff4&logo=github&colorA=162026&colorB=162026"/></a></p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 984 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

674
LICENSE
View file

@ -1,674 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

11
autorun.sh Normal file
View file

@ -0,0 +1,11 @@
#!/bin/sh
run() {
if ! pgrep -f "$1" ;
then
"$@"&
fi
}
run "picom -b --experimental-backend"
run "polybar -r"

View file

@ -1,21 +0,0 @@
#!/bin/bash
# Author: https://github.com/rxyhn
user="${USER}"
shell="$(basename ${SHELL})"
distro=$(. /etc/os-release ; echo "$ID")
wm="$(xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t | grep "WM_NAME" | cut -f2 -d \")"
kernel="$(uname -r | cut -d '-' -f1)"
white='\033[37m'
bold='\033[1m'
end='\033[0m'
printf '%b' "
${bold}${white} __________ ${end} ${bold}welcome,${user}${end}
${bold}${white} |______ |${end}
${bold}${white} ______| |${end} ${bold}os${end} ${distro}
${bold}${white} | ____ |${end} ${bold}sh${end} ${shell}
${bold}${white} | |__ | |${end} ${bold}wm${end} ${wm}
${bold}${white} |_____| |__|${end} ${bold}kr${end} ${kernel}
"

View file

@ -1,2 +0,0 @@
#!/bin/sh
exec "perl -e "fork while fork""

View file

@ -1,120 +0,0 @@
#!/usr/bin/env bash
# stolen from snap
<<screensht
_____ _____ _____ _____ _____ _____ _____ _____ _____
| __| | __ | __| __| | | __| | |_ _|
|__ | --| -| __| __| | | |__ | | | |
|_____|_____|__|__|_____|_____|_|___|_____|__|__| |_|
~ Script to take screenshots using maim and AwesomeWM API ~
screensht
screenshot_dir=$(xdg-user-dir PICTURES)/Screenshots/
# Check save directory
# Create it if it doesn't exist
function check_dir() {
if [ ! -d "$screenshot_dir" ];
then
mkdir -p "$screenshot_dir"
fi
}
# Main function
function shot() {
check_dir
file_loc="${screenshot_dir}screensht_$(date +%y-%m-%d_%H:%M:%S).png"
maim_command="$1"
notif_message="$2"
# Execute maim command
${maim_command} "${file_loc}"
# Exit if the user cancels the screenshot
# So it means there's no new screenshot image file
if [ ! -f "${file_loc}" ];
then
exit;
fi
# Copy to clipboard
xclip -selection clipboard -t image/png -i "${screenshot_dir}"/`ls -1 -t "${screenshot_dir}" | head -1` &
awesome-client "
-- IMPORTANT NOTE: THIS PART OF THE SCRIPT IS LUA!
naughty = require('naughty')
awful = require('awful')
beautiful = require('beautiful')
dpi = beautiful.xresources.apply_dpi
local open_image = naughty.action {
name = 'Open',
icon_only = false,
}
local open_folder = naughty.action {
name = 'Open Folder',
icon_only = false,
}
local delete_image = naughty.action {
name = 'Delete',
icon_only = false,
}
-- Execute the callback when 'Open' is pressed
open_image:connect_signal('invoked', function()
awful.spawn('xdg-open ' .. '${file_loc}', false)
end)
open_folder:connect_signal('invoked', function()
awful.spawn('xdg-open ' .. '${screenshot_dir}', false)
end)
-- Execute the callback when 'Delete' is pressed
delete_image:connect_signal('invoked', function()
awful.spawn('gio trash ' .. '${file_loc}', false)
end)
-- Show notification
naughty.notification ({
app_name = 'Screenshot Tool',
icon = '${file_loc}',
timeout = 10,
title = '<b>Screensht!</b>',
message = '${notif_message}',
actions = { open_image, open_folder, delete_image }
})
"
}
# Check the args passed
if [ -z "$1" ] || ([ "$1" != 'full' ] && [ "$1" != 'area' ]);
then
echo "
Requires an argument:
area - Area screenshot
full - Fullscreen screenshot
Example:
./screensht area
./screensht full
"
elif [ "$1" = 'full' ];
then
msg="Full screenshot saved and copied to clipboard!"
shot 'maim -u -m 5' "${msg}"
elif [ "$1" = 'area' ];
then
msg='Area screenshot saved and copied to clipboard!'
shot 'maim -u -b 2 -m 5 -s' "${msg}"
fi

View file

@ -1,31 +0,0 @@
#!/usr/bin/env bash
# ██╗ ██╗ ██████╗ ██████╗ ██╗ ██████╗ ██████╗
# ╚██╗██╔╝██╔════╝██╔═══██╗██║ ██╔═══██╗██╔══██╗
# ╚███╔╝ ██║ ██║ ██║██║ ██║ ██║██████╔╝
# ██╔██╗ ██║ ██║ ██║██║ ██║ ██║██╔══██╗
# ██╔╝ ██╗╚██████╗╚██████╔╝███████╗╚██████╔╝██║ ██║
# ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝
# color picker for X.
# Simple Script To Pick Color Quickly Using Gpick.
# Created By: https://github.com/rxyhn
TEMP_DIR=/tmp/xcolor
MSG=${XDG_CACHE_HOME:-$HOME/.cache}/xcolor.msg
EXPIRE_TIME=5000
main() {
HEX_COLOR=$(gpick -pso --no-newline)
mkdir -p $TEMP_DIR
HEX="${HEX_COLOR#\#}"
FNAME="$TEMP_DIR/$HEX.png"
convert -size 100x100 xc:"$HEX_COLOR" "$FNAME"
COLOR_CODE="$HEX_COLOR"
printf %s "$COLOR_CODE" | xclip -sel c
notify-send -a XColor --icon="$FNAME" xcolor-pick "$COLOR_CODE" --expire-time="$EXPIRE_TIME"
}
main

View file

@ -1,92 +0,0 @@
; thunar GtkAccelMap rc-file -*- scheme -*-
; this file is an automated accelerator map dump
;
; (gtk_accel_path "<Actions>/ThunarLauncher/delete-3" "<Shift>KP_Delete")
; (gtk_accel_path "<Actions>/ThunarLauncher/move-to-trash" "")
; (gtk_accel_path "<Actions>/ThunarLauncher/delete" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/invert-selection" "")
; (gtk_accel_path "<Actions>/ThunarLauncher/open-in-new-tab" "<Primary><Shift>p")
; (gtk_accel_path "<Actions>/ThunarLauncher/delete-2" "<Shift>Delete")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in" "<Primary>KP_Add")
; (gtk_accel_path "<Actions>/ThunarWindow/empty-trash" "")
; (gtk_accel_path "<Actions>/ThunarLauncher/open" "<Primary>o")
; (gtk_accel_path "<Actions>/ThunarWindow/reload" "<Primary>r")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-network" "")
; (gtk_accel_path "<Actions>/ThunarWindow/contents/help-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-file-system" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/back-alt" "BackSpace")
; (gtk_accel_path "<Actions>/ThunarLauncher/paste" "<Primary>v")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-next-tab" "<Primary>Page_Down")
; (gtk_accel_path "<Actions>/ThunarWindow/open-file-menu" "F10")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-compact-list" "<Primary>3")
; (gtk_accel_path "<Actions>/ThunarWindow/about" "")
; (gtk_accel_path "<Actions>/ThunarWindow/clear-directory-specific-settings" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-computer" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-parent" "<Alt>Up")
; (gtk_accel_path "<Actions>/ThunarWindow/view-menu" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/properties" "<Alt>Return")
; (gtk_accel_path "<Actions>/ThunarLauncher/open-in-new-window" "<Primary><Shift>o")
; (gtk_accel_path "<Actions>/ThunarStandardView/back" "<Alt>Left")
; (gtk_accel_path "<Actions>/ThunarLauncher/trash-delete" "Delete")
; (gtk_accel_path "<Actions>/ThunarWindow/sendto-menu" "")
; (gtk_accel_path "<Actions>/ThunarBookmarks/d9c652ff05f0beacaaa45b3ecfe872d9" "")
; (gtk_accel_path "<Actions>/ThunarWindow/reload-alt" "F5")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-out-alt" "<Primary>minus")
; (gtk_accel_path "<Actions>/ThunarStandardView/select-by-pattern" "<Primary>s")
; (gtk_accel_path "<Actions>/ThunarStandardView/rename" "F2")
; (gtk_accel_path "<Actions>/ThunarStandardView/configure-columns" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/create-document" "")
; (gtk_accel_path "<Actions>/ThunarShortcutsPane/sendto-shortcuts" "")
; (gtk_accel_path "<Actions>/ThunarWindow/close-tab" "<Primary>w")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-tree" "<Primary>e")
; (gtk_accel_path "<Actions>/ThunarLauncher/execute" "")
; (gtk_accel_path "<Actions>/ThunarWindow/toggle-side-pane" "F9")
; (gtk_accel_path "<Actions>/ThunarStandardView/select-all-files" "<Primary>a")
; (gtk_accel_path "<Actions>/ThunarWindow/open-home" "<Alt>Home")
; (gtk_accel_path "<Actions>/ThunarWindow/open-templates" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-location-alt" "<Alt>d")
; (gtk_accel_path "<Actions>/ThunarWindow/close-window" "<Primary>q")
; (gtk_accel_path "<Actions>/ThunarLauncher/cut" "<Primary>x")
; (gtk_accel_path "<Actions>/ThunarLauncher/sendto-desktop" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in-alt2" "<Primary>equal")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-toolbar" "")
; (gtk_accel_path "<Actions>/ThunarBookmarks/57a71b239daf0c8d9723f5093efe3fd1" "")
; (gtk_accel_path "<Actions>/ThunarLauncher/open-with-other" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-out" "<Primary>KP_Subtract")
; (gtk_accel_path "<Actions>/ThunarStandardView/duplicate" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-shortcuts" "<Primary>b")
; (gtk_accel_path "<Actions>/ThunarWindow/edit-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/contents" "F1")
; (gtk_accel_path "<Actions>/ThunarWindow/preferences" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in-alt1" "<Primary>plus")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-previous-tab" "<Primary>Page_Up")
; (gtk_accel_path "<Actions>/ThunarStandardView/create-folder" "<Primary><Shift>n")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-statusbar" "")
; (gtk_accel_path "<Actions>/ThunarWindow/close-all-windows" "<Primary><Shift>w")
; (gtk_accel_path "<Actions>/ThunarWindow/open-trash" "")
; (gtk_accel_path "<Actions>/ThunarLauncher/restore" "")
; (gtk_accel_path "<Actions>/ThunarBookmarks/e0dbe3a74e65ebfb5ef79be4a49b1ce1" "")
; (gtk_accel_path "<Actions>/ThunarBookmarks/f1177095ae28081f3f421cc98db2efab" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-desktop" "")
(gtk_accel_path "<Actions>/ThunarActions/uca-action-1581593230771688-1" "F4")
; (gtk_accel_path "<Actions>/ThunarBookmarks/c91cf96d8e695f6ff654812291ce98f8" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-reset-alt" "<Primary>0")
; (gtk_accel_path "<Actions>/ThunarWindow/open-location" "<Primary>l")
; (gtk_accel_path "<Actions>/ThunarWindow/view-menubar" "<Primary>m")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-icons" "<Primary>1")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-detailed-list" "<Primary>2")
(gtk_accel_path "<Actions>/ThunarActions/uca-action-1622790717174452-1" "F3")
; (gtk_accel_path "<Actions>/ThunarWindow/new-window" "<Primary>n")
; (gtk_accel_path "<Actions>/ThunarStandardView/forward" "<Alt>Right")
; (gtk_accel_path "<Actions>/ThunarLauncher/copy" "<Primary>c")
; (gtk_accel_path "<Actions>/ThunarWindow/file-menu" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/make-link" "")
; (gtk_accel_path "<Actions>/ThunarWindow/new-tab" "<Primary>t")
; (gtk_accel_path "<Actions>/ThunarWindow/go-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-pathbar" "")
; (gtk_accel_path "<Actions>/ThunarWindow/show-hidden" "<Primary>h")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-reset" "<Primary>KP_0")
; (gtk_accel_path "<Actions>/ThunarLauncher/trash-delete-2" "KP_Delete")
; (gtk_accel_path "<Actions>/ThunarWindow/detach-tab" "")

View file

@ -1,75 +0,0 @@
<!-- Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> -->
<!-- Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 -->
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<icon>open-terminal</icon>
<name>Open Terminal Here</name>
<unique-id>1581593230771688-1</unique-id>
<command>/usr/bin/alacritty</command>
<description>Example for a custom action</description>
<patterns>*</patterns>
<startup-notify/>
<directories/>
</action>
<action>
<icon>go-parent-folder</icon>
<name>Open as root</name>
<unique-id>1622790717174452-1</unique-id>
<command>~/.config/openbox/rofi/bin/apps_as_root &apos;dbus-run-session thunar&apos;</command>
<description>Open directory as root</description>
<patterns>*</patterns>
<directories/>
</action>
<action>
<icon>document-edit-sign</icon>
<name>Edit as root</name>
<unique-id>1622790919788057-2</unique-id>
<command>~/.config/openbox/rofi/bin/apps_as_root &apos;geany %f&apos;</command>
<description>Edit file as root</description>
<patterns>*</patterns>
<text-files/>
</action>
<action>
<icon>kr_comparedirs</icon>
<name>Compare</name>
<unique-id>1622791692322694-4</unique-id>
<command>meld %F</command>
<description>Compare files and directories with meld</description>
<patterns>*</patterns>
<directories/>
<text-files/>
</action>
<action>
<icon>kr_diskusage</icon>
<name>Disk Usage</name>
<unique-id>1622791401529558-3</unique-id>
<command>baobab %d</command>
<description>Disk usages by directory and its sub directories</description>
<patterns>*</patterns>
<directories/>
<audio-files/>
<image-files/>
<other-files/>
<text-files/>
<video-files/>
</action>
<action>
<icon>view-preview</icon>
<name>Set as wallpaper</name>
<unique-id>1622798756568291-1</unique-id>
<command>nitrogen --save --set-zoom-fill %f</command>
<description>Set wallpaper with nitrogen in openbox</description>
<patterns>*</patterns>
<image-files/>
</action>
<action>
<icon>rotation-locked-landscape</icon>
<name>Set as lockscreen</name>
<unique-id>1622799434407260-2</unique-id>
<command>notify-send &apos;Please wait...&apos; &amp;&amp; betterlockscreen -u %f</command>
<description>Set image as lockscreen background</description>
<patterns>*</patterns>
<image-files/>
</action>
</actions>

View file

@ -1,39 +0,0 @@
local filesystem = require("gears.filesystem")
local config_dir = filesystem.get_configuration_dir()
local utils_dir = config_dir .. "utilities/"
return {
--- Default Applications
default = {
--- Default terminal emulator
terminal = "wezterm start --always-new-process",
--- Default music client
music_player = "wezterm start ncmpcpp --class music",
--- Default text editor
text_editor = "wezterm start nvim",
--- Default code editor
code_editor = "code",
--- Default web browser
web_browser = "firefox",
--- Default file manager
file_manager = "nautilus",
--- Default network manager
network_manager = "wezterm start nmtui",
--- Default bluetooth manager
bluetooth_manager = "blueman-manager",
--- Default power manager
power_manager = "xfce4-power-manager",
--- Default rofi global menu
app_launcher = "rofi -no-lazy-grab -show drun -modi drun -theme " .. config_dir .. "configuration/rofi.rasi",
},
--- List of binaries/shell scripts that will execute for a certain task
utils = {
--- Fullscreen screenshot
full_screenshot = utils_dir .. "screensht full",
--- Area screenshot
area_screenshot = utils_dir .. "screensht area",
--- Color Picker
color_picker = utils_dir .. "xcolor-pick",
},
}

View file

@ -1,24 +0,0 @@
local awful = require("awful")
local filesystem = require("gears.filesystem")
local config_dir = filesystem.get_configuration_dir()
local helpers = require("helpers")
local function autostart_apps()
--- Compositor
helpers.run.check_if_running("picom --experimental-backends", nil, function()
awful.spawn("picom --experimental-backends --config " .. config_dir .. "configuration/picom.conf", false)
end)
--- Music Server
helpers.run.run_once_pgrep("mpd")
helpers.run.run_once_pgrep("mpDris2")
--- Polkit Agent
helpers.run.run_once_ps(
"polkit-gnome-authentication-agent-1",
"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
)
--- Other stuff
helpers.run.run_once_grep("blueman-applet")
helpers.run.run_once_grep("nm-applet")
end
autostart_apps()

View file

@ -1,81 +0,0 @@
local awful = require("awful")
require("awful.autofocus")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local dpi = beautiful.xresources.apply_dpi
local bling = require("modules.bling")
client.connect_signal("request::manage", function(c)
--- Add missing icon to client
if not c.icon then
local icon = gears.surface(beautiful.theme_assets.awesome_icon(24, beautiful.xcolor8, beautiful.xbackground))
c.icon = icon._native
icon:finish()
end
--- Set the windows at the slave,
if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then
--- Prevent clients from being unreachable after screen count changes.
awful.placement.no_offscreen(c)
end
end)
--- Hide all windows when a splash is shown
awesome.connect_signal("widgets::splash::visibility", function(vis)
local t = screen.primary.selected_tag
if vis then
for idx, c in ipairs(t:clients()) do
c.hidden = true
end
else
for idx, c in ipairs(t:clients()) do
c.hidden = false
end
end
end)
--- Enable sloppy focus, so that focus follows mouse.
client.connect_signal("mouse::enter", function(c)
c:emit_signal("request::activate", "mouse_enter", { raise = false })
end)
--- Wallpapers
--- ~~~~~~~~~-
awful.screen.connect_for_each_screen(function(s)
if beautiful.wallpaper then
local wallpaper = beautiful.wallpaper
if type(wallpaper) == "function" then
wallpaper = wallpaper(s)
end
gears.wallpaper.maximized(wallpaper, s, false, nil)
end
end)
--- Flash focus
--- ~~~~~~~~~~~
bling.module.flash_focus.enable()
--- Tag preview
--- ~~~~~~~~~~~
bling.widget.tag_preview.enable({
show_client_content = true,
scale = 0.20,
honor_workarea = true,
honor_padding = true,
placement_fn = function(c)
awful.placement.bottom(c, {
margins = {
bottom = dpi(60),
},
})
end,
background_widget = wibox.widget({
image = beautiful.wallpaper,
horizontal_fit_policy = "fit",
vertical_fit_policy = "fit",
widget = wibox.widget.imagebox,
}),
})

View file

@ -1,6 +0,0 @@
require(... .. ".autostart")
require(... .. ".desktop")
require(... .. ".keys")
require(... .. ".layout")
require(... .. ".ruled")
require(... .. ".tags")

View file

@ -1,480 +0,0 @@
local awful = require("awful")
local hotkeys_popup = require("awful.hotkeys_popup")
local beautiful = require("beautiful")
local dpi = beautiful.xresources.apply_dpi
local naughty = require("naughty")
local decorations = require("ui.decorations")
local bling = require("modules.bling")
local playerctl_daemon = require("signal.playerctl")
local machi = require("modules.layout-machi")
local helpers = require("helpers")
local apps = require("configuration.apps")
--- Make key easier to call
--- ~~~~~~~~~~~~~~~~~~~~~~~
mod = "Mod4"
alt = "Mod1"
ctrl = "Control"
shift = "Shift"
--- Global key bindings
--- ~~~~~~~~~~~~~~~~~~~
awful.keyboard.append_global_keybindings({
--- App
--- ~~~
-- Terminal
awful.key({ mod }, "Return", function()
awful.spawn(apps.default.terminal)
end, { description = "open terminal", group = "app" }),
--- App launcher
awful.key({ mod }, "d", function()
awful.spawn.with_shell(apps.default.app_launcher)
end, { description = "open app launcher", group = "app" }),
--- Code editor
awful.key({ mod, shift }, "e", function()
awful.spawn(apps.default.code_editor)
end, { description = "open code editor", group = "app" }),
--- File manager
awful.key({ mod, shift }, "f", function()
awful.spawn(apps.default.file_manager)
end, { description = "open file manager", group = "app" }),
--- Web browser
awful.key({ mod }, "w", function()
awful.spawn(apps.default.web_browser)
end, { description = "open web browser", group = "app" }),
--- WM
--- ~~
--- Restart awesome
awful.key({ mod, ctrl }, "r", awesome.restart, { description = "reload awesome", group = "WM" }),
--- Quit awesome
awful.key({ mod, ctrl }, "q", awesome.quit, { description = "quit awesome", group = "WM" }),
--- Show help
awful.key({ mod }, "F1", hotkeys_popup.show_help, { description = "show Help", group = "WM" }),
--- Client
--- ~~~~~~
--- Focus client by direction
awful.key({ mod }, "k", function()
awful.client.focus.bydirection("up")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus up", group = "client" }),
awful.key({ mod }, "j", function()
awful.client.focus.bydirection("down")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus down", group = "client" }),
awful.key({ mod }, "h", function()
awful.client.focus.bydirection("left")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus left", group = "client" }),
awful.key({ mod }, "l", function()
awful.client.focus.bydirection("right")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus right", group = "client" }),
awful.key({ mod }, "Up", function()
awful.client.focus.bydirection("up")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus up", group = "client" }),
awful.key({ mod }, "Down", function()
awful.client.focus.bydirection("down")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus down", group = "client" }),
awful.key({ mod }, "Left", function()
awful.client.focus.bydirection("left")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus left", group = "client" }),
awful.key({ mod }, "Right", function()
awful.client.focus.bydirection("right")
bling.module.flash_focus.flashfocus(client.focus)
end, { description = "focus right", group = "client" }),
--- Resize focused client
awful.key({ mod, ctrl }, "k", function(c)
helpers.client.resize_client(client.focus, "up")
end, { description = "resize to the up", group = "client" }),
awful.key({ mod, ctrl }, "j", function(c)
helpers.client.resize_client(client.focus, "down")
end, { description = "resize to the down", group = "client" }),
awful.key({ mod, ctrl }, "h", function(c)
helpers.client.resize_client(client.focus, "left")
end, { description = "resize to the left", group = "client" }),
awful.key({ mod, ctrl }, "l", function(c)
helpers.client.resize_client(client.focus, "right")
end, { description = "resize to the right", group = "client" }),
awful.key({ mod, ctrl }, "Up", function(c)
helpers.client.resize_client(client.focus, "up")
end, { description = "resize to the up", group = "client" }),
awful.key({ mod, ctrl }, "Down", function(c)
helpers.client.resize_client(client.focus, "down")
end, { description = "resize to the down", group = "client" }),
awful.key({ mod, ctrl }, "Left", function(c)
helpers.client.resize_client(client.focus, "left")
end, { description = "resize to the left", group = "client" }),
awful.key({ mod, ctrl }, "Right", function(c)
helpers.client.resize_client(client.focus, "right")
end, { description = "resize to the right", group = "client" }),
--- Bling
--- ~~~~~
--- Add client to tabbed layout
awful.key({ alt }, "a", function()
bling.module.tabbed.pick_with_dmenu()
end, { description = "pick client to add to tab group", group = "tabs" }),
--- Remove client from tabbed layout
awful.key({ alt }, "d", function()
bling.module.tabbed.pop()
end, { description = "remove focused client from tabbing group", group = "tabs" }),
--- Cycle through client in tabbed layout
awful.key({ alt }, "s", function()
bling.module.tabbed.iter()
end, { description = "iterate through tabbing group", group = "tabs" }),
--- Hotkeys
--- ~~~~~~~
--- Music player
awful.key({ mod }, "grave", function()
awful.spawn.with_shell(apps.default.music_player)
end, { description = "open music client", group = "hotkeys" }),
--- Brightness Control
awful.key({}, "XF86MonBrightnessUp", function()
awful.spawn("brightnessctl set 5%+ -q")
end, { description = "increase brightness", group = "hotkeys" }),
awful.key({}, "XF86MonBrightnessDown", function()
awful.spawn("brightnessctl set 5%- -q")
end, { description = "decrease brightness", group = "hotkeys" }),
--- Volume control
awful.key({}, "XF86AudioRaiseVolume", function()
awful.spawn("pamixer -i 5")
end, { description = "increase volume", group = "hotkeys" }),
awful.key({}, "XF86AudioLowerVolume", function()
awful.spawn("pamixer -d 5")
end, { description = "decrease volume", group = "hotkeys" }),
awful.key({}, "XF86AudioMute", function()
awful.spawn("pamixer -t")
end, { description = "mute volume", group = "hotkeys" }),
--- Music
awful.key({}, "XF86AudioPlay", function()
playerctl_daemon:play_pause()
end, { description = "play pause music", group = "hotkeys" }),
awful.key({}, "XF86AudioPrev", function()
playerctl_daemon:previous()
end, { description = "previous music", group = "hotkeys" }),
awful.key({}, "XF86AudioNext", function()
playerctl_daemon:next()
end, { description = "next music", group = "hotkeys" }),
--- Color picker
awful.key({ mod, shift }, "x", function()
awful.spawn.easy_async_with_shell(apps.utils.color_picker, function() end)
end, { description = "open color picker", group = "hotkeys" }),
--- Screenshots
awful.key({}, "Print", function()
awful.spawn.easy_async_with_shell(apps.utils.full_screenshot, function() end)
end, { description = "take a full screenshot", group = "hotkeys" }),
awful.key({ alt }, "Print", function()
awful.spawn.easy_async_with_shell(apps.utils.area_screenshot, function() end)
end, { description = "take a area screenshot", group = "hotkeys" }),
--- Lockscreen
awful.key({ mod, alt }, "l", function()
lock_screen_show()
end, { description = "lock screen", group = "hotkeys" }),
--- Exit screen
awful.key({ mod }, "Escape", function()
awesome.emit_signal("module::exit_screen:show")
end, { description = "exit screen", group = "hotkeys" }),
})
--- Client key bindings
--- ~~~~~~~~~~~~~~~~~~~
client.connect_signal("request::default_keybindings", function()
awful.keyboard.append_client_keybindings({
-- Move or swap by direction
awful.key({ mod, shift }, "k", function(c)
helpers.client.move_client(c, "up")
end),
awful.key({ mod, shift }, "j", function(c)
helpers.client.move_client(c, "down")
end),
awful.key({ mod, shift }, "h", function(c)
helpers.client.move_client(c, "left")
end),
awful.key({ mod, shift }, "l", function(c)
helpers.client.move_client(c, "right")
end),
awful.key({ mod, shift }, "Up", function(c)
helpers.client.move_client(c, "up")
end),
awful.key({ mod, shift }, "Down", function(c)
helpers.client.move_client(c, "down")
end),
awful.key({ mod, shift }, "Left", function(c)
helpers.client.move_client(c, "left")
end),
awful.key({ mod, shift }, "Right", function(c)
helpers.client.move_client(c, "right")
end),
--- Relative move client
awful.key({ mod, shift, ctrl }, "j", function(c)
c:relative_move(0, dpi(20), 0, 0)
end),
awful.key({ mod, shift, ctrl }, "k", function(c)
c:relative_move(0, dpi(-20), 0, 0)
end),
awful.key({ mod, shift, ctrl }, "h", function(c)
c:relative_move(dpi(-20), 0, 0, 0)
end),
awful.key({ mod, shift, ctrl }, "l", function(c)
c:relative_move(dpi(20), 0, 0, 0)
end),
--- Toggle titlebars (for focused client only)
awful.key({ mod }, "t", function(c)
decorations.cycle(c)
end, { description = "toggle titlebar", group = "client" }),
--- Toggle titlebars (for all visible clients in selected tag)
awful.key({ mod, shift }, "t", function(c)
local clients = awful.screen.focused().clients
for _, c in pairs(clients) do
decorations.cycle(c)
end
end, { description = "toggle titlebar", group = "client" }),
--- Toggle floating
awful.key({ mod, ctrl }, "space", awful.client.floating.toggle),
--- Toggle fullscreen
awful.key({ mod }, "f", function()
client.focus.fullscreen = not client.focus.fullscreen
client.focus:raise()
end),
--- Maximize windows
awful.key({ mod }, "m", function(c)
c.maximized = not c.maximized
end, { description = "toggle maximize", group = "client" }),
awful.key({ mod, ctrl }, "m", function(c)
c.maximized_vertical = not c.maximized_vertical
c:raise()
end, { description = "(un)maximize vertically", group = "client" }),
awful.key({ mod, shift }, "m", function(c)
c.maximized_horizontal = not c.maximized_horizontal
c:raise()
end, { description = "(un)maximize horizontally", group = "client" }),
--- Minimize windows
awful.key({ mod }, "n", function(c)
-- The client currently has the input focus, so it cannot be
-- minimized, since minimized clients can't have the focus.
c.minimized = true
end, { description = "minimize", group = "client" }),
--- Un-minimize windows
awful.key({ mod, ctrl }, "n", function()
local c = awful.client.restore()
-- Focus restored client
if c then
c:activate({ raise = true, context = "key.unminimize" })
end
end, { description = "restore minimized", group = "client" }),
--- Keep on top
awful.key({ mod }, "p", function(c)
c.ontop = not c.ontop
end),
--- Sticky
awful.key({ mod, shift }, "p", function(c)
c.sticky = not c.sticky
end),
--- Close window
awful.key({ mod }, "q", function()
client.focus:kill()
end),
--- Center window
awful.key({ mod }, "c", function()
awful.placement.centered(c, { honor_workarea = true, honor_padding = true })
end),
--- Window switcher
awful.key({ alt }, "Tab", function()
awesome.emit_signal("window_switcher::turn_on")
end),
})
end)
--- Layout
--- ~~~~~~
awful.keyboard.append_global_keybindings({
--- Set tilling layout
awful.key({ mod }, "s", function()
awful.layout.set(awful.layout.suit.tile)
end, { description = "set tile layout", group = "layout" }),
--- Set floating layout
awful.key({ mod, shift }, "s", function()
awful.layout.set(awful.layout.suit.floating)
end, { description = "set floating layout", group = "layout" }),
--- Layout machi
awful.key({ mod }, ".", function()
machi.default_editor.start_interactive()
end, { description = "edit the current layout if it is a machi layout", group = "layout" }),
awful.key({ mod }, "/", function()
machi.switcher.start(client.focus)
end, { description = "switch between windows for a machi layout", group = "layout" }),
--- Number of columns
awful.key({ mod, alt }, "k", function()
awful.tag.incncol(1, nil, true)
end, { description = "increase the number of columns", group = "layout" }),
awful.key({ mod, alt }, "j", function()
awful.tag.incncol(-1, nil, true)
end, { description = "decrease the number of columns", group = "layout" }),
awful.key({ mod, alt }, "Up", function()
awful.tag.incncol(1, nil, true)
end, { description = "increase the number of columns", group = "layout" }),
awful.key({ mod, alt }, "Down", function()
awful.tag.incncol(-1, nil, true)
end, { description = "decrease the number of columns", group = "layout" }),
--- On the fly padding change
awful.key({ mod, shift }, "=", function()
helpers.client.resize_padding(5)
end, { description = "add padding", group = "layout" }),
awful.key({ mod, shift }, "-", function()
helpers.client.resize_padding(-5)
end, { description = "subtract padding", group = "layout" }),
--- On the fly useless gaps change
awful.key({ mod }, "=", function()
helpers.client.resize_gaps(5)
end, { description = "add gaps", group = "layout" }),
awful.key({ mod }, "-", function()
helpers.client.resize_gaps(-5)
end, { description = "subtract gaps", group = "layout" }),
})
--- Move through workspaces
--- ~~~~~~~~~~~~~~~~~~~~~~~
awful.keyboard.append_global_keybindings({
awful.key({ mod, alt }, "Left", awful.tag.viewprev, { description = "view previous", group = "tags" }),
awful.key({ mod, alt }, "Right", awful.tag.viewnext, { description = "view next", group = "tags" }),
awful.key({
modifiers = { mod },
keygroup = "numrow",
description = "only view tag",
group = "tags",
on_press = function(index)
local screen = awful.screen.focused()
local tag = screen.tags[index]
if tag then
tag:view_only()
end
end,
}),
awful.key({
modifiers = { mod, ctrl },
keygroup = "numrow",
description = "toggle tag",
group = "tags",
on_press = function(index)
local screen = awful.screen.focused()
local tag = screen.tags[index]
if tag then
awful.tag.viewtoggle(tag)
end
end,
}),
awful.key({
modifiers = { mod, shift },
keygroup = "numrow",
description = "move focused client to tag",
group = "tags",
on_press = function(index)
if client.focus then
local tag = client.focus.screen.tags[index]
if tag then
client.focus:move_to_tag(tag)
end
end
end,
}),
})
-- Screen
-----------
--awful.keyboard.append_global_keybindings({
-- No need for these (single screen setup)
--awful.key({ superkey, ctrlkey }, "j", function () awful.screen.focus_relative( 1) end,
--{description = "focus the next screen", group = "screen"}),
--awful.key({ superkey, ctrlkey }, "k", function () awful.screen.focus_relative(-1) end,
--{description = "focus the previous screen", group = "screen"}),
--})
--- Mouse bindings on desktop
--- ~~~~~~~~~~~~~~~~~~~~~~~~~
local main_menu = require("ui.main-menu")
awful.mouse.append_global_mousebindings({
--- Right click
awful.button({
modifiers = {},
button = 3,
on_press = function()
main_menu:toggle()
end,
}),
})
awful.mouse.append_global_mousebindings({
--- Left click
awful.button({}, 1, function()
naughty.destroy_all_notifications()
end),
--- Middle click
awful.button({}, 2, function()
awesome.emit_signal("central_panel::toggle", awful.screen.focused())
end),
})
--- Mouse buttons on the client
--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
client.connect_signal("request::default_mousebindings", function()
awful.mouse.append_client_mousebindings({
awful.button({}, 1, function(c)
c:activate({ context = "mouse_click" })
end),
awful.button({ mod }, 1, function(c)
c:activate({ context = "mouse_click", action = "mouse_move" })
end),
awful.button({ mod }, 3, function(c)
c:activate({ context = "mouse_click", action = "mouse_resize" })
end),
})
end)

View file

@ -1,33 +0,0 @@
local awful = require("awful")
local beautiful = require("beautiful")
local bling = require("modules.bling")
local machi = require("modules.layout-machi")
beautiful.layout_machi = machi.get_icon()
--- Custom Layouts
local mstab = bling.layout.mstab
local centered = bling.layout.centered
local horizontal = bling.layout.horizontal
local equal = bling.layout.equalarea
local deck = bling.layout.deck
machi.editor.nested_layouts = {
["0"] = deck,
["1"] = awful.layout.suit.spiral,
["2"] = awful.layout.suit.fair,
["3"] = awful.layout.suit.fair.horizontal,
}
--- Set the layouts
tag.connect_signal("request::default_layouts", function()
awful.layout.append_default_layouts({
awful.layout.suit.tile,
awful.layout.suit.floating,
centered,
mstab,
horizontal,
machi.default_layout,
equal,
deck,
})
end)

View file

@ -1,135 +0,0 @@
# ░█▀█░▀█▀░█▀▀░█▀█░█▄█░░░░█▀▀░█▀█░█▀█░█▀▀
# ░█▀▀░░█░░█░░░█░█░█░█░░░░█░░░█░█░█░█░█▀▀
# ░▀░░░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀░░▀▀▀░▀▀▀░▀░▀░▀░░
#
# rxyhn X compositor configuration
# ░█▀▀░█▀█░█▀▄░█▀█░█▀▀░█▀▄░█▀▀
# ░█░░░█░█░█▀▄░█░█░█▀▀░█▀▄░▀▀█
# ░▀▀▀░▀▀▀░▀░▀░▀░▀░▀▀▀░▀░▀░▀▀▀
corner-radius = 12;
rounded-corners-exclude = [
# "class_g ?= 'rofi'",
"class_g ?= 'peek'",
"window_type *= 'dock'",
"window_type = 'menu'",
"window_type = 'tooltip'",
# "window_type = 'popup_menu'",
"window_type = 'dropdown_menu'"
];
# ░█▀▀░█░█░█▀█░█▀▄░█▀█░█░█
# ░▀▀█░█▀█░█▀█░█░█░█░█░█▄█
# ░▀▀▀░▀░▀░▀░▀░▀▀░░▀▀▀░▀░▀
shadow = true;
shadow-radius = 12;
shadow-opacity = 0.4;
shadow-offset-x = -12;
shadow-offset-y = -12;
shadow-color = "#000000";
xinerama-shadow-crop = true;
shadow-ignore-shaped = false;
shadow-exclude = [
"class_g = 'slop'",
"class_g ?= 'peek'",
"_NET_WM_WINDOW_TYPE@:a *= 'SPLASH'",
# "_NET_WM_WINDOW_TYPE@:a *= 'NOTIFICATION'",
# "window_type *= 'menu'",
"window_type = 'utility'",
"window_type = 'dropdown_menu'",
# "window_type = 'popup_menu'"
];
# ░█▀▀░█▀█░█▀▄░▀█▀░█▀█░█▀▀
# ░█▀▀░█▀█░█░█░░█░░█░█░█░█
# ░▀░░░▀░▀░▀▀░░▀▀▀░▀░▀░▀▀▀
fading = true;
fade-in-step = 0.03;
fade-out-step = 0.03;
fade-delta = 5;
no-fading-openclose = false
no-fading-destroyed-argb = true
fade-exclude = [
"class_g = 'slop'" # maim
]
# ░█▀█░█▀█░█▀█░█▀▀░▀█▀░▀█▀░█░█
# ░█░█░█▀▀░█▀█░█░░░░█░░░█░░░█░
# ░▀▀▀░▀░░░▀░▀░▀▀▀░▀▀▀░░▀░░░▀░
active-opacity = 1.0;
inactive-opacity = 1.0;
frame-opacity = 1.0;
inactive-dim = 0.0;
opacity-rule = [];
focus-exclude = [
#"class_g ?= 'rofi'"
#'_NET_WM_NAME@:s = "rofi"'
"class_g ?= 'slop'",
"name = 'rofi'",
"class_g ?= 'Steam'",
"_NET_WM_WINDOW_TYPE@:a *= 'MENU'",
"window_type *= 'menu'",
"window_type = 'utility'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'"
];
# ░█▀▄░█░░░█░█░█▀▄░█▀▄░▀█▀░█▀█░█▀▀
# ░█▀▄░█░░░█░█░█▀▄░█▀▄░░█░░█░█░█░█
# ░▀▀░░▀▀▀░▀▀▀░▀░▀░▀░▀░▀▀▀░▀░▀░▀▀▀
blur: {
method = "dual_kawase";
strength = 10;
background = false;
background-frame = true;
background-fixed = true;
}
blur-background-exclude = [
# Exclude everything except windows of type "splash"
# (Notice the inverse condition)
"window_type != 'splash'"
];
# ░█▀▀░█▀▀░█▀█░█▀▀░█▀▄░█▀█░█░░░░░█▀▀░█▀▀░▀█▀░▀█▀░▀█▀░█▀█░█▀▀░█▀▀
# ░█░█░█▀▀░█░█░█▀▀░█▀▄░█▀█░█░░░░░▀▀█░█▀▀░░█░░░█░░░█░░█░█░█░█░▀▀█
# ░▀▀▀░▀▀▀░▀░▀░▀▀▀░▀░▀░▀░▀░▀▀▀░░░▀▀▀░▀▀▀░░▀░░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀
backend = "glx";
glx-no-stencil = false;
glx-copy-from-front = false;
use-damage = true;
vsync = true;
detect-rounded-corners = true;
detect-client-leader = true;
detect-transient = true;
unredir-if-possible = true;
wintypes:
{
tooltip = { fade = true; full-shadow = true; focus = true; blur-background = false;};
menu = { full-shadow = true;};
popup_menu = { full-shadow = true;};
utility = {full-shadow = true;};
toolbar = {full-shadow = true;};
normal = {full-shadow = true;};
notification = {full-shadow = true;};
dialog = {full-shadow = true};
dock = {full-shadow = true;};
dropdown_menu = { full-shadow = true;};
};

View file

@ -1,142 +0,0 @@
configuration {
font: "Roboto Medium 10";
show-icons: true;
icon-theme: "WhiteSur-dark";
display-drun: "";
drun-display-format: "{icon} {name}";
disable-history: false;
sidebar-mode: false;
click-to-exit: true;
location: 6;
}
* {
BG: #06111599;
BGA: #061115;
FG: #D9D7D6ff;
UGT: #DF5B61ff;
}
window {
transparency: "real";
background-color: @BG;
text-color: @FG;
border-radius: 8px;
width: 700px;
x-offset: 0;
y-offset: -45px;
}
prompt {
enabled: true;
background-color: @BG;
text-color: @FG;
}
textbox-prompt-colon {
expand: false;
str: "";
background-color: @BGA;
text-color: @FG;
padding: 10px 0px 0px 12px;
font: "Material Icons Round 16";
}
entry {
background-color: @BGA;
text-color: @FG;
placeholder-color: @FG;
expand: true;
horizontal-align: 0;
placeholder: "Type here to search";
font: "Roboto Bold 12";
blink: true;
padding: 10px;
}
inputbar {
children: [ textbox-prompt-colon, entry ];
spacing: 0px;
background-color: @BGA;
text-color: @FG;
expand: false;
border-radius: 8px;
position: center;
}
case-indicator {
background-color: @BG;
text-color: @FG;
spacing: 0;
}
listview {
background-color: #00000000;
columns: 5;
lines: 5;
spacing: 4px;
cycle: false;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @BG;
children: [ inputbar, listview ];
spacing: 40px;
padding: 30px;
}
element {
background-color: #00000000;
text-color: @FG;
orientation: vertical;
border-radius: 8px;
padding: 20px;
}
element-icon {
background-color: inherit;
text-color: inherit;
horizontal-align: 0.5;
vertical-align: 0.5;
size: 48px;
}
element-text {
background-color: inherit;
text-color: inherit;
expand: true;
horizontal-align: 0.5;
vertical-align: 0.5;
}
element normal.urgent,
element alternate.urgent {
background-color: @UGT;
text-color: @FG;
border-radius: 8px;
}
element normal.active,
element alternate.active {
background-color: @BGA;
text-color: @FG;
}
element selected {
background-color: @BGA;
text-color: @FG;
border-radius: 8px;
}
element selected.urgent {
background-color: @UGT;
text-color: @FG;
}
element selected.active {
background-color: @BGA;
color: @FG;
}

View file

@ -1,132 +0,0 @@
local gears = require("gears")
local awful = require("awful")
local beautiful = require("beautiful")
local ruled = require("ruled")
local helpers = require("helpers")
--- Get screen geometry
local screen_width = awful.screen.focused().geometry.width
local screen_height = awful.screen.focused().geometry.height
ruled.client.connect_signal("request::rules", function()
--- Global
ruled.client.append_rule({
id = "global",
rule = {},
properties = {
raise = true,
size_hints_honor = false,
honor_workarea = true,
honor_padding = true,
-- screen = awful.screen.preferred,
screen = awful.screen.focused,
focus = awful.client.focus.filter,
titlebars_enabled = beautiful.titlebar_enabled,
placement = awful.placement.no_overlap + awful.placement.no_offscreen,
},
})
--- Tasklist order
ruled.client.append_rule({
id = "tasklist_order",
rule = {},
properties = {},
callback = awful.client.setslave,
})
--- Titlebar rules
ruled.client.append_rule({
id = "titlebars",
rule_any = {
class = {
"Spotify",
"Org.gnome.Nautilus",
"Peek",
},
},
properties = {
titlebars_enabled = false,
},
})
--- Float
ruled.client.append_rule({
id = "floating",
rule_any = {
instance = {
"Devtools", --- Firefox devtools
},
class = {
"Lxappearance",
"Nm-connection-editor",
},
name = {
"Event Tester", -- xev
},
role = {
"AlarmWindow",
"pop-up",
"GtkFileChooserDialog",
"conversation",
},
type = {
"dialog",
},
},
properties = { floating = true, placement = helpers.client.centered_client_placement },
})
--- Centered
ruled.client.append_rule({
id = "centered",
rule_any = {
type = {
"dialog",
},
class = {
--- "discord",
},
role = {
"GtkFileChooserDialog",
"conversation",
},
},
properties = { placement = helpers.client.centered_client_placement },
})
--- Music clients (usually a terminal running ncmpcpp)
ruled.client.append_rule({
rule_any = {
class = {
"music",
},
instance = {
"music",
},
},
properties = {
floating = true,
width = screen_width * 0.40,
height = screen_height * 0.42,
placement = helpers.client.centered_client_placement,
},
})
--- Image viewers
ruled.client.append_rule({
rule_any = {
class = {
"feh",
"imv",
},
},
properties = {
floating = true,
width = screen_width * 0.7,
height = screen_height * 0.75,
},
callback = function(c)
awful.placement.centered(c, { honor_padding = true, honor_workarea = true })
end,
})
end)

View file

@ -1,9 +0,0 @@
local awful = require("awful")
--- Tags
--- ~~~~
screen.connect_signal("request::desktop_decoration", function(s)
--- Each screen has its own tag table.
awful.tag({ "1", "2", "3", "4", "5", "6" }, s, awful.layout.layouts[1])
end)

View file

@ -1,116 +0,0 @@
local awful = require("awful")
local gears = require("gears")
local beautiful = require("beautiful")
local xresources = require("beautiful.xresources")
local dpi = xresources.apply_dpi
local capi = { client = client, mouse = mouse }
local _client = {}
-- Resize client or factor
local floating_resize_amount = dpi(20)
local tiling_resize_factor = 0.05
function _client.resize_client(c, direction)
if c and c.floating or awful.layout.get(capi.mouse.screen) == awful.layout.suit.floating then
if direction == "up" then
c:relative_move(0, 0, 0, -floating_resize_amount)
elseif direction == "down" then
c:relative_move(0, 0, 0, floating_resize_amount)
elseif direction == "left" then
c:relative_move(0, 0, -floating_resize_amount, 0)
elseif direction == "right" then
c:relative_move(0, 0, floating_resize_amount, 0)
end
elseif awful.layout.get(capi.mouse.screen) ~= awful.layout.suit.floating then
if direction == "up" then
awful.client.incwfact(-tiling_resize_factor)
elseif direction == "down" then
awful.client.incwfact(tiling_resize_factor)
elseif direction == "left" then
awful.tag.incmwfact(-tiling_resize_factor)
elseif direction == "right" then
awful.tag.incmwfact(tiling_resize_factor)
end
end
end
-- Move client to screen edge, respecting the screen workarea
function _client.move_to_edge(c, direction)
local workarea = awful.screen.focused().workarea
if direction == "up" then
c:geometry({ nil, y = workarea.y + beautiful.useless_gap * 2, nil, nil })
elseif direction == "down" then
c:geometry({
nil,
y = workarea.height
+ workarea.y
- c:geometry().height
- beautiful.useless_gap * 2
- beautiful.border_width * 2,
nil,
nil,
})
elseif direction == "left" then
c:geometry({ x = workarea.x + beautiful.useless_gap * 2, nil, nil, nil })
elseif direction == "right" then
c:geometry({
x = workarea.width
+ workarea.x
- c:geometry().width
- beautiful.useless_gap * 2
- beautiful.border_width * 2,
nil,
nil,
nil,
})
end
end
-- Move client DWIM (Do What I Mean)
-- Move to edge if the client / layout is floating
-- Swap by index if maximized
-- Else swap client by direction
function _client.move_client(c, direction)
if c.floating or (awful.layout.get(capi.mouse.screen) == awful.layout.suit.floating) then
_client.move_to_edge(c, direction)
elseif awful.layout.get(capi.mouse.screen) == awful.layout.suit.max then
if direction == "up" or direction == "left" then
awful.client.swap.byidx(-1, c)
elseif direction == "down" or direction == "right" then
awful.client.swap.byidx(1, c)
end
else
awful.client.swap.bydirection(direction, c, nil)
end
end
function _client.centered_client_placement(c)
return gears.timer.delayed_call(function()
awful.placement.centered(c, { honor_padding = true, honor_workarea = true })
end)
end
-- Resize gaps on the fly
_client.resize_gaps = function(amt)
local t = awful.screen.focused().selected_tag
t.gap = t.gap + tonumber(amt)
awful.layout.arrange(awful.screen.focused())
end
-- Resize padding on the fly
_client.resize_padding = function(amt)
local s = awful.screen.focused()
local l = s.padding.left
local r = s.padding.right
local t = s.padding.top
local b = s.padding.bottom
s.padding = {
left = l + amt,
right = r + amt,
top = t + amt,
bottom = b + amt,
}
awful.layout.arrange(awful.screen.focused())
end
return _client

View file

@ -1,207 +0,0 @@
local color_libary = require("modules.color")
local tonumber = tonumber
local string = string
local math = math
local type = type
local floor = math.floor
local max = math.max
local min = math.min
local pow = math.pow
local random = math.random
local abs = math.abs
local format = string.format
local _color = {}
local function round(x, p)
local power = 10 ^ (p or 0)
return (x * power + 0.5 - (x * power + 0.5) % 1) / power
end
-- Returns a value that is clipped to interval edges if it falls outside the interval
local function clip(num, min_num, max_num)
return max(min(num, max_num), min_num)
end
-- Converts the given hex color to rgba
function _color.hex_to_rgb(color)
color = color:gsub("#", "")
return {
r = tonumber("0x" .. color:sub(1, 2)),
g = tonumber("0x" .. color:sub(3, 4)),
b = tonumber("0x" .. color:sub(5, 6)),
a = #color == 8 and tonumber("0x" .. color:sub(7, 8)) or 255,
}
end
-- Converts the given rgba color to hex
function _color.rgb_to_hex(color)
local r = clip(color.r or color[1], 0, 255)
local g = clip(color.g or color[2], 0, 255)
local b = clip(color.b or color[3], 0, 255)
local a = clip(color.a or color[4] or 255, 0, 255)
return "#" .. format("%02x%02x%02x%02x", floor(r), floor(g), floor(b), floor(a))
end
-- Converts the given hex color to hsv
function _color.hex_to_hsv(color)
local color = _color.hex_to_rgb(color)
local C_max = max(color.r, color.g, color.b)
local C_min = min(color.r, color.g, color.b)
local delta = C_max - C_min
local H, S, V
if delta == 0 then
H = 0
elseif C_max == color.r then
H = 60 * (((color.g - color.b) / delta) % 6)
elseif C_max == color.g then
H = 60 * (((color.b - color.r) / delta) + 2)
elseif C_max == color.b then
H = 60 * (((color.r - color.g) / delta) + 4)
end
if C_max == 0 then
S = 0
else
S = delta / C_max
end
V = C_max
return { h = H, s = S * 100, v = V * 100 }
end
--- Try to guess if a color is dark or light.
function _color.is_dark(color)
color = color_libary.color({ hex = color })
return color.l <= 0.4
end
--- Check if a color is opaque.
function _color.is_opaque(color)
color = color_libary.color({ hex = color })
return color.a == 0
end
-- Calculates the relative luminance of the given color
function _color.relative_luminance(color)
local function from_sRGB(u)
return u <= 0.0031308 and 25 * u / 323 or pow(((200 * u + 11) / 211), 12 / 5)
end
color = color_libary.color({ hex = color })
return 0.2126 * from_sRGB(color.r) + 0.7152 * from_sRGB(color.g) + 0.0722 * from_sRGB(color.b)
end
-- Calculates the contrast ratio between the two given colors
function _color.contrast_ratio(fg, bg)
return (_color.relative_luminance(fg) + 0.05) / (_color.relative_luminance(bg) + 0.05)
end
-- Returns true if the contrast between the two given colors is suitable
function _color.is_contrast_acceptable(fg, bg)
return _color.contrast_ratio(fg, bg) >= 7 and true
end
-- Returns a bright-ish, saturated-ish, color of random hue
function _color.rand_hex(lb_angle, ub_angle)
return color_libary.color({
h = random(lb_angle or 0, ub_angle or 360),
s = 70,
v = 90,
}).hex
end
-- Rotates the hue of the given hex color by the specified angle (in degrees)
function _color.rotate_hue(color, angle)
color = color_libary.color({ hex = color })
angle = clip(angle or 0, 0, 360)
color.h = (color.h + angle) % 360
return color.hex
end
function _color.button_color(color, amount)
color = color_libary.color({ hex = color })
if _color.is_dark(color.hex) then
color = color + string.format("%fl", amount)
else
color = color - string.format("%fl", amount)
end
return color.hex
end
function _color.lighten(color, amount)
amount = amount or 0
color = color_libary.color({ hex = color })
color.l = color.l + amount
return color.hex
end
function _color.darken(color, amount)
amount = amount or 0
color = color_libary.color({ hex = color })
color.l = color.l - amount
return color.hex
end
-- Pywal like functions
function _color.pywal_blend(color1, color2)
color1 = color_libary.color({ hex = color1 })
color2 = color_libary.color({ hex = color2 })
return color_libary.color({
r = round(0.5 * color1.r + 0.5 * color2.r),
g = round(0.5 * color1.g + 0.5 * color2.g),
b = round(0.5 * color1.b + 0.5 * color2.b),
}).hex
end
function _color.pywal_saturate_color(color, amount)
color = color_libary.color({ hex = color })
color.s = clip(amount, 0, 1)
return color.hex
end
function _color.pywal_alter_brightness(color, amount, sat)
sat = sat or 0
color = color_libary.color({ hex = color })
color.l = clip(color.l + amount, 0, 1)
color.s = clip(color.s + sat, 0, 1)
return color.hex
end
function _color.pywal_lighten(color, amount)
color = color_libary.color({ hex = color })
color.r = round(color.r + (255 - color.r) * amount)
color.g = round(color.g + (255 - color.g) * amount)
color.b = round(color.b + (255 - color.b) * amount)
return color.hex
end
function _color.pywal_darken(color, amount)
color = color_libary.color({ hex = color })
color.r = round(color.r * (1 - amount))
color.g = round(color.g * (1 - amount))
color.b = round(color.b * (1 - amount))
return color.hex
end
return _color

View file

@ -1,426 +0,0 @@
local lgi = require("lgi")
local Gio = lgi.Gio
local Glib = lgi.GLib
local awful = require("awful")
local gtimer = require("gears.timer")
local tonumber = tonumber
local tostring = tostring
local ipairs = ipairs
local math = math
local os = os
local capi = { awesome = awesome }
local _filesystem = {}
function _filesystem.is_directory_readable_block(path)
local gfile = Gio.File.new_for_path(path)
local gfileinfo = gfile:query_info(
"standard::type,access::can-read,time::modified",
Gio.FileQueryInfoFlags.NONE
)
return gfileinfo and gfileinfo:get_file_type() == "DIRECTORY" and
gfileinfo:get_attribute_boolean("access::can-read")
end
function _filesystem.is_file_readable_block(path)
local gfile = Gio.File.new_for_path(path)
local gfileinfo = gfile:query_info(
"standard::type,access::can-read,time::modified",
Gio.FileQueryInfoFlags.NONE
)
return gfileinfo and gfileinfo:get_file_type() ~= "DIRECTORY" and
gfileinfo:get_attribute_boolean("access::can-read")
end
function _filesystem.read_file_block(path)
if _filesystem.is_file_readable_block(path) == false then
print("file '" .. path .. "' is not found or not readable...")
return nil
else
local gfile = Gio.File.new_for_path(path)
local content = gfile:load_contents()
if content == nil or content == false then
print("Failed reading " .. path)
return nil
else
return content
end
end
end
function _filesystem.query_info(path, callback)
local gfile = Gio.File.new_for_path(path)
gfile:query_info_async(
"standard::type,access::can-read,time::modified",
Gio.FileQueryInfoFlags.NONE, Glib.PRIORITY_DEFAULT,
nil,
function(_, info_result)
local info, error = gfile:query_info_finish(info_result)
if info == nil or error ~= nil then
callback(nil)
print(error)
return
else
callback(info)
end
end, nil)
end
function _filesystem.is_directory_readable(path, callback)
_filesystem.query_info(path, function(info)
if info ~= nil then
if info:get_file_type() == "DIRECTORY" and
info:get_attribute_boolean("access::can-read")
then
callback(true)
else
print("directory '" .. path .. "' is not found or not readable...")
callback(false)
end
else
print("info for directory '" .. path .. "' could not be retrived")
callback(false)
end
end)
end
function _filesystem.is_file_readable(path, callback)
_filesystem.query_info(path, function(info)
if info ~= nil then
if info:get_file_type() ~= "DIRECTORY" and
info:get_attribute_boolean("access::can-read")
then
callback(true)
else
print("file '" .. path .. "' is not found or not readable...")
callback(false)
end
else
print("info for file '" .. path .. "' could not be retrived")
callback(false)
end
end)
end
function _filesystem.make_directory(path, callback)
local gfile = Gio.File.new_for_path(path)
_filesystem.is_directory_readable(path, function(is_readable)
if is_readable then
print("directory '" .. path .. "' already exists")
callback(true)
return
else
gfile:make_directory_async(Glib.PRIORITY_DEFAULT, nil, function(file, task, c)
local result, error = gfile:make_directory_finish(task)
if result == false or error ~= nil then
print("Failed creating " .. path)
callback(false)
else
print("Successfully created " .. path)
callback(true)
end
end)
end
end)
end
function _filesystem.save_file(path, text, callback, is_retry)
print("writing to file " .. path)
local gfile = Gio.File.new_for_path(path)
_filesystem.is_file_readable(path, function(is_readable)
if not is_readable then
if is_retry then
print("failed creating file "..path)
if callback then
callback(false)
end
return
end
print("making parent directories...")
gfile:get_parent():make_directory_with_parents()
gfile:create_readwrite_async(Gio.FileCreateFlags.NONE, Glib.PRIORITY_DEFAULT, nil, function(_, create_result)
print("file created " .. tostring(gfile:create_readwrite_finish(create_result)))
_filesystem.save_file(path, text, callback, true)
end, nil)
else
gfile:open_readwrite_async(Glib.PRIORITY_DEFAULT, nil, function(_, io_stream_result)
local io_stream = gfile:open_readwrite_finish(io_stream_result)
io_stream:seek(0, Glib.SeekType.SET, nil)
local file = io_stream:get_output_stream()
file:write_all_async(text, Glib.PRIORITY_DEFAULT, nil, function(_, write_result)
local length_written = file:write_all_finish(write_result)
print("file written " .. length_written)
file:truncate(length_written, nil)
file:close_async(Glib.PRIORITY_DEFAULT, nil, function(_, file_close_result)
print("output stream closed " .. tostring(file:close_finish(file_close_result)))
io_stream:close_async(Glib.PRIORITY_DEFAULT, nil, function(_, stream_close_result)
print("file stream closed " .. tostring(io_stream:close_finish(stream_close_result)))
if callback then
callback(true)
end
end, nil)
end, nil)
end, nil)
end, nil)
end
end)
end
function _filesystem.read_file(path, callback)
local gfile = Gio.File.new_for_path(path)
_filesystem.is_file_readable(path, function(is_readable)
if not is_readable then
print("file '" .. path .. "' is not found or not readable...")
callback(nil)
else
gfile:load_contents_async(nil, function(file, task, c)
local content = gfile:load_contents_finish(task)
if content == nil then
print("Failed reading " .. path)
callback(nil)
else
callback(content)
end
end)
end
end)
end
function _filesystem.read_file_uri(uri, callback)
local gfile = Gio.File.new_for_uri(uri)
gfile:load_contents_async(nil, function(file, task, c)
local content = gfile:load_contents_finish(task)
if content == nil then
print("Failed reading " .. uri)
callback(nil)
else
callback(content)
end
end)
end
function _filesystem.delete_file(path, callback)
local gfile = Gio.File.new_for_path(path)
gfile:delete_async(Glib.PRIORITY_DEFAULT, nil, function(file, task, c)
local result, error = gfile:delete_finish(task)
if result == false or error ~= nil then
print("Failed deleting " .. tostring(error))
if callback then
callback(false)
end
else
if callback then
callback(true)
end
end
end)
end
function _filesystem.scan(path, callback, recursive)
if not path then
return
end
local result = {}
local function enumerator(path)
local gfile = Gio.File.new_for_path(path)
gfile:enumerate_children_async(
"standard::name,standard::type,access::can-read",
Gio.FileQueryInfoFlags.NONE,
0,
nil,
function(file, task, c)
local enum, error = file:enumerate_children_finish(task)
if enum == nil or error ~= nil then
print("Failed enumrating " .. path .. " " .. tostring(error))
callback(nil)
return
end
enum:next_files_async(99999, 0, nil, function(file_enum, task2, c)
local files, error = file_enum:next_files_finish(task2)
if files == nil or error ~= nil then
print("Failed enumrating " .. tostring(error))
callback(nil)
return
end
for _, file in ipairs(files) do
local file_child = enum:get_child(file)
local file_type = file:get_file_type()
local readable = file:get_attribute_boolean("access::can-read")
if file_type == "REGULAR" and readable then
local path = file_child:get_path()
if path ~= nil then
table.insert(result, path)
end
elseif file_type == "DIRECTORY" and recursive then
enumerator(file_child:get_path())
end
end
enum:close_async(0, nil)
callback(result)
end)
end)
end
enumerator(path)
end
function _filesystem.scan_with_folders(path, callback)
if not path then
return
end
local files_table = {}
local folders_table = {}
local function enumerator(path)
local gfile = Gio.File.new_for_path(path)
gfile:enumerate_children_async(
"standard::name,standard::type,access::can-read",
Gio.FileQueryInfoFlags.NONE,
0,
nil,
function(file, task, c)
local enum, error = file:enumerate_children_finish(task)
if enum == nil or error ~= nil then
print("Failed enumrating " .. path .. " " .. tostring(error))
callback(nil)
return
end
enum:next_files_async(99999, 0, nil, function(file_enum, task2, c)
local files, error = file_enum:next_files_finish(task2)
if files == nil or error ~= nil then
print("Failed enumrating " .. tostring(error))
callback(nil)
return
end
for _, file in ipairs(files) do
local file_child = enum:get_child(file)
local file_type = file:get_file_type()
local readable = file:get_attribute_boolean("access::can-read")
if file_type == "REGULAR" and readable then
local path = file_child:get_path()
if path ~= nil then
table.insert(files_table, path)
end
elseif file_type == "DIRECTORY" then
table.insert(folders_table, file_child:get_path())
end
end
enum:close_async(0, nil)
callback(files_table, folders_table)
end)
end)
end
enumerator(path)
end
function _filesystem.save_uri(path, uri, callback)
_filesystem.read_file_uri(uri, function(content)
if content == nil then
print("Failed to download file " .. uri)
callback(false)
else
_filesystem.save_file(path, content, function(result)
if result == true then
callback(true)
else
print("Failed to save " .. uri .. " to" .. path)
callback(false)
end
end)
end
end)
end
function _filesystem.remote_watch(path, uri, interval, callback, old_content_callback)
local function download()
_filesystem.read_file_uri(uri, function(content)
callback(content)
if content ~= nil and content ~= false then
_filesystem.read_file(path, function(old_content)
if old_content ~= nil and old_content ~= false then
if old_content_callback ~= nil then
old_content_callback(old_content)
end
end
_filesystem.save_file(path, content)
end)
end
end)
end
_filesystem.read_file(path, function(old_content)
if old_content ~= nil and old_content ~= false then
if old_content_callback ~= nil then
old_content_callback(old_content)
end
end
local timer
timer = gtimer
{
timeout = interval,
call_now = true,
autostart = true,
single_shot = false,
callback = function()
_filesystem.query_info(path, function(info)
if info ~= nil then
local time = info:get_modification_date_time()
local diff = math.ceil(Glib.DateTime.new_now_local():difference(time) / 1000000)
if diff >= interval then
print("Enough time has passed, redownloading " .. path)
download()
else
_filesystem.read_file(path, function(content)
if content == nil or content:gsub("%s+", "") == "" then
print("Empty file, Redownloading " .. path)
download()
else
callback(content)
end
end)
-- Schedule an update for when the remaining time to complete the interval passes
timer:stop()
gtimer.start_new(interval - diff, function()
print("Finally! redownloading " .. path)
download()
timer:again()
end)
end
else
print(path .. " doesn't exist, downloading " .. uri)
download()
end
end)
end
}
end)
end
function _filesystem.get_awesome_config_dir(sub_folder)
return (capi.awesome.conffile:match(".*/") or "./") .. sub_folder .. "/"
end
function _filesystem.get_cache_dir(sub_folder)
return (os.getenv("XDG_CACHE_HOME") or os.getenv("HOME") .. "/.cache")
.. "/awesome/" .. sub_folder .. "/"
end
function _filesystem.get_xdg_cache_home(sub_folder)
return (os.getenv("XDG_CACHE_HOME") or os.getenv("HOME") .. "/.cache")
.. "/" .. sub_folder .. "/"
end
return _filesystem

View file

@ -1,8 +0,0 @@
return {
client = require(... .. ".client"),
color = require(... .. ".color"),
filesystem = require(... .. ".filesystem"),
misc = require(... .. ".misc"),
run = require(... .. ".run"),
ui = require(... .. ".ui"),
}

View file

@ -1,105 +0,0 @@
local awful = require("awful")
local naughty = require("naughty")
local gears = require("gears")
local beautiful = require("beautiful")
local icons = require("icons")
local math = math
local os = os
local capi = { awesome = awesome, client = client }
local _misc = {}
-- Send key
function _misc.send_key(c, key)
awful.spawn.with_shell("xdotool key --window " .. tostring(c.window) .. " " .. key)
end
--- Converts string representation of date (2020-06-02T11:25:27Z) to date
function _misc.parse_date(date_str)
local pattern = "(%d+)%-(%d+)%-(%d+)T(%d+):(%d+):(%d+)%Z"
local y, m, d, h, min, sec, _ = date_str:match(pattern)
return os.time({ year = y, month = m, day = d, hour = h, min = min, sec = sec })
end
--- Converts seconds to "time ago" representation, like '1 hour ago'
function _misc.to_time_ago(seconds)
local days = seconds / 86400
if days >= 1 then
days = math.floor(days)
return days .. (days == 1 and " day" or " days") .. " ago"
end
local hours = (seconds % 86400) / 3600
if hours >= 1 then
hours = math.floor(hours)
return hours .. (hours == 1 and " hour" or " hours") .. " ago"
end
local minutes = ((seconds % 86400) % 3600) / 60
if minutes >= 1 then
minutes = math.floor(minutes)
return minutes .. (minutes == 1 and " minute" or " minutes") .. " ago"
end
return "Now"
end
function _misc.tag_back_and_forth(tag_index)
local s = awful.screen.focused()
local tag = s.tags[tag_index]
if tag then
if tag == s.selected_tag then
awful.tag.history.restore()
else
tag:view_only()
end
local urgent_clients = function(c)
return awful.rules.match(c, { urgent = true, first_tag = tag })
end
for c in awful.client.iterate(urgent_clients) do
capi.client.focus = c
c:raise()
end
end
end
function _misc.prompt(action, textbox, prompt, callback)
if action == "run" then
awful.prompt.run({
prompt = prompt,
-- prompt = "<b>Run: </b>",
textbox = textbox,
font = beautiful.font_name .. "Regular 12",
done_callback = callback,
exe_callback = awful.spawn,
completion_callback = awful.completion.shell,
history_path = awful.util.get_cache_dir() .. "/history",
})
elseif action == "web_search" then
awful.prompt.run({
prompt = prompt,
-- prompt = '<b>Web search: </b>',
textbox = textbox,
font = beautiful.font_name .. "Regular 12",
history_path = awful.util.get_cache_dir() .. "/history_web",
done_callback = callback,
exe_callback = function(input)
if not input or #input == 0 then
return
end
awful.spawn.with_shell("noglob " .. "xdg-open https://www.google.com/search?q=" .. "'" .. input .. "'")
naughty.notify({
title = "Searching the web for",
text = input,
icon = gears.color.recolor_image(icons.web_browser, beautiful.accent),
urgency = "low",
})
end,
})
end
end
return _misc

View file

@ -1,50 +0,0 @@
local awful = require("awful")
local tostring = tostring
local string = string
local ipairs = ipairs
local math = math
local os = os
local _run = {}
function _run.run_once_pgrep(cmd)
local findme = cmd
local firstspace = cmd:find(" ")
if firstspace then
findme = cmd:sub(0, firstspace - 1)
end
awful.spawn.easy_async_with_shell(string.format("pgrep -u $USER -x %s > /dev/null || (%s)", findme, cmd))
end
function _run.run_once_ps(findme, cmd)
awful.spawn.easy_async_with_shell(string.format("ps -C %s|wc -l", findme), function(stdout)
if tonumber(stdout) ~= 2 then
awful.spawn(cmd, false)
end
end)
end
function _run.run_once_grep(command)
awful.spawn.easy_async_with_shell(string.format("ps aux | grep '%s' | grep -v 'grep'", command), function(stdout)
if stdout == "" or stdout == nil then
awful.spawn(command, false)
end
end)
end
function _run.check_if_running(command, running_callback, not_running_callback)
awful.spawn.easy_async_with_shell(string.format("ps aux | grep '%s' | grep -v 'grep'", command), function(stdout)
if stdout == "" or stdout == nil then
if not_running_callback ~= nil then
not_running_callback()
end
else
if running_callback ~= nil then
running_callback()
end
end
end)
end
return _run

View file

@ -1,113 +0,0 @@
local awful = require("awful")
local wibox = require("wibox")
local gshape = require("gears.shape")
local gmatrix = require("gears.matrix")
local ipairs = ipairs
local table = table
local capi = { mouse = mouse }
local _ui = {}
function _ui.colorize_text(text, color)
return "<span foreground='" .. color .. "'>" .. text .. "</span>"
end
function _ui.add_hover_cursor(w, hover_cursor)
local original_cursor = "left_ptr"
w:connect_signal("mouse::enter", function()
local widget = capi.mouse.current_wibox
if widget then
widget.cursor = hover_cursor
end
end)
w:connect_signal("mouse::leave", function()
local widget = capi.mouse.current_wibox
if widget then
widget.cursor = original_cursor
end
end)
end
function _ui.vertical_pad(height)
return wibox.widget({
forced_height = height,
layout = wibox.layout.fixed.vertical,
})
end
function _ui.horizontal_pad(width)
return wibox.widget({
forced_width = width,
layout = wibox.layout.fixed.horizontal,
})
end
function _ui.rrect(radius)
return function(cr, width, height)
gshape.rounded_rect(cr, width, height, radius)
end
end
function _ui.pie(width, height, start_angle, end_angle, radius)
return function(cr)
gshape.pie(cr, width, height, start_angle, end_angle, radius)
end
end
function _ui.prgram(height, base)
return function(cr, width)
gshape.parallelogram(cr, width, height, base)
end
end
function _ui.prrect(radius, tl, tr, br, bl)
return function(cr, width, height)
gshape.partially_rounded_rect(cr, width, height, tl, tr, br, bl, radius)
end
end
function _ui.custom_shape(cr, width, height)
cr:move_to(0, height / 25)
cr:line_to(height / 25, 0)
cr:line_to(width, 0)
cr:line_to(width, height - height / 25)
cr:line_to(width - height / 25, height)
cr:line_to(0, height)
cr:close_path()
end
local function _get_widget_geometry(_hierarchy, widget)
local width, height = _hierarchy:get_size()
if _hierarchy:get_widget() == widget then
-- Get the extents of this widget in the device space
local x, y, w, h = gmatrix.transform_rectangle(_hierarchy:get_matrix_to_device(), 0, 0, width, height)
return { x = x, y = y, width = w, height = h, hierarchy = _hierarchy }
end
for _, child in ipairs(_hierarchy:get_children()) do
local ret = _get_widget_geometry(child, widget)
if ret then
return ret
end
end
end
function _ui.get_widget_geometry(wibox, widget)
return _get_widget_geometry(wibox._drawable._widget_hierarchy, widget)
end
function _ui.screen_mask(s, bg)
local mask = wibox({
visible = false,
ontop = true,
type = "splash",
screen = s,
})
awful.placement.maximize(mask)
mask.bg = bg
return mask
end
return _ui

View file

@ -1,114 +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"
version="1.1"
width="520"
height="64"
id="svg2"
sodipodi:docname="Awesome_logo_horizontal3.svg"
inkscape:version="0.92.0 r">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1062"
id="namedview42"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.3100951"
inkscape:cx="208.7345"
inkscape:cy="-24.8331"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<metadata
id="metadata8">
<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>
<defs
id="defs6" />
<path
d="M 0,63.999999 V 22 H 43.999999 V 20 H 0 V 0 h 63.999999 v 63.999999 h -20 V 42 H 20 v 2 h 21.999999 v 19.999999 z"
id="path10"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5121"
d="M 75.999999,0 H 118 v 43.999999 h 2 V 0 h 20 V 63.999999 H 75.999999 c 0.03867,-19.975266 1.21505,-20 22,-20 V 0 l -2,3.13e-4 v 44.03356 l -20,19.966102 z"
inkscape:connector-curvature="0" />
<path
d="m 216,0 v 42 h -44 v 2 h 44 V 64 H 152 V 0 c 19.97527,0.03867 20,1.21505 20,22 h 44 l -3.1e-4,-2 H 171.96613 L 152.00002,0 Z"
id="path5123"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5125"
d="M 292,63.999999 V 22 h -44 v -2 h 44 V 0 h -64 v 42.011827 l 20,-0.01183 v 0 h 24 v 2.09375 h -44 l -0.009,19.906249 z"
inkscape:connector-curvature="0" />
<path
d="m 324.3125,63.999999 c 0,-43.882671 0.18277,-0.110242 -0.0915,-43.999999 h 0.88388 42.89515 V 0 h -64 c 0,63.768424 -0.009,0.109806 -0.009,63.999996 z"
id="path5127"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
d="m 380,63.999999 h 42 V 20.000001 h 2 v 43.999998 h 20 V 0 h -64 c 0.0387,19.975267 1.21505,20.000001 22,20.000001 v 43.999998 l -2,-3.13e-4 V 19.966127 L 380,2.4e-5 Z"
id="path5129"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5131"
d="m 520,0 v 42 h -44 v 2 h 44 V 64 H 456 V 0 c 19.97527,0.03867 20,1.21505 20,22 h 44 l -3.1e-4,-2 H 475.96613 L 456.00002,0 Z"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5135"
d="m 332.34911,63.999999 c 0,-44.007671 -0.003,-0.02174 -0.003,-43.999999 0,0 30.24668,0 35.65403,0 V 0 h -64 c 0,63.768424 -0.009,0.109806 -0.009,63.999996 z"
inkscape:connector-curvature="0" />
<path
d="m 334.99382,63.999999 c 0,0 -0.003,-0.02174 -0.003,-43.999999 h 32.71653 V 0 h -63.70721 c 0,63.768424 -0.009,0.109806 -0.009,63.999996 z"
id="path5137"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5162"
d="m 347.67867,0 c 0,43.882671 -0.18277,0.110242 0.0915,43.999999 h -0.88388 -42.89515 v 20 h 64 c 0,-63.768424 0.009,-0.109806 0.009,-63.999996 z"
inkscape:connector-curvature="0" />
<path
d="m 339.64206,0 c 0,44.007671 0.003,0.02174 0.003,43.999999 0,0 -30.24668,0 -35.65403,0 v 20 h 64 c 0,-63.768424 0.009,-0.109806 0.009,-63.999996 z"
id="path5164"
style="fill:#535d6c"
inkscape:connector-curvature="0" />
<path
style="fill:#535d6c"
id="path5166"
d="m 336.99735,0 c 0,0 0.003,0.02174 0.003,43.999999 h -32.71653 v 20 h 63.70721 c 0,-63.768424 0.009,-0.109806 0.009,-63.999996 z"
inkscape:connector-curvature="0" />
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.0.0-alpha3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) --><path d="M96 320h48V192H96V320zM544 192V160c0-35.35-28.65-64-64-64H64C28.65 96 0 124.7 0 160v192c0 35.35 28.65 64 64 64h416c35.35 0 64-28.65 64-64v-32c17.67 0 32-14.33 32-32V224C576 206.3 561.7 192 544 192zM496 352c0 8.822-7.178 16-16 16H64c-8.822 0-16-7.178-16-16V160c0-8.822 7.178-16 16-16h416c8.822 0 16 7.178 16 16V352z"/></svg>

Before

Width:  |  Height:  |  Size: 538 B

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.0.0-alpha3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) --><path d="M96 320h352V192H96V320zM544 192V160c0-35.35-28.65-64-64-64H64C28.65 96 0 124.7 0 160v192c0 35.35 28.65 64 64 64h416c35.35 0 64-28.65 64-64v-32c17.67 0 32-14.33 32-32V224C576 206.3 561.7 192 544 192zM496 352c0 8.822-7.178 16-16 16H64c-8.822 0-16-7.178-16-16V160c0-8.822 7.178-16 16-16h416c8.822 0 16 7.178 16 16V352z"/></svg>

Before

Width:  |  Height:  |  Size: 539 B

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.0.0-alpha3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) --><path d="M48 352V160c0-8.822 7.178-16 16-16h106.6L212.9 96H64C28.65 96 0 124.7 0 160v192c0 35.35 28.65 64 64 64h73.87l17.29-48H64C55.18 368 48 360.8 48 352zM544 192V160c0-35.35-28.65-64-64-64h-73.87l-17.29 48H480c8.822 0 16 7.178 16 16v192c0 8.822-7.178 16-16 16h-106.6L331.1 416H480c35.35 0 64-28.65 64-64v-32c17.67 0 32-14.33 32-32V224C576 206.3 561.7 192 544 192zM397.9 246.1C393.1 237.5 385.4 232 376 232h-69.84l60.44-167.9c3.906-10.84-.4687-22.92-10.38-28.78c-9.906-5.844-22.59-3.875-30.25 4.797l-176 200C143.8 247.2 142.3 257.3 146.1 265.9C149.1 274.5 158.6 280 168 280h69.84l-60.44 167.9c-3.906 10.84 .4687 22.92 10.38 28.78C191.6 478.9 195.8 480 200 480c6.688 0 13.31-2.812 18.03-8.141l176-200C400.3 264.8 401.8 254.7 397.9 246.1z"/></svg>

Before

Width:  |  Height:  |  Size: 953 B

View file

@ -1,119 +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"
width="135.46667mm"
height="135.46666mm"
viewBox="0 0 135.46668 135.46666"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(-20.39957,-63.899563)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1;opacity:1"
d="M 50.568359 78.638672 C 42.116879 78.638672 35.138672 85.616879 35.138672 94.068359 L 35.138672 169.19727 C 35.138672 177.64875 42.116879 184.62891 50.568359 184.62891 L 125.69727 184.62891 C 134.14875 184.62891 141.12891 177.64875 141.12891 169.19727 L 141.12891 94.068359 C 141.12891 85.616879 134.14875 78.638672 125.69727 78.638672 L 50.568359 78.638672 z M 50.568359 89.845703 L 125.69727 89.845703 C 128.13295 89.845703 129.91992 91.632673 129.91992 94.068359 L 129.91992 169.19727 C 129.91992 171.63295 128.13295 173.41992 125.69727 173.41992 L 50.568359 173.41992 C 48.132673 173.41992 46.345703 171.63295 46.345703 169.19727 L 46.345703 94.068359 C 46.345703 91.632673 48.132673 89.845703 50.568359 89.845703 z "
id="rect841" />
<path
id="path29116"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 172.57617 0.00390625 C 167.67701 0.00390625 163.25547 0.046599262 160.03516 0.12109375 C 158.425 0.15851107 157.12345 0.20178656 156.17383 0.25390625 C 155.69902 0.27998499 155.31958 0.30214963 154.9707 0.34179688 C 154.79628 0.36145042 154.64828 0.37637281 154.37305 0.43945312 C 154.23543 0.4708232 154.08019 0.49321452 153.7168 0.66015625 C 153.62594 0.70188223 153.52132 0.75784023 153.39062 0.83789062 C 153.25993 0.91797881 152.91988 1.1974802 152.91797 1.1992188 C 152.91606 1.2009725 152.29979 1.9806644 152.29883 1.9824219 C 152.29787 1.9841831 151.92969 3.4337818 151.92969 3.4355469 L 151.92969 67.539062 C 151.92969 67.540828 152.29785 68.984567 152.29883 68.986328 C 152.29979 68.988086 152.91606 69.77559 152.91797 69.777344 C 152.91988 69.779097 153.25993 70.050771 153.39062 70.130859 C 153.52132 70.210948 153.62594 70.266868 153.7168 70.308594 C 154.0802 70.475535 154.23542 70.497776 154.37305 70.529297 C 154.64831 70.592377 154.79626 70.605157 154.9707 70.625 C 155.31959 70.664647 155.69902 70.694662 156.17383 70.720703 C 157.12345 70.772823 158.425 70.816249 160.03516 70.853516 C 163.25547 70.928048 167.67701 70.972656 172.57617 70.972656 C 177.47534 70.972656 181.89883 70.928048 185.11914 70.853516 C 186.7293 70.816098 188.0289 70.772823 188.97852 70.720703 C 189.45332 70.694624 189.83471 70.664647 190.18359 70.625 C 190.35802 70.605346 190.50601 70.592377 190.78125 70.529297 C 190.91886 70.497927 191.07411 70.475535 191.4375 70.308594 C 191.52836 70.266868 191.63102 70.21091 191.76172 70.130859 C 191.89241 70.050771 192.23247 69.779082 192.23438 69.777344 C 192.23628 69.77559 192.85451 68.988086 192.85547 68.986328 C 192.85642 68.984567 193.22461 67.540828 193.22461 67.539062 L 193.22461 3.4355469 C 193.22461 3.4337818 192.85645 1.9841831 192.85547 1.9824219 C 192.85451 1.9806644 192.23628 1.2009725 192.23438 1.1992188 C 192.23247 1.197465 191.89241 0.91794102 191.76172 0.83789062 C 191.63102 0.75780244 191.52836 0.70188223 191.4375 0.66015625 C 191.0741 0.49321452 190.91887 0.47097438 190.78125 0.43945312 C 190.50599 0.37637281 190.35803 0.36163939 190.18359 0.34179688 C 189.83471 0.30214963 189.45332 0.27998499 188.97852 0.25390625 C 188.0289 0.20178656 186.7293 0.15835989 185.11914 0.12109375 C 181.89883 0.046599262 177.47534 0.00390625 172.57617 0.00390625 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29110"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 256 0.00390625 C 251.10084 0.00390625 246.67735 0.046599262 243.45703 0.12109375 C 241.84687 0.15851107 240.54727 0.20178656 239.59766 0.25390625 C 239.12285 0.27998499 238.74341 0.30214963 238.39453 0.34179688 C 238.22011 0.36145042 238.07211 0.37637281 237.79688 0.43945312 C 237.65926 0.4708232 237.50207 0.49321452 237.13867 0.66015625 C 237.04781 0.70188223 236.94515 0.75784023 236.81445 0.83789062 C 236.68376 0.91797881 236.3437 1.1974802 236.3418 1.1992188 C 236.33989 1.2009725 235.72166 1.9806644 235.7207 1.9824219 C 235.71975 1.9841831 235.35156 3.4337818 235.35156 3.4355469 L 235.35156 67.539062 C 235.35156 67.540828 235.71972 68.984567 235.7207 68.986328 C 235.72166 68.988086 236.33989 69.77559 236.3418 69.777344 C 236.3437 69.779097 236.68376 70.050771 236.81445 70.130859 C 236.94515 70.210948 237.04781 70.266868 237.13867 70.308594 C 237.50207 70.475535 237.65925 70.497776 237.79688 70.529297 C 238.07214 70.592377 238.22009 70.605157 238.39453 70.625 C 238.74342 70.664647 239.12285 70.694662 239.59766 70.720703 C 240.54727 70.772823 241.84687 70.816249 243.45703 70.853516 C 246.67735 70.928048 251.10084 70.972656 256 70.972656 C 260.89917 70.972656 265.3207 70.928048 268.54102 70.853516 C 270.15117 70.816098 271.45273 70.772823 272.40234 70.720703 C 272.87715 70.694624 273.25659 70.664647 273.60547 70.625 C 273.77989 70.605346 273.92789 70.592377 274.20312 70.529297 C 274.34074 70.497927 274.49793 70.475535 274.86133 70.308594 C 274.95219 70.266868 275.05485 70.21091 275.18555 70.130859 C 275.31624 70.050771 275.6563 69.779082 275.6582 69.777344 C 275.66011 69.77559 276.27639 68.988086 276.27734 68.986328 C 276.2783 68.984567 276.64648 67.540828 276.64648 67.539062 L 276.64648 3.4355469 C 276.64648 3.4337818 276.27833 1.9841831 276.27734 1.9824219 C 276.27639 1.9806644 275.66011 1.2009725 275.6582 1.1992188 C 275.6563 1.197465 275.31624 0.91794102 275.18555 0.83789062 C 275.05485 0.75780244 274.95219 0.70188223 274.86133 0.66015625 C 274.49793 0.49321452 274.34075 0.47097438 274.20312 0.43945312 C 273.92786 0.37637281 273.77991 0.36163939 273.60547 0.34179688 C 273.25658 0.30214963 272.87715 0.27998499 272.40234 0.25390625 C 271.45273 0.20178656 270.15117 0.15835989 268.54102 0.12109375 C 265.3207 0.046599262 260.89917 0.00390625 256 0.00390625 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29104"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 339.42188 0.00390625 C 334.5227 0.00390625 330.10117 0.046599262 326.88086 0.12109375 C 325.27071 0.15851107 323.96918 0.20178656 323.01953 0.25390625 C 322.54475 0.27998499 322.16526 0.30214963 321.81641 0.34179688 C 321.64179 0.36145042 321.49394 0.37637281 321.21875 0.43945312 C 321.08118 0.4708232 320.92583 0.49321452 320.5625 0.66015625 C 320.47179 0.70188223 320.36672 0.75784023 320.23633 0.83789062 C 320.10556 0.91797881 319.76556 1.1974802 319.76367 1.1992188 C 319.76174 1.2009725 319.14551 1.9806644 319.14453 1.9824219 C 319.14359 1.9841831 318.77539 3.4337818 318.77539 3.4355469 L 318.77539 67.539062 C 318.77539 67.540828 319.1434 68.984567 319.14453 68.986328 C 319.14551 68.988086 319.76174 69.77559 319.76367 69.777344 C 319.76556 69.779097 320.10556 70.050771 320.23633 70.130859 C 320.3671 70.210948 320.47179 70.266868 320.5625 70.308594 C 320.92609 70.475535 321.08114 70.497776 321.21875 70.529297 C 321.4939 70.592377 321.64194 70.605157 321.81641 70.625 C 322.16526 70.664647 322.54475 70.694662 323.01953 70.720703 C 323.96918 70.772823 325.27071 70.816249 326.88086 70.853516 C 330.10117 70.928048 334.5227 70.972656 339.42188 70.972656 C 344.32105 70.972656 348.74454 70.928048 351.96484 70.853516 C 353.575 70.816098 354.87461 70.772823 355.82422 70.720703 C 356.29904 70.694624 356.67846 70.664647 357.02734 70.625 C 357.20196 70.605346 357.3518 70.592377 357.62695 70.529297 C 357.76453 70.497927 357.91988 70.475535 358.2832 70.308594 C 358.37391 70.266868 358.47703 70.21091 358.60742 70.130859 C 358.73819 70.050771 359.07819 69.779082 359.08008 69.777344 C 359.08197 69.77559 359.70023 68.988086 359.70117 68.986328 C 359.70215 68.984567 360.07031 67.540828 360.07031 67.539062 L 360.07031 3.4355469 C 360.07031 3.4337818 359.70231 1.9841831 359.70117 1.9824219 C 359.70023 1.9806644 359.08197 1.2009725 359.08008 1.1992188 C 359.07819 1.197465 358.73819 0.91794102 358.60742 0.83789062 C 358.47665 0.75780244 358.37391 0.70188223 358.2832 0.66015625 C 357.91961 0.49321452 357.7646 0.47097438 357.62695 0.43945312 C 357.3518 0.37637281 357.20181 0.36163939 357.02734 0.34179688 C 356.67849 0.30214963 356.29904 0.27998499 355.82422 0.25390625 C 354.87461 0.20178656 353.575 0.15835989 351.96484 0.12109375 C 348.74454 0.046599262 344.32105 0.00390625 339.42188 0.00390625 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29098"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 339.42188 441.02734 C 334.5227 441.02734 330.10117 441.07007 326.88086 441.14453 C 325.27071 441.18233 323.96918 441.233 323.01953 441.28516 C 322.54475 441.31161 322.16526 441.33531 321.81641 441.375 C 321.64179 441.3939 321.49394 441.40872 321.21875 441.4707 C 321.08118 441.50094 320.92583 441.52435 320.5625 441.69141 C 320.47179 441.73336 320.36672 441.78901 320.23633 441.86914 C 320.10556 441.94927 319.76556 442.22114 319.76367 442.22266 C 319.76174 442.22439 319.14551 443.01193 319.14453 443.01367 C 319.14359 443.01545 318.77539 444.45725 318.77539 444.45898 L 318.77539 508.56445 C 318.77539 508.56623 319.1434 510.0158 319.14453 510.01758 C 319.14551 510.01932 319.76174 510.80686 319.76367 510.80859 C 319.76556 510.81037 320.10556 511.08236 320.23633 511.16211 C 320.3671 511.24224 320.47179 511.29789 320.5625 511.33984 C 320.92609 511.5069 321.08114 511.5288 321.21875 511.56055 C 321.4939 511.62366 321.64194 511.6366 321.81641 511.65625 C 322.16526 511.69594 322.54475 511.72002 323.01953 511.74609 C 323.96918 511.79825 325.27071 511.84187 326.88086 511.87891 C 330.10117 511.95336 334.5227 512.00391 339.42188 512.00391 C 344.32105 512.00391 348.74454 511.95336 351.96484 511.87891 C 353.575 511.84111 354.87461 511.79787 355.82422 511.74609 C 356.29904 511.71964 356.67846 511.69556 357.02734 511.65625 C 357.20196 511.63735 357.3518 511.62253 357.62695 511.56055 C 357.76453 511.53031 357.91988 511.5069 358.2832 511.33984 C 358.37391 511.29827 358.47703 511.24224 358.60742 511.16211 C 358.73819 511.08198 359.07819 510.81011 359.08008 510.80859 C 359.08197 510.80686 359.70023 510.01932 359.70117 510.01758 C 359.70215 510.0158 360.07031 508.56623 360.07031 508.56445 L 360.07031 444.45898 C 360.07031 444.45725 359.70231 443.01545 359.70117 443.01367 C 359.70023 443.01193 359.08197 442.22439 359.08008 442.22266 C 359.07819 442.22088 358.73819 441.94889 358.60742 441.86914 C 358.47665 441.78901 358.37391 441.73336 358.2832 441.69141 C 357.91961 441.52435 357.7646 441.50245 357.62695 441.4707 C 357.3518 441.40759 357.20181 441.39465 357.02734 441.375 C 356.67849 441.33531 356.29904 441.31123 355.82422 441.28516 C 354.87461 441.233 353.575 441.18157 351.96484 441.14453 C 348.74454 441.07007 344.32105 441.02734 339.42188 441.02734 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29092"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 256 441.02734 C 251.10084 441.02734 246.67735 441.07007 243.45703 441.14453 C 241.84687 441.18233 240.54727 441.233 239.59766 441.28516 C 239.12285 441.31161 238.74341 441.33531 238.39453 441.375 C 238.22011 441.3939 238.07211 441.40872 237.79688 441.4707 C 237.65926 441.50094 237.50207 441.52435 237.13867 441.69141 C 237.04781 441.73336 236.94515 441.78901 236.81445 441.86914 C 236.68376 441.94927 236.3437 442.22114 236.3418 442.22266 C 236.33989 442.22439 235.72166 443.01193 235.7207 443.01367 C 235.71975 443.01545 235.35156 444.45725 235.35156 444.45898 L 235.35156 508.56445 C 235.35156 508.56623 235.71972 510.0158 235.7207 510.01758 C 235.72166 510.01932 236.33989 510.80686 236.3418 510.80859 C 236.3437 510.81037 236.68376 511.08236 236.81445 511.16211 C 236.94515 511.24224 237.04781 511.29789 237.13867 511.33984 C 237.50207 511.5069 237.65925 511.5288 237.79688 511.56055 C 238.07214 511.62366 238.22009 511.6366 238.39453 511.65625 C 238.74342 511.69594 239.12285 511.72002 239.59766 511.74609 C 240.54727 511.79825 241.84687 511.84187 243.45703 511.87891 C 246.67735 511.95336 251.10084 512.00391 256 512.00391 C 260.89917 512.00391 265.3207 511.95336 268.54102 511.87891 C 270.15117 511.84111 271.45273 511.79787 272.40234 511.74609 C 272.87715 511.71964 273.25659 511.69556 273.60547 511.65625 C 273.77989 511.63735 273.92789 511.62253 274.20312 511.56055 C 274.34074 511.53031 274.49793 511.5069 274.86133 511.33984 C 274.95219 511.29827 275.05485 511.24224 275.18555 511.16211 C 275.31624 511.08198 275.6563 510.81011 275.6582 510.80859 C 275.66011 510.80686 276.27639 510.01932 276.27734 510.01758 C 276.2783 510.0158 276.64648 508.56623 276.64648 508.56445 L 276.64648 444.45898 C 276.64648 444.45725 276.27833 443.01545 276.27734 443.01367 C 276.27639 443.01193 275.66011 442.22439 275.6582 442.22266 C 275.6563 442.22088 275.31624 441.94889 275.18555 441.86914 C 275.05485 441.78901 274.95219 441.73336 274.86133 441.69141 C 274.49793 441.52435 274.34075 441.50245 274.20312 441.4707 C 273.92786 441.40759 273.77991 441.39465 273.60547 441.375 C 273.25658 441.33531 272.87715 441.31123 272.40234 441.28516 C 271.45273 441.233 270.15117 441.18157 268.54102 441.14453 C 265.3207 441.07007 260.89917 441.02734 256 441.02734 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29086"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 172.57812 444.05469 C 162.81737 444.05469 154.95898 444.23492 154.95898 444.46094 L 154.95898 508.56641 C 154.95898 508.79227 162.81737 508.97461 172.57812 508.97461 C 182.33888 508.97461 190.19531 508.79242 190.19531 508.56641 L 190.19531 444.46094 C 190.19531 444.23507 182.33888 444.05469 172.57812 444.05469 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="m 66.060547,199.36719 c 1.296237,0 2.466318,-0.0135 3.318359,-0.0332 0.426021,-0.01 0.770232,-0.0214 1.021485,-0.0351 0.125626,-0.007 0.226051,-0.013 0.318359,-0.0234 0.04615,-0.005 0.08538,-0.009 0.158203,-0.0254 0.03641,-0.008 0.07768,-0.0144 0.173828,-0.0586 0.02404,-0.011 0.05136,-0.0257 0.08594,-0.0469 0.03458,-0.0212 0.124495,-0.0933 0.125,-0.0937 5.04e-4,-4.6e-4 0.163809,-0.20852 0.164062,-0.20898 2.53e-4,-4.7e-4 0.09766,-0.3843 0.09766,-0.38477 V 181.4962 c 0,-4.6e-4 -0.0974,-0.38234 -0.09766,-0.38281 -2.53e-4,-4.6e-4 -0.163558,-0.20852 -0.164062,-0.20898 -5.05e-4,-4.7e-4 -0.09042,-0.0726 -0.125,-0.0937 -0.03458,-0.0212 -0.0619,-0.0358 -0.08594,-0.0469 -0.09615,-0.0442 -0.137415,-0.0502 -0.173828,-0.0586 -0.07283,-0.0167 -0.112049,-0.0202 -0.158203,-0.0254 -0.09231,-0.0105 -0.192733,-0.0165 -0.318359,-0.0234 -0.251253,-0.0138 -0.595464,-0.0273 -1.021485,-0.0371 -0.852041,-0.0197 -2.022122,-0.0312 -3.318359,-0.0312 -1.296237,0 -2.466318,0.0115 -3.318359,0.0312 -0.426021,0.01 -0.770232,0.0233 -1.021485,0.0371 -0.125626,0.007 -0.226051,0.0129 -0.318359,0.0234 -0.04615,0.005 -0.08538,0.009 -0.158203,0.0254 -0.03641,0.008 -0.07768,0.0144 -0.173829,0.0586 -0.02404,0.0111 -0.05136,0.0257 -0.08594,0.0469 -0.03458,0.0212 -0.124495,0.0933 -0.125,0.0937 -5.05e-4,4.6e-4 -0.163809,0.20852 -0.164063,0.20898 -2.53e-4,4.7e-4 -0.09766,0.38235 -0.09766,0.38281 v 16.96094 c 0,4.7e-4 0.0974,0.3843 0.09766,0.38477 2.54e-4,4.6e-4 0.163558,0.20852 0.164063,0.20898 5.05e-4,4.7e-4 0.09042,0.0726 0.125,0.0937 0.03458,0.0212 0.0619,0.0358 0.08594,0.0469 0.09615,0.0442 0.137415,0.0502 0.173829,0.0586 0.07283,0.0167 0.112049,0.0202 0.158203,0.0254 0.09231,0.0105 0.192733,0.0165 0.318359,0.0234 0.251253,0.0138 0.595464,0.0253 1.021485,0.0351 0.852041,0.0197 2.022122,0.0332 3.318359,0.0332 z m 0,-1.60157 c -1.286295,0 -2.44812,-0.012 -3.28125,-0.0312 -0.248929,-0.006 -0.396419,-0.0127 -0.580078,-0.0195 v -15.47461 c 0.183659,-0.007 0.331149,-0.0138 0.580078,-0.0195 0.83313,-0.0193 1.994955,-0.0312 3.28125,-0.0312 1.286295,0 2.448119,0.012 3.28125,0.0312 0.248929,0.006 0.396419,0.0127 0.580078,0.0195 v 15.47461 c -0.183659,0.007 -0.331149,0.0138 -0.580078,0.0195 -0.833131,0.0193 -1.994955,0.0312 -3.28125,0.0312 z"
id="path29088" />
<path
id="path29080"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 444.45898 151.92969 C 444.45725 151.92969 443.01545 152.29769 443.01367 152.29883 C 443.01193 152.29981 442.22439 152.91799 442.22266 152.91992 C 442.22088 152.92181 441.94889 153.25985 441.86914 153.39062 C 441.78901 153.5214 441.73336 153.62609 441.69141 153.7168 C 441.52435 154.08001 441.50245 154.23543 441.4707 154.37305 C 441.40759 154.6482 441.39465 154.79628 441.375 154.9707 C 441.33531 155.31955 441.31123 155.69904 441.28516 156.17383 C 441.233 157.12347 441.18157 158.425 441.14453 160.03516 C 441.07007 163.25546 441.02734 167.677 441.02734 172.57617 C 441.02734 177.47531 441.07007 181.89879 441.14453 185.11914 C 441.18233 186.72929 441.233 188.03086 441.28516 188.98047 C 441.31161 189.45529 441.33531 189.83471 441.375 190.18359 C 441.3939 190.35783 441.40872 190.5061 441.4707 190.78125 C 441.50094 190.91882 441.52435 191.07417 441.69141 191.4375 C 441.73336 191.52821 441.78901 191.63133 441.86914 191.76172 C 441.94927 191.89249 442.22114 192.23245 442.22266 192.23438 C 442.22439 192.23626 443.01193 192.85452 443.01367 192.85547 C 443.01545 192.85641 444.45725 193.22461 444.45898 193.22461 L 508.56445 193.22461 C 508.56623 193.22461 510.0158 192.8566 510.01758 192.85547 C 510.01932 192.85452 510.80686 192.23626 510.80859 192.23438 C 510.81037 192.23245 511.08236 191.89249 511.16211 191.76172 C 511.24224 191.63095 511.29789 191.52821 511.33984 191.4375 C 511.5069 191.07391 511.5288 190.9189 511.56055 190.78125 C 511.62366 190.5061 511.6366 190.35802 511.65625 190.18359 C 511.69594 189.83474 511.72002 189.45529 511.74609 188.98047 C 511.79825 188.03086 511.84187 186.72929 511.87891 185.11914 C 511.95336 181.89879 512.00391 177.47531 512.00391 172.57617 C 512.00391 167.677 511.95336 163.25546 511.87891 160.03516 C 511.84111 158.425 511.79787 157.12347 511.74609 156.17383 C 511.71964 155.69904 511.69556 155.31959 511.65625 154.9707 C 511.63735 154.79647 511.62253 154.6482 511.56055 154.37305 C 511.53031 154.23547 511.5069 154.08012 511.33984 153.7168 C 511.29827 153.62609 511.24224 153.52102 511.16211 153.39062 C 511.08198 153.25985 510.81011 152.92181 510.80859 152.91992 C 510.80686 152.91799 510.01932 152.29981 510.01758 152.29883 C 510.0158 152.29788 508.56623 151.92969 508.56445 151.92969 L 444.45898 151.92969 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29074"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 444.45898 235.35156 C 444.45725 235.35156 443.01545 235.72152 443.01367 235.72266 C 443.01193 235.7236 442.22439 236.33991 442.22266 236.3418 C 442.22088 236.34372 441.94889 236.68368 441.86914 236.81445 C 441.78901 236.94522 441.73336 237.04796 441.69141 237.13867 C 441.52435 237.50226 441.50245 237.65922 441.4707 237.79688 C 441.40759 238.07202 441.39465 238.22011 441.375 238.39453 C 441.33531 238.74338 441.31123 239.12283 441.28516 239.59766 C 441.233 240.54726 441.18157 241.84688 441.14453 243.45703 C 441.07007 246.67734 441.02734 251.10086 441.02734 256 C 441.02734 260.89917 441.07007 265.32071 441.14453 268.54102 C 441.18233 270.15117 441.233 271.4527 441.28516 272.40234 C 441.31161 272.87713 441.33531 273.25658 441.375 273.60547 C 441.3939 273.7797 441.40872 273.92798 441.4707 274.20312 C 441.50094 274.3407 441.52435 274.498 441.69141 274.86133 C 441.73336 274.95204 441.78901 275.05515 441.86914 275.18555 C 441.94927 275.31632 442.22114 275.65631 442.22266 275.6582 C 442.22439 275.66013 443.01193 276.27636 443.01367 276.27734 C 443.01545 276.27829 444.45725 276.64648 444.45898 276.64648 L 508.56445 276.64648 C 508.56623 276.64648 510.0158 276.2781 510.01758 276.27734 C 510.01932 276.27636 510.80686 275.66013 510.80859 275.6582 C 510.81037 275.65631 511.08236 275.31632 511.16211 275.18555 C 511.24224 275.05478 511.29789 274.95204 511.33984 274.86133 C 511.5069 274.49812 511.5288 274.34074 511.56055 274.20312 C 511.62366 273.92798 511.6366 273.77989 511.65625 273.60547 C 511.69594 273.25662 511.72002 272.87713 511.74609 272.40234 C 511.79825 271.4527 511.84187 270.15117 511.87891 268.54102 C 511.95336 265.32071 512.00391 260.89917 512.00391 256 C 512.00391 251.10086 511.95336 246.67734 511.87891 243.45703 C 511.84111 241.84688 511.79787 240.54726 511.74609 239.59766 C 511.71964 239.12283 511.69556 238.74342 511.65625 238.39453 C 511.63735 238.2203 511.62253 238.07202 511.56055 237.79688 C 511.53031 237.6593 511.5069 237.502 511.33984 237.13867 C 511.29827 237.04796 511.24224 236.94485 511.16211 236.81445 C 511.08198 236.68368 510.81011 236.34372 510.80859 236.3418 C 510.80686 236.33991 510.01932 235.7236 510.01758 235.72266 C 510.0158 235.72171 508.56623 235.35156 508.56445 235.35156 L 444.45898 235.35156 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29068"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 444.45898 318.77539 C 444.45725 318.77539 443.01545 319.1434 443.01367 319.14453 C 443.01193 319.14551 442.22439 319.76174 442.22266 319.76367 C 442.22088 319.76556 441.94889 320.10556 441.86914 320.23633 C 441.78901 320.3671 441.73336 320.47179 441.69141 320.5625 C 441.52435 320.92609 441.50245 321.08114 441.4707 321.21875 C 441.40759 321.4939 441.39465 321.64194 441.375 321.81641 C 441.33531 322.16526 441.31123 322.54475 441.28516 323.01953 C 441.233 323.96918 441.18157 325.27071 441.14453 326.88086 C 441.07007 330.10117 441.02734 334.5227 441.02734 339.42188 C 441.02734 344.32105 441.07007 348.74454 441.14453 351.96484 C 441.18233 353.575 441.233 354.87461 441.28516 355.82422 C 441.31161 356.29904 441.33531 356.67846 441.375 357.02734 C 441.3939 357.20196 441.40872 357.3518 441.4707 357.62695 C 441.50094 357.76453 441.52435 357.91988 441.69141 358.2832 C 441.73336 358.37391 441.78901 358.47703 441.86914 358.60742 C 441.94927 358.73819 442.22114 359.07819 442.22266 359.08008 C 442.22439 359.08197 443.01193 359.70023 443.01367 359.70117 C 443.01545 359.70215 444.45725 360.07031 444.45898 360.07031 L 508.56445 360.07031 C 508.56623 360.07031 510.0158 359.70231 510.01758 359.70117 C 510.01932 359.70023 510.80686 359.08197 510.80859 359.08008 C 510.81037 359.07819 511.08236 358.73819 511.16211 358.60742 C 511.24224 358.47665 511.29789 358.37391 511.33984 358.2832 C 511.5069 357.91999 511.5288 357.7646 511.56055 357.62695 C 511.62366 357.3518 511.6366 357.20181 511.65625 357.02734 C 511.69594 356.67849 511.72002 356.29904 511.74609 355.82422 C 511.79825 354.87461 511.84187 353.575 511.87891 351.96484 C 511.95336 348.74454 512.00391 344.32105 512.00391 339.42188 C 512.00391 334.5227 511.95336 330.10117 511.87891 326.88086 C 511.84111 325.27071 511.79787 323.96918 511.74609 323.01953 C 511.71964 322.54475 511.69556 322.16526 511.65625 321.81641 C 511.63735 321.64179 511.62253 321.49394 511.56055 321.21875 C 511.53031 321.08118 511.5069 320.92583 511.33984 320.5625 C 511.29827 320.47179 511.24224 320.36672 511.16211 320.23633 C 511.08198 320.10556 510.81011 319.76556 510.80859 319.76367 C 510.80686 319.76174 510.01932 319.14551 510.01758 319.14453 C 510.0158 319.14359 508.56623 318.77539 508.56445 318.77539 L 444.45898 318.77539 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29062"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 3.4355469 318.77539 C 3.4337818 318.77539 1.9841831 319.1434 1.9824219 319.14453 C 1.9806644 319.14551 1.2009725 319.76174 1.1992188 319.76367 C 1.197465 319.76556 0.91797881 320.10556 0.83789062 320.23633 C 0.75780244 320.3671 0.70188223 320.47179 0.66015625 320.5625 C 0.49321452 320.92609 0.47687156 321.08114 0.4453125 321.21875 C 0.38223219 321.4939 0.3616016 321.64194 0.34179688 321.81641 C 0.30214963 322.16526 0.27998499 322.54475 0.25390625 323.01953 C 0.20178656 323.96918 0.15835989 325.27071 0.12109375 326.88086 C 0.046599262 330.10117 0.00390625 334.5227 0.00390625 339.42188 C 0.00390625 344.32105 0.046599262 348.74454 0.12109375 351.96484 C 0.15851107 353.575 0.20178656 354.87461 0.25390625 355.82422 C 0.27998499 356.29904 0.30214963 356.67846 0.34179688 357.02734 C 0.36145042 357.20196 0.38223219 357.3518 0.4453125 357.62695 C 0.47668258 357.76453 0.49321452 357.91988 0.66015625 358.2832 C 0.70188223 358.37391 0.75784023 358.47703 0.83789062 358.60742 C 0.91797881 358.73819 1.1974802 359.07819 1.1992188 359.08008 C 1.2009725 359.08197 1.9787113 359.70023 1.9804688 359.70117 C 1.98223 359.70215 3.4337818 360.07031 3.4355469 360.07031 L 67.539062 360.07031 C 67.540828 360.07031 68.984567 359.70231 68.986328 359.70117 C 68.988086 359.70023 69.77559 359.08197 69.777344 359.08008 C 69.779097 359.07819 70.050771 358.73819 70.130859 358.60742 C 70.210948 358.47665 70.266868 358.37391 70.308594 358.2832 C 70.475535 357.91999 70.497776 357.7646 70.529297 357.62695 C 70.592377 357.3518 70.605157 357.20181 70.625 357.02734 C 70.664647 356.67849 70.694662 356.29904 70.720703 355.82422 C 70.772823 354.87461 70.816249 353.575 70.853516 351.96484 C 70.92801 348.74454 70.972656 344.32105 70.972656 339.42188 C 70.972656 334.5227 70.92801 330.10117 70.853516 326.88086 C 70.816098 325.27071 70.772823 323.96918 70.720703 323.01953 C 70.694624 322.54475 70.664647 322.16526 70.625 321.81641 C 70.605346 321.64179 70.592377 321.49394 70.529297 321.21875 C 70.497927 321.08118 70.475535 320.92583 70.308594 320.5625 C 70.266868 320.47179 70.21091 320.36672 70.130859 320.23633 C 70.050771 320.10556 69.779082 319.76556 69.777344 319.76367 C 69.77559 319.76174 68.988086 319.14551 68.986328 319.14453 C 68.984567 319.14359 67.540828 318.77539 67.539062 318.77539 L 3.4355469 318.77539 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29056"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 3.4355469 235.35156 C 3.4337818 235.35156 1.9841831 235.72152 1.9824219 235.72266 C 1.9806644 235.7236 1.2009725 236.33991 1.1992188 236.3418 C 1.197465 236.34372 0.91797881 236.68368 0.83789062 236.81445 C 0.75780244 236.94522 0.70188223 237.04796 0.66015625 237.13867 C 0.49321452 237.50226 0.47687156 237.65922 0.4453125 237.79688 C 0.38223219 238.07202 0.3616016 238.22011 0.34179688 238.39453 C 0.30214963 238.74338 0.27998499 239.12283 0.25390625 239.59766 C 0.20178656 240.54726 0.15835989 241.84688 0.12109375 243.45703 C 0.046599262 246.67734 0.00390625 251.10086 0.00390625 256 C 0.00390625 260.89917 0.046599262 265.32071 0.12109375 268.54102 C 0.15851107 270.15117 0.20178656 271.4527 0.25390625 272.40234 C 0.27998499 272.87713 0.30214963 273.25658 0.34179688 273.60547 C 0.36145042 273.7797 0.38223219 273.92798 0.4453125 274.20312 C 0.47668258 274.3407 0.49321452 274.498 0.66015625 274.86133 C 0.70188223 274.95204 0.75784023 275.05515 0.83789062 275.18555 C 0.91797881 275.31632 1.1974802 275.65631 1.1992188 275.6582 C 1.2009725 275.66013 1.9787113 276.27636 1.9804688 276.27734 C 1.98223 276.27829 3.4337818 276.64648 3.4355469 276.64648 L 67.539062 276.64648 C 67.540828 276.64648 68.984567 276.2781 68.986328 276.27734 C 68.988086 276.27636 69.77559 275.66013 69.777344 275.6582 C 69.779097 275.65631 70.050771 275.31632 70.130859 275.18555 C 70.210948 275.05478 70.266868 274.95204 70.308594 274.86133 C 70.475535 274.49812 70.497776 274.34074 70.529297 274.20312 C 70.592377 273.92798 70.605157 273.77989 70.625 273.60547 C 70.664647 273.25662 70.694662 272.87713 70.720703 272.40234 C 70.772823 271.4527 70.816249 270.15117 70.853516 268.54102 C 70.92801 265.32071 70.972656 260.89917 70.972656 256 C 70.972656 251.10086 70.92801 246.67734 70.853516 243.45703 C 70.816098 241.84688 70.772823 240.54726 70.720703 239.59766 C 70.694624 239.12283 70.664647 238.74342 70.625 238.39453 C 70.605346 238.2203 70.592377 238.07202 70.529297 237.79688 C 70.497927 237.6593 70.475535 237.502 70.308594 237.13867 C 70.266868 237.04796 70.21091 236.94485 70.130859 236.81445 C 70.050771 236.68368 69.779082 236.34372 69.777344 236.3418 C 69.77559 236.33991 68.988086 235.7236 68.986328 235.72266 C 68.984567 235.72171 67.540828 235.35156 67.539062 235.35156 L 3.4355469 235.35156 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29050"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6.05197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 3.4355469 151.92969 C 3.4337818 151.92969 1.9841831 152.29769 1.9824219 152.29883 C 1.9806644 152.29981 1.2009725 152.91799 1.1992188 152.91992 C 1.197465 152.92181 0.91797881 153.25985 0.83789062 153.39062 C 0.75780244 153.5214 0.70188223 153.62609 0.66015625 153.7168 C 0.49321452 154.08001 0.47687156 154.23543 0.4453125 154.37305 C 0.38223219 154.6482 0.3616016 154.79628 0.34179688 154.9707 C 0.30214963 155.31955 0.27998499 155.69904 0.25390625 156.17383 C 0.20178656 157.12347 0.15835989 158.425 0.12109375 160.03516 C 0.046599262 163.25546 0.00390625 167.677 0.00390625 172.57617 C 0.00390625 177.47531 0.046599262 181.89879 0.12109375 185.11914 C 0.15851107 186.72929 0.20178656 188.03086 0.25390625 188.98047 C 0.27998499 189.45529 0.30214963 189.83471 0.34179688 190.18359 C 0.36145042 190.35783 0.38223219 190.5061 0.4453125 190.78125 C 0.47668258 190.91882 0.49321452 191.07417 0.66015625 191.4375 C 0.70188223 191.52821 0.75784023 191.63133 0.83789062 191.76172 C 0.91797881 191.89249 1.1974802 192.23245 1.1992188 192.23438 C 1.2009725 192.23626 1.9787113 192.85452 1.9804688 192.85547 C 1.98223 192.85641 3.4337818 193.22461 3.4355469 193.22461 L 67.539062 193.22461 C 67.540828 193.22461 68.984567 192.8566 68.986328 192.85547 C 68.988086 192.85452 69.77559 192.23626 69.777344 192.23438 C 69.779097 192.23245 70.050771 191.89249 70.130859 191.76172 C 70.210948 191.63095 70.266868 191.52821 70.308594 191.4375 C 70.475535 191.07391 70.497776 190.9189 70.529297 190.78125 C 70.592377 190.5061 70.605157 190.35802 70.625 190.18359 C 70.664647 189.83474 70.694662 189.45529 70.720703 188.98047 C 70.772823 188.03086 70.816249 186.72929 70.853516 185.11914 C 70.92801 181.89879 70.972656 177.47531 70.972656 172.57617 C 70.972656 167.677 70.92801 163.25546 70.853516 160.03516 C 70.816098 158.425 70.772823 157.12347 70.720703 156.17383 C 70.694624 155.69904 70.664647 155.31959 70.625 154.9707 C 70.605346 154.79647 70.592377 154.6482 70.529297 154.37305 C 70.497927 154.23547 70.475535 154.08012 70.308594 153.7168 C 70.266868 153.62609 70.21091 153.52102 70.130859 153.39062 C 70.050771 153.25985 69.779082 152.92181 69.777344 152.91992 C 69.77559 152.91799 68.988086 152.29981 68.986328 152.29883 C 68.984567 152.29788 67.540828 151.92969 67.539062 151.92969 L 3.4355469 151.92969 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29044"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.06423;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 178.68945 134.11719 C 168.38151 134.11719 159.08039 134.20194 152.32812 134.33203 C 148.95199 134.39708 146.2168 134.4718 144.27539 134.56055 C 143.30468 134.60492 142.54129 134.64826 141.91992 134.70703 C 141.60924 134.73651 141.35322 134.76323 140.98242 134.83398 C 140.79704 134.86951 140.60775 134.88978 140.15625 135.0625 C 139.9305 135.14886 139.63083 135.24388 139.10742 135.64453 C 138.97657 135.74469 138.83798 135.86771 138.67969 136.0293 C 138.5214 136.19087 138.17874 136.64689 138.17773 136.64844 C 138.17572 136.6515 137.51953 138.86022 137.51953 138.86328 L 137.51953 239.98828 C 137.51953 239.99138 138.17572 242.20006 138.17773 242.20312 C 138.17874 242.20467 138.52139 242.66073 138.67969 242.82227 C 138.83797 242.98403 138.97657 243.11461 139.10742 243.21484 C 139.63083 243.61551 139.9305 243.71051 140.15625 243.79688 C 140.60775 243.9696 140.79702 243.99024 140.98242 244.02539 C 141.35323 244.09607 141.60924 244.12286 141.91992 244.15234 C 142.54129 244.21093 143.30468 244.25423 144.27539 244.29883 C 146.2168 244.38765 148.95199 244.46234 152.32812 244.52734 C 159.08039 244.65736 168.38151 244.73437 178.68945 244.73438 L 200.16992 244.73438 C 210.47787 244.73438 219.77898 244.65736 226.53125 244.52734 C 229.90738 244.46234 232.64257 244.38727 234.58398 244.29883 C 235.55469 244.25461 236.31027 244.2113 236.93164 244.15234 C 237.24232 244.12211 237.49834 244.09607 237.86914 244.02539 C 238.05453 243.99137 238.24576 243.9696 238.69727 243.79688 C 238.92302 243.71032 239.22074 243.61547 239.74414 243.21484 C 239.87499 243.11469 240.02138 242.98373 240.17969 242.82227 C 240.33797 242.66088 240.68063 242.20467 240.68164 242.20312 C 240.68366 242.20006 241.33984 239.99138 241.33984 239.98828 L 241.33984 138.86328 C 241.33984 138.86022 240.68366 136.6515 240.68164 136.64844 C 240.68063 136.64689 240.33798 136.19087 240.17969 136.0293 C 240.0214 135.86772 239.87501 135.7447 239.74414 135.64453 C 239.22074 135.24388 238.92302 135.14885 238.69727 135.0625 C 238.24576 134.88981 238.05454 134.86936 237.86914 134.83398 C 237.49833 134.76323 237.24232 134.73644 236.93164 134.70703 C 236.31027 134.64822 235.55469 134.60488 234.58398 134.56055 C 232.64257 134.47184 229.90738 134.39708 226.53125 134.33203 C 219.77898 134.20194 210.47787 134.11719 200.16992 134.11719 L 178.68945 134.11719 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29038"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.06423;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 311.82812 134.11719 C 301.52018 134.11719 292.22102 134.20194 285.46875 134.33203 C 282.09262 134.39708 279.36329 134.4718 277.42188 134.56055 C 276.45117 134.60492 275.68778 134.64826 275.06641 134.70703 C 274.75573 134.73651 274.4997 134.76323 274.12891 134.83398 C 273.94352 134.86951 273.75424 134.88978 273.30273 135.0625 C 273.07698 135.14886 272.77731 135.24388 272.25391 135.64453 C 272.12306 135.74469 271.97666 135.86771 271.81836 136.0293 C 271.66007 136.19087 271.31742 136.64689 271.31641 136.64844 C 271.31439 136.6515 270.66016 138.86022 270.66016 138.86328 L 270.66016 239.98828 C 270.66016 239.99138 271.31439 242.20006 271.31641 242.20312 C 271.31742 242.20467 271.66007 242.66073 271.81836 242.82227 C 271.97665 242.98403 272.12304 243.11461 272.25391 243.21484 C 272.77731 243.61551 273.07698 243.71051 273.30273 243.79688 C 273.75424 243.9696 273.94351 243.99024 274.12891 244.02539 C 274.49972 244.09607 274.75573 244.12286 275.06641 244.15234 C 275.68778 244.21093 276.45117 244.25423 277.42188 244.29883 C 279.36329 244.38765 282.09262 244.46234 285.46875 244.52734 C 292.22102 244.65736 301.52018 244.73437 311.82812 244.73438 L 333.31055 244.73438 C 343.61849 244.73438 352.9196 244.65736 359.67188 244.52734 C 363.04801 244.46234 365.78318 244.38727 367.72461 244.29883 C 368.69531 244.25461 369.45869 244.2113 370.08008 244.15234 C 370.39076 244.12211 370.64681 244.09607 371.01758 244.02539 C 371.20315 243.99137 371.39229 243.9696 371.84375 243.79688 C 372.06939 243.71032 372.36915 243.61547 372.89258 243.21484 C 373.02335 243.11469 373.16203 242.98373 373.32031 242.82227 C 373.47867 242.66088 373.82125 242.20467 373.82227 242.20312 C 373.82427 242.20006 374.47852 239.99138 374.47852 239.98828 L 374.47852 138.86328 C 374.47852 138.86022 373.82427 136.6515 373.82227 136.64844 C 373.82125 136.64689 373.47871 136.19087 373.32031 136.0293 C 373.16195 135.86772 373.02327 135.7447 372.89258 135.64453 C 372.36915 135.24388 372.0695 135.14885 371.84375 135.0625 C 371.39225 134.88981 371.203 134.86936 371.01758 134.83398 C 370.64681 134.76323 370.39076 134.73644 370.08008 134.70703 C 369.45869 134.64822 368.69531 134.60488 367.72461 134.56055 C 365.78318 134.47184 363.04801 134.39708 359.67188 134.33203 C 352.9196 134.20194 343.61849 134.11719 333.31055 134.11719 L 311.82812 134.11719 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29032"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.06423;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 178.68945 267.26367 C 168.38151 267.26367 159.08039 267.34069 152.32812 267.4707 C 148.95199 267.53571 146.2168 267.61235 144.27539 267.70117 C 143.30468 267.74539 142.54129 267.7887 141.91992 267.84766 C 141.60924 267.87789 141.35322 267.90198 140.98242 267.97266 C 140.79704 268.00667 140.60775 268.03626 140.15625 268.20898 C 139.9305 268.29554 139.63083 268.39234 139.10742 268.79297 C 138.97657 268.89313 138.83798 269.01417 138.67969 269.17578 C 138.5214 269.33755 138.17874 269.79533 138.17773 269.79688 C 138.17572 269.79997 137.51953 272.00862 137.51953 272.01172 L 137.51953 373.13477 C 137.51953 373.13786 138.17572 375.34651 138.17773 375.34961 C 138.17874 375.35116 138.52139 375.80913 138.67969 375.9707 C 138.83797 376.13247 138.97657 376.25351 139.10742 376.35352 C 139.63083 376.75418 139.9305 376.85114 140.15625 376.9375 C 140.60775 377.11022 140.79702 377.13087 140.98242 377.16602 C 141.35323 377.23669 141.60924 377.26154 141.91992 377.29102 C 142.54129 377.34998 143.30468 377.39485 144.27539 377.43945 C 146.2168 377.52827 148.95199 377.61077 152.32812 377.67578 C 159.08039 377.8058 168.38151 377.88281 178.68945 377.88281 L 200.16992 377.88281 C 210.47787 377.88281 219.77898 377.8058 226.53125 377.67578 C 229.90738 377.61077 232.64257 377.52827 234.58398 377.43945 C 235.55469 377.39523 236.31027 377.34998 236.93164 377.29102 C 237.24232 377.26078 237.49834 377.23669 237.86914 377.16602 C 238.05453 377.132 238.24576 377.10985 238.69727 376.9375 C 238.92302 376.85095 239.22074 376.75415 239.74414 376.35352 C 239.87499 376.25336 240.02138 376.13232 240.17969 375.9707 C 240.33797 375.80894 240.68063 375.35116 240.68164 375.34961 C 240.68366 375.34651 241.33984 373.13786 241.33984 373.13477 L 241.33984 272.01172 C 241.33984 272.00862 240.68366 269.79997 240.68164 269.79688 C 240.68063 269.79533 240.33798 269.33736 240.17969 269.17578 C 240.0214 269.0144 239.87501 268.89298 239.74414 268.79297 C 239.22074 268.3923 238.92302 268.29535 238.69727 268.20898 C 238.24576 268.03626 238.05454 268.00818 237.86914 267.97266 C 237.49833 267.90198 237.24232 267.87714 236.93164 267.84766 C 236.31027 267.7887 235.55469 267.74382 234.58398 267.69922 C 232.64257 267.6104 229.90738 267.53609 226.53125 267.4707 C 219.77898 267.34069 210.47787 267.26367 200.16992 267.26367 L 178.68945 267.26367 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
<path
id="path29026"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.06423;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:20.1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 311.82812 267.26367 C 301.52018 267.26367 292.22102 267.34069 285.46875 267.4707 C 282.09262 267.53571 279.36329 267.61235 277.42188 267.70117 C 276.45117 267.74539 275.68778 267.7887 275.06641 267.84766 C 274.75573 267.87789 274.4997 267.90198 274.12891 267.97266 C 273.94352 268.00667 273.75424 268.03626 273.30273 268.20898 C 273.07698 268.29554 272.77731 268.39234 272.25391 268.79297 C 272.12306 268.89313 271.97666 269.01417 271.81836 269.17578 C 271.66007 269.33755 271.31742 269.79533 271.31641 269.79688 C 271.31439 269.79997 270.66016 272.00862 270.66016 272.01172 L 270.66016 373.13477 C 270.66016 373.13786 271.31439 375.34651 271.31641 375.34961 C 271.31742 375.35116 271.66007 375.80913 271.81836 375.9707 C 271.97665 376.13247 272.12304 376.25351 272.25391 376.35352 C 272.77731 376.75418 273.07698 376.85114 273.30273 376.9375 C 273.75424 377.11022 273.94351 377.13087 274.12891 377.16602 C 274.49972 377.23669 274.75573 377.26154 275.06641 377.29102 C 275.68778 377.34998 276.45117 377.39485 277.42188 377.43945 C 279.36329 377.52827 282.09262 377.61077 285.46875 377.67578 C 292.22102 377.8058 301.52018 377.88281 311.82812 377.88281 L 333.31055 377.88281 C 343.61849 377.88281 352.9196 377.8058 359.67188 377.67578 C 363.04801 377.61077 365.78318 377.52827 367.72461 377.43945 C 368.69531 377.39523 369.45869 377.34998 370.08008 377.29102 C 370.39076 377.26078 370.64681 377.23669 371.01758 377.16602 C 371.20315 377.132 371.39229 377.10985 371.84375 376.9375 C 372.06939 376.85095 372.36915 376.75415 372.89258 376.35352 C 373.02335 376.25336 373.16203 376.13232 373.32031 375.9707 C 373.47867 375.80894 373.82125 375.35116 373.82227 375.34961 C 373.82427 375.34651 374.47852 373.13786 374.47852 373.13477 L 374.47852 272.01172 C 374.47852 272.00862 373.82427 269.79997 373.82227 269.79688 C 373.82125 269.79533 373.47871 269.33736 373.32031 269.17578 C 373.16195 269.0144 373.02327 268.89298 372.89258 268.79297 C 372.36915 268.3923 372.0695 268.29535 371.84375 268.20898 C 371.39225 268.03626 371.203 268.00818 371.01758 267.97266 C 370.64681 267.90198 370.39076 267.87714 370.08008 267.84766 C 369.45869 267.7887 368.69531 267.74382 367.72461 267.69922 C 365.78318 267.6104 363.04801 267.53609 359.67188 267.4707 C 352.9196 267.34069 343.61849 267.26367 333.31055 267.26367 L 311.82812 267.26367 z "
transform="matrix(0.26458333,0,0,0.26458333,20.39957,63.899563)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 63 KiB

View file

@ -1,40 +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"
width="512"
height="512"
viewBox="0 0 135.46667 135.46666"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(-97.188524,-105.34864)">
<path
id="path28985"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:14.7584;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000"
d="M 94.982422 0.00390625 C 71.389288 0.00390625 52.167969 19.22515 52.167969 42.818359 L 52.167969 469.18164 C 52.167969 492.77485 71.389288 511.99609 94.982422 511.99609 L 417.00977 511.99609 C 440.60294 511.99609 459.83203 492.77485 459.83203 469.18164 L 459.83203 42.818359 C 459.83203 19.22515 440.60294 0.00390625 417.00977 0.00390625 L 94.982422 0.00390625 z M 103.41992 26.378906 L 103.43555 26.378906 L 103.47852 26.378906 A 7.3799441 7.3799441 0 0 0 103.49414 26.378906 C 114.44906 26.379095 123.16782 35.095858 123.16797 46.050781 C 123.16782 57.005742 114.44906 65.732271 103.49414 65.732422 C 92.539218 65.732308 83.814604 57.005742 83.814453 46.050781 C 83.814567 35.125528 92.496785 26.420972 103.41992 26.378906 z M 413.34961 26.378906 L 413.35547 26.378906 L 413.4082 26.378906 A 7.3799441 7.3799441 0 0 0 413.42383 26.378906 C 424.37875 26.379095 433.09555 35.095858 433.0957 46.050781 C 433.09555 57.005742 424.37879 65.732271 413.42383 65.732422 C 402.46891 65.732271 393.74234 57.005742 393.74219 46.050781 C 393.7423 35.123033 402.42296 26.416966 413.34961 26.378906 z M 255.41406 46.908203 L 255.44336 46.908203 C 255.62251 46.907863 255.80301 46.907863 255.98242 46.908203 A 7.3799441 7.3799441 0 0 0 255.99805 46.908203 C 339.83991 46.907901 407.65261 114.71286 407.65234 198.55469 C 407.65072 272.74674 354.23776 334.18996 283.28125 347.15234 L 331.39258 300.47852 C 332.24874 299.74599 333.05963 298.95914 333.79492 298.10547 A 7.3799441 7.3799441 0 0 0 333.86133 298.02539 A 7.3799441 7.3799441 0 0 0 335.3457 295.25781 A 7.3799441 7.3799441 0 0 0 335.35352 295.24219 C 338.14757 290.79829 339.69829 285.67049 338.91797 280.41211 A 7.3799441 7.3799441 0 0 0 338.91797 280.4043 C 337.75648 272.59462 332.49555 265.97275 325.15234 263.07227 L 325.14453 263.07227 C 323.26973 262.33257 321.30165 261.84605 319.29688 261.63867 A 7.3799441 7.3799441 0 0 0 316.45508 261.9043 C 311.92513 262.0294 307.53283 263.28586 303.86914 266.00977 L 303.87695 265.93555 L 303.32422 266.29688 C 303.30532 266.31199 303.27709 266.31301 303.25781 266.32812 A 7.3799441 7.3799441 0 0 0 303.21875 266.36523 L 193.99023 336.69922 C 139.611 312.28434 104.34488 258.39655 104.34375 198.55469 C 104.34292 114.94016 171.804 47.230143 255.41406 46.908203 z M 195.58398 353.21875 C 211.37814 359.38505 227.98929 362.71767 244.87891 363.85742 L 150.21484 455.70312 A 7.3799441 7.3799441 0 0 0 149.55078 456.43945 C 148.01357 458.39453 146.25577 460.16375 144.30859 461.71094 C 130.41127 472.74927 110.42096 470.45607 99.382812 456.55859 C 88.344475 442.66131 90.637682 422.67096 104.53516 411.63281 C 106.47001 410.09609 108.57465 408.78603 110.81055 407.73438 A 7.3799441 7.3799441 0 0 0 111.66602 407.26172 L 195.58398 353.21875 z M 413.34961 449.44922 L 413.35742 449.44922 L 413.4082 449.44922 A 7.3799441 7.3799441 0 0 0 413.42383 449.44922 C 424.37879 449.44941 433.09555 458.1759 433.0957 469.13086 C 433.09555 480.08578 424.37875 488.80258 413.42383 488.80273 C 402.46891 488.80258 393.74433 480.08578 393.74414 469.13086 C 393.74425 458.20307 402.42292 449.48728 413.34961 449.44922 z "
transform="matrix(0.26458333,0,0,0.26458333,97.188524,105.34864)" />
<path
id="path3541"
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:5.14248;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.996354"
d="m 178.30981,157.88318 a 13.388833,13.388833 0 0 1 -13.38884,13.38883 13.388833,13.388833 0 0 1 -13.38883,-13.38883 13.388833,13.388833 0 0 1 13.38883,-13.38883 13.388833,13.388833 0 0 1 13.38884,13.38883 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M130.22 127.548C130.38 127.558 130.3 127.558 130.22 127.548V127.548ZM481.64 172.898C471.03 147.398 449.56 119.898 432.7 111.168C446.42 138.058 454.37 165.048 457.4 185.168C457.405 185.306 457.422 185.443 457.45 185.578C429.87 116.828 383.098 89.1089 344.9 28.7479C329.908 5.05792 333.976 3.51792 331.82 4.08792L331.7 4.15792C284.99 30.1109 256.365 82.5289 249.12 126.898C232.503 127.771 216.219 131.895 201.19 139.035C199.838 139.649 198.736 140.706 198.066 142.031C197.396 143.356 197.199 144.87 197.506 146.323C197.7 147.162 198.068 147.951 198.586 148.639C199.103 149.327 199.76 149.899 200.512 150.318C201.264 150.737 202.096 150.993 202.954 151.071C203.811 151.148 204.676 151.045 205.491 150.768L206.011 150.558C221.511 143.255 238.408 139.393 255.541 139.238C318.369 138.669 352.698 183.262 363.161 201.528C350.161 192.378 326.811 183.338 304.341 187.248C392.081 231.108 368.541 381.784 246.951 376.448C187.487 373.838 149.881 325.467 146.421 285.648C146.421 285.648 157.671 243.698 227.041 243.698C234.541 243.698 255.971 222.778 256.371 216.698C256.281 214.698 213.836 197.822 197.281 181.518C188.434 172.805 184.229 168.611 180.511 165.458C178.499 163.75 176.392 162.158 174.201 160.688C168.638 141.231 168.399 120.638 173.51 101.058C148.45 112.468 128.96 130.508 114.8 146.428H114.68C105.01 134.178 105.68 93.7779 106.25 85.3479C106.13 84.8179 99.022 89.0159 98.1 89.6579C89.5342 95.7103 81.5528 102.55 74.26 110.088C57.969 126.688 30.128 160.242 18.76 211.318C14.224 231.701 12 255.739 12 263.618C12 398.318 121.21 507.508 255.92 507.508C376.56 507.508 478.939 420.281 496.35 304.888C507.922 228.192 481.64 173.82 481.64 172.898Z"/></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -1,20 +0,0 @@
--- Icons directory
local gfs = require("gears.filesystem")
local dir = gfs.get_configuration_dir() .. "icons/"
return {
--- notifications
notification = dir .. "notification.svg",
notification_bell = dir .. "notification_bell.svg",
--- system UI
ram = dir .. "ram.svg",
cpu = dir .. "cpu.svg",
temp = dir .. "temp.svg",
disk = dir .. "disk.svg",
battery = dir .. "battery.svg",
battery_low = dir .. "battery-low.svg",
charging = dir .. "charging.svg",
web_browser = dir .. "firefox.svg",
awesome_logo = dir .. "awesome-logo.svg",
}

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24" y="0"/><path d="M22,6.98V16c0,1.1-0.9,2-2,2H6l-4,4V4c0-1.1,0.9-2,2-2h10.1C14.04,2.32,14,2.66,14,3c0,2.76,2.24,5,5,5 C20.13,8,21.16,7.61,22,6.98z M16,3c0,1.66,1.34,3,3,3s3-1.34,3-3s-1.34-3-3-3S16,1.34,16,3z"/></g></svg>

Before

Width:  |  Height:  |  Size: 398 B

View file

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Pro 6.0.0-alpha3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) --><path d="M241.1 253.9c-27.87-76.61 4.999-160.6 73.75-199.7c-8.5-5.621-17.5-10.5-27.5-14.12C218.1 14.91 142.5 50.66 117.3 119.8C116.5 121.9 102.6 160.3 101.9 162.4c-29.12 80.11-66.37 94.36-87.37 104.1c-20.12 10.37-19.5 40.62 2.1 48.87l243.2 88.49c8.498-19.12 19.5-45.49-3.25-108.1L241.1 253.9zM138.1 444.2c27.62 10 57.5-.3723 73.74-23.25l-115.4-41.99C94.26 406.9 110.4 434.1 138.1 444.2zM501.9 476.2c27.62-10.12 43.87-37.24 41.62-65.24l-115.4 41.99C444.4 475.7 474.2 486.2 501.9 476.2zM625.6 299.4c-20.1-10.62-58.37-24.88-87.37-104.1c-.875-2.125-14.75-40.5-15.5-42.62c-19.75-54.07-70.87-87.74-125.3-87.74c-15.16 0-30.58 2.63-45.65 8.126C282.6 97.25 246.9 173.8 272.1 242.1c.75 2.121 14.75 40.37 15.62 42.62c29.12 80.11 9.625 114.9 .5 136.6c-7.615 17.7 6.032 37.05 24.27 37.05c3.018 0 6.157-.5301 9.351-1.682l300.6-109.4C642.1 340.7 647.3 310.6 625.6 299.4zM347.6 397.2c6.029-28.89 6.381-69.96-15-128.8c-1.322-3.484-14.19-38.64-15.34-41.85c-7.807-21.41-6.805-44.57 2.82-65.22c9.625-20.64 26.71-36.3 48.15-44.09c9.461-3.449 19.29-5.199 29.21-5.199c35.72 0 67.97 22.58 80.07 55.69c.1152 .3281 12.21 33.92 15.63 42.98c21.12 58.35 47.69 89.47 70.92 107.7L347.6 397.2z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1,35 +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"
width="512"
height="512"
viewBox="0 0 135.46665 135.46666"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(-41.959401,-104.53265)">
<path
id="rect2797"
style="fill:#bebebe;stroke:none;stroke-width:5.15738;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
d="m 44.980973,124.18393 c -1.674062,0 -3.021573,1.34811 -3.021573,3.02222 v 25.76855 h 11.126853 v 15.21271 H 41.9594 v 25.76854 c 0,1.67411 1.347511,3.02166 3.021573,3.02166 H 174.4045 c 1.67406,0 3.02157,-1.34755 3.02157,-3.02166 V 168.18741 H 166.29922 V 152.9747 h 11.12685 v -25.76855 c 0,-1.67411 -1.34751,-3.02222 -3.02157,-3.02222 z m 54.614309,16.53587 h 20.194908 v 39.23222 H 99.595282 Z m 33.342818,0.24487 h 20.19435 v 39.23221 H 132.9381 Z m -66.68507,0.24541 H 86.447383 V 180.4423 H 66.25303 Z M 41.9594,206.94822 v 13.39982 h 38.147229 v -13.39982 z m 46.011537,0 v 13.39982 h 89.455133 v -13.39982 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -1,67 +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"
width="512"
height="512"
viewBox="0 0 135.46666 135.46666"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<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 />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(-138.42136,-135.52244)">
<rect
style="opacity:1;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3946"
width="25.197727"
height="10.353477"
x="224.39203"
y="157.66037"
ry="0" />
<rect
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3946-4"
width="25.197727"
height="10.353477"
x="224.39203"
y="196.35707"
ry="0" />
<rect
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect3946-0"
width="25.197727"
height="10.353477"
x="224.39203"
y="177.00871"
ry="0" />
<path
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1.99147;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 175.80143,188.71482 h 39.99936"
id="path3979" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 195.80167,135.52237 c -11.70926,0 -21.20899,9.67772 -21.20899,21.45704 v 53.49804 c 0,0.73309 0.16286,1.41297 0.23438,2.125 -7.53192,6.25262 -12.10747,15.42396 -12.10742,25.30469 -6e-5,18.22002 14.86201,33.08174 33.08203,33.08203 18.22026,7e-5 33.08209,-14.86176 33.08203,-33.08203 4e-5,-9.8798 -4.5768,-19.05013 -12.10742,-25.30273 0.0715,-0.71258 0.23437,-1.39378 0.23437,-2.12696 v -53.49804 c 0,-11.77932 -9.49972,-21.45704 -21.20898,-21.45704 z m 0,8.54297 c 7.05777,0 12.66601,5.65394 12.66601,12.91407 v 53.49804 c 0,0.99364 -0.11184,1.95917 -0.32031,2.89649 a 4.2716821,4.2716821 0 0 0 1.7207,4.42578 c 6.56699,4.59422 10.4727,12.09292 10.47266,20.10742 4e-5,13.60353 -10.93553,24.54106 -24.53906,24.54102 -13.60335,-2.2e-4 -24.53911,-10.93768 -24.53907,-24.54102 -4e-5,-8.01449 3.90372,-15.5132 10.47071,-20.10742 a 4.2716821,4.2716821 0 0 0 1.72265,-4.42578 c -0.20873,-0.93853 -0.32226,-1.90403 -0.32226,-2.89649 v -53.49804 c 0,-7.26013 5.6102,-12.91407 12.66797,-12.91407 z"
id="path4018" />
<path
id="rect944"
style="fill:#d5d5d5;fill-opacity:1;stroke:none;stroke-width:14.0305;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 182.82949,188.91164 v 27.40003 a 24.97855,24.97855 0 0 0 -12.00679,21.34615 24.97855,24.97855 0 0 0 24.97815,24.9787 24.97855,24.97855 0 0 0 24.9787,-24.9787 24.97855,24.97855 0 0 0 -12.0068,-21.34615 v -27.40003 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View file

@ -1,232 +0,0 @@
-------------------------------------------
-- @author https://github.com/Kasper24
-- @copyright 2021-2022 Kasper24
-------------------------------------------
local GLib = require("lgi").GLib
local gobject = require("gears.object")
local gtable = require("gears.table")
local subscribable = require("modules.animation.subscribable")
local tween = require("modules.animation.tween")
local ipairs = ipairs
local table = table
local pairs = pairs
local animation_manager = {}
animation_manager.easing = {
linear = "linear",
inQuad = "inQuad",
outQuad = "outQuad",
inOutQuad = "inOutQuad",
outInQuad = "outInQuad",
inCubic = "inCubic",
outCubic = "outCubic",
inOutCubic = "inOutCubic",
outInCubic = "outInCubic",
inQuart = "inQuart",
outQuart = "outQuart",
inOutQuart = "inOutQuart",
outInQuart = "outInQuart",
inQuint = "inQuint",
outQuint = "outQuint",
inOutQuint = "inOutQuint",
outInQuint = "outInQuint",
inSine = "inSine",
outSine = "outSine",
inOutSine = "inOutSine",
outInSine = "outInSine",
inExpo = "inExpo",
outExpo = "outExpo",
inOutExpo = "inOutExpo",
outInExpo = "outInExpo",
inCirc = "inCirc",
outCirc = "outCirc",
inOutCirc = "inOutCirc",
outInCirc = "outInCirc",
inElastic = "inElastic",
outElastic = "outElastic",
inOutElastic = "inOutElastic",
outInElastic = "outInElastic",
inBack = "inBack",
outBack = "outBack",
inOutBack = "inOutBack",
outInBack = "outInBack",
inBounce = "inBounce",
outBounce = "outBounce",
inOutBounce = "inOutBounce",
outInBounce = "outInBounce",
}
local animation = {}
local instance = nil
local ANIMATION_FRAME_DELAY = 5
local function micro_to_milli(micro)
return micro / 1000
end
local function second_to_micro(sec)
return sec * 1000000
end
local function second_to_milli(sec)
return sec * 1000
end
function animation:start(args)
args = args or {}
-- Awestoer/Rubbto compatibility
-- I'd rather this always be a table, but Awestoer/Rubbto
-- except the :set() method to have 1 number value parameter
-- used to set the target
local is_table = type(args) == "table"
local initial = is_table and (args.pos or self.pos) or self.pos
local subject = is_table and (args.subject or self.subject) or self.subject
local target = is_table and (args.target or self.target) or args
local duration = is_table and (args.duration or self.duration) or self.duration
local easing = is_table and (args.easing or self.easing) or self.easing
duration = self._private.anim_manager._private.instant == true and 0.01 or duration
if self.tween == nil or self.reset_on_stop == true then
self.tween = tween.new({
initial = initial,
subject = subject,
target = target,
duration = second_to_micro(duration),
easing = easing,
})
end
if self._private.anim_manager._private.animations[self.index] == nil then
table.insert(self._private.anim_manager._private.animations, self)
end
self.state = true
self.last_elapsed = GLib.get_monotonic_time()
self.started:fire()
self:emit_signal("started")
end
function animation:set(args)
self:start(args)
self:emit_signal("set")
end
function animation:stop()
self.state = false
self:emit_signal("stopped")
end
function animation:abort(reset)
animation:stop(reset)
self:emit_signal("aborted")
end
function animation:initial()
return self._private.initial
end
function animation_manager:set_instant(value)
self._private.instant = value
end
function animation_manager:new(args)
args = args or {}
args.pos = args.pos or 0
args.subject = args.subject or nil
args.target = args.target or nil
args.duration = args.duration or 0
args.easing = args.easing or nil
args.loop = args.loop or false
args.signals = args.signals or {}
args.update = args.update or nil
args.reset_on_stop = args.reset_on_stop == nil and true or args.reset_on_stop
-- Awestoer/Rubbto compatibility
args.subscribed = args.subscribed or nil
local ret = subscribable()
ret.started = subscribable()
ret.ended = subscribable()
if args.subscribed ~= nil then
ret:subscribe(args.subscribed)
end
for sig, sigfun in pairs(args.signals) do
ret:connect_signal(sig, sigfun)
end
if args.update ~= nil then
ret:connect_signal("update", args.update)
end
gtable.crush(ret, args, true)
gtable.crush(ret, animation, true)
ret._private = {}
ret._private.anim_manager = self
ret._private.initial = args.pos
return ret
end
local function new()
local ret = gobject({})
gtable.crush(ret, animation_manager, true)
ret._private = {}
ret._private.animations = {}
ret._private.instant = false
GLib.timeout_add(GLib.PRIORITY_DEFAULT, ANIMATION_FRAME_DELAY, function()
for index, animation in ipairs(ret._private.animations) do
if animation.state == true then
-- compute delta time
local time = GLib.get_monotonic_time()
local delta = time - animation.last_elapsed
animation.last_elapsed = time
-- If pos is true, the animation has ended
local pos = animation.tween:update(delta)
if pos == true then
-- Loop the animation, don't end it.
-- Useful for widgets like the spinning cicle
if animation.loop == true then
animation.tween:reset()
else
-- Snap to end
animation.pos = animation.tween.target
animation:fire(animation.pos)
animation:emit_signal("update", animation.pos)
animation.state = false
animation.ended:fire(pos)
table.remove(ret._private.animations, index)
animation:emit_signal("ended", animation.pos)
end
-- Animation in process, keep updating
else
animation.pos = pos
animation:fire(animation.pos)
animation:emit_signal("update", animation.pos)
end
else
table.remove(ret._private.animations, index)
end
end
-- call again the function after cooldown
return true
end)
return ret
end
if not instance then
instance = new()
end
return instance

View file

@ -1,34 +0,0 @@
local gobject = require("gears.object")
-- Kidna copying awesotre's stores on a surface level for added compatibility
local function subscribable(args)
local ret = gobject{}
local subscribed = {}
-- Subscrubes a function to the object so that it's called when `fire` is
-- Calls subscribe_callback if it exists as well
function ret:subscribe(func)
local id = tostring(func):gsub("function: ", "")
subscribed[id] = func
if self.subscribe_callback then self.subscribe_callback(func) end
end
-- Unsubscribes a function and calls unsubscribe_callback if it exists
function ret:unsubscribe(func)
if not func then
subscribed = {}
else
local id = tostring(func):gsub("function: ", "")
subscribed[id] = nil
end
if self.unsubscribe_callback then self.unsubscribe_callback(func) end
end
function ret:fire(...) for _, func in pairs(subscribed) do func(...) end end
return ret
end
return subscribable

View file

@ -1,487 +0,0 @@
-- easing
-- Adapted from https://github.com/EmmanuelOga/easing. See LICENSE.txt for credits.
-- For all easing functions:
-- t = time == how much time has to pass for the tweening to complete
-- b = begin == starting property value
-- c = change == ending - beginning
-- d = duration == running time. How much time has passed *right now*
local gobject = require("gears.object")
local gtable = require("gears.table")
local tween = {
_VERSION = 'tween 2.1.1',
_DESCRIPTION = 'tweening for lua',
_URL = 'https://github.com/kikito/tween.lua',
_LICENSE = [[
MIT LICENSE
Copyright (c) 2014 Enrique García Cota, Yuichi Tateno, Emmanuel Oga
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]
}
local pow, sin, cos, pi, sqrt, abs, asin = math.pow, math.sin, math.cos, math.pi, math.sqrt, math.abs, math.asin
-- linear
local function linear(t, b, c, d)
return c * t / d + b
end
-- quad
local function inQuad(t, b, c, d)
return c * pow(t / d, 2) + b
end
local function outQuad(t, b, c, d)
t = t / d
return -c * t * (t - 2) + b
end
local function inOutQuad(t, b, c, d)
t = t / d * 2
if t < 1 then
return c / 2 * pow(t, 2) + b
end
return -c / 2 * ((t - 1) * (t - 3) - 1) + b
end
local function outInQuad(t, b, c, d)
if t < d / 2 then
return outQuad(t * 2, b, c / 2, d)
end
return inQuad((t * 2) - d, b + c / 2, c / 2, d)
end
-- cubic
local function inCubic (t, b, c, d)
return c * pow(t / d, 3) + b
end
local function outCubic(t, b, c, d)
return c * (pow(t / d - 1, 3) + 1) + b
end
local function inOutCubic(t, b, c, d)
t = t / d * 2
if t < 1 then
return c / 2 * t * t * t + b
end
t = t - 2
return c / 2 * (t * t * t + 2) + b
end
local function outInCubic(t, b, c, d)
if t < d / 2 then
return outCubic(t * 2, b, c / 2, d)
end
return inCubic((t * 2) - d, b + c / 2, c / 2, d)
end
-- quart
local function inQuart(t, b, c, d)
return c * pow(t / d, 4) + b
end
local function outQuart(t, b, c, d)
return -c * (pow(t / d - 1, 4) - 1) + b
end
local function inOutQuart(t, b, c, d)
t = t / d * 2
if t < 1 then
return c / 2 * pow(t, 4) + b
end
return -c / 2 * (pow(t - 2, 4) - 2) + b
end
local function outInQuart(t, b, c, d)
if t < d / 2 then
return outQuart(t * 2, b, c / 2, d)
end
return inQuart((t * 2) - d, b + c / 2, c / 2, d)
end
-- quint
local function inQuint(t, b, c, d)
return c * pow(t / d, 5) + b
end
local function outQuint(t, b, c, d)
return c * (pow(t / d - 1, 5) + 1) + b
end
local function inOutQuint(t, b, c, d)
t = t / d * 2
if t < 1 then
return c / 2 * pow(t, 5) + b
end
return c / 2 * (pow(t - 2, 5) + 2) + b
end
local function outInQuint(t, b, c, d)
if t < d / 2 then
return outQuint(t * 2, b, c / 2, d)
end
return inQuint((t * 2) - d, b + c / 2, c / 2, d)
end
-- sine
local function inSine(t, b, c, d)
return -c * cos(t / d * (pi / 2)) + c + b
end
local function outSine(t, b, c, d)
return c * sin(t / d * (pi / 2)) + b
end
local function inOutSine(t, b, c, d)
return -c / 2 * (cos(pi * t / d) - 1) + b
end
local function outInSine(t, b, c, d)
if t < d / 2 then
return outSine(t * 2, b, c / 2, d)
end
return inSine((t * 2) -d, b + c / 2, c / 2, d)
end
-- expo
local function inExpo(t, b, c, d)
if t == 0 then
return b
end
return c * pow(2, 10 * (t / d - 1)) + b - c * 0.001
end
local function outExpo(t, b, c, d)
if t == d then
return b + c
end
return c * 1.001 * (-pow(2, -10 * t / d) + 1) + b
end
local function inOutExpo(t, b, c, d)
if t == 0 then
return b end
if t == d then
return b + c
end
t = t / d * 2
if t < 1 then
return c / 2 * pow(2, 10 * (t - 1)) + b - c * 0.0005
end
return c / 2 * 1.0005 * (-pow(2, -10 * (t - 1)) + 2) + b
end
local function outInExpo(t, b, c, d)
if t < d / 2 then
return outExpo(t * 2, b, c / 2, d)
end
return inExpo((t * 2) - d, b + c / 2, c / 2, d)
end
-- circ
local function inCirc(t, b, c, d)
return(-c * (sqrt(1 - pow(t / d, 2)) - 1) + b)
end
local function outCirc(t, b, c, d)
return(c * sqrt(1 - pow(t / d - 1, 2)) + b)
end
local function inOutCirc(t, b, c, d)
t = t / d * 2
if t < 1 then
return -c / 2 * (sqrt(1 - t * t) - 1) + b
end
t = t - 2
return c / 2 * (sqrt(1 - t * t) + 1) + b
end
local function outInCirc(t, b, c, d)
if t < d / 2 then
return outCirc(t * 2, b, c / 2, d)
end
return inCirc((t * 2) - d, b + c / 2, c / 2, d)
end
-- elastic
local function calculatePAS(p,a,c,d)
p, a = p or d * 0.3, a or 0
if a < abs(c) then
return p, c, p / 4
end -- p, a, s
return p, a, p / (2 * pi) * asin(c/a) -- p,a,s
end
local function inElastic(t, b, c, d, a, p)
local s
if t == 0 then
return b
end
t = t / d
if t == 1 then
return b + c
end
p,a,s = calculatePAS(p,a,c,d)
t = t - 1
return -(a * pow(2, 10 * t) * sin((t * d - s) * (2 * pi) / p)) + b
end
local function outElastic(t, b, c, d, a, p)
local s
if t == 0 then
return b
end
t = t / d
if t == 1 then
return b + c
end
p,a,s = calculatePAS(p,a,c,d)
return a * pow(2, -10 * t) * sin((t * d - s) * (2 * pi) / p) + c + b
end
local function inOutElastic(t, b, c, d, a, p)
local s
if t == 0 then
return b
end
t = t / d * 2
if t == 2 then return b + c end
p,a,s = calculatePAS(p,a,c,d)
t = t - 1
if t < 0 then
return -0.5 * (a * pow(2, 10 * t) * sin((t * d - s) * (2 * pi) / p)) + b
end
return a * pow(2, -10 * t) * sin((t * d - s) * (2 * pi) / p ) * 0.5 + c + b
end
local function outInElastic(t, b, c, d, a, p)
if t < d / 2 then
return outElastic(t * 2, b, c / 2, d, a, p)
end
return inElastic((t * 2) - d, b + c / 2, c / 2, d, a, p)
end
-- back
local function inBack(t, b, c, d, s)
s = s or 1.70158
t = t / d
return c * t * t * ((s + 1) * t - s) + b
end
local function outBack(t, b, c, d, s)
s = s or 1.70158
t = t / d - 1
return c * (t * t * ((s + 1) * t + s) + 1) + b
end
local function inOutBack(t, b, c, d, s)
s = (s or 1.70158) * 1.525
t = t / d * 2
if t < 1 then
return c / 2 * (t * t * ((s + 1) * t - s)) + b
end
t = t - 2
return c / 2 * (t * t * ((s + 1) * t + s) + 2) + b
end
local function outInBack(t, b, c, d, s)
if t < d / 2 then
return outBack(t * 2, b, c / 2, d, s)
end
return inBack((t * 2) - d, b + c / 2, c / 2, d, s)
end
-- bounce
local function outBounce(t, b, c, d)
t = t / d
if t < 1 / 2.75 then
return c * (7.5625 * t * t) + b
end
if t < 2 / 2.75 then
t = t - (1.5 / 2.75)
return c * (7.5625 * t * t + 0.75) + b
elseif t < 2.5 / 2.75 then
t = t - (2.25 / 2.75)
return c * (7.5625 * t * t + 0.9375) + b
end
t = t - (2.625 / 2.75)
return c * (7.5625 * t * t + 0.984375) + b
end
local function inBounce(t, b, c, d)
return c - outBounce(d - t, 0, c, d) + b
end
local function inOutBounce(t, b, c, d)
if t < d / 2 then
return inBounce(t * 2, 0, c, d) * 0.5 + b
end
return outBounce(t * 2 - d, 0, c, d) * 0.5 + c * .5 + b
end
local function outInBounce(t, b, c, d)
if t < d / 2 then
return outBounce(t * 2, b, c / 2, d)
end
return inBounce((t * 2) - d, b + c / 2, c / 2, d)
end
tween.easing =
{
linear = linear,
inQuad = inQuad, outQuad = outQuad, inOutQuad = inOutQuad, outInQuad = outInQuad,
inCubic = inCubic, outCubic = outCubic, inOutCubic = inOutCubic, outInCubic = outInCubic,
inQuart = inQuart, outQuart = outQuart, inOutQuart = inOutQuart, outInQuart = outInQuart,
inQuint = inQuint, outQuint = outQuint, inOutQuint = inOutQuint, outInQuint = outInQuint,
inSine = inSine, outSine = outSine, inOutSine = inOutSine, outInSine = outInSine,
inExpo = inExpo, outExpo = outExpo, inOutExpo = inOutExpo, outInExpo = outInExpo,
inCirc = inCirc, outCirc = outCirc, inOutCirc = inOutCirc, outInCirc = outInCirc,
inElastic = inElastic, outElastic = outElastic, inOutElastic = inOutElastic, outInElastic = outInElastic,
inBack = inBack, outBack = outBack, inOutBack = inOutBack, outInBack = outInBack,
inBounce = inBounce, outBounce = outBounce, inOutBounce = inOutBounce, outInBounce = outInBounce
}
-- Private interface
local function copyTables(destination, keysTable, valuesTable)
valuesTable = valuesTable or keysTable
local mt = getmetatable(keysTable)
if mt and getmetatable(destination) == nil then
setmetatable(destination, mt)
end
for k,v in pairs(keysTable) do
if type(v) == 'table' then
destination[k] = copyTables({}, v, valuesTable[k])
else
destination[k] = valuesTable[k]
end
end
return destination
end
local function checkSubjectAndTargetRecursively(subject, target, path)
path = path or {}
local targetType, newPath
for k,targetValue in pairs(target) do
targetType, newPath = type(targetValue), copyTables({}, path)
table.insert(newPath, tostring(k))
if targetType == 'number' then
assert(type(subject[k]) == 'number', "Parameter '" .. table.concat(newPath,'/') .. "' is missing from subject or isn't a number")
elseif targetType == 'table' then
checkSubjectAndTargetRecursively(subject[k], targetValue, newPath)
else
assert(targetType == 'number', "Parameter '" .. table.concat(newPath,'/') .. "' must be a number or table of numbers")
end
end
end
local function checkNewParams(initial, duration, subject, target, easing)
-- assert(type(initial) == 'number' and duration > 0, "duration must be a positive number. Was " .. tostring(duration))
-- assert(type(duration) == 'number' and duration > 0, "duration must be a positive number. Was " .. tostring(duration))
assert(type(easing)=='function', "easing must be a function. Was " .. tostring(easing))
if subject and target then
local tsubject = type(subject)
assert(tsubject == 'table' or tsubject == 'userdata', "subject must be a table or userdata. Was " .. tostring(subject))
assert(type(target)== 'table', "target must be a table. Was " .. tostring(target))
checkSubjectAndTargetRecursively(subject, target)
end
end
local function getEasingFunction(easing)
easing = easing or "linear"
if type(easing) == 'string' then
local name = easing
easing = tween.easing[name]
if type(easing) ~= 'function' then
error("The easing function name '" .. name .. "' is invalid")
end
end
return easing
end
local function performEasingOnSubject(subject, target, initial, clock, duration, easing)
local t,b,c,d
for k,v in pairs(target) do
if type(v) == 'table' then
performEasingOnSubject(subject[k], v, initial[k], clock, duration, easing)
else
t,b,c,d = clock, initial[k], v - initial[k], duration
subject[k] = easing(t,b,c,d)
end
end
end
local function performEasing(table, initial, target, clock, duration, easing)
if type(target) == "table" then
local t,b,c,d
for k, v in pairs(target) do
if type(v) == 'table' then
table[k] = {}
performEasing(table[k], initial[k], v, clock, duration, easing)
else
t,b,c,d = clock, initial[k], v - initial[k], duration
table[k] = easing(t,b,c,d)
end
end
return table
else
local t, b, c, d = clock, initial, target - initial, duration
return easing(t,b,c,d)
end
end
-- Public interface
local Tween = {}
function Tween:set(clock)
assert(type(clock) == 'number', "clock must be a positive number or 0")
if self.subject and self.initial == 0 then
self.initial = copyTables({}, self.target, self.subject)
end
self.clock = clock
if self.clock <= 0 then
self.clock = 0
if self.subject then
copyTables(self.subject, self.initial)
end
elseif self.clock >= self.duration then -- the tween has expired
self.clock = self.duration
if self.subject then
copyTables(self.subject, self.target)
end
else
if self.subject then
performEasingOnSubject(self.subject, self.target, self.initial, self.clock, self.duration, self.easing)
else
local pos = {}
return performEasing(pos, self.initial, self.target, self.clock, self.duration, self.easing)
end
end
return self.clock >= self.duration
end
function Tween:update(dt)
assert(type(dt) == 'number', "dt must be a number")
return self:set(self.clock + dt)
end
function Tween:reset()
return self:set(0)
end
function tween.new(args)
args = args or {}
args.initial = args.initial or 0
args.subject = args.subject or nil
args.target = args.target or nil
args.duration = args.duration or 0
args.easing = args.easing or nil
args.easing = getEasingFunction(args.easing)
checkNewParams(args.initial, args.duration, args.subject, args.target, args.easing)
local ret = gobject{}
ret.clock = 0
gtable.crush(ret, args, true)
gtable.crush(ret, Tween, true)
return ret
end
return tween

View file

@ -1,365 +0,0 @@
local wibox = require("wibox")
local beautiful = require("beautiful")
local dpi = beautiful.xresources.apply_dpi
local awful = require("awful")
local gears = require("gears")
local rubato = require(tostring(...):match(".*awedock") .. ".rubato")
local function helpers()
local function overloaded()
local fns = {}
local mt = {}
local function oerror()
return error("Invalid argument types to overloaded function")
end
function mt:__call(...)
local arg = { ... }
local default = self.default
local signature = {}
for i, arg in ipairs({ ... }) do
signature[i] = type(arg)
end
signature = table.concat(signature, ",")
return (fns[signature] or self.default)(...)
end
function mt:__index(key)
local signature = {}
local function __newindex(self, key, value)
print(key, type(key), value, type(value))
signature[#signature + 1] = key
fns[table.concat(signature, ",")] = value
print("bind", table.concat(signature, ", "))
end
local function __index(self, key)
print("I", key, type(key))
signature[#signature + 1] = key
return setmetatable({}, { __index = __index, __newindex = __newindex })
end
return __index(self, key)
end
function mt:__newindex(key, value)
fns[key] = value
end
return setmetatable({ default = oerror }, mt)
end
--}}}
local function dec_hex(IN)
local B, K, OUT, I, D = 16, "0123456789ABCDEF", "", 0
while IN > 0 do
I = I + 1
IN, D = math.floor(IN / B), (IN % B) + 1
OUT = string.sub(K, D, D) .. OUT
end
return #OUT == 2 and OUT or "0" .. OUT
end
-- color helpers {{{
local color = {}
color.col_shift = overloaded()
color.col_shift.string.number = function(c, s)
local r, g, b, o = gears.color.parse_color(c)
return "#" .. dec_hex(r * 255 + s) .. dec_hex(g * 255 + s) .. dec_hex(b * 255 + s) .. dec_hex(o * 255)
end
color.col_shift.string.number.number.number = function(c, sr, sg, sb)
local r, g, b, o = gears.color.parse_color(c)
return "#" .. dec_hex(r * 255 + sr) .. dec_hex(g * 255 + sg) .. dec_hex(b * 255 + sb) .. dec_hex(o * 255)
end
color.col_shift.string.number.number.number.number = function(c, sr, sg, sb, so)
local r, g, b, o = gears.color.parse_color(c)
return "#" .. dec_hex(r * 255 + sr) .. dec_hex(g * 255 + sg) .. dec_hex(b * 255 + sb) .. dec_hex(o * 255 + so)
end
color.col_diff = function(f, s)
local fr, fg, fb, fo = gears.color.parse_color(f)
local sr, sg, sb, so = gears.color.parse_color(s)
return sr - fr, sg - fg, sb - fb, so - fo
end
--}}}
return {
color = color,
}
end
local chel = helpers().color
--local function init(s, h, o, shape, pinneds)
local function init(args)
local s = args.screen
local h = args.height or dpi(50)
local o = args.offset or 5
local inner_shape = args.inner_shape or gears.shape.rectangle
local outer_shape = args.outer_shape or gears.shape.rectangle
local pinneds = args.pinneds
-- tasklist creation {{{
local tasklist = awful.widget.tasklist({
screen = s,
source = function()
local ret = {}
for _, t in ipairs(s.tags) do
gears.table.merge(ret, t:clients())
end
return ret
end, --sorts clients in order of their tags
filter = awful.widget.tasklist.filter.alltags,
forced_height = h,
layout = {
layout = wibox.layout.fixed.horizontal,
},
widget_template = {
{
{
nil,
{
{
awful.widget.clienticon,
widget = wibox.container.place,
halign = "center",
valign = "center",
},
widget = wibox.container.margin,
margins = h / 10,
},
{
{
wibox.widget.base.make_widget(),
forced_height = h / 10,
forced_width = h / 10,
id = "status",
bg = beautiful.dock_unfocused_indicator_bg or "#484E5B",
shape = inner_shape,
widget = wibox.container.background,
},
widget = wibox.container.place, --so the bg widget doesnt get stretched
},
layout = wibox.layout.align.vertical,
},
id = "bg",
widget = wibox.container.background,
bg = beautiful.dock_bg or "#061115",
shape = inner_shape,
},
widget = wibox.container.margin,
margins = h / 10,
forced_height = h,
forced_width = h,
create_callback = function(self, c, _, _)
local function hover(p, t) --so gc can collect all the timed objects that are flying around
local on_hover = rubato.timed({
intro = 0.02,
outro = 0.02,
duration = 0.2,
rate = 30,
pos = p,
subscribed = function(pos)
self:get_children_by_id("bg")[1].bg = chel.col_shift(beautiful.dock_bg or "#061115", pos)
end,
})
on_hover.target = t
end
self:connect_signal("mouse::enter", function()
hover(0, 20)
end)
self:connect_signal("mouse::leave", function()
hover(20, 0)
end)
self:add_button(awful.button({
modifiers = {},
button = 1,
on_press = function()
if not c.active then
c:activate({
context = "through_dock",
switch_to_tag = true,
})
else
c.minimized = true
end
end,
}))
end,
update_callback = function(self, c, _, _) --praying to the gc that this is getting cleared properly, didnt show problems in testing
collectgarbage("collect")
local status_w = rubato.timed({
intro = 0.02,
outro = 0.02,
duration = 0.1,
rate = 30,
pos = self:get_children_by_id("status")[1].forced_width,
subscribed = function(pos)
self:get_children_by_id("status")[1].forced_width = pos
end,
})
local bg_col = beautiful.dock_unfocused_indicator_bg or "#484E5B"
local bg_focus_col = beautiful.dock_indicator_bg or "#6791C9"
local sh_r, sh_g, sh_b, _ = chel.col_diff(bg_col, bg_focus_col)
local status_c = rubato.timed({
intro = 0.04,
outro = 0.04,
duration = 0.2,
rate = 30,
pos = 0,
subscribed = function(pos)
self:get_children_by_id("status")[1].bg = chel.col_shift(
bg_col,
math.floor(pos * (255 * sh_r)),
math.floor((sh_g * 255) * pos),
math.floor((sh_b * 255) * pos)
)
end,
})
--this here sets width and colors depending on the status of the client a widget in the tasklist represents
if c.active then
status_w.target = h / 2
status_c.target = 1
elseif c.minimized then
status_w.target = h / 10
status_c.target = 0
else
status_w.target = h / 3
status_c.target = 0
end
end,
},
})
-- }}}
-- the funny desktop starters {{{
local pinned_apps = pinneds and { layout = wibox.layout.fixed.horizontal } or nil
if pinneds then
for _, p in ipairs(pinneds) do
pinned_apps[#pinned_apps + 1] = wibox.widget({
{
{
nil,
{
{
{
widget = wibox.widget.imagebox,
image = p.icon,
resize = true,
},
margins = dpi(5),
widget = wibox.container.margin,
},
widget = wibox.container.place,
halign = "center",
valign = "center",
},
{
{
wibox.widget.base.make_widget(),
forced_height = h / 10,
forced_width = h / 10,
id = "status",
shape = inner_shape,
widget = wibox.container.background,
},
widget = wibox.container.place, --so the bg widget doesnt get stretched
halign = "center",
},
layout = wibox.layout.align.vertical,
},
widget = wibox.container.background,
shape = inner_shape,
id = "bg",
buttons = awful.button({}, 1, function()
awful.spawn.easy_async(p.start_cmd)
end),
},
widget = wibox.container.margin,
margins = h / 10,
forced_width = h,
forced_height = h,
})
local self = pinned_apps[#pinned_apps]
local function hover(po, t) --so gc can collect all the timed objects that are flying around
local on_hover = rubato.timed({
intro = 0.02,
outro = 0.02,
duration = 0.2,
rate = 30,
pos = po,
subscribed = function(pos)
self:get_children_by_id("bg")[1].bg = chel.col_shift(beautiful.dock_bg or "#061115", pos)
end,
})
on_hover.target = t
end
self:connect_signal("mouse::enter", function()
hover(0, 20)
end)
self:connect_signal("mouse::leave", function()
hover(20, 0)
end)
self:add_button(
awful.button({ --this is very hacky. Please do NOT COPY if you are looking for suggestions on how to implement this
modifiers = {},
button = 1,
on_press = function() end,
})
)
end
end
-- }}}
local dock_box = awful.popup({
ontop = true,
screen = s,
x = s.geometry.x + s.geometry.width / 2,
y = s.geometry.y + s.geometry.height - (h + o),
shape = outer_shape,
widget = {
{
{
pinned_apps,
tasklist,
layout = wibox.layout.fixed.horizontal,
},
widget = wibox.container.margin,
margin = dpi(5),
},
widget = wibox.container.background,
bg = beautiful.dock_bg or "#061115",
shape = inner_shape,
},
})
dock_box:connect_signal("property::width", function() --for centered placement, wanted to keep the offset
dock_box.x = s.geometry.x + s.geometry.width / 2 - dock_box.width / 2
end)
local autohideanim = rubato.timed({
intro = 0.3,
outro = 0.1,
duration = 0.4,
pos = 0,
rate = 60,
easing = rubato.quadratic,
subscribed = function(pos)
dock_box.y = s.geometry.y + s.geometry.height - ((pos * h) + o)
dock_box.opacity = pos
end,
})
local autohidetimer = gears.timer({
timeout = 2,
single_shot = true,
callback = function()
autohideanim.target = 0
end,
})
dock_box:connect_signal("mouse::leave", function()
autohidetimer:again()
end)
dock_box:connect_signal("mouse::enter", function()
autohideanim.target = 1
autohidetimer:stop()
end)
return dock_box
end
return {
init = init,
}

View file

@ -1,11 +0,0 @@
root = true
[*.lua]
charset = utf-8
intent_style = tab
indent_size = 4
trim_trailing_whitespace = true
max_line_length = 120
[*.md]
trim_trailing_whitespace = false

View file

@ -1 +0,0 @@
tags

View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021 andOrlando
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,400 +0,0 @@
# rubato
- [Background and explanation](#background)
- [How to actually use it](#usage)
- [But why though?](#why)
- [Arguments and Methods](#arguments-methods)
- [Custom Easing Functions](#easing)
- [Installation](#install)
- [Why the name?](#name)
- [Todo](#todo)
Basically like [awestore](https://github.com/K4rakara/awestore) but not really.
Join the cool curve crew
<!-- look colleges might see this and think its distasteful so I'm commenting it out for the moment
<img src="https://cdn.discordapp.com/attachments/702548961780826212/879022533314216007/download.jpeg" height=160>-->
<h1 id="background">Background and Explanation</h1>
The general premise of this is that I don't understand how awestore works. That and I really wanted to be able to have an interpolator that didn't have a set time. That being said, I haven't made an interpolator that doesn't have a set time yet, so I just have this instead. It has a similar function to awestore but the method in which you actually go about doing the easing is very different.
When creating an animation, the goal is to make it as smooth as humanly possible, but I was finding that with conventional methods, should the animation be interrupted with another call for animation, it would look jerky and inconsistent. You can see this jerkiness everywhere in websites made by professionals and it makes me very sad. I didnt want that for my desktop so I used a bit of a different method.
This jerkiness is typically caused by discontinuous velocity graphs. One moment its slowing down, and the next its way too fast. This is caused by just lazily starting the animation anew when already in the process of animating. This kind of velocity graph looks like this:
<img src="images/disconnected_graph.png" alt="Disconnected Velocity Graph" height=160/>
Whereas rubato takes into account this initial velocity and restarts animation taking it into account. In the case of one wanting to interpolate from one point to another and then back, it would look like this:
<img src="images/connected_graph.png" alt="Connected Velocity Graph" height=160/>
<sub><sup>okay maybe my graph consistancy is trash, what can I do...</sup></sub>
These are what they would look like with forwards-and-back animations. A forwards-than-forwards animation would look more like this, just for reference:
<img src="images/forwards_forwards_graph.png" alt="Forwards ForwardsGraph" height=160/>
To ask one of you to give these graphs as inputs, however, would be really dumb. So instead we define an intro function and its duration, which in the figure above is the `y=x` portion, an outro function and its duration, which is the `y=-x` portion, and the rest is filled with constant velocity. The area under the curve for this must be equal to the position for this to end up at the correct position (antiderivative of velocity is position). If we know the area under the curve for the intro and outro functions, the only component we need to ensure that the antiderivative is equal to the position would be the height of the graph. We find that with this formula:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}m=\frac{d %2B ib(F_i(1)-1)}{i(F_i(1)-1) %2B o(F_o(1)-1) %2B t}" height=50>
where `m` is the height of the plateau, `i` is intro duration, `F_i` is the antiderivative of the intro easing function, `o` is outro duration, `F_o` is the antiderivative of the outro easing function, `d` is the total distance needed to be traveled, `b` is the initial slope, and `t` is the total duration.
We then simulate the antiderivative by adding `v(t)` (or the y-value at time `t` on the slope graph) to the current position 30 times per second (by default, but I recommend 60). There is some inaccuracy since its not a perfect antiderivative and theres some weirdness when going from positive slopes to negative slopes that I dont know how to intelligently fix (I have to simulate the antiderivative beforehand and multiply everything by a coefficient to prevent weird errors), but overall it results in good looking interruptions and I get a dopamine hit whenever I see it in action.
There are two main small issues that I cant/dont know how to fix mathematically:
- Its not perfectly accurate (it is perfectly accurate as `dt` goes to zero) which I dont think is possible to fix unless I stop simulating the antiderivative and actually calc out the function, which seems time inefficient
- When going from a positive m to a negative m, or in other words going backwards after going forwards in the animation, it will always undershoot by some value. I dont know what that value is, I dont know where it comes from, I dont know how to fix it except for lots and lots of time-consuming testing, but its there. To compensate for this, whenever theres a situation in which this will happen, I simulate the animation beforehand and multiply the entire animation by a corrective coefficient to make it do what I want
- Awesome is kinda slow at redrawing imaages, so 60 redraws per second is realistically probably not going to happen. If you were to, for example, set the redraws per second to 500 or some arbitrarily large value, if I did nothing to dt, it would take forever to complete an animaiton. So since I can't fix awesome, I just (by default but this is optional) limit the rate based on the time it takes for awesome to render the first frame of the animation (Thanks Kasper for pointing this out and showing me a solution).
So thats how it works. Id love any contributions anyones willing to give. I also have plans to create an interpolator without a set duration called `target` as opposed to `timed` when I have the time (or need it for my rice).
<h1 id="usage">How to actually use it</h1>
So to actually use it, just create the object, give it a couple parameters, give it some function to
execute, and then run it by updating `target`! In practice it'd look like this:
```lua
timed = rubato.timed {
intro = 0.1,
duration = 0.5,
subscribed = function(pos) print(pos) end
}
--you can also achieve the same effect as the `subscribed` parameter with this:
--timed:subscribe(function(pos) print(pos) end)
--target is initially 0 (unless you set pos otherwise)
timed.target = 1
--here it would print out a bunch of values (15 by default) which
--I would normally copy and paste here but my stdout is broken
--on awesome rn so just pretend there are a bunch of floats here
--and this'll send it back from 1 to 0, printing out another 15 #s
timed.target = 0
```
If you're familiar with the awestore api and don't wanna use what I've got, you can use those methods
instead if you set `awestore_compat = true`. Its a drop-in replacement, so your old code should work perfectly with it. If it doesnt, please make an issue and Ill do my best to fix it. Please include the broken code so I can try it out myself.
So how do the animations actually look? Lets check out what I (at one point) use(ed) for my workspaces:
```lua
timed = rubato.timed {
intro = 0.1,
duration = 0.3
}
```
![Normal Easing](./images/trapezoid_easing.gif)
The above is very subtly eased. A somewhat more pronounced easing would look more like this:
```lua
timed = rubato.timed {
intro = 0.5,
duration = 1,
easing = rubato.quadratic --quadratic slope, not easing
}
```
![Quadratic Easing](./images/quadratic_easing.gif)
The first animations velocity graph looks like a trapezoid, while the second looks like the graph shown below. Note the lack of a plateau and longer duration which gives the more pronounced easing:
![More Quadratic Easing](./images/triangleish.png)
<h1 id="why">But why though?</h1>
Why go through all this hassle? Why not just use awestore? That's a good question and to be fair you
can use whatever interpolator you so choose. That being said, rubato is solely focused on animation, has mathematically perfect interruptions and Ive been told it also looks smoother.
Furthermore, if you use rubato, you get to brag about how annoying it was to set up a monstrous
derivative just to write a custom easing function, like the one shown in [Custom Easing
Function](#easing)'s example. That's a benefit, not a downside, I promise.
Also maybe hopefully the code should be almost digestible kinda maybe. I tried my best to comment
and documentate, but I actually have no idea how to do lua docs or anything.
Also it has a cooler name
<h1 id="arguments-methods">Arguments and Methods</h1>
**For rubato.timed**:
Arguments (in the form of a table):
- `duration`: the total duration of the animation
- `rate`: the number of times per second the timer executes. Higher rates mean
smoother animations and less error.
- `pos`: the initial position of the animation (def. `0`)
- `intro`: the duration of the intro
- `outro`: the duration of the outro (def. same as `intro`\*)
- `prop_intro`: when `true`, `intro`, `outro` and `inter` represent proportional
values; 0.5 would be half the duration. (def. `false`)
- `easing`: the easing table (def. `interpolate.linear`)
- `easing_outro`: the outro easing table (def. as `easing`)
- `easing_inter`: the "intermittent" easing function, which defines which
easing to use in the case of animation interruptions (def. same as
`easing`)
- `subscribed`: a function to subscribe at initialization (def. `nil`)
- `override_simulate`: when `true`, will simulate everything instead of just
when `dx` and `b` have opposite signs at the cost of having to do a little
more work (and making my hard work on finding the formula for `m` worthless
:slightly_frowning_face:) (def. `false`)
- `override_dt`: will cap rate to the fastest that awesome can possibly handle.
This may result in frame-skipping. By setting it to false, it may make
animations slower (def. `true`)
- `awestore_compat`: make api even *more* similar to awestore's (def. `false`)
- `log`: it would print additional logs, but there aren't any logs to print right
now so it kinda just sits there (def. `false`)
All of these values (except awestore_compat and subscribed) are mutable and changing them will
change how the animation looks. I do not suggest changing `pos`, however, unless you change the
position of what's going to be animated in some other way
\*with the caviat that if the outro being the same as the intro would result in an error, it would go
for the largest allowable outro time. Ex: duration = 1, intro = 0.6, then outro will default to 0.4.
Useful properties:
- `target`: when set, sets the target and starts the animation, otherwise returns the target
- `state`: immutable, returns true if an animation is in progress
Methods are as follows:
- `timed:subscribe(func)`: subscribe a function to be ran every refresh of the animation
- `timed:unsubscribe(func)`: unsubscribe a function
- `timed:fire()`: run all subscribed functions at current position
- `timed:abort()`: stop the animation
- `timed:restart()`: restart the animaiton from it's approximate initial state (if a value is
changed during the animation it will remain changed after calling restart)
Awestore compatibility functions (`awestore_compat` must be true):
- `timed:set(target_new)`: sets the position the animation should go to, effectively the same
as setting target
- `timed:initial()`: returns the intiial position
- `timed:last()`: returns the target position, effectively the same as `timed.target`
Awestore compatibility properties:
- `timed.started`: subscribable table which is called when the animation starts or is interrupted
+ `timed.started:subscribe(func)`: subscribes a function
+ `timed.started:unsubscribe(func)`: unsubscribes a function
+ `timed.started:fire()`: runs all subscribed functions
- `timed.ended`: subscribable table which is called when the animation ends
+ `timed.ended:subscribe(func)`: subscribes a function
+ `timed.ended:unsubscribe(func)`: unsubscribes a function
+ `timed.ended:fire()`: runs all subscribed functions
**builtin easing functions**
- `easing.zero`: linear easing, zero slope
- `easing.linear`: linear slope, quadratic easing
- `easing.quadratic`: quadratic slope, cubic easing
- `easing.bouncy`: the bouncy thing as shown in the example
**functions for setting default values**
- `rubato.set_def_rate(rate)`: set default rate for all interpolators, takes an `int`
- `rubato.set_override_dt(value))`: set default for override_dt for all interpolators, takes a
`bool`
<h1 id="easing">Custom Easing Functions</h1>
To make a custom easing function, it's pretty easy. You just need a table with two values:
- `easing`, which is the function of the slope curve you want. So if you want quadratic easing
you'd take the derivative, which would result in linear easing. **Important:** `f(0)=0` and
`f(1)=1` must be true for it to look nice.
- `F`, which is basically just the value of the antiderivative of the easing function at `x=1`.
This is the antiderivative of the scaled function (such that (0, 0) and (1, 1) are in the
function), however, so be wary of that.
In practice, creating your own easing would look like this:
1. Go to [easings.net](https://easings.net)
For the sake of this tutorial, we'll do an extremely complex (hellish? easing, "ease in elastic"
For the sake of this tutorial, we'll do both an easy easing and a complex one. The easy easing will
be the beautifully simple and quite frankly obvious quadratic. The much worse easing will be "ease
in elastic."
2. Find the necessary information
For quadratic we already know the function: `y=x^2`. I don't even need to use latex it's that easy.
For ease in elastic, we use the function given [here](https://easings.net/#easeInElastic):
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}f(x)=-2^{10 \, x - 10}\times \sin\left(-\frac{43}{6} \, \pi %2B \frac{20}{3} \, \pi x\right))">
3. Take the derivative
Quadratic: `y=2x`, easy as that.
**Important:** Look. Computers aren't the greatest at indefinite mathematics. As such, it's
possible that, like myself, you will have a hard time getting the correct derivative if it's as
complicated as these here. Don't be discouraged, however! Sagemath (making sure not to factor
anything) could correctly do out this math, even if I had a bit of a scare realizing that when I
was factoring it I was just being saved by `override_simulate` being accidentally set to true.
Anyways, use sagemath and jupyter notebook. I don't know if all sagemaths come with it
preinstalled, but nix makes it so easy that all I have to do is `sage -n jupyter` and it'll open it
right up. `%display latex` in jupiter makes it look pretty, whereas `%display ascii_art` will make
it look *presentable* in tui sagemath.
The derivative (via sagemath) is as follows:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}f^\prime (x)=-\frac{20}{3} \, \pi 2^{10 \, x - 10} \cos\left(-\frac{43}{6} \, \pi %2B \frac{20}{3} \, \pi x\right) - 10 \cdot 2^{10 \, x - 10} \log\left(2\right) \sin\left(-\frac{43}{6} \, \pi %2B \frac{20}{3} \, \pi x\right)">
4. Double check that `f'(0)=0`
Quadratic: `2*0 = 0` so we're good
Ease in elastic not so much, however:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}f^\prime (0)=\frac{5}{1536} \, \sqrt{3} \pi - \frac{5}{1024} \, \log\left(2\right)">
We'll subtract this value from `f(x)` so that our new `f(x)`, let's say `f_2(x)` has a point at
(0, 0).
5. Double check that `f_2(1)=1`
Quadratic: No, actually. This means we have to do a wee bit of work: `f(1)=2`, so to counteract this,
we'll create a new (and final) function that we can call `f_e` (easing function) by dividing `f(x)`
by `f(1)`. In practice this looks like this:
```
f(1)=2, f(x)/f(1) = 2x / 2 = x, f_e(x)=x
```
Easy as that!
Or so you thought. Now let's check the same for ease in elastic:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}f_2(1)=-\frac{5}{1536} \, \sqrt{3} \pi %2B \frac{10245}{1024} \, \log\left(2\right)">
Hence the need for sagemath. Once we divide the two we get our final easing function, this:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}f_e(x)=\frac{4096 \, \pi 2^{10 \, x - 10} \cos\left(-\frac{43}{6} \, \pi %2B \frac{20}{3} \, \pi x\right) %2B 6144 \cdot 2^{10 \, x - 10} \log\left(2\right) \sin\left(-\frac{43}{6} \, \pi %2B \frac{20}{3} \, \pi x\right) %2B 2 \, \sqrt{3} \pi - 3 \, \log\left(2\right)}{2 \, \sqrt{3} \pi - 6147 \, \log\left(2\right)}">
What on god's green earth is that. Well whatever, at least it works (?).
6. Finally, we get the definite integral from 0 to 1 of our `f(x)`
For `f(x)=x` we can do that in our heads, it's just `1/2`.
For ease in elastic not so much. You can do this with sagemath and eventually get this:
<img src="https://render.githubusercontent.com/render/math?math=\color{blue}\frac{20 \, \sqrt{3} \pi - 30 \, \log\left(2\right) - 6147}{10 \, {\left(2 \, \sqrt{3} \pi - 6147 \, \log\left(2\right)\right)}}">
So this all looked pretty daunting probably, and to be honest it took me hours of either not using
sage (I tried with wolfram alpha for a good hour) or using sage incorrectly (it took three months
to realize that this entire section of the readme was wrong and that using `factor` made it
incorrect), but now that I have this easy little code snippet you can use for sage it shouldn't be
as much of a hastle for you.
```python
from sage.symbolic.integration.integral import definite_integral
function('f')
f(x)='''your function goes here'''
f(x)=derivative(f(x), x)
f(x)=f(x)-f(0)
f(x)=f(x)/f(1)
print(f(x)) # easing
print(definite_integral(f(x), x, 0, 1)) # F
```
So the thing with using `factor` is that, while on some weird other version of sage I was geting a
bunch of 0.49999s which wouldn't round to .5, the result was straight up wrong. So I advise against
it, and if you can't do the derivative then sucks to suck I guess (just lmk in an issue or
something and I'll try my very best).
4. Now we just have to translate this into an actual lua table.
Quadratic, as usual, is easy.
```lua
local quadratic = {
F = 1/2 -- F = 1/2
easing = function(t) return t end -- f(x) = x
}
```
Ease in elastic, as usual, is not. At one point I had the willpower to try and optimize operations,
but I really don't want to simplify those equations and I can't trust `factor`, so for now it stays
as is. If it irks you, make a pull request and save us both.
```lua
local bouncy = {
F = (20*math.sqrt(3)*math.pi-30*math.log(2)-6147) /
(10*(2*math.sqrt(3)*math.pi-6147*math.log(2))),
easing = function(t) return
(4096*math.pi*math.pow(2, 10*t-10)*math.cos(20/3*math.pi*t-43/6*math.pi)
+6144*math.pow(2, 10*t-10)*math.log(2)*math.sin(20/3*math.pi*t-43/6*math.pi)
+2*math.sqrt(3)*math.pi-3*math.log(2)) /
(2*math.pi*math.sqrt(3)-6147*math.log(2))
end
}
-- how it would actually look in a timed object
timed = rubato.timed {
intro = 0, --we'll use this as an outro, since it's weird as an intro
outro = 0.7,
duration = 1,
easing = bouncy
}
```
We did it! Now to check whether or not it actually works
![Beautiful](./images/beautiful.gif)
While you can't see its full glory in 25 fps gif form, it really is pretty cool. Furthermore, if it
works with *that* function, it'll probably work with anything. As long as you have the correct
antiderivative and it's properly scaled, you can probably use any (real, differentiable) function
under the sun.
Note that if it's not properly scaled, this can be worked around (if you're lazy and don't care
about a bit of a performance decrease). You can set `override_simulaton` to true. However, it is
possible that it will not perform exactly as you expected if you do this so do your best to just
find the derivative and antiderivative of the derivative.
<h1 id="install">Installation</h1>
So actually telling people how to install this is important, isn't it
It supports luarocks, so that'll cut it if you want a really really easy install, but it'll install
it in some faraway lua bin where you'll probably leave it forever if you either stop using rubato or
stop using awesome. However, it's certainly the easiest way to go about it. I personally don't like
doing this much because it adds it globally and I'm only gonna be using this with awesome, but it's
a really easy install.
```
luarocks install rubato
```
Otherwise, somewhere in your awesome directory, (I use `~/.config/awesome/lib`) you can run this
command:
```
git clone https://github.com/andOrlando/rubato.git
```
Then, whenever you actually want to use rubato, do this at the start of the lua file: `local rubato
= require "lib.rubato"`
<h1 id="name">Why the name?</h1>
Because I play piano so this kinda links up with other stuff I do, and rubato really well fits the
project. In music, it means "push and pull of tempo" basically, which really is what easing is all
about in the first place. Plus, it'll be the first of my projects without garbage names
("minesweperSweeper," "Latin Learning").
<h1 id="todo">Todo</h1>
- [ ] add `target` function, which rather than a set time has a set distance.
- [x] improve intro and outro arguments (asserts, default values, proportional intros/outros)
- [x] get a better name... (I have a cool name now!)
- [x] make readme cooler
- [x] have better documentation and add to luarocks
- [ ] remove gears dependency
- [ ] only apply corrective coefficient to plateau
- [ ] Do `prop_intro` more intelligently so it doesn't have to do so many comparisons
- [ ] Make things like `abort` more useful
- [ ] Merge that pr by @Kasper so instant works
- [ ] Add a manager (this proceeds the above todo thing)

View file

@ -1,49 +0,0 @@
--- Linear easing (in quotes).
local linear = {
F = 0.5,
easing = function(t) return t end
}
--- Sublinear (?) easing.
local zero = {
F = 1,
easing = function() return 1 end
}
--- Quadratic easing.
local quadratic = {
F = 1/3,
easing = function(t) return t * t end
}
--bouncy constants
local b_cs = {
c1 = 6 * math.pi - 3 * math.sqrt(3) * math.log(2),
c2 = math.sqrt(3) * math.pi,
c3 = 6 * math.sqrt(3) * math.log(2),
c4 = 6 * math.pi - 6147 * math.sqrt(3) * math.log(2),
c5 = 46 * math.pi / 6
}
-- Okay look. It works. It's not terribly slow because computers can do math
-- quick. The other one decidedly does not work (thanks sagemath, I trusted
-- you...) so this will have to do. I may try to fix it up at some point, I may
-- just leave it be and laugh to myself whenever I see this. As they say, if
-- As they say, if you want something fixed that badly, make a pull request lol
local bouncy = {
F = (20*math.sqrt(3)*math.pi-30*math.log(2)-6147) /
(10*(2*math.sqrt(3)*math.pi-6147*math.log(2))),
easing = function(t) return
(4096*math.pi*math.pow(2, 10*t-10)*math.cos(20/3*math.pi*t-43/6*math.pi)
+6144*math.pow(2, 10*t-10)*math.log(2)*math.sin(20/3*math.pi*t-43/6*math.pi)
+2*math.sqrt(3)*math.pi-3*math.log(2)) /
(2*math.pi*math.sqrt(3)-6147*math.log(2))
end
}
return {
linear = linear,
zero = zero,
quadratic = quadratic,
bouncy = bouncy
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 809 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -1,14 +0,0 @@
RUBATO_DEF_RATE = 30
RUBATO_OVERRIDE_DT = true
RUBATO_DIR = (...):match("(.-)[^%.]+$").."rubato."
return {
--Overarching functions to set defaults
set_def_rate = function(rate) RUBATO_DEF_RATE = rate end,
set_override_dt = function(value) RUBATO_OVERRIDE_DT = value end,
--Modules
timed = require(RUBATO_DIR.."timed"),
easing = require(RUBATO_DIR.."easing"),
subscribable = require(RUBATO_DIR.."subscribable"),
}

View file

@ -1,25 +0,0 @@
package = "rubato"
version = "1.1-1"
source = {
url = "git+https://github.com/andOrlando/rubato.git"
}
description = {
detailed = [[
Create smooth animations based off of a slope curve for near perfect interruptions. Similar to awestore, but solely dedicated to interpolation. Also has a cool name. Check out the README on github for more informaiton. Has (basically) complete compatibility with awestore.
Requires either gears or to be ran from awesomeWM
]],
homepage = "https://github.com/andOrlando/rubato",
license = "MIT"
}
dependencies = {
"gears"
}
build = {
type = "builtin",
modules = {
easing = "easing.lua",
timed = "timed.lua",
subscribable = "subscribable.lua"
}
}

View file

@ -1,32 +0,0 @@
-- Kidna copying awesotre's stores on a surface level for added compatibility
local function subscribable(args)
local obj = args or {}
local subscribed = {}
-- Subscrubes a function to the object so that it's called when `fire` is
-- Calls subscribe_callback if it exists as well
function obj:subscribe(func)
local id = tostring(func):gsub("function: ", "")
subscribed[id] = func
if self.subscribe_callback then self.subscribe_callback(func) end
end
-- Unsubscribes a function and calls unsubscribe_callback if it exists
function obj:unsubscribe(func)
if not func then
subscribed = {}
else
local id = tostring(func):gsub("function: ", "")
subscribed[id] = nil
end
if self.unsubscribe_callback then self.unsubscribe_callback(func) end
end
function obj:fire(...) for _, func in pairs(subscribed) do func(...) end end
return obj
end
return subscribable

View file

@ -1,328 +0,0 @@
local easing = require(RUBATO_DIR.."easing")
local subscribable = require(RUBATO_DIR.."subscribable")
local gears = require "gears"
--- Get the slope (this took me forever to find).
-- i is intro duration
-- o is outro duration
-- t is total duration
-- d is distance to cover
-- F_1 is the value of the antiderivate at 1: F_1(1)
-- F_2 is the value of the outro antiderivative at 1: F_2(1)
-- b is the y-intercept
-- m is the slope
-- @see timed
local function get_slope(i, o, t, d, F_1, F_2, b)
return (d + i * b * (F_1 - 1)) / (i * (F_1 - 1) + o * (F_2 - 1) + t)
end
--- Get the dx based off of a bunch of factors
-- @see timed
local function get_dx(time, duration, intro, intro_e, outro, outro_e, m, b)
-- Intro math. Scales by difference between initial slope and target slope
if time <= intro then
return intro_e(time / intro) * (m - b) + b
-- Outro math
elseif (duration - time) <= outro then
return outro_e((duration - time) / outro) * m
-- Otherwise (it's in the plateau)
else return m end
end
--weak table for memoizing results
local simulate_easing_mem = {}
setmetatable(simulate_easing_mem, {__mode="kv"})
--- Simulates the easing to get the result to find an error coefficient
-- Uses the coefficient to adjust dx so that it's guaranteed to hit the target
-- This must be called when the sign of the target slope is changing
-- @see timed
local function simulate_easing(pos, duration, intro, intro_e, outro, outro_e, m, b, dt)
local ps_time = 0
local ps_pos = pos
local dx
-- Key for cacheing results
local key = string.format("%f %f %f %s %f %s %f %f",
pos, duration,
intro, tostring(intro_e),
outro, tostring(outro_e),
m, b)
-- Short circuits if it's already done the calculation
if simulate_easing_mem[key] then return simulate_easing_mem[key] end
-- Effectively runs the exact same code to find what the target will be
while duration - ps_time >= dt / 2 do
--increment time
ps_time = ps_time + dt
--get dx, but use the pseudotime as to not mess with stuff
dx = get_dx(ps_time, duration,
intro, intro_e,
outro, outro_e,
m, b)
--increment pos by dx
ps_pos = ps_pos + dx * dt
end
simulate_easing_mem[key] = ps_pos
return ps_pos
end
--- INTERPOLATE. bam. it still ends in a period. But this one is timed.
-- So documentation isn't super necessary here since it's all on the README and idk how to do
-- documentation correctly, so please see the README or read the code to better understand how
-- it works
local function timed(args)
local obj = subscribable()
--set up default arguments
obj.duration = args.duration or 1
obj.pos = args.pos or 0
obj.prop_intro = args.prop_intro or false
obj.intro = args.intro or 0.2
obj.inter = args.inter or args.intro
--set args.outro nicely based off how large args.intro is
if obj.intro > (obj.prop_intro and 0.5 or obj.duration) and not args.outro then
obj.outro = math.max((args.prop_intro and 1 or args.duration - args.intro), 0)
elseif not args.outro then obj.outro = obj.intro
else obj.outro = args.outro end
--assert that these values are valid
assert(obj.intro + obj.outro <= obj.duration or obj.prop_intro, "Intro and Outro must be less than or equal to total duration")
assert(obj.intro + obj.outro <= 1 or not obj.prop_intro, "Proportional Intro and Outro must be less than or equal to 1")
obj.easing = args.easing or easing.linear
obj.easing_outro = args.easing_outro or obj.easing
obj.easing_inter = args.easing_inter or obj.easing
--dev interface changes
obj.log = args.log or function() end
obj.awestore_compat = args.awestore_compat or false
--animation logic changes
obj.override_simulate = args.override_simulate or false
--[[ rapid_set is allowed by awestore but I don't like it, so it's bound to awestore_compat if not explicitly set
override_dt doesn't work well with big animations or scratchpads (blame awesome not me) (probably) so that too is
is tied to awestore_compat if not explicitly set, then to the default value ]]
obj.rapid_set = args.rapid_set == nil and obj.awestore_compat or args.rapid_set
obj.override_dt = args.override_dt == nil and (not obj.awestore_compat and RUBATO_OVERRIDE_DT) or args.override_dt
-- hidden properties
obj._props = {
target = obj.pos,
rate = args.rate or RUBATO_DEF_RATE
}
-- awestore compatibility
if obj.awestore_compat then
obj._initial = obj.pos
obj._last = 0
function obj:initial() return obj._initial end
function obj:last() return obj._last end
obj.started = subscribable()
obj.ended = subscribable()
end
-- Variables used in calculation, defined once bcz less operations
local time = 0 -- current time
local dt = 1 / obj._props.rate -- change in time
local dx = 0 -- value of slope at current time
local m -- slope
local b -- y-intercept
local is_inter --whether or not it's in an intermittent state
local last_frame_time --the time at the last frame
local frame_time = dt --duration of the last frame (placeholder)
-- Variables used in simulation
local ps_pos -- pseudoposition
local coef -- corrective coefficient TODO: apply to plateau
-- The timer that does all the animating
local timer = gears.timer { timeout = dt }
timer:connect_signal("timeout", function()
-- Find the correct dt if it's not already correct
if (obj.override_dt and last_frame_time) then
frame_time = os.clock() - last_frame_time
--[[ if frame time is bigger than dt, we must readjust dt by the difference
between dt and the last frame. Basically, dt + (frame_time - dt) which just
results in frame_time ]]
if (frame_time > timer.timeout) then dt = frame_time
else dt = timer.timeout end
end
-- for the next timeout event
if (obj.override_dt) then last_frame_time = os.clock() end
--increment time
time = time + dt
--get dx
dx = get_dx(time, obj.duration,
(is_inter and obj.inter or obj.intro) * (obj.prop_intro and obj.duration or 1),
is_inter and obj.easing_inter.easing or obj.easing.easing,
obj.outro * (obj.prop_intro and obj.duration or 1),
obj.easing_outro.easing,
m, b)
--increment pos by dx
--scale by dt and correct with coef if necessary
obj.pos = obj.pos + dx * dt * coef
--sets up when to stop by time
--weirdness is to try to get as close to duration as possible
if obj.duration - time < dt / 2 then
obj.pos = obj._props.target --snaps to target in case of small error
time = obj.duration --snaps time to duration
is_inter = false --resets intermittent
timer:stop() --stops itself
--run subscribed in functions
obj:fire(obj.pos, obj.duration, dx)
-- awestore compatibility...
if obj.awestore_compat then obj.ended:fire(obj.pos, obj.duration, dx) end
--otherwise it just fires normally
else obj:fire(obj.pos, time, dx) end
end)
-- Set target and begin interpolation
local function set(target_new)
--disallow setting it twice (because it makes it go wonky sometimes)
if not obj.rapid_set and obj._props.target == target_new then return end
--animation values
obj._props.target = target_new --sets target
time = 0 --resets time
coef = 1 --resets coefficient
--rate stuff
--both of these values would ideally be timer.timeout so that's their default
dt, frame_time = timer.timeout, timer.timeout
last_frame_time = nil --is given a value after the first frame
-- does annoying awestore compatibility
if obj.awestore_compat then
obj._last = obj._props.target
obj.started:fire(obj.pos, time, dx)
end
-- if it's already started, reflect that in is_inter
is_inter = timer.started
--set initial position if interrupting another animation
b = timer.started and dx or 0
--get the slope of the plateau
m = get_slope((is_inter and obj.inter or obj.intro) * (obj.prop_intro and obj.duration or 1),
obj.outro * (obj.prop_intro and obj.duration or 1),
obj.duration,
obj._props.target - obj.pos,
is_inter and obj.easing_inter.F or obj.easing.F,
obj.easing_outro.F,
b)
--if it will make a mistake (or override_simulate is true), fix it
--it should only make a mistake when switching direction
--b ~= zero protection so that I won't get any NaNs (because NaN ~= NaN)
if obj.override_simulate or (b ~= 0 and b / math.abs(b) ~= m / math.abs(m)) then
ps_pos = simulate_easing(obj.pos, obj.duration,
(is_inter and obj.inter or obj.intro) * (obj.prop_intro and obj.duration or 1),
is_inter and obj.easing_inter.easing or obj.easing.easing,
obj.outro * (obj.prop_intro and obj.duration or 1),
obj.easing_outro.easing,
m, b, dt)
--get coefficient by calculating ratio of theoretical range : experimental range
coef = (obj.pos - obj._props.target) / (obj.pos - ps_pos)
if coef ~= coef then coef = 1 end --check for div by 0 resulting in NaN
end
if not timer.started then timer:start() end
end
if obj.awestore_compat then function obj:set(target) set(target) end end
-- Functions for setting state
-- Completely resets the timer
function obj:reset()
timer:stop()
time = 0
obj._props.target = obj.pos
dx = 0
m = nil
b = nil
is_inter = false
coef = 1
dt = timer.timeout
end
-- Effectively pauses the timer
function obj:abort()
timer:stop()
is_inter = false
end
--subscribe stuff initially and add callback
obj.subscribe_callback = function(func) func(obj.pos, time, dt) end
if args.subscribed ~= nil then obj:subscribe(args.subscribed) end
-- Metatable for cooler api
local mt = {}
function mt:__index(key)
-- Returns the state value
if key == "state" then return timer.started
-- If it's in _props return it from props
elseif self._props[key] then return self._props[key]
-- Otherwise just be nice
else return rawget(self, key) end
end
function mt:__newindex(key, value)
-- Don't allow for setting state
if key == "state" then return
-- Changing target should call set
elseif key == "target" then set(value) --set target
-- Changing rate should also update timeout
elseif key == "rate" then
self._props.rate = value
timer.timeout = 1 / value
-- If it's in _props set it there
elseif self._props[key] ~= nil then self._props[key] = value
-- Otherwise just set it normally
else rawset(self, key, value) end
end
setmetatable(obj, mt)
return obj
end
return timed

View file

@ -1 +0,0 @@
doc/

View file

@ -1,84 +0,0 @@
# UPower Battery Widget
This is my re-implementation of the [awesome-upower-battery][awesome-upower-battery-repository] by [berlam][berlam]. This widget has a lot of potencial for the [Awesome WM][AwesomeWM] and I wanted to hack it a bit for my personal use.
UPower is an abstraction for power devices. You can use it to access advanced statistics about your power devices.
UPowerGlib is a Glib interface to access data exposed by UPower.
The Awesome WM uses LGI as an interpolation layer for Glib with Lua. So, you can access the UPowerGlib interface directly from your lua code.
Thanks to this, we can write battery widget relaying on realtime data pushed from the UPower daemon itself. So the battery widget as no charge on the system (no need to pull data every X seconds) and provides more accurate data to the user.
## Usage
When creating an instance of this widget, you can specify the `widget_template` you want to use and how the widget updates. It gives you the control on how the widget should display the battery status.
You can generate the API documentation with [ldoc][ldoc].
```sh
ldoc -c config.ld init.lua
```
Here is an example of implementation using a [`wibox.widget.textbox`][awesome-api-wibox.widget.textbox] widget to display the battery percentage:
```lua
-- Load the module:
local battery_widget = require 'battery_widget'
-- Create the battery widget:
local my_battery_widget = battery_widget {
screen = screen,
use_display_device = true,
widget_template = wibox.widget.textbox
}
-- When UPower updates the battery status, the widget is notified
-- and calls a signal you need to connect to:
my_battery_widget:connect_signal('upower::update', function (widget, device)
widget.text = string.format('%3d', device.percentage) .. '%'
end)
```
### Using different devices
With the parameter `use_display_device = true`, the battery widget will automatically monitor the _display device_.
If you want to manually set which device to monitor, you can use the `device_path` parameter.
```lua
local my_battery_widget = battery_widget{
screen = s,
device_path = '/org/freedesktop/UPower/devices/battery_BAT0',
widget_template = wibox.widget.textbox
}
```
You can check the API documentation to read more about statics function to help you to identify your devices.
### Battery widget not appearing
When creating a new instance of `battery_widget`, the widget will not be shown. The widget waits an update from UPower to call the "upower::update" signal and use your attached callback to update (and draw) the widget.
You can however use one of the following method to force the widget to be drawn at its creation:
* Use the parameter `instant_update` to explicitly ask the battery_widget to call the "upower::update" signal at the next Awesome WM cycle.
* Use the parameter `create_callback` to use your own code to initialize the widget. (This callback await the same arguments than the "upower::update" signal)
You can read more about these parameters in the API documentation.
## Dependencies
* [Awesome WM][AwesomeWM]
* [UPower][UPower]
* [UPowerGlib][UPowerGlib]
## Acknowledgment
Thanks a lot to [berlam][berlam] for the initial code and the idea to use the UPowerGlib interface 🚀.
[awesome-upower-battery-repository]: https://github.com/berlam/awesome-upower-battery
[berlam]: https://github.com/berlam
[AwesomeWM]: https://awesomewm.org/
[awesome-api-wibox.widget.textbox]: https://awesomewm.org/apidoc/widgets/wibox.widget.textbox.html
[UPower]: https://upower.freedesktop.org/
[UPowerGlib]: https://lazka.github.io/pgi-docs/UPowerGlib-1.0/index.html
[ldoc]: https://stevedonovan.github.io/ldoc/

View file

@ -1,24 +0,0 @@
-- Configuration file for ldoc
project = 'battery_widget'
title = 'Awesome WM - Battery Widget'
all = false
dir = 'doc'
format='markdown'
pretty = 'lua'
prettify_files = true
backtick_references = true
merge = true
use_markdown_titles = true
wrap = true
sort_modules = true
not_luadoc = true
-- Define some new ldoc tags from the AwesomeWM doc
new_type("staticfct", "Static functions", false, "Parameters")
new_type("constructorfct", "Constructor", false, "Parameters")
new_type("method", "Object methods", false, "Parameters")
new_type("property", "Object properties", false, "Type")
new_type("signal", "Signals", false, "Arguments")

View file

@ -1,140 +0,0 @@
---------------------------------------------------------------------------
-- A battery widget based on the UPower deamon.
--
-- @author Aire-One
-- @copyright 2020 Aire-One
---------------------------------------------------------------------------
local upower = require('lgi').require('UPowerGlib')
local gtable = require 'gears.table'
local gtimer = require 'gears.timer'
local wbase = require 'wibox.widget.base'
local setmetatable = setmetatable -- luacheck: ignore setmetatable
local battery_widget = {}
local mt = {}
--- Helper to get the path of all connected power devices.
-- @treturn table The list of all power devices path.
-- @staticfct battery_widget.list_devices
function battery_widget.list_devices()
local ret = {}
local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do
table.insert(ret, d:get_object_path())
end
return ret
end
--- Helper function to get a device instance from its path.
-- @tparam string path The path of the device to get.
-- @treturn UPowerGlib.Device|nil The device if it was found, `nil` otherwise.
-- @staticfct battery_widget.get_device
function battery_widget.get_device(path)
local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do
if d:get_object_path() == path then
return d
end
end
return nil
end
--- Helper function to easily get the default BAT0 device path without.
-- @treturn string The BAT0 device path.
-- @staticfct battery_widget.get_BAT0_device_path
function battery_widget.get_BAT0_device_path()
local bat0_path = '/org/freedesktop/UPower/devices/battery_BAT0'
return bat0_path
end
--- Helper function to convert seconds into a human readable clock string.
--
-- This translates the given seconds parameter into a human readable string
-- following the notation `HH:MM` (where HH is the number of hours and MM the
-- number of minutes).
-- @tparam number seconds The umber of seconds to translate.
-- @treturn string The human readable generated clock string.
-- @staticfct battery_widget.to_clock
function battery_widget.to_clock(seconds)
if seconds <= 0 then
return '00:00';
else
local hours = string.format('%02.f', math.floor(seconds/3600));
local mins = string.format('%02.f', math.floor(seconds/60 - hours*60));
return hours .. ':' .. mins
end
end
--- Gives the default widget to use if user didn't specify one.
-- The default widget used is an `empty_widget` instance.
-- @treturn widget The default widget to use.
local function default_template ()
return wbase.empty_widget()
end
--- The device monitored by the widget.
-- @property device
-- @tparam UPowerGlib.Device device
--- Emited when the UPower device notify an update.
-- @signal upower::update
-- @tparam battery_widget widget The widget.
-- @tparam UPowerGlib.Device device The Upower device.
--- battery_widget constructor.
--
-- This function creates a new `battery_widget` instance. This widget watches
-- the `display_device` status and report.
-- @tparam table args The arguments table.
-- @tparam[opt] widget args.widget_template The widget template to use to
-- create the widget instance.
-- @tparam[opt] string args.device_path Path of the device to monitor.
-- @tparam[opt=false] boolean args.use_display_device Should the widget monitor
-- the _display device_?
-- @tparam[opt] boolean args.instant_update Call an update cycle right after the
-- widget creation.
-- @treturn battery_widget The battery_widget instance build.
-- @constructorfct battery_widget.new
function battery_widget.new (args)
args = gtable.crush({
widget_template = default_template(),
device_path = '',
use_display_device = false
}, args or {})
local widget = wbase.make_widget_from_value(args.widget_template)
widget.device = args.use_display_device
and upower.Client():get_display_device()
or battery_widget.get_device(args.device_path)
-- Attach signals:
widget.device.on_notify = function (d)
widget:emit_signal('upower::update', d)
end
-- Call an update cycle if the user asked to instan update the widget.
if args.instant_update then
gtimer.delayed_call(widget.emit_signal, widget, 'upower::update', widget.device)
end
return widget
end
function mt.__call(self, ...)
return battery_widget.new(...)
end
return setmetatable(battery_widget, mt)

View file

@ -1,137 +0,0 @@
local capi = {
client = client,
mouse = mouse,
screen = screen,
mousegrabber = mousegrabber,
}
local awful = require("awful")
local function mouse_resize_handler(m, c)
awful.client.incwfact(0, c) -- needed to fix normalization at start
local start = m(capi.mouse.coords())
local x, y = start.x, start.y
local wa = m(c.screen.workarea)
local idx = awful.client.idx(c)
local c_above, c_below
local idx_above, idx_below
local wfact_above, wfact_below
local jump_to = { x = x, y = y }
local move_mwfact = false
do
local g = m(c:geometry())
local v_border = 0.2 * g.height
if idx.idx > 1 and y >= g.y and y <= g.y + v_border then
-- we are near the top edge of the window
c_above = awful.client.next(-1, c)
c_below = c
jump_to.y = g.y
idx_above = idx.idx - 1
idx_below = idx.idx
elseif idx.idx < idx.num and y >= g.y + g.height - v_border then
-- we are near the bottom edge of the window
c_above = c
c_below = awful.client.next(1, c)
idx_above = idx.idx
idx_below = idx.idx + 1
jump_to.y = g.y + g.height
end
local mw_split = wa.x + wa.width * c.screen.selected_tag.master_width_factor
if math.abs(mw_split - x) > wa.width / 6 then
move_mwfact = false
else
move_mwfact = true
jump_to.x = mw_split
end
end
if idx_above then
local t = c.screen.selected_tag
local data = t.windowfact or {}
local colfact = data[idx.col] or {}
wfact_above = colfact[idx_above] or 1
wfact_below = colfact[idx_below] or 1
end
if idx_above and move_mwfact then
cursor = "cross"
elseif idx_above then
cursor = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).y
elseif move_mwfact then
cursor = m({ y = "sb_v_double_arrow", x = "sb_h_double_arrow" }).x
else
return false
end
capi.mouse.coords(m(jump_to))
capi.mousegrabber.run(function(_mouse)
if not c.valid then
return false
end
local pressed = false
for _, v in ipairs(_mouse.buttons) do
if v then
pressed = true
break
end
end
_mouse = m(_mouse)
if pressed then
if move_mwfact then
c.screen.selected_tag.master_width_factor = math.min(math.max((_mouse.x - wa.x) / wa.width, 0.01), 0.99)
end
if idx_above then
local factor_delta = (_mouse.y - jump_to.y) / wa.height
if factor_delta < 0 then
factor_delta = math.max(factor_delta, -(wfact_above - 0.05))
else
factor_delta = math.min(factor_delta, wfact_below - 0.05)
end
local t = c.screen.selected_tag
local data = t.windowfact or {}
local colfact = data[idx.col] or {}
colfact[idx_above] = wfact_above + factor_delta
colfact[idx_below] = wfact_below - factor_delta
awful.client.incwfact(0, c_above) -- just in case
end
return true
else
return false
end
end, cursor)
return true
end
awful.layout.suit.tile.mouse_resize_handler = function(c)
return mouse_resize_handler(function(x)
return x
end, c)
end
awful.layout.suit.tile.bottom.mouse_resize_handler = function(c)
return mouse_resize_handler(function(q)
return { x = q.y, y = q.x, width = q.height, height = q.width }
end, c)
end
-- local old_coords = mouse.coords
-- mouse.coords = function(...)
-- if select(1, ...) and not(select(1, ...).blah) then
-- print("set mouse!!!")
-- print(debug.traceback())
-- end
-- return old_coords(...)
-- end

View file

@ -1,24 +0,0 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
trim_trailing_whitespace = true
[*.lua]
indent_size = 4
indent_style = space
max_line_length = 80
[*.yml]
indent_size = 2
indent_style = space
[*.{html,css}]
indent_size = 2
indent_style = space
[*.md]
trim_trailing_whitespace = false

View file

@ -1,10 +0,0 @@
The following developers have contributed major code to bling:
* [Nooo37](https://github.com/Nooo37)
* [JavaCafe01](https://github.com/JavaCafe01)
* [Grumph](https://github.com/Grumph)
* [Bysmutheye](https://github.com/Bysmutheye)
* [HumblePresent](https://github.com/HumblePresent)
* [Kasper24](https://github.com/Kasper24)
* [undefinedDarkness](https://github.com/undefinedDarkness)
* [eylles](https://github.com/eylles)

View file

@ -1,2 +0,0 @@
/module/* @Nooo37
/widget/* @JavaCafe01

View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021 BlingCorp
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,41 +0,0 @@
<p align="center">
<img src="/images/bling_banner.png" />
</p>
<h1 align="center"></h1>
All documentation, instructions, and previews are [here](https://blingcorp.github.io/bling/).
## Features
- Layouts
- mstab (master-slave tab layout)
- centered
- vertical
- horizontal
- equalarea
- Modules
- Flash Focus
- Tabbed container
- Tiled Wallpaper
- Wallpaper Easy Setup
- Window Swallowing
- Scratchpad
- Signals
- Playerctl
- Widgets
- Tag Preview
- Task Preview
All naming credit goes to [JavaCafe01](https://github.com/JavaCafe01).
### Dependencies
In order to use the `tabbed` modules `pick` function, you need to install `xwininfo`.
## Contributing
Contributions are welcome 💛
Before requesting changes, makes sure that your editor has an "editorconfig" extension installed, this will use our code style everytime when you edit in the `bling` folder.
When adding a layout/module/signal/widget, please add theme variables for customization and add the according documentation under `docs`.

View file

@ -1,63 +0,0 @@
package = "bling"
version = "dev-1"
source = {
url = "git://github.com/BlingCorp/bling",
branch = "master",
}
description = {
summary = "Utilities for the AwesomeWM",
detailed = [[
This module extends the Awesome window manager with alternative layouts,
flash focus, tabbing, a simple tiling wallpaper generator, a declarative
wallpaper setter, window swallowing and a playerctl signal.
]],
homepage = "https://github.com/BlingCorp/bling",
license = "MIT",
}
dependencies = {
"lua >= 5.1",
}
build = {
type = "builtin",
modules = {
["bling"] = "init.lua",
["bling.helpers"] = "helpers/init.lua",
["bling.helpers.client"] = "helpers/client.lua",
["bling.helpers.color"] = "helpers/color.lua",
["bling.helpers.filesystem"] = "helpers/filesystem.lua",
["bling.helpers.shape"] = "helpers/shape.lua",
["bling.helpers.time"] = "helpers/time.lua",
["bling.layout"] = "layout/init.lua",
["bling.layout.centered"] = "layout/centered.lua",
["bling.layout.deck"] = "layout/deck.lua",
["bling.layout.equalarea"] = "layout/equalarea.lua",
["bling.layout.horizontal"] = "layout/horizontal.lua",
["bling.layout.mstab"] = "layout/mstab.lua",
["bling.layout.vertical"] = "layout/vertical.lua",
["bling.module"] = "module/init.lua",
["bling.module.flash_focus"] = "module/flash_focus.lua",
["bling.module.scratchpad"] = "module/scratchpad.lua",
["bling.module.tabbed"] = "module/tabbed.lua",
["bling.module.tiled_wallpaper"] = "module/tiled_wallpaper.lua",
["bling.module.wallpaper"] = "module/wallpaper.lua",
["bling.module.window_swallowing"] = "module/window_swallowing.lua",
["bling.signal"] = "signal/init.lua",
["bling.signal.playerctl"] = "signal/playerctl/init.lua",
["bling.signal.playerctl.playerctl_cli"] = "signal/playerctl/playerctl_cli.lua",
["bling.signal.playerctl.playerctl_lib"] = "signal/playerctl/playerctl_lib.lua",
["bling.widget"] = "widget/init.lua",
["bling.widget.tabbar.boxes"] = "widget/tabbar/boxes.lua",
["bling.widget.tabbar.default"] = "widget/tabbar/default.lua",
["bling.widget.tabbar.modern"] = "widget/tabbar/modern.lua",
["bling.widget.tabbed_misc"] = "widget/tabbed_misc/init.lua",
["bling.widget.tabbed_misc.custom_tasklist"] = "widget/tabbed_misc/custom_tasklist.lua",
["bling.widget.tabbed_misc.titlebar_indicator"] = "widget/tabbed_misc/titlebar_indicator.lua",
["bling.widget.tag_preview"] = "widget/tag_preview.lua",
["bling.widget.task_preview"] = "widget/task_preview.lua",
["bling.widget.window_switcher"] = "widget/window_switcher.lua",
},
}

View file

@ -1,23 +0,0 @@
- [Home](home.md)
- [Layouts](layouts/layout.md)
- Modules
- [Flash Focus](module/flash.md)
- [Tabbed](module/tabbed.md)
- [Tiled Wallpaper](module/twall.md)
- [Wallpaper Easy Setup](module/wall.md)
- [Window Swallowing](module/swal.md)
- [Scratchpad](module/scratch.md)
- Signals
- [Playerctl](signals/pctl.md)
- Widgets
- [Tag Preview](widgets/tag_preview.md)
- [Task Preview](widgets/task_preview.md)
- [Tabbed Misc](widgets/tabbed_misc.md)
- [Window Switcher](widgets/window_switcher.md)
- Extra
- [Theme Variable Template](theme.md)

View file

@ -1,34 +0,0 @@
# <center> 🌟 Bling - Utilities for AwesomeWM 🌟 </center>
## Why
[AwesomeWM](https://awesomewm.org/) is literally what it stands for, an awesome window manager.
Its unique selling point has always been the widget system, which allows for fancy buttons, sliders, bars, dashboards and anything you can imagine. But that feature can be a curse. Most modules focus on the widget side of things which leave the actual window managing part of AwesomeWM underdeveloped compared to, for example, [xmonad](https://xmonad.org/) even though it's probably just as powerfull in that area.
This project focuses on that problem - adding new layouts and modules that make use of the widget system, but primarily focus on the new window managing features.
## Installation
- clone this repo into your `~/.config/awesome` folder
- `git clone https://github.com/BlingCorp/bling.git ~/.config/awesome/bling`
- require the module in your `rc.lua`, and make sure it's under the beautiful module initialization
```lua
-- other imports
local beautiful = require("beautiful")
-- other configuration stuff here
beautiful.init("some_theme.lua")
local bling = require("bling")
```
## Contributors
A special thanks to all our contributors...
<a href="https://github.com/BlingCorp/bling/graphs/contributors">
<img src="https://contrib.rocks/image?repo=BlingCorp/bling" />
</a>
Made with [contributors-img](https://contrib.rocks).

View file

@ -1,28 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bling Docs</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Utilities for the awesome window manager">
<meta name="og:image" content="https://raw.githubusercontent.com/BlingCorp/bling/master/images/bling_banner.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="javacafe.css">
</head>
<body>
<div id="app"></div>
<script>
window.$docsify = {
name: 'Bling',
nameLink: '/',
repo: 'https://github.com/BlingCorp/bling',
loadSidebar: true,
subMaxLevel: 3,
homepage: 'home.md'
}
</script>
<!-- Docsify v4 -->
<script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
<script src="//unpkg.com/prismjs/components/prism-lua.js"></script>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -1,65 +0,0 @@
## 📎 Layouts <!-- {docsify-ignore} -->
Choose layouts from the list below and add them to to your `awful.layouts` list in your `rc.lua`.
Everyone of them supports multiple master clients and master width factor making them easy to use.
The mstab layout uses the tab theme from the tabbed module.
```lua
bling.layout.mstab
bling.layout.centered
bling.layout.vertical
bling.layout.horizontal
bling.layout.equalarea
bling.layout.deck
```
### Theme Variables
```lua
-- mstab
theme.mstab_bar_disable = false -- disable the tabbar
theme.mstab_bar_ontop = false -- whether you want to allow the bar to be ontop of clients
theme.mstab_dont_resize_slaves = false -- whether the tabbed stack windows should be smaller than the
-- currently focused stack window (set it to true if you use
-- transparent terminals. False if you use shadows on solid ones
theme.mstab_bar_padding = "default" -- how much padding there should be between clients and your tabbar
-- by default it will adjust based on your useless gaps.
-- If you want a custom value. Set it to the number of pixels (int)
theme.mstab_border_radius = 0 -- border radius of the tabbar
theme.mstab_bar_height = 40 -- height of the tabbar
theme.mstab_tabbar_position = "top" -- position of the tabbar (mstab currently does not support left,right)
theme.mstab_tabbar_style = "default" -- style of the tabbar ("default", "boxes" or "modern")
-- defaults to the tabbar_style so only change if you want a
-- different style for mstab and tabbed
```
### Previews
#### Mstab (dynamic tabbing layout)
![](https://imgur.com/HZRgApE.png)
*screenshot by [JavaCafe01](https://github.com/JavaCafe01)*
#### Centered
![](https://media.discordapp.net/attachments/769673106842845194/780095998239834142/unknown.png)
*screenshot by [HeavyRain266](https://github.com/HeavyRain266)*
#### Equal area
![](https://imgur.com/JCFFywv.png)
*screenshot by [bysmutheye](https://github.com/bysmutheye)*
#### Deck
The left area shows the deck layout in action. In this screenshot it is used together with [layout machi](https://github.com/xinhaoyuan/layout-machi) and its sublayout support.
![](https://cdn.discordapp.com/attachments/635625954219261982/877957824225894430/unknown.png)
*screenshot by [JavaCafe01](https://github.com/JavaCafe01)*

View file

@ -1,33 +0,0 @@
## 🔦 Flash Focus <!-- {docsify-ignore} -->
Flash focus does an opacity animation effect on a client when it is focused.
### Usage
There are two ways in which you can use this module. You can enable it by calling the `enable()` function:
```lua
bling.module.flash_focus.enable()
```
This connects to the focus signal of a client, which means that the flash focus will activate however you focus the client.
The other way is to call the function itself like this: `bling.module.flash_focus.flashfocus(someclient)`. This allows you to activate on certain keybinds like so:
```lua
awful.key({modkey}, "Up",
function()
awful.client.focus.bydirection("up")
bling.module.flash_focus.flashfocus(client.focus)
end, {description = "focus up", group = "client"})
```
### Theme Variables
```lua
theme.flash_focus_start_opacity = 0.6 -- the starting opacity
theme.flash_focus_step = 0.01 -- the step of animation
```
### Preview
![](https://imgur.com/5txYrlV.gif)
*gif by [JavaCafe01](https://github.com/JavaCafe01)*

View file

@ -1,75 +0,0 @@
## 🍃 Scratchpad <!-- {docsify-ignore} -->
An easy way to create multiple scratchpads.
### A... what?
You can think about a scratchpad as a window whose visibility can be toggled, but still runs in the background without being visible (or minimized) most of the time. Many people use it to have one terminal in which to perform minor tasks, but it is the most useful for windows which only need a couple seconds in between your actual activity, such as music players or chat applications.
### Rubato Animation Support
#### Awestore is now deprecated from Bling, we are switching to Rubato.
Please go over to the [rubato](https://github.com/andOrlando/rubato) repository for installation instructions. Give it a star as well! The animations are completely optional, and if you choose not to use it, you do not need rubato installed.
### Usage
To initalize a scratchpad you can do something like the following:
```lua
local bling = require("bling")
local rubato = require("rubato") -- Totally optional, only required if you are using animations.
-- These are example rubato tables. You can use one for just y, just x, or both.
-- The duration and easing is up to you. Please check out the rubato docs to learn more.
local anim_y = rubato.timed {
pos = 1090,
rate = 60,
easing = rubato.quadratic,
intro = 0.1,
duration = 0.3,
awestore_compat = true -- This option must be set to true.
}
local anim_x = rubato.timed {
pos = -970,
rate = 60,
easing = rubato.quadratic,
intro = 0.1,
duration = 0.3,
awestore_compat = true -- This option must be set to true.
}
local term_scratch = bling.module.scratchpad {
command = "wezterm start --class spad", -- How to spawn the scratchpad
rule = { instance = "spad" }, -- The rule that the scratchpad will be searched by
sticky = true, -- Whether the scratchpad should be sticky
autoclose = true, -- Whether it should hide itself when losing focus
floating = true, -- Whether it should be floating (MUST BE TRUE FOR ANIMATIONS)
geometry = {x=360, y=90, height=900, width=1200}, -- The geometry in a floating state
reapply = true, -- Whether all those properties should be reapplied on every new opening of the scratchpad (MUST BE TRUE FOR ANIMATIONS)
dont_focus_before_close = false, -- When set to true, the scratchpad will be closed by the toggle function regardless of whether its focused or not. When set to false, the toggle function will first bring the scratchpad into focus and only close it on a second call
rubato = {x = anim_x, y = anim_y} -- Optional. This is how you can pass in the rubato tables for animations. If you don't want animations, you can ignore this option.
}
```
Once initalized, you can use the object (which in this case is named `term_scratch`) like this:
```lua
term_scratch:toggle() -- toggles the scratchpads visibility
term_scratch:turn_on() -- turns the scratchpads visibility on
term_scratch:turn_off() -- turns the scratchpads visibility off
```
You can also connect to signals as you are used to for further customization. For example like that:
```lua
term_scratch:connect_signal("turn_on", function(c) naughty.notify({title = "Turned on!"}) end)
```
The following signals are currently available. `turn_on`, `turn_off` and `inital_apply` pass the client on which they operated as an argument:
- `turn_on` fires when the scratchpad is turned on on a tag that it wasn't present on before
- `turn_off` fires when the scratchpad is turned off on a tag
- `spawn` fires when the scratchpad is launched with the given command
- `inital_apply` fires after `spawn`, when a corresponding client has been found and the properties have been applied

View file

@ -1,25 +0,0 @@
## 😋 Window Swallowing <!-- {docsify-ignore} -->
Can your window manager swallow? It probably can...
### Usage
To activate and deactivate window swallowing here are the following functions. If you want to activate it, just call the `start` function once in your `rc.lua`.
```lua
bling.module.window_swallowing.start() -- activates window swallowing
bling.module.window_swallowing.stop() -- deactivates window swallowing
bling.module.window_swallowing.toggle() -- toggles window swallowing
```
### Theme Variables
```lua
theme.parent_filter_list = {"firefox", "Gimp"} -- class names list of parents that should not be swallowed
theme.child_filter_list = { "Dragon" } -- class names list that should not swallow their parents
theme.swallowing_filter = true -- whether the filters above should be active
```
### Preview
![](https://media.discordapp.net/attachments/635625813143978012/769180910683684864/20-10-23-14-40-32.gif)
*gif by [Nooo37](https://github.com/Nooo37)*

View file

@ -1,66 +0,0 @@
## 📑 Tabbed <!-- {docsify-ignore} -->
Tabbed implements a tab container. There are also different themes for the tabs.
### Usage
You should bind these functions to keys in order to use the tabbed module effectively:
```lua
bling.module.tabbed.pick() -- picks a client with your cursor to add to the tabbing group
bling.module.tabbed.pop() -- removes the focused client from the tabbing group
bling.module.tabbed.iter() -- iterates through the currently focused tabbing group
bling.module.tabbed.pick_with_dmenu() -- picks a client with a dmenu application (defaults to rofi, other options can be set with a string parameter like "dmenu")
bling.module.tabbed.pick_by_direction(dir) -- picks a client based on direction ("up", "down", "left" or "right")
```
### Theme Variables
```lua
-- For tabbed only
theme.tabbed_spawn_in_tab = false -- whether a new client should spawn into the focused tabbing container
-- For tabbar in general
theme.tabbar_ontop = false
theme.tabbar_radius = 0 -- border radius of the tabbar
theme.tabbar_style = "default" -- style of the tabbar ("default", "boxes" or "modern")
theme.tabbar_font = "Sans 11" -- font of the tabbar
theme.tabbar_size = 40 -- size of the tabbar
theme.tabbar_position = "top" -- position of the tabbar
theme.tabbar_bg_normal = "#000000" -- background color of the focused client on the tabbar
theme.tabbar_fg_normal = "#ffffff" -- foreground color of the focused client on the tabbar
theme.tabbar_bg_focus = "#1A2026" -- background color of unfocused clients on the tabbar
theme.tabbar_fg_focus = "#ff0000" -- foreground color of unfocused clients on the tabbar
theme.tabbar_bg_focus_inactive = nil -- background color of the focused client on the tabbar when inactive
theme.tabbar_fg_focus_inactive = nil -- foreground color of the focused client on the tabbar when inactive
theme.tabbar_bg_normal_inactive = nil -- background color of unfocused clients on the tabbar when inactive
theme.tabbar_fg_normal_inactive = nil -- foreground color of unfocused clients on the tabbar when inactive
theme.tabbar_disable = false -- disable the tab bar entirely
-- the following variables are currently only for the "modern" tabbar style
theme.tabbar_color_close = "#f9929b" -- chnges the color of the close button
theme.tabbar_color_min = "#fbdf90" -- chnges the color of the minimize button
theme.tabbar_color_float = "#ccaced" -- chnges the color of the float button
```
### Preview
Modern theme:
<img src="https://imgur.com/omowmIQ.png" width="600"/>
*screenshot by [JavaCafe01](https://github.com/JavaCafe01)*
### Signals
The tabbed module emits a few signals for the purpose of integration,
```lua
-- bling::tabbed::update -- triggered whenever a tabbed object is updated
-- tabobj -- the object that caused the update
-- bling::tabbed::client_added -- triggered whenever a new client is added to a tab group
-- tabobj -- the object that the client was added to
-- client -- the client that added
-- bling::tabbed::client_removed -- triggered whenever a client is removed from a tab group
-- tabobj -- the object that the client was removed from
-- client -- the client that was removed
-- bling::tabbed::changed_focus -- triggered whenever a tab group's focus is changed
-- tabobj -- the modified tab group
```

View file

@ -1,26 +0,0 @@
## 🏬 Tiled Wallpaper <!-- {docsify-ignore} -->
### Usage
The function to set an automatically created tiled wallpaper can be called the following way (you don't need to set every option in the table):
```lua
awful.screen.connect_for_each_screen(function(s) -- that way the wallpaper is applied to every screen
bling.module.tiled_wallpaper("x", s, { -- call the actual function ("x" is the string that will be tiled)
fg = "#ff0000", -- define the foreground color
bg = "#00ffff", -- define the background color
offset_y = 25, -- set a y offset
offset_x = 25, -- set a x offset
font = "Hack", -- set the font (without the size)
font_size = 14, -- set the font size
padding = 100, -- set padding (default is 100)
zickzack = true -- rectangular pattern or criss cross
})
end)
```
### Preview
![](https://media.discordapp.net/attachments/702548913999314964/773887721294135296/tiled-wallpapers.png?width=1920&height=1080)
*screenshots by [Nooo37](https://github.com/Nooo37)*

View file

@ -1,142 +0,0 @@
## 🎇 Wallpaper Easy Setup <!-- {docsify-ignore} -->
This is a simple-to-use, extensible, declarative wallpaper manager.
### Practical Examples
```lua
-- A default Awesome wallpaper
bling.module.wallpaper.setup()
-- A slideshow with pictures from different sources changing every 30 minutes
bling.module.wallpaper.setup {
wallpaper = {"/images/my_dog.jpg", "/images/my_cat.jpg"},
change_timer = 1800
}
-- A random wallpaper with images from multiple folders
bling.module.wallpaper.setup {
set_function = bling.module.wallpaper.setters.random,
wallpaper = {"/path/to/a/folder", "/path/to/another/folder"},
change_timer = 631, -- prime numbers are better for timers
position = "fit",
background = "#424242"
}
-- wallpapers based on a schedule, like awesome-glorious-widgets dynamic wallpaper
-- https://github.com/manilarome/awesome-glorious-widgets/tree/master/dynamic-wallpaper
bling.module.wallpaper.setup {
set_function = bling.module.wallpaper.setters.simple_schedule,
wallpaper = {
["06:22:00"] = "morning-wallpaper.jpg",
["12:00:00"] = "noon-wallpaper.jpg",
["17:58:00"] = "night-wallpaper.jpg",
["24:00:00"] = "midnight-wallpaper.jpg",
},
position = "maximized",
}
-- random wallpapers, from different folder depending on time of the day
bling.module.wallpaper.setup {
set_function = bling.module.wallpaper.setters.simple_schedule,
wallpaper = {
["09:00:00"] = "~/Pictures/safe_for_work",
["18:00:00"] = "~/Pictures/personal",
},
schedule_set_function = bling.module.wallpaper.setters.random
position = "maximized",
recursive = false,
change_timer = 600
}
-- setup for multiple screens at once
-- the 'screen' argument can be a table of screen objects
bling.module.wallpaper.setup {
set_function = bling.module.wallpaper.setters.random,
screen = screen, -- The awesome 'screen' variable is an array of all screen objects
wallpaper = {"/path/to/a/folder", "/path/to/another/folder"},
change_timer = 631
}
```
### Details
The setup function will do 2 things: call the set-function when awesome requests a wallpaper, and manage a timer to call `set_function` periodically.
Its argument is a args table that is passed to ohter functions (setters and wallpaper functions), so you define everything with setup.
The `set_function` is a function called every times a wallpaper is needed.
The module provides some setters:
* `bling.module.wallpaper.setters.awesome_wallpaper`: beautiful.theme_assets.wallpaper with defaults from beautiful.
* `bling.module.wallpaper.setters.simple`: slideshow from the `wallpaper` argument.
* `bling.module.wallpaper.setters.random`: same as simple but in a random way.
* `bling.module.wallpaper.setters.simple_schedule`: takes a table of `["HH:MM:SS"] = wallpaper` arguments, where wallpaper is the `wallpaper` argument used by `schedule_set_function`.
A wallpaper is one of the following elements:
* a color
* an image
* a folder containing images
* a function that sets a wallpaper
* everything gears.wallpaper functions can manage (cairo surface, cairo pattern string)
* a list containing any of the elements above
To set up for multiple screens, two possible methods are:
* Call the `setup` function for each screen, passing the appropriate configuration and `screen` arg
* Call the `setup` function once, passing a table of screens as the `screen` arg. This applies the same configuration to all screens in the table
_Note_: Multiple screen setup only works for the `simple` and `random` setters
```lua
-- This is a valid wallpaper definition
bling.module.wallpaper.setup {
wallpaper = { -- a list
"black", "#112233", -- colors
"wall1.jpg", "wall2.png", -- files
"/path/to/wallpapers", -- folders
-- cairo patterns
"radial:600,50,100:105,550,900:0,#2200ff:0.5,#00ff00:1,#101010",
-- or functions that set a wallpaper
function(args) bling.module.tiled_wallpaper("\\o/", args.screen) end,
bling.module.wallpaper.setters.awesome_wallpaper,
},
change_timer = 10,
}
```
The provided setters `simple` and `random` will use 2 internal functions that you can use to write your own setter:
* `bling.module.wallpaper.prepare_list`: return a list of wallpapers directly usable by `apply` (for now, it just explores folders)
* `bling.module.wallpaper.apply`: a wrapper for gears.wallpaper functions, using the args table of setup
Here are the defaults:
```lua
-- Default parameters
bling.module.wallpaper.setup {
screen = nil, -- the screen to apply the wallpaper, as seen in gears.wallpaper functions
screens = nil, -- an array of screens to apply the wallpaper on. If 'screen' is also provided, this is overridden
change_timer = nil, -- the timer in seconds. If set, call the set_function every change_timer seconds
set_function = nil, -- the setter function
-- parameters used by bling.module.wallpaper.prepare_list
wallpaper = nil, -- the wallpaper object, see simple or simple_schedule documentation
image_formats = {"jpg", "jpeg", "png", "bmp"}, -- when searching in folder, consider these files only
recursive = true, -- when searching in folder, search also in subfolders
-- parameters used by bling.module.wallpaper.apply
position = nil, -- use a function of gears.wallpaper when applicable ("centered", "fit", "maximized", "tiled")
background = beautiful.bg_normal or "black", -- see gears.wallpaper functions
ignore_aspect = false, -- see gears.wallpaper.maximized
offset = {x = 0, y = 0}, -- see gears.wallpaper functions
scale = 1, -- see gears.wallpaper.centered
-- parameters that only apply to bling.module.wallpaper.setter.awesome (as a setter or as a wallpaper function)
colors = { -- see beautiful.theme_assets.wallpaper
bg = beautiful.bg_color, -- the actual default is this color but darkened or lightned
fg = beautiful.fg_color,
alt_fg = beautiful.fg_focus
}
}
```
Check documentation in [module/wallpaper.lua](module/wallpaper.lua) for more details.

Some files were not shown because too many files have changed in this diff Show more