diff --git a/awesome/src/assets/icons/bluetooth/audio-card.svg b/awesome/src/assets/icons/bluetooth/audio-card.svg new file mode 100644 index 0000000..a09c799 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/audio-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/audio-headphones.svg b/awesome/src/assets/icons/bluetooth/audio-headphones.svg new file mode 100644 index 0000000..49d9ff5 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/audio-headphones.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/audio-headset.svg b/awesome/src/assets/icons/bluetooth/audio-headset.svg new file mode 100644 index 0000000..68de8be --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/audio-headset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/camera-photo.svg b/awesome/src/assets/icons/bluetooth/camera-photo.svg new file mode 100644 index 0000000..14d9649 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/camera-photo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/camera-video.svg b/awesome/src/assets/icons/bluetooth/camera-video.svg new file mode 100644 index 0000000..5222ea3 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/camera-video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/computer.svg b/awesome/src/assets/icons/bluetooth/computer.svg new file mode 100644 index 0000000..de38c7d --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/computer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/input-gaming.svg b/awesome/src/assets/icons/bluetooth/input-gaming.svg new file mode 100644 index 0000000..cdf3ee2 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/input-gaming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/input-keyboard.svg b/awesome/src/assets/icons/bluetooth/input-keyboard.svg new file mode 100644 index 0000000..c36d000 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/input-keyboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/input-mouse.svg b/awesome/src/assets/icons/bluetooth/input-mouse.svg new file mode 100644 index 0000000..c5ea217 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/input-mouse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/input-tablet.svg b/awesome/src/assets/icons/bluetooth/input-tablet.svg new file mode 100644 index 0000000..ddf8170 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/input-tablet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/link-off.svg b/awesome/src/assets/icons/bluetooth/link-off.svg new file mode 100644 index 0000000..3c5e302 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/link-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/link.svg b/awesome/src/assets/icons/bluetooth/link.svg new file mode 100644 index 0000000..6f4c3b6 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/menu-down.svg b/awesome/src/assets/icons/bluetooth/menu-down.svg new file mode 100644 index 0000000..50b8625 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/menu-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/menu-up.svg b/awesome/src/assets/icons/bluetooth/menu-up.svg new file mode 100644 index 0000000..5fb8642 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/menu-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/multimedia-player.svg b/awesome/src/assets/icons/bluetooth/multimedia-player.svg new file mode 100644 index 0000000..b5cfa13 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/multimedia-player.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/network-wireless.svg b/awesome/src/assets/icons/bluetooth/network-wireless.svg new file mode 100644 index 0000000..3974275 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/network-wireless.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/phone.svg b/awesome/src/assets/icons/bluetooth/phone.svg new file mode 100644 index 0000000..cd9374e --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/printer.svg b/awesome/src/assets/icons/bluetooth/printer.svg new file mode 100644 index 0000000..5e81f96 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/scanner.svg b/awesome/src/assets/icons/bluetooth/scanner.svg new file mode 100644 index 0000000..d530d21 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/scanner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/television.svg b/awesome/src/assets/icons/bluetooth/television.svg new file mode 100644 index 0000000..6c6dfcc --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/television.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/video-display.svg b/awesome/src/assets/icons/bluetooth/video-display.svg new file mode 100644 index 0000000..e8be002 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/video-display.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/assets/icons/bluetooth/watch.svg b/awesome/src/assets/icons/bluetooth/watch.svg new file mode 100644 index 0000000..9db8a32 --- /dev/null +++ b/awesome/src/assets/icons/bluetooth/watch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/awesome/src/dbus/bluetooth_dbus.lua b/awesome/src/dbus/bluetooth_dbus.lua index 8c51a0a..ce453e0 100644 --- a/awesome/src/dbus/bluetooth_dbus.lua +++ b/awesome/src/dbus/bluetooth_dbus.lua @@ -28,16 +28,12 @@ return function() interface = "org.freedesktop.DBus.Properties", path = object_path } - - if device.Name ~= "" and device.Name ~= nil then + awesome.emit_signal("bluetooth::scan") + if device.Name ~= nil or device.Alias ~= nil then device_properties:connect_signal(function() - naughty.notification { - title = "Bluetooth Device Connected", - message = device.Name, - icon = require("awful").util.getdir("config") .. "src/assets/icons/bluetooth/bluetooth.svg" - } - awesome.emit_signal("device_added", object_path, device, battery) + awesome.emit_signal("bluetooth::device_changed", device, battery) end, "PropertiesChanged") + awesome.emit_signal("bluetooth::device_changed", device, battery) end end end @@ -91,10 +87,16 @@ return function() "PropertiesChanged" ) + awesome.connect_signal( + "bluetooth::scan", + function() + Adapter:StartDiscovery() + end + ) + AdapterProperties:connect_signal( function(data) if data.Powered ~= nil then - awesome.emit_signal("state", data.Powered) if data.Powered then Adapter:StartDiscovery() end diff --git a/awesome/src/modules/bluetooth_controller.lua b/awesome/src/modules/bluetooth_controller.lua new file mode 100644 index 0000000..43a61cb --- /dev/null +++ b/awesome/src/modules/bluetooth_controller.lua @@ -0,0 +1,500 @@ +-------------------------------------- +-- This is the bluetooth controller -- +-------------------------------------- + +-- Awesome Libs +local awful = require("awful") +local color = require("src.theme.colors") +local dpi = require("beautiful").xresources.apply_dpi +local gears = require("gears") +local naughty = require("naughty") +local wibox = require("wibox") + +local rubato = require("src.lib.rubato") + +local icondir = awful.util.getdir("config") .. "src/assets/icons/bluetooth/" + +return function(s) + + local function create_device(device, battery) + local icon = device.Icon or "bluetooth-on" + local device_widget = wibox.widget { + { + { + { + { + { + image = gears.color.recolor_image(icondir .. icon .. ".svg", color["Purple200"]), + id = "icon", + resize = false, + valign = "center", + halign = "center", + forced_width = dpi(24), + forced_height = dpi(24), + widget = wibox.widget.imagebox + }, + id = "icon_container", + strategy = "max", + width = dpi(24), + height = dpi(24), + widget = wibox.container.constraint + }, + { + { + { + text = device.Alias or device.Name, + id = "alias", + widget = wibox.widget.textbox + }, + { + text = "Connecting...", + id = "connecting", + visible = false, + font = user_vars.font.specify .. ", regular 10", + widget = wibox.widget.textbox + }, + id = "alias_container", + layout = wibox.layout.fixed.horizontal + }, + width = dpi(260), + height = dpi(40), + strategy = "max", + widget = wibox.container.constraint + }, + spacing = dpi(10), + layout = wibox.layout.fixed.horizontal + }, + { -- Spacing + forced_width = dpi(10), + widget = wibox.container.background + }, + { + { + { + { + { + id = "con", + resize = false, + valign = "center", + halign = "center", + forced_width = dpi(24), + forced_height = dpi(24), + widget = wibox.widget.imagebox + }, + id = "place", + strategy = "max", + width = dpi(24), + height = dpi(24), + widget = wibox.container.constraint + }, + id = "margin", + margins = dpi(2), + widget = wibox.container.margin + }, + id = "backgr", + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, dpi(4)) + end, + bg = color["Blue200"], + widget = wibox.container.background + }, + id = "margin0", + margin = dpi(5), + widget = wibox.container.margin + }, + id = "device_layout", + layout = wibox.layout.align.horizontal + }, + id = "device_margin", + margins = dpi(5), + widget = wibox.container.margin + }, + bg = color["Grey900"], + fg = color["LightBlue200"], + border_color = color["Grey800"], + border_width = dpi(2), + id = "background", + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end, + widget = wibox.container.background + } + + --! using :Connect freezes awesome, either find a solution or switch to console commands + if device.Connected then + device_widget:get_children_by_id("con")[1].image = gears.color.recolor_image(icondir .. "link-off.svg", color["Grey900"]) + device_widget:connect_signal( + "button::press", + function(c, d, e, key) + if key == 1 then + device:Disconnect() + awesome.emit_signal("bluetooth::connect", device) + end + end + ) + else + device_widget:get_children_by_id("con")[1].image = gears.color.recolor_image(icondir .. "link.svg", color["Grey900"]) + device_widget:connect_signal( + "button::press", + function(c, d, e, key) + if key == 1 then + device:Connect() + awesome.emit_signal("bluetooth::disconnect", device) + end + end + ) + end + Hover_signal(device_widget, '#313131', color["LightBlue100"]) + return device_widget + end + + local connected_devices_list = wibox.widget { + { + { + { + step = dpi(50), + spacing = dpi(10), + layout = wibox.layout.overflow.vertical, + scrollbar_width = 0, + id = "connected_device_list" + }, + id = "margin", + margins = dpi(10), + widget = wibox.container.margin + }, + id = "place", + height = dpi(200), + strategy = "max", + widget = wibox.container.constraint + }, + id = "connected_device_background", + border_color = color["Grey800"], + border_width = dpi(2), + shape = function(cr, width, height) + gears.shape.partially_rounded_rect(cr, width, height, false, false, true, true, 4) + end, + widget = wibox.container.background + } + + local discovered_devices_list = wibox.widget { + { + { + { + spacing = dpi(10), + step = dpi(50), + layout = wibox.layout.overflow.vertical, + scrollbar_width = 0, + id = "discovered_device_list" + }, + id = "margin", + margins = dpi(10), + widget = wibox.container.margin + }, + id = "place", + height = dpi(200), + strategy = "max", + widget = wibox.container.constraint + }, + id = "discovered_device_background", + border_color = color["Grey800"], + border_width = dpi(2), + shape = function(cr, width, height) + gears.shape.partially_rounded_rect(cr, width, height, false, false, true, true, 4) + end, + widget = wibox.container.background + } + + local bluetooth_container = wibox.widget { + { + { + { + { + { + { + { + { + resize = false, + image = gears.color.recolor_image(icondir .. "menu-down.svg", color["Purple200"]), + widget = wibox.widget.imagebox, + id = "icon" + }, + id = "center", + halign = "center", + valign = "center", + widget = wibox.container.place, + }, + { + { + text = "Coupled Devices", + widget = wibox.widget.textbox, + id = "device_name" + }, + margins = dpi(5), + widget = wibox.container.margin + }, + id = "connected", + layout = wibox.layout.fixed.horizontal + }, + id = "connected_bg", + bg = color["Grey800"], + fg = color["Purple200"], + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end, + widget = wibox.container.background + }, + id = "connected_margin", + widget = wibox.container.margin + }, + { + id = "connected_list", + widget = connected_devices_list, + forced_height = 0 + }, + { + { + { + { + { + resize = false, + image = gears.color.recolor_image(icondir .. "menu-down.svg", color["LightBlueA200"]), + widget = wibox.widget.imagebox, + id = "icon", + }, + id = "center", + halign = "center", + valign = "center", + widget = wibox.container.place, + }, + { + { + text = "Nearby Devices", + widget = wibox.widget.textbox, + id = "device_name" + }, + margins = dpi(5), + widget = wibox.container.margin + }, + id = "discovered", + layout = wibox.layout.fixed.horizontal + }, + id = "discovered_bg", + bg = color["Grey800"], + fg = color["Blue200"], + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end, + widget = wibox.container.background + }, + id = "discovered_margin", + top = dpi(10), + widget = wibox.container.margin + }, + { + id = "discovered_list", + widget = discovered_devices_list, + forced_height = 0 + }, + id = "layout1", + layout = wibox.layout.fixed.vertical + }, + id = "margin", + margins = dpi(15), + widget = wibox.container.margin + }, + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, dpi(8)) + end, + border_color = color["Grey800"], + border_width = dpi(4), + bg = color["Grey900"], + id = "background", + widget = wibox.container.background + }, + width = dpi(400), + strategy = "exact", + widget = wibox.container.constraint + } + + -- Main container + local bluetooth_controller_container = awful.popup { + widget = wibox.container.background, + ontop = true, + bg = color["Grey900"], + stretch = false, + visible = false, + screen = s, + placement = function(c) awful.placement.align(c, { position = "top_right", margins = { right = dpi(380), top = dpi(60) } }) end, + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 12) + end + } + + local connected_devices, nearby_devices = {}, {} + + -- function to check if a device is already in the list + local function is_device_in_list(device) + for i = 1, #connected_devices do + if connected_devices[i].Address == device.Address then + return true + end + end + return false + end + + awesome.connect_signal( + "bluetooth::device_changed", + function(device, battery) + if not is_device_in_list(device) then + -- add device and battery to list + if device.Paired then + table.insert(connected_devices, device) + else + table.insert(nearby_devices, device) + end + end + + if (#connected_devices + #nearby_devices) > 0 then + local cd_list, dd_list = {}, {} + for _, d in pairs(connected_devices) do + if d.Paired then + table.insert(cd_list, create_device(d)) + else + table.insert(dd_list, create_device(d)) + end + end + for _, d in pairs(nearby_devices) do + if d.Paired then + table.insert(cd_list, create_device(d, battery)) + else + table.insert(dd_list, create_device(d, battery)) + end + end + connected_devices_list:get_children_by_id("connected_device_list")[1].children = cd_list + discovered_devices_list:get_children_by_id("discovered_device_list")[1].children = dd_list + end + end + ) + + -- Variables for easier access and better readability + local connected_margin = bluetooth_container:get_children_by_id("connected_margin")[1] + local connected_list = bluetooth_container:get_children_by_id("connected_list")[1] + local connected_bg = bluetooth_container:get_children_by_id("connected_bg")[1] + local connected = bluetooth_container:get_children_by_id("connected")[1].center + + -- Click event for the microphone dropdown + connected_margin:connect_signal( + "button::press", + function() + local rubato_timer = rubato.timed { + duration = 0.4, + intro = 0.1, + outro = 0.1, + pos = connected_list.forced_height, + easing = rubato.linear, + subscribed = function(v) + connected_list.forced_height = v + end + } + if connected_list.forced_height == 0 then + local size = (#connected_devices * 45) + ((#connected_devices - 1) * 10) + if size < 210 then + rubato_timer.target = dpi(size) + else + rubato_timer.target = dpi(210) + end + connected_margin.connected_bg.shape = function(cr, width, height) + gears.shape.partially_rounded_rect(cr, width, height, true, true, false, false, 4) + end + connected.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["Purple200"])) + else + rubato_timer.target = 0 + connected_bg.shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end + connected.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["Purple200"])) + end + end + ) + + -- Variables for easier access and better readability + local discovered_margin = bluetooth_container:get_children_by_id("discovered_margin")[1] + local discovered_list = bluetooth_container:get_children_by_id("discovered_list")[1] + local discovered_bg = bluetooth_container:get_children_by_id("discovered_bg")[1] + local discovered = bluetooth_container:get_children_by_id("discovered")[1].center + + -- Click event for the microphone dropdown + discovered_margin:connect_signal( + "button::press", + function() + local rubato_timer = rubato.timed { + duration = 0.4, + intro = 0.1, + outro = 0.1, + pos = discovered_list.forced_height, + easing = rubato.linear, + subscribed = function(v) + discovered_list.forced_height = v + end + } + + if discovered_list.forced_height == 0 then + local size = (#nearby_devices * dpi(45)) + ((#nearby_devices - 1) * dpi(10)) + if size < 210 then + rubato_timer.target = dpi(size) + else + rubato_timer.target = dpi(20) + end + discovered_margin.discovered_bg.shape = function(cr, width, height) + gears.shape.partially_rounded_rect(cr, width, height, true, true, false, false, 4) + end + discovered.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["LightBlue200"])) + else + rubato_timer.target = dpi(0) + discovered_bg.shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end + discovered.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["LightBlue200"])) + end + end + ) + + -- When the mouse leaves the popup it stops the mousegrabber and hides the popup. + bluetooth_controller_container:connect_signal( + "mouse::leave", + function() + mousegrabber.run( + function() + awesome.emit_signal("bluetooth_controller::toggle", s) + mousegrabber.stop() + return true + end, + "arrow" + ) + end + ) + + bluetooth_controller_container:connect_signal( + "mouse::enter", + function() + mousegrabber.stop() + end + ) + + -- Draw the popup + bluetooth_controller_container:setup { + bluetooth_container, + layout = wibox.layout.fixed.horizontal + } + + -- Toggle container visibility + awesome.connect_signal( + "bluetooth_controller::toggle", + function(scr) + if scr == s then + bluetooth_controller_container.visible = not bluetooth_controller_container.visible + end + end + ) + +end diff --git a/awesome/src/modules/notification-center/status_bars.lua b/awesome/src/modules/notification-center/status_bars.lua index 0c12663..5a39103 100644 --- a/awesome/src/modules/notification-center/status_bars.lua +++ b/awesome/src/modules/notification-center/status_bars.lua @@ -92,7 +92,7 @@ return function() awesome.connect_signal( "update::cpu_usage_widget", function(cpu_usage) - w:get_children_by_id("progressbar1")[1].value = cpu_usage + --w:get_children_by_id("progressbar1")[1].value = cpu_usage tooltip.text = "CPU Usage: " .. cpu_usage .. "%" rubato_timer.target = cpu_usage end @@ -163,7 +163,7 @@ return function() awesome.connect_signal( "update::cpu_temp_widget", function(cpu_temp, cpu_temp_icon) - w:get_children_by_id("progressbar1")[1].value = cpu_temp + --w:get_children_by_id("progressbar1")[1].value = cpu_temp w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(cpu_temp_icon, color["Blue200"]) tooltip.text = "CPU Temp: " .. cpu_temp .. "°C" rubato_timer.target = cpu_temp @@ -233,7 +233,7 @@ return function() awesome.connect_signal( "update::ram_widget", function(ram_usage) - w:get_children_by_id("progressbar1")[1].value = ram_usage + --w:get_children_by_id("progressbar1")[1].value = ram_usage tooltip.text = "RAM Usage: " .. ram_usage .. "%" rubato_timer.target = ram_usage end @@ -302,7 +302,7 @@ return function() awesome.connect_signal( "update::gpu_usage_widget", function(gpu_usage) - w:get_children_by_id("progressbar1")[1].value = gpu_usage + --w:get_children_by_id("progressbar1")[1].value = gpu_usage tooltip.text = "GPU Usage: " .. gpu_usage .. "%" rubato_timer.target = gpu_usage end @@ -373,7 +373,7 @@ return function() awesome.connect_signal( "update::gpu_temp_widget", function(gpu_temp, gpu_temp_icon) - w:get_children_by_id("progressbar1")[1].value = gpu_temp + --w:get_children_by_id("progressbar1")[1].value = gpu_temp w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(gpu_temp_icon, color["Green200"]) tooltip.text = "GPU Temp: " .. gpu_temp .. "°C" rubato_timer.target = gpu_temp @@ -445,7 +445,7 @@ return function() awesome.connect_signal( "update::volume_widget", function(volume, volume_icon) - w:get_children_by_id("progressbar1")[1].value = volume + --w:get_children_by_id("progressbar1")[1].value = volume w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(volume_icon, color["Yellow200"]) tooltip.text = "Volume: " .. volume .. "%" rubato_timer.target = volume @@ -517,7 +517,7 @@ return function() awesome.connect_signal( "update::microphone_widget", function(microphone, microphone_icon) - w:get_children_by_id("progressbar1")[1].value = microphone + --w:get_children_by_id("progressbar1")[1].value = microphone w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(microphone_icon, color["Purple200"]) tooltip.text = "Microphone: " .. microphone .. "%" rubato_timer.target = microphone @@ -589,7 +589,7 @@ return function() awesome.connect_signal( "update::backlight_widget", function(backlight, backlight_icon) - w:get_children_by_id("progressbar1")[1].value = backlight + --w:get_children_by_id("progressbar1")[1].value = backlight w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(backlight_icon, color["Pink200"]) tooltip.text = "Backlight: " .. backlight .. "%" rubato_timer.target = backlight @@ -661,7 +661,7 @@ return function() awesome.connect_signal( "update::battery_widget", function(battery, battery_icon) - w:get_children_by_id("progressbar1")[1].value = battery + --w:get_children_by_id("progressbar1")[1].value = battery w:get_children_by_id("icon1")[1].image = gears.color.recolor_image(battery_icon, color["Purple200"]) tooltip.text = "Battery: " .. battery .. "%" rubato_timer.target = battery diff --git a/awesome/src/modules/volume_controller.lua b/awesome/src/modules/volume_controller.lua index a2955c9..b58c68e 100644 --- a/awesome/src/modules/volume_controller.lua +++ b/awesome/src/modules/volume_controller.lua @@ -9,7 +9,8 @@ local dpi = require("beautiful").xresources.apply_dpi local gears = require("gears") local naughty = require("naughty") local wibox = require("wibox") -require("src.core.signals") + +local rubato = require("src.lib.rubato") -- Icon directory path local icondir = awful.util.getdir("config") .. "src/assets/icons/audio/" @@ -23,145 +24,53 @@ return function(s) { { { - { - image = "", - id = "icon", - resize = false, - widget = wibox.widget.imagebox - }, - { - text = name, - id = "node", - widget = wibox.widget.textbox - }, - id = "device_layout", - layout = wibox.layout.align.horizontal + id = "icon", + resize = false, + widget = wibox.widget.imagebox }, - id = "device_margin", - margins = dpi(5), - widget = wibox.container.margin + spacing = dpi(10), + { + text = name, + id = "node", + widget = wibox.widget.textbox + }, + id = "device_layout", + layout = wibox.layout.fixed.horizontal }, - id = "background", - shape = function(cr, width, height) - gears.shape.rounded_rect(cr, width, height, 4) - end, - widget = wibox.container.background + id = "device_margin", + margins = dpi(9), + widget = wibox.container.margin }, - margins = dpi(5), - widget = wibox.container.margin + id = "background", + bg = color["Grey900"], + border_color = color["Grey800"], + border_width = dpi(2), + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end, + widget = wibox.container.background } - if sink == true then device:connect_signal( "button::press", function() if node then - awful.spawn.spawn("./.config/awesome/src/scripts/vol.sh set_sink " .. node) + awful.spawn("./.config/awesome/src/scripts/vol.sh set_sink " .. node) end - - awesome.emit_signal("update::background:vol", node) + awesome.emit_signal("update::bg_sink", node) end ) - - --#region Signal Functions - local old_wibox, old_cursor, old_bg, old_fg - local bg = "" - local fg = "" - local mouse_enter = function() - if bg then - old_bg = device.background.bg - device.background.bg = bg .. 'dd' - end - if fg then - old_fg = device.background.fg - device.background.fg = fg - end - local w = mouse.current_wibox - if w then - old_cursor, old_wibox = w.cursor, w - w.cursor = "hand1" - end - end - - local button_press = function() - if bg then - if bg then - if string.len(bg) == 7 then - device.background.bg = bg .. 'bb' - else - device.background.bg = bg - end - end - end - if fg then - device.background.fg = fg - end - end - - local button_release = function() - if bg then - if bg then - if string.len(bg) == 7 then - device.background.bg = bg .. 'dd' - else - device.background.bg = bg - end - end - end - if fg then - device.background.fg = fg - end - end - - local mouse_leave = function() - if bg then - device.background.bg = old_bg - end - if fg then - device.background.fg = old_fg - end - if old_wibox then - old_wibox.cursor = old_cursor - old_wibox = nil - end - end - - device:connect_signal( - "mouse::enter", - mouse_enter - ) - - device:connect_signal( - "button::press", - button_press - ) - - device:connect_signal( - "button::release", - button_release - ) - - device:connect_signal( - "mouse::leave", - mouse_leave - ) - --#endregion - awesome.connect_signal( - "update::background:vol", + "update::bg_sink", function(new_node) if node == new_node then - old_bg = color["Purple200"] - old_fg = color["Grey900"] - bg = color["Purple200"] - fg = color["Grey900"] - device.background:set_bg(color["Purple200"]) - device.background:set_fg(color["Grey900"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "headphones.svg", color["Grey900"]) + device.bg = color["Purple200"] + device.fg = color["Grey900"] else - fg = color["Purple200"] - bg = color["Grey700"] - device.background:set_fg(color["Purple200"]) - device.background:set_bg(color["Grey700"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "headphones.svg", color["Purple200"]) + device.bg = color["Grey900"] + device.fg = color["Purple200"] end end ) @@ -170,130 +79,40 @@ return function(s) function(stdout) local node_active = stdout:gsub("\n", "") if node == node_active then - bg = color["Purple200"] - fg = color["Grey900"] - device.background:set_bg(color["Purple200"]) - device.background:set_fg(color["Grey900"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "headphones.svg", color["Grey900"]) + device.bg = color["Purple200"] + device.fg = color["Grey900"] else - fg = color["Purple200"] - bg = color["Grey700"] - device.background:set_fg(color["Purple200"]) - device.background:set_bg(color["Grey700"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "headphones.svg", color["Purple200"]) + device.bg = color["Grey900"] + device.fg = color["Purple200"] end end ) + awesome.emit_signal("update::bg_sink", node) + --Hover_signal(device, "#313131", color["Purple200"]) else device:connect_signal( "button::press", function() if node then - awful.spawn.spawn("./.config/awesome/src/scripts/mic.sh set_source " .. node) + awful.spawn("./.config/awesome/src/scripts/mic.sh set_source " .. node) end - - awesome.emit_signal("update::background:mic", node) + awesome.emit_signal("update::bg_source", node) end ) - - --#region Signal Functions - local old_wibox, old_cursor, old_bg, old_fg - local bg = "" - local fg = "" - local mouse_enter = function() - if bg then - old_bg = device.background.bg - device.background.bg = bg .. 'dd' - end - if fg then - old_fg = device.background.fg - device.background.fg = fg - end - local w = mouse.current_wibox - if w then - old_cursor, old_wibox = w.cursor, w - w.cursor = "hand1" - end - end - - local button_press = function() - if bg then - if bg then - if string.len(bg) == 7 then - device.background.bg = bg .. 'bb' - else - device.background.bg = bg - end - end - end - if fg then - device.background.fg = fg - end - end - - local button_release = function() - if bg then - if bg then - if string.len(bg) == 7 then - device.background.bg = bg .. 'dd' - else - device.background.bg = bg - end - end - end - if fg then - device.background.fg = fg - end - end - - local mouse_leave = function() - if bg then - device.background.bg = old_bg - end - if fg then - device.background.fg = old_fg - end - if old_wibox then - old_wibox.cursor = old_cursor - old_wibox = nil - end - end - - device:connect_signal( - "mouse::enter", - mouse_enter - ) - - device:connect_signal( - "button::press", - button_press - ) - - device:connect_signal( - "button::release", - button_release - ) - - device:connect_signal( - "mouse::leave", - mouse_leave - ) - --#endregion - awesome.connect_signal( - "update::background:mic", + "update::bg_source", function(new_node) if node == new_node then - old_bg = color["Blue200"] - old_fg = color["Grey900"] - bg = color["Blue200"] - fg = color["Grey900"] - device.background:set_bg(color["Blue200"]) - device.background:set_fg(color["Grey900"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "microphone.svg", color["Grey900"]) + device.bg = color["Blue200"] + device.fg = color["Grey900"] else - fg = color["Blue200"] - bg = color["Grey700"] - device.background:set_fg(color["Blue200"]) - device.background:set_bg(color["Grey700"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "microphone.svg", color["Blue200"]) + device.bg = color["Grey900"] + device.fg = color["Blue200"] end end ) @@ -302,18 +121,19 @@ return function(s) function(stdout) local node_active = stdout:gsub("\n", "") if node == node_active then - bg = color["Blue200"] - fg = color["Grey900"] - device.background:set_bg(color["Blue200"]) - device.background:set_fg(color["Grey900"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "microphone.svg", color["Grey900"]) + device.bg = color["Blue200"] + device.fg = color["Grey900"] + Hover_signal(device, "#313131", color["Blue200"]) else - fg = color["Blue200"] - bg = color["Grey700"] - device.background:set_fg(color["Blue200"]) - device.background:set_bg(color["Grey700"]) + device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "microphone.svg", color["Blue200"]) + device.bg = color["Grey900"] + device.fg = color["Blue200"] + Hover_signal(device, "#313131", color["Blue200"]) end end ) + awesome.emit_signal("update::bg_source", node) end return device end @@ -322,11 +142,26 @@ return function(s) local dropdown_list_volume = wibox.widget { { { - layout = wibox.layout.fixed.vertical, - id = "volume_device_list" + { + { + spacing = dpi(10), + layout = wibox.layout.overflow.vertical, + scrollbar_width = 0, + step = dpi(50), + id = "volume_device_list", + }, + id = "margin", + margins = dpi(10), + widget = wibox.container.margin + }, + id = "place", + height = dpi(200), + strategy = "max", + widget = wibox.container.constraint }, + border_color = color["Grey800"], + border_width = dpi(2), id = "volume_device_background", - bg = color["Grey800"], shape = function(cr, width, height) gears.shape.partially_rounded_rect(cr, width, height, false, false, true, true, 4) end, @@ -341,11 +176,26 @@ return function(s) local dropdown_list_microphone = wibox.widget { { { - layout = wibox.layout.fixed.vertical, - id = "volume_device_list" + { + { + spacing = dpi(10), + layout = wibox.layout.overflow.vertical, + id = "volume_device_list", + scrollbar_width = 0, + step = dpi(50), + }, + id = "margin", + margins = dpi(10), + widget = wibox.container.margin + }, + id = "place", + height = dpi(200), + strategy = "max", + widget = wibox.container.constraint }, id = "volume_device_background", - bg = color["Grey800"], + border_color = color["Grey800"], + border_width = dpi(2), shape = function(cr, width, height) gears.shape.partially_rounded_rect(cr, width, height, false, false, true, true, 4) end, @@ -404,7 +254,7 @@ return function(s) { id = "volume_list", widget = dropdown_list_volume, - visible = false + forced_height = 0 }, -- Microphone selector { @@ -451,7 +301,7 @@ return function(s) { id = "mic_list", widget = dropdown_list_microphone, - visible = false + forced_height = 0 }, -- Audio volume slider { @@ -558,17 +408,28 @@ return function(s) audio_selector_margin:connect_signal( "button::press", function() - volume_list.visible = not volume_list.visible - if volume_list.visible then + local rubato_timer = rubato.timed { + duration = 0.4, + intro = 0.1, + outro = 0.1, + pos = volume_list.forced_height, + easing = rubato.linear, + subscribed = function(v) + volume_list.forced_height = v + end + } + if volume_list.forced_height == 0 then + rubato_timer.target = dpi(200) audio_bg.shape = function(cr, width, height) gears.shape.partially_rounded_rect(cr, width, height, true, true, false, false, 4) end - audio_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["Teal200"])) + audio_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["Purple200"])) else + rubato_timer.target = 0 audio_bg.shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end - audio_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["Teal200"])) + audio_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["Purple200"])) end end ) @@ -583,17 +444,28 @@ return function(s) mic_selector_margin:connect_signal( "button::press", function() - mic_list.visible = not mic_list.visible - if mic_list.visible then + local rubato_timer = rubato.timed { + duration = 0.4, + intro = 0.1, + outro = 0.1, + pos = mic_list.forced_height, + easing = rubato.linear, + subscribed = function(v) + mic_list.forced_height = v + end + } + if mic_list.forced_height == 0 then + rubato_timer.target = dpi(200) mic_selector_margin.mic_bg.shape = function(cr, width, height) gears.shape.partially_rounded_rect(cr, width, height, true, true, false, false, 4) end - mic_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["Teal200"])) + mic_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-up.svg", color["Blue200"])) else + rubato_timer.target = 0 mic_bg.shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 4) end - mic_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["Teal200"])) + mic_volume.icon:set_image(gears.color.recolor_image(icondir .. "menu-down.svg", color["Blue200"])) end end ) @@ -641,7 +513,7 @@ return function(s) [[ pactl list sinks | grep -E 'node.name|device.description|alsa.card_name' | awk '{gsub(/"/, ""); for(i = 1;i < NF;i++) printf $i " "; print $NF}' ]], function(stdout) - local device_list = { layout = wibox.layout.fixed.vertical } + local device_list = {} local was_alsa = false local node_names, alsa_names = {}, {} for val in stdout:gmatch("[^\n]+") do @@ -663,7 +535,7 @@ return function(s) for k = 1, #alsa_names, 1 do device_list[#device_list + 1] = create_device(alsa_names[k], node_names[k], true) end - dropdown_list_volume.volume_device_background.volume_device_list.children = device_list + dropdown_list_volume:get_children_by_id("volume_device_list")[1].children = device_list end ) end @@ -676,7 +548,7 @@ return function(s) [[ pactl list sources | grep -E "node.name|device.description|alsa.card_name" | awk '{gsub(/"/, ""); for(i = 1;i < NF;i++) printf $i " "; print $NF}' ]], function(stdout) - local device_list = { layout = wibox.layout.fixed.vertical } + local device_list = {} local was_alsa = false local node_names, alsa_names = {}, {} @@ -699,7 +571,7 @@ return function(s) for k = 1, #alsa_names, 1 do device_list[#device_list + 1] = create_device(alsa_names[k], node_names[k], false) end - dropdown_list_microphone.volume_device_background.volume_device_list.children = device_list + dropdown_list_microphone:get_children_by_id("volume_device_list")[1].children = device_list end ) end diff --git a/awesome/src/widgets/bluetooth.lua b/awesome/src/widgets/bluetooth.lua index 93405e1..b64d9bd 100644 --- a/awesome/src/widgets/bluetooth.lua +++ b/awesome/src/widgets/bluetooth.lua @@ -9,13 +9,12 @@ local dpi = require("beautiful").xresources.apply_dpi local gears = require("gears") local naughty = require("naughty") local wibox = require("wibox") -require("src.core.signals") -- Icon directory path local icondir = awful.util.getdir("config") .. "src/assets/icons/bluetooth/" -- Returns the bluetooth widget -return function() +return function(s) local bluetooth_widget = wibox.widget { { { @@ -53,8 +52,12 @@ return function() bluetooth_widget:connect_signal( "button::press", - function() - awesome.emit_signal("toggle_bluetooth") + function(c, d, e, key) + if key == 1 then + awesome.emit_signal("bluetooth_controller::toggle", s) + else + awesome.emit_signal("toggle_bluetooth") + end end )