136 lines
3.7 KiB
Lua
136 lines
3.7 KiB
Lua
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local dbus_proxy = require("dbus_proxy")
|
|
local lgi = require("lgi")
|
|
local naughty = require("naughty")
|
|
|
|
return function()
|
|
|
|
local function get_device_info(object_path)
|
|
if object_path ~= nil and object_path:match("/org/bluez/hci0/dev") then
|
|
local device = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.bluez.Device1",
|
|
path = object_path
|
|
}
|
|
|
|
local battery = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.bluez.Battery1",
|
|
path = object_path
|
|
}
|
|
|
|
local device_properties = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.freedesktop.DBus.Properties",
|
|
path = object_path
|
|
}
|
|
awesome.emit_signal("bluetooth::scan")
|
|
if device.Name ~= nil or device.Alias ~= nil then
|
|
device_properties:connect_signal(function()
|
|
awesome.emit_signal("bluetooth::device_changed", device, battery)
|
|
end, "PropertiesChanged")
|
|
awesome.emit_signal("bluetooth::device_changed", device, battery)
|
|
end
|
|
end
|
|
end
|
|
|
|
awful.spawn.easy_async_with_shell(
|
|
"lsusb | grep Bluetooth",
|
|
function(stdout)
|
|
stdout = stdout:gsub("\n", "")
|
|
if stdout ~= "" or stdout == nil then
|
|
local ObjectManager = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.freedesktop.DBus.ObjectManager",
|
|
path = "/"
|
|
}
|
|
|
|
local Adapter = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.bluez.Adapter1",
|
|
path = "/org/bluez/hci0"
|
|
}
|
|
|
|
local AdapterProperties = dbus_proxy.Proxy:new {
|
|
bus = dbus_proxy.Bus.SYSTEM,
|
|
name = "org.bluez",
|
|
interface = "org.freedesktop.DBus.Properties",
|
|
path = "/org/bluez/hci0"
|
|
}
|
|
|
|
ObjectManager:connect_signal(
|
|
function(interface)
|
|
get_device_info(interface)
|
|
end,
|
|
"InterfacesAdded"
|
|
)
|
|
|
|
ObjectManager:connect_signal(
|
|
function(interface)
|
|
awesome.emit_signal("device_removed", interface)
|
|
end,
|
|
"InterfacesRemoved"
|
|
)
|
|
|
|
Adapter:connect_signal(
|
|
function(data)
|
|
if data.Powered ~= nil then
|
|
awesome.emit_signal("state", data.Powered)
|
|
end
|
|
end,
|
|
"PropertiesChanged"
|
|
)
|
|
|
|
awesome.connect_signal(
|
|
"bluetooth::scan",
|
|
function()
|
|
Adapter:StartDiscovery()
|
|
end
|
|
)
|
|
|
|
AdapterProperties:connect_signal(
|
|
function(data)
|
|
if data.Powered ~= nil then
|
|
if data.Powered then
|
|
Adapter:StartDiscovery()
|
|
end
|
|
end
|
|
end,
|
|
"PropertiesChanged"
|
|
)
|
|
|
|
awesome.connect_signal("toggle_bluetooth",
|
|
function()
|
|
local is_powered = Adapter.Powered
|
|
Adapter:Set(
|
|
"org.bluez.Adapter1",
|
|
"Powered",
|
|
lgi.GLib.Variant("b", not is_powered)
|
|
)
|
|
Adapter.Powered = { signature = "b", value = not is_powered }
|
|
awesome.emit_signal("state", Adapter.Powered)
|
|
end)
|
|
|
|
gears.timer.delayed_call(
|
|
function()
|
|
local objects = ObjectManager:GetManagedObjects()
|
|
|
|
for object_path, _ in pairs(objects) do
|
|
get_device_info(object_path)
|
|
end
|
|
|
|
awesome.emit_signal("state", Adapter.Powered)
|
|
end
|
|
)
|
|
end
|
|
end
|
|
)
|
|
|
|
end
|