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 # 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. 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. 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 -- Configuration file for ldoc
project = 'battery_widget' project = "battery_widget"
title = 'Awesome WM - Battery Widget' title = "A UPowerGlib based battery widget for the Awesome WM with a basic widget template mechanism! 🔋"
all = false all = false
dir = 'doc' dir = "doc"
format='markdown' format = "markdown"
pretty = 'lua' pretty = "lua"
prettify_files = true prettify_files = true
backtick_references = true backtick_references = true
merge = true merge = true
@ -15,7 +15,6 @@ wrap = true
sort_modules = true sort_modules = true
not_luadoc = true not_luadoc = true
-- Define some new ldoc tags from the AwesomeWM doc -- Define some new ldoc tags from the AwesomeWM doc
new_type("staticfct", "Static functions", false, "Parameters") new_type("staticfct", "Static functions", false, "Parameters")
new_type("constructorfct", "Constructor", 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 -- @author Aire-One
-- @copyright 2020 Aire-One -- @copyright 2020 Aire-One
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
local upower = require('lgi').require('UPowerGlib') local upower = require("lgi").require "UPowerGlib"
local gtable = require 'gears.table' local gtable = require "gears.table"
local gtimer = require 'gears.timer' local gtimer = require "gears.timer" -- cspell: ignore gtimer
local wbase = require 'wibox.widget.base' local wbase = require "wibox.widget.base" -- cspell: ignore wbase
local setmetatable = setmetatable -- luacheck: ignore setmetatable local setmetatable = setmetatable -- luacheck: ignore setmetatable
local battery_widget = {} local battery_widget = {}
local mt = {} local mt = {}
--- Helper to get the path of all connected power devices. --- Helper to get the path of all connected power devices.
-- @treturn table The list of all power devices path. -- @treturn table The list of all power devices path.
-- @staticfct battery_widget.list_devices -- @staticfct battery_widget.list_devices
function battery_widget.list_devices() function battery_widget.list_devices()
local ret = {} local ret = {}
local devices = upower.Client():get_devices() local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do for _, d in ipairs(devices) do
table.insert(ret, d:get_object_path()) table.insert(ret, d:get_object_path())
end end
return ret return ret
end end
--- Helper function to get a device instance from its path. --- 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. -- @treturn UPowerGlib.Device|nil The device if it was found, `nil` otherwise.
-- @staticfct battery_widget.get_device -- @staticfct battery_widget.get_device
function battery_widget.get_device(path) function battery_widget.get_device(path)
local devices = upower.Client():get_devices() local devices = upower.Client():get_devices()
for _,d in ipairs(devices) do for _, d in ipairs(devices) do
if d:get_object_path() == path then if d:get_object_path() == path then
return d return d
end end
end end
return nil return nil
end end
--- Helper function to easily get the default BAT0 device path without. --- Helper function to easily get the default BAT0 device path without.
-- @treturn string The BAT0 device path. -- @treturn string The BAT0 device path.
-- @staticfct battery_widget.get_BAT0_device_path -- @staticfct battery_widget.get_BAT0_device_path
function battery_widget.get_BAT0_device_path() function battery_widget.get_BAT0_device_path()
local bat0_path = '/org/freedesktop/UPower/devices/battery_BAT0' local bat0_path = "/org/freedesktop/UPower/devices/battery_BAT0"
return bat0_path return bat0_path
end end
--- Helper function to convert seconds into a human readable clock string. --- Helper function to convert seconds into a human readable clock string.
@ -64,34 +63,31 @@ end
-- @treturn string The human readable generated clock string. -- @treturn string The human readable generated clock string.
-- @staticfct battery_widget.to_clock -- @staticfct battery_widget.to_clock
function battery_widget.to_clock(seconds) function battery_widget.to_clock(seconds)
if seconds <= 0 then if seconds <= 0 then
return '00:00'; return "00:00"
else else
local hours = string.format('%02.f', math.floor(seconds/3600)); local hours = string.format("%02.f", math.floor(seconds / 3600))
local mins = string.format('%02.f', math.floor(seconds/60 - hours*60)); local mins = string.format("%02.f", math.floor(seconds / 60 - hours * 60))
return hours .. ':' .. mins return hours .. ":" .. mins
end end
end end
--- Gives the default widget to use if user didn't specify one. --- Gives the default widget to use if user didn't specify one.
-- The default widget used is an `empty_widget` instance. -- The default widget used is an `empty_widget` instance.
-- @treturn widget The default widget to use. -- @treturn widget The default widget to use.
local function default_template () local function default_template()
return wbase.empty_widget() return wbase.empty_widget()
end end
--- The device monitored by the widget. --- The device monitored by the widget.
-- @property device -- @property device
-- @tparam UPowerGlib.Device device -- @tparam UPowerGlib.Device device
--- Emited when the UPower device notify an update. --- Emitted when the UPower device notify an update.
-- @signal upower::update -- @signal upower::update
-- @tparam battery_widget widget The widget. -- @tparam battery_widget widget The widget.
-- @tparam UPowerGlib.Device device The Upower device. -- @tparam UPowerGlib.Device device The Upower device.
--- battery_widget constructor. --- battery_widget constructor.
-- --
-- This function creates a new `battery_widget` instance. This widget watches -- This function creates a new `battery_widget` instance. This widget watches
@ -106,35 +102,33 @@ end
-- widget creation. -- widget creation.
-- @treturn battery_widget The battery_widget instance build. -- @treturn battery_widget The battery_widget instance build.
-- @constructorfct battery_widget.new -- @constructorfct battery_widget.new
function battery_widget.new (args) function battery_widget.new(args)
args = gtable.crush({ args = gtable.crush({
widget_template = default_template(), widget_template = default_template(),
device_path = '', device_path = "",
use_display_device = false use_display_device = false,
}, args or {}) }, 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 widget.device = args.use_display_device and upower.Client():get_display_device()
and upower.Client():get_display_device() or battery_widget.get_device(args.device_path)
or battery_widget.get_device(args.device_path)
-- Attach signals: -- Attach signals:
widget.device.on_notify = function (d) widget.device.on_notify = function(d)
widget:emit_signal('upower::update', d) widget:emit_signal("upower::update", d)
end end
-- Call an update cycle if the user asked to instan update the widget. -- Call an update cycle if the user asked to instant update the widget.
if args.instant_update then if args.instant_update then
gtimer.delayed_call(widget.emit_signal, widget, 'upower::update', widget.device) gtimer.delayed_call(widget.emit_signal, widget, "upower::update", widget.device)
end end
return widget return widget
end end
function mt.__call(_, ...)
function mt.__call(self, ...) return battery_widget.new(...)
return battery_widget.new(...)
end end
return setmetatable(battery_widget, mt) return setmetatable(battery_widget, mt)