Author: | shmilee |
---|---|
Version: | git |
License: | GNU-GPL2 |
Source: | https://github.com/shmilee/awesome-away |
This module provides wallpapers, widgets, themes and utilities for Awesome WM 4.x. Some partial widgets and utilities extracted from other repositories are also included in ./third_party.
- curl: download data with URL
- dkjson: decode json data, included in ./third_party
- xwinwrap: optional, for video wallpaper away.wallpaper.get_videowallpaper
- mpv: optional, for video wallpaper away.wallpaper.get_videowallpaper
- yt-dlp: optional, for websites (like Bilibili) video wallpaper away.wallpaper.get_videowallpaper
- alsa-utils: optional, for away.widget.alsa
- acpi: optional, for away.widget.battery
- sxtwl: optional, for away.widget.lunar
# archlinux
sudo pacman -S mpv yt-dlp
sudo yay -S xwinwrap-git
# debian, ubuntu, etc
sudo apt-get install mpv
# install xwinwrap from source, see its homepage
sudo pacman -S alsa-utils # archlinux
sudo apt-get install alsa-utils # debian, ubuntu, etc
sudo pacman -S acpi # archlinux
sudo apt-get install acpi # debian, ubuntu, etc
- About sxtwl version:
- date: Sep 6 2024
- commit: 601ac4cbec0c2a4c08060eb22cf08b4995effe4c
About lua version, if several versions lua are installed in your system, sxtwl must use the same version lua of awesome. Like, awesome uses lua53, 5.3.6, but latest lua is lua, 5.4.7, then we need to edit the CMakeLists.txt find_package(Lua).
git clone https://github.com/yuangu/sxtwl_cpp.git
cd sxtwl_cpp/
# set lua version if needed
#sed -i 's|find_package(Lua)|find_package(Lua 5.3.6 EXACT)|' CMakeLists.txt
mkdir build
cd build/
cmake .. -G "Unix Makefiles" -DSXTWL_WRAPPER_LUA=1
cmake --build .
strip libsxtwl_lua.so
# check lua version
ldd libsxtwl_lua.so | grep lua
ldd `which awesome` | grep lua
# install
cp libsxtwl_lua.so ~/.config/awesome/sxtwl.so
cd ~/.config/awesome
git clone https://github.com/shmilee/awesome-away.git away
then include away into your rc.lua
local away = require("away")
example: test-wallpaper.lua
-- get_solowallpaper(screen, name, args)
wp = away.wallpaper.get_solowallpaper(screen, 'local', {
id='Local test',
dirpath='/path/to/image/dir',
})
wp.update() -- set next wallpaper
wp.print_using() -- print using wallpaper
- support name
- local: Use images in the given dicrectory
- 360chrome: Fetch http://wallpaper.apc.360.cn/ images
- baidu: Fetch http://image.baidu.com/ images
- bing: Fetch https://www.bing.com daily images
- nationalgeographic: Fetch https://www.nationalgeographic.com/photography/photo-of-the-day/ images
- spotlight: Fetch Windows spotlight's images
- wallhaven: Fetch https://wallhaven.cc/ images
support args of local:
Argument
Meaning
Type
Default
id
ID
string
nil
dirpath
images dicrectory path
string
nil
imagetype
images extension
table of strings
{'jpg', 'jpeg', 'png'}
ls
cmd ls
string
'ls -a'
filter
filename filter pattern
string
'.*'
setting
set wallpaper
function
function(wp) ... end
timeout
refresh timeout seconds for setting next wallpaper
number
60
update_by_tag
set wallpaper when tag changed
boolean
false
support args of others, like bing:
Argument
Meaning
Type
Default
id
ID
string
'Bing'
api
web api
string
query
search query
table of parameters
{ format='js', idx=-1, n=8 }
choices
choices in response
table of numbers
{ 1, 2, 3, 4, 5, 6, 7, 8 }
curl
curl cmd
string
'curl -f -s -m 10'
cachedir
path to store images
string
"~/.cache/wallpaper-bing"
timeout_info
refresh timeout seconds for fetching new json
number
86400
setting
Set wallpaper
function
function(wp) ... end
force_hd
force to use HD image(work with get_url)
boolean or 'UHD'
true
get_url
get image url from response data
function
function(wp, data, choice) ... end
get_name
get image name from response data
function
function(wp, data, choice) ... end
timeout
refresh timeout seconds for setting next wallpaper
number
60
update_by_tag
set wallpaper when tag changed
boolean
false
combine solo wallpapers local 360chrome baidu bing etc.
-- get_miscwallpaper(screen, margs, candidates)
wp = away.wallpaper.get_miscwallpaper(
screen, { timeout=5, random=true },
{
{ name='bing', weight=2, args={ query={ format='js', idx=1, n=4 } } },
{ name='local', weight=2, args={ id='Local', dirpath='/dir/path' } },
-- more ...
})
wp.update() -- set next wallpaper
wp.print_using() -- print using wallpaper
support margs candidates:
Input Variable
Meaning
Type
Default
margs.timeout
refresh timeout seconds for setting next wallpaper
number
60
margs.random
random wallpaper for next
boolean
false
margs.update_by_tag
set wallpaper when tag changed
boolean
false
candidates
misc wallpaper candidates
table of solo_wallpaper table
nil
solo_wallpaper.name
local or bing etc
string
nil
solo_wallpaper.weight
frequency of this wallpaper
number
nil
solo_wallpaper.args
args of this wallpaper, see above. args.timeout and args.update_by_tag are ignored.
table
nil
-- get_videowallpaper(screen, args)
wp = away.wallpaper.get_videowallpaper(screen, {
id='Video test',
path='/path/to/video/file.mp4',
})
wp.update() -- update wallpaper, reopen player
wp.print_using() -- print video path
support args:
Argument
Meaning
Type
Default
id
ID
string
'Video'
path
video path or url
string
nil
get_realpath
get real video path from url
function
nil
xwinwrap
xwinwrap cmd
string
'xwinwrap'
xargs
options for xwinwrap (without -g)
table of string
{'-b -ov -ni -nf -un -s -st -sp -o 0.9'}
player
video player
string
'mpv'
pargs
options for player
table of string
{ '-wid WID ...etc ', '--loop-file ...etc'}
after_prg
set wallpaper after after_prg (pgrep pattern) started
string
nil
timeout
refresh timeout seconds for updating wallpaper
number (>=0)
0 (do not update)
volume = away.widget.alsa({
theme = theme, -- or beautiful
setting = function(volume)
volume.set_now(volume)
if volume.now.status == "off" then
awful.spawn("volnoti-show -m")
else
awful.spawn(string.format("volnoti-show %s", volume.now.level))
end
end,
buttoncmds = { left="pavucontrol" },
})
tokens0 = away.widget.apiusage({
timeout = 3600, font = 'Ubuntu Mono 14',
apis = {
{
url = "https://api.xxxx/v1/query/usage_detail",
header = {
['Content-Type']="application/json",
['Authorization']="sk-xxxxxxxxxxx"
},
postdata = '{"days":3,"model":"gpt-%"}',
get_info = function(self, data)
for i = 1, #data do
self.usage = ??
self.detail += ??
end
end,
},
{
url = "https://api.xxx/v1/query/balance",
query = ..., header = ..., postdata = ...,
get_info = ...,
},
},
setting = function(self)
self.now.icon = '??'
self.now.notification_icon = '??'
self.now.text = 'AI: ??'
self.now.notification_text = ''
end
})
-- single
tokens0:attach(tokens0.wtext)
tokens0:attach(tokens0.wicon)
tokens0.wicon:buttons(tokens0.updatebuttons)
-- multi, merge into one group
tokens1, tokens2 = ... -- set more apiusage workers
alltokens = away.widget.apiusage.group(
{ tokens0, tokens1, tokens2, ... }, -- arg-1: all apiusage workers
{ tokens0.wicon, tokens0.wtext, tokens1.wtext, tokens2.wtext, ...,
layout = 'horizontal' } -- arg-2 for wibox.widget
)
alltokens:attach(alltokens.wlayout)
alltokens.wlayout:buttons(alltokens.updatebuttons)
battery = away.widget.battery({
timeout = 5,
font ='Ubuntu Mono 12',
--setting = function(battery) .... end,
})
battery:attach(battery.wicon)
-- add battery.observer.handlers to handle observer.status
--table.insert(battery.observer.handlers, function(observer, val) ... end)
_wcpu = away.widget.cpu({
theme = theme,
font = wfont,
})
_wcpu:attach(_wcpu.wicon)
lunar = away.widget.lunar({
timeout = 10800,
font ='Ubuntu Mono 12',
--setting = function(lunar) .... end,
})
lunar:attach(lunar.wtext)
-- available weather module's query
weather_querys = {
etouch = {
citykey=101210101, --杭州
},
meizu = {
cityIds=101210101,
},
tianqi = {
version='v1', unescape=1,
appid=23035354, appsecret='8YvlPNrz',
--cityid= 101210101, -- default weather by IP address
},
xiaomiv2 = {
cityId=101210101,
},
xiaomiv3 ={
latitude = 0,
longitude = 0,
locationKey = 'weathercn:101210101', --杭州
appKey = 'weather20151024',
sign = 'zUFJoAR2ZVrDy1vF3D07',
isGlobal = 'false',
locale = 'zh_cn',
days = 6,
},
}
weather = away.widget.weather['tianqi']({
timeout = 600, -- 10 min
query = weather_querys['tianqi'],
--curl = 'curl -f -s -m 7'
--font ='Ubuntu Mono 12',
--get_info = function(weather, data) end,
--setting = function(weather) end,
})
weather:attach(weather.wicon)
meiriyiwen = away.widget.meiriyiwen({
font = 'WenQuanYi Micro Hei',
font_size = 15,
ratio = 0, -- 0: all content; (0-1): content*ratio
height = 0.9, -- screen.height*0.9
})
yiwen = meiriyiwen.update
-- 长文章后半段, Super + x : yiwen({ratio=0.5})
mem = away.widget.memory({
theme = theme,
timeout = 2,
-- calculate mem.now.perc, mem.now.used by mem.now.info {MemTotal ...}
--calculate = function(mem) end,
-- setting mem.now.text, mem.now.notification_text
--setting = function(mem) end,
})
_wtemp = away.widget.thermal({
theme = theme,
font = wfont,
})
_wtemp:attach(_wtemp.wicon)
away.menu.init({
osi_wm_name="", -- Name of the WM for the OnlyShowIn entry
icon_theme=nil, -- icon theme for application icons
categories_name=nil, -- category name with nice name
})
-- away.menu.menubar_nice_category_name()
local dpi = require("beautiful").xresources.apply_dpi
-- mainmenu for each screen
s.mymainmenu = away.menu({
before=thinktheme.awesomemenu(), -- items before freedesktop.org menu
after=thinktheme.custommenu(), -- items after freedesktop.org menu
theme={ -- set menu item height, width, font for each screen
height=dpi(20, s), width=dpi(120, s), font=nil,
},
})
- generate awful menu items:
xrandr_menu = away.xrandr_menu({
{ name="H-S-MiTV", dpi=144, complete=true, monitors={
{ key='eDP1-310x170-1366x768', scale=1.5 }, -- laptop T450
{ key='Mi-TV-1220x690-3840x2160', scale=1.0 } -- Mi TV
} },
{ name='Reset', complete=true, monitors={
'eDP1-310x170-1366x768', -- laptop T450, dpi=96, scale=1.0
} },
})
-- showX: show connected monitors info get by 'xrandr -q --prop'
-- showA: show screen info get from awesome
-- Hline-auto: stack all connected outputs horizontally (--auto)
-- Hline-scale: stack all connected outputs horizontally (--scale 1.0)
-- H-S-MiTV: stack T450 scale=1.5, MiTV scale=1.0 horizontally
-- Reset: only enable T450 scale=1.0, disable others (--off)
- Get keys in lua interactive mode:
> xrandr = require("away.xrandr") -- or xrandr = require("xrandr")
> xrandr.show_connected()
2022-04-06 10:41:09 Away[I]: Run command: xrandr -q --prop, DONE with exit code 0
Monitor 1:
Key: eDP1-310x170-1366x768
DPI: 112.59
Geometry: 1366x768
Size: 310mmx170mm
Preferred: 1366x768
Monitor 2: DELL U2723QX
Key: DELL-U2723QX-600x340-3840x2160
DPI: 162.28
Geometry: 3840x2160
Size: 600mmx340mm
Preferred: 3840x2160
>
inherit zenburn theme, then add
- function theme.wallpaper(s)
- use away.wallpaper
- os.getenv("HOME") .. "/.cache/wallpaper-bing"
- os.getenv("HOME") .. "/.cache/wallpaper-360chrome"
- os.getenv("HOME") .. "/.cache/wallpaper-wallhaven"
- os.getenv("HOME") .. "/.cache/wallpaper-lovebizhi"
- online(like FY-4B) video wallpaper
- fallback
- think-1920x1200.jpg
- violin-1920x1080.jpg
- menu
- terminal: xterm
- editor: vim
- firefox
- table theme.layouts for 4 screens
- table theme.tagnames for 4 screens
- Widgets from away, save to theme.widgets
- textclock, calendar
- lunar, apiusage, weather, battery, volume: need dependencies
- volume: also need pavucontrol, volnoti
- systray, coretemp, cpu, mem
- function theme.createmywibox(s)
- wallpaper, mainmenu, taglist, promptbox, tasklist, widgets
- theme.height etc. for mainmenu, tasklist
- different dpi for each screen
- fonts
- default: WenQuanYi Micro Hei
- widget: Ubuntu Mono
- read secret keys from away.secret (examples in secret-example.lua)
- ChatAnywhere API keys
- yiketianqi query, appid, appsecret