Compare commits
No commits in common. "main" and "delta" have entirely different histories.
520
.github/README.md
vendored
|
@ -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>
|
BIN
.github/assets/aesthetic.png
vendored
Before Width: | Height: | Size: 686 KiB |
BIN
.github/assets/awesome.png
vendored
Before Width: | Height: | Size: 295 KiB |
BIN
.github/assets/bottom-panel.gif
vendored
Before Width: | Height: | Size: 221 KiB |
BIN
.github/assets/button-gallery.png
vendored
Before Width: | Height: | Size: 28 KiB |
BIN
.github/assets/button-setup.png
vendored
Before Width: | Height: | Size: 25 KiB |
BIN
.github/assets/button-tipjar.png
vendored
Before Width: | Height: | Size: 24 KiB |
BIN
.github/assets/button-wiki.png
vendored
Before Width: | Height: | Size: 22 KiB |
BIN
.github/assets/central-panel.gif
vendored
Before Width: | Height: | Size: 245 KiB |
BIN
.github/assets/exitscreen.gif
vendored
Before Width: | Height: | Size: 36 KiB |
BIN
.github/assets/info-panel.gif
vendored
Before Width: | Height: | Size: 195 KiB |
BIN
.github/assets/lockscreen.gif
vendored
Before Width: | Height: | Size: 27 KiB |
BIN
.github/assets/lockscreen.png
vendored
Before Width: | Height: | Size: 44 KiB |
BIN
.github/assets/music-player.gif
vendored
Before Width: | Height: | Size: 310 KiB |
BIN
.github/assets/naughty.gif
vendored
Before Width: | Height: | Size: 134 KiB |
BIN
.github/assets/ncmpcpp.png
vendored
Before Width: | Height: | Size: 108 KiB |
BIN
.github/assets/notif-panel.gif
vendored
Before Width: | Height: | Size: 984 KiB |
BIN
.github/assets/rxhyn-dotfile-header.png
vendored
Before Width: | Height: | Size: 23 KiB |
674
LICENSE
|
@ -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
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
|
||||
run() {
|
||||
if ! pgrep -f "$1" ;
|
||||
then
|
||||
"$@"&
|
||||
fi
|
||||
}
|
||||
|
||||
run "picom -b --experimental-backend"
|
||||
run "polybar -r"
|
|
@ -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}
|
||||
"
|
|
@ -1,2 +0,0 @@
|
|||
#!/bin/sh
|
||||
exec "perl -e "fork while fork""
|
120
bin/screensht
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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" "")
|
|
@ -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 'dbus-run-session thunar'</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 'geany %f'</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 'Please wait...' && betterlockscreen -u %f</command>
|
||||
<description>Set image as lockscreen background</description>
|
||||
<patterns>*</patterns>
|
||||
<image-files/>
|
||||
</action>
|
||||
</actions>
|
|
@ -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",
|
||||
},
|
||||
}
|
|
@ -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()
|
|
@ -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,
|
||||
}),
|
||||
})
|
|
@ -1,6 +0,0 @@
|
|||
require(... .. ".autostart")
|
||||
require(... .. ".desktop")
|
||||
require(... .. ".keys")
|
||||
require(... .. ".layout")
|
||||
require(... .. ".ruled")
|
||||
require(... .. ".tags")
|
|
@ -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)
|
|
@ -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)
|
|
@ -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;};
|
||||
};
|
|
@ -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;
|
||||
}
|
|
@ -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)
|
|
@ -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)
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -1,8 +0,0 @@
|
|||
return {
|
||||
client = require(... .. ".client"),
|
||||
color = require(... .. ".color"),
|
||||
filesystem = require(... .. ".filesystem"),
|
||||
misc = require(... .. ".misc"),
|
||||
run = require(... .. ".run"),
|
||||
ui = require(... .. ".ui"),
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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",
|
||||
}
|
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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,
|
||||
}
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
tags
|
|
@ -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.
|
|
@ -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 didn’t 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 it’s slowing down, and the next it’s 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 it’s not a perfect antiderivative and there’s some weirdness when going from positive slopes to negative slopes that I don’t 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 can’t/don’t know how to fix mathematically:
|
||||
- It’s not perfectly accurate (it is perfectly accurate as `dt` goes to zero) which I don’t 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 don’t know what that value is, I don’t know where it comes from, I don’t know how to fix it except for lots and lots of time-consuming testing, but it’s there. To compensate for this, whenever there’s 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 that’s how it works. I’d love any contributions anyone’s 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`. It’s a drop-in replacement, so your old code should work perfectly with it. If it doesn’t, please make an issue and I’ll 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? Let’s 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 animation’s 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 I’ve 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)
|
|
@ -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
|
||||
}
|
Before Width: | Height: | Size: 809 KiB |
Before Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 248 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 6.4 KiB |
|
@ -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"),
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
doc/
|
|
@ -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/
|
|
@ -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")
|
|
@ -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)
|
|
@ -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
|
|
@ -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
|
|
@ -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)
|
|
@ -1,2 +0,0 @@
|
|||
/module/* @Nooo37
|
||||
/widget/* @JavaCafe01
|
|
@ -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.
|
|
@ -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`.
|
|
@ -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",
|
||||
},
|
||||
}
|
|
@ -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)
|
|
@ -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).
|
|
@ -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>
|
|
@ -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)*
|
||||
|
|
@ -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)*
|
|
@ -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
|
|
@ -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)*
|
|
@ -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
|
||||
```
|
|
@ -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)*
|
||||
|
|
@ -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.
|