Compare commits

..

4 Commits

Author SHA1 Message Date
Aire-One 25a0e62431 chore(rockspec): add lua versions dependencies 2024-10-31 22:19:21 +01:00
Aire-One 8c711157f9 update cspell 2024-10-31 21:55:15 +01:00
Aire-One 603204c064 init luarocks 2024-10-31 21:49:17 +01:00
Aire-One f147f9b4c8 add configs 2024-10-31 21:18:37 +01:00
14 changed files with 323 additions and 64 deletions

34
.cspell.json Normal file
View File

@ -0,0 +1,34 @@
{
"$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
"version": "0.2",
"useGitignore": true,
"ignorePaths": [".git"],
"enableGlobDot": true,
"words": [
"Aire-One",
"apikey",
"berlam",
"constructorfct",
"dbus",
"drawin",
"dryrun",
"fatalwarnings",
"freedesktop",
"JohnnyMorganz",
"keygrabber",
"ldoc",
"luacheck",
"luacheckrc",
"luadoc",
"luarocks",
"lunarmodules",
"mktemp",
"mousegrabber",
"rockspec",
"rockspecs",
"staticfct",
"stylua",
"upower",
"wibox"
]
}

19
.editorconfig Normal file
View File

@ -0,0 +1,19 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 3
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{json,yaml}]
indent_size = 2
[Makefile]
indent_style = tab

38
.github/workflows/doc.yaml vendored Normal file
View File

@ -0,0 +1,38 @@
name: Build doc
on:
push:
branches:
- master
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: lunarmodules/ldoc@v1.5.0
- uses: actions/upload-pages-artifact@v3
id: deployment
with:
path: doc/
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/deploy-pages@v4
id: deployment

51
.github/workflows/lint.yaml vendored Normal file
View File

@ -0,0 +1,51 @@
name: Lint
on:
push:
branches:
- master
pull_request:
jobs:
luacheck:
needs: []
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: lunarmodules/luacheck@v1
stylua:
needs: []
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: JohnnyMorganz/stylua-action@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
version: v0.20.0
args: --check .
ldoc:
needs: []
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: lunarmodules/ldoc@v1.5.0
with:
args: --fatalwarnings .
spellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: streetsidesoftware/cspell-action@v6
with:
incremental_files_only: false
rockspec:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: luarocks/gh-actions-lua@v10
- uses: luarocks/gh-actions-luarocks@v5
- run: luarocks lint awesome-battery_widget-dev-1.rockspec

21
.github/workflows/rock.yaml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Upload rock to LuaRocks
on:
push:
jobs:
affected:
uses: lunarmodules/.github/.github/workflows/list_affected_rockspecs.yml@main
upload:
needs: affected
if: >-
${{
github.repository == 'Aire-One/awesome-battery_widget' &&
( github.ref_name == 'master' || startsWith(github.ref, 'refs/tags/') ) &&
needs.affected.outputs.rockspecs
}}
uses: lunarmodules/.github/.github/workflows/upload_to_luarocks.yml@main
with:
rockspecs: ${{ needs.affected.outputs.rockspecs }}
secrets:
apikey: ${{ secrets.LUAROCKS_APIKEY }}

2
.gitignore vendored
View File

@ -1 +1 @@
doc/
/doc

31
.luacheckrc Normal file
View File

@ -0,0 +1,31 @@
std = "min"
include_files = {
".busted",
".luacheckrc",
"*.rockspec",
"src/",
}
read_globals = {
"awesome",
"button",
"dbus",
"drawable",
"drawin",
"key",
"keygrabber",
"mousegrabber",
"selection",
"tag",
"window",
"table.unpack",
"math.atan2",
}
globals = {
"screen",
"mouse",
"root",
"client",
}

6
.stylua.toml Normal file
View File

@ -0,0 +1,6 @@
indent_type = "Spaces"
indent_width = 3
call_parentheses = "None"
[sort_requires]
enabled = true

16
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
"Lua.runtime.path": [
"/usr/share/awesome/lib/?.lua",
"/usr/share/awesome/lib/?/init.lua"
],
"[lua]": {
"editor.defaultFormatter": "JohnnyMorganz.stylua"
},
"stylua.targetReleaseVersion": "latest",
"files.associations": {
".busted": "lua",
".luacheckrc": "lua",
"*.rockspec": "lua",
"config.ld": "lua"
}
}

24
Makefile Normal file
View File

@ -0,0 +1,24 @@
install:
luarocks --local build
luacheck:
luacheck .
stylua:
stylua --check .
ldoc-dryrun:
$(eval TMP := $(shell mktemp -d))
ldoc --fatalwarnings --dir $(TMP) .
rm -rf $(TMP)
cspell:
cspell lint .
lint-rockspec:
luarocks lint awesome-battery_widget-dev-1.rockspec
lint: luacheck stylua ldoc-dryrun cspell lint-rockspec
ldoc:
ldoc .

View File

@ -1,6 +1,6 @@
# 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.
This is my re-implementation of the [awesome-upower-battery][awesome-upower-battery-repository] by [berlam][berlam]. This widget has a lot of potential 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.

View File

@ -0,0 +1,26 @@
package = "awesome-battery_widget"
version = "dev-1"
source = {
url = "git+https://github.com/Aire-One/awesome-battery_widget.git",
}
description = {
summary = "A UPowerGlib based battery widget for the Awesome WM with a basic widget template mechanism! 🔋",
homepage = "https://github.com/Aire-One/awesome-battery_widget",
license = "*** please specify a license ***",
}
dependencies = {
"lua >= 5.1, < 5.5",
}
build = {
type = "builtin",
modules = {
["awesome-battery_widget.init"] = "src/awesome-battery_widget/init.lua",
},
copy_directories = {
"doc",
},
}

View File

@ -1,12 +1,12 @@
-- Configuration file for ldoc
project = 'battery_widget'
title = 'Awesome WM - Battery Widget'
project = "battery_widget"
title = "A UPowerGlib based battery widget for the Awesome WM with a basic widget template mechanism! 🔋"
all = false
dir = 'doc'
format='markdown'
pretty = 'lua'
dir = "doc"
format = "markdown"
pretty = "lua"
prettify_files = true
backtick_references = true
merge = true
@ -15,7 +15,6 @@ 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")

View File

@ -1,34 +1,33 @@
---------------------------------------------------------------------------
-- A battery widget based on the UPower deamon.
-- A battery widget based on the UPower daemon.
--
-- @author Aire-One
-- @copyright 2020 Aire-One
---------------------------------------------------------------------------
local upower = require('lgi').require('UPowerGlib')
local upower = require("lgi").require "UPowerGlib"
local gtable = require 'gears.table'
local gtimer = require 'gears.timer'
local wbase = require 'wibox.widget.base'
local gtable = require "gears.table"
local gtimer = require "gears.timer" -- cspell: ignore gtimer
local wbase = require "wibox.widget.base" -- cspell: ignore wbase
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()
local ret = {}
local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do
table.insert(ret, d:get_object_path())
end
for _, d in ipairs(devices) do
table.insert(ret, d:get_object_path())
end
return ret
return ret
end
--- Helper function to get a device instance from its path.
@ -36,23 +35,23 @@ end
-- @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()
local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do
if d:get_object_path() == path then
return d
end
end
for _, d in ipairs(devices) do
if d:get_object_path() == path then
return d
end
end
return nil
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
local bat0_path = "/org/freedesktop/UPower/devices/battery_BAT0"
return bat0_path
end
--- Helper function to convert seconds into a human readable clock string.
@ -64,34 +63,31 @@ end
-- @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
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()
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.
--- Emitted 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
@ -106,35 +102,33 @@ end
-- 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 {})
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)
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)
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
-- 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
-- Call an update cycle if the user asked to instant update the widget.
if args.instant_update then
gtimer.delayed_call(widget.emit_signal, widget, "upower::update", widget.device)
end
return widget
return widget
end
function mt.__call(self, ...)
return battery_widget.new(...)
function mt.__call(_, ...)
return battery_widget.new(...)
end
return setmetatable(battery_widget, mt)