From 022a6a116f909bbd05a19186f72a7bb963742b48 Mon Sep 17 00:00:00 2001 From: Yessiest Date: Sun, 3 Apr 2022 14:45:52 +0400 Subject: [PATCH] Fixed volume control on per-application basis --- core/layout.lua | 63 +++++++++++++++++----- core/titlebar.lua | 80 +++++++++------------------ core/vars.lua | 2 +- widgets/client-volume.lua | 39 +++++++------- widgets/wallpapers.lua.old | 108 ------------------------------------- 5 files changed, 96 insertions(+), 196 deletions(-) delete mode 100644 widgets/wallpapers.lua.old diff --git a/core/layout.lua b/core/layout.lua index 3238b36..64e23a4 100644 --- a/core/layout.lua +++ b/core/layout.lua @@ -49,53 +49,92 @@ awful.screen.connect_for_each_screen(function(s) s.mytasklist = require("core.widgets.tasklist")(s) -- Create the wibox s.mywibox = awful.wibar({ - position = "bottom", + position = "top", screen = s, bg = beautiful.topbar_bg, - border_width = 1, - border_color = beautiful.bg_normal }) -- Add screen lock require("widgets.lock")({screen = s, obscure = true}) + require("widgets.unitybar")(s,{ + top_widgets = { + require("widgets.polytasklist")({ + vertical = true, + stretch = false, + --constraint = 180, + names = false, + margins = 5 + })(s), + }, + bottom_widgets = { + require("widgets.polylauncher")({vertical = true}) + } + }) -- Add widgets to the wibox s.mywibox:setup { layout = wibox.layout.align.horizontal, { -- Left widgets layout = wibox.layout.fixed.horizontal, - require("core.widgets.menu_launcher"), - require("widgets.polylauncher")({vertical = false}), + { + { + require("core.widgets.menu_launcher"), + widget = wibox.container.place, + halign = "center" + }, + bg = "#26262633", + widget = wibox.container.background, + forced_width = require("beautiful.xresources").apply_dpi(61), + }, + --require("widgets.polylauncher")({vertical = false}), + --s.mytaglist, s.mypromptbox, spacing = 3 }, -- Middle widget { - require("widgets.polytasklist")({ + --[[require("widgets.polytasklist")({ + vertical = false, + stretch = false, constraint = 180, names = true, margins = 5 - })(s), + })(s),]] layout = wibox.layout.fixed.horizontal }, { -- Right widgets layout = wibox.layout.fixed.horizontal, awful.widget.keyboardlayout(), - require("widgets.drawer")({ - wibox.widget.systray(), - vertical = false - }), require("widgets.wallpapers")({ screen = s, path = os.getenv("HOME").."/Pictures/Wallpapers/", + style = { + icon_bg_normal = beautiful.topbar_bg + } }), require("widgets.mailbox")({ screen = s, + style = { + rounding = 1, + icon_bg_normal = beautiful.topbar_bg + } }), --wibox.widget.systray(), - require("widgets.volume")({}), + require("widgets.volume")({ + style = { + icon_bg_normal = beautiful.topbar_bg + } + }), require("widgets.battery")({ percentage = true, + style = { + icon_bg_normal = beautiful.topbar_bg + } }), wibox.widget.textclock(), + require("widgets.username")({ + style = { + icon_bg_normal = beautiful.topbar_bg + } + }), s.mylayoutbox, spacing = 4 }, diff --git a/core/titlebar.lua b/core/titlebar.lua index 45662df..af98678 100644 --- a/core/titlebar.lua +++ b/core/titlebar.lua @@ -43,47 +43,6 @@ awful.screen.connect_for_each_screen(function(s) toggle_tags }) end) -local controls_widget = wibox.widget { - forced_width = 72, - forced_height = 24, - layout = wibox.layout.fixed.horizontal, -} --- To conserve memory we keep one menu at a time -local menu_widget = menu({ - before = { - controls_widget - }, - after = { - require("widgets.client-volume")({}) - }, - items = { - { "Move to tag" , - move_screentags - }, - { "Toggle on tag", - toggle_screentags - }, - { "Stop task", - function() - awful.spawn("kill "..tostring(c.pid)) - end - }, - { "Kill task", - function() - awful.spawn("kill -s KILL "..tostring(c.pid)) - end - }, - { "Debug info", - { - before = { - require("widgets.window-debug")() - } - } - } - }, - vertical = true -}) - return function(c) local buttons = gears.table.join( awful.button({ }, 1, function() @@ -95,26 +54,35 @@ return function(c) awful.mouse.client.resize(c) end) ) + c.menu = menu({ + before = { + { + awful.titlebar.widget.floatingbutton (c), + awful.titlebar.widget.stickybutton (c), + awful.titlebar.widget.ontopbutton (c), + forced_width = 72, + forced_height = 24, + layout = wibox.layout.fixed.horizontal, + } + }, + items = { + { "Move to tag" , + move_screentags + }, + { "Toggle on tag", + toggle_screentags + } + }, + vertical = true + }) c.menu_button = awful.titlebar.widget.iconwidget(c) - -- A little trick we do to conserve memory and cpu usage on regenerating - -- buttons is we pop up a menu in the location of the icon - -- and insert buttons into the controls widget layout. - c.hidden_floatingbutton = awful.titlebar.widget.floatingbutton(c) - c.hidden_stickybutton = awful.titlebar.widget.stickybutton(c) - c.hidden_ontopbutton = awful.titlebar.widget.ontopbutton(c) c.menu_button:connect_signal("button::press", function() - menu_widget.toggle() - if controls_widget then - controls_widget:reset() - controls_widget:add(c.hidden_floatingbutton) - controls_widget:add(c.hidden_stickybutton) - controls_widget:add(c.hidden_ontopbutton) - end + c.menu.toggle() c:emit_signal("request::activate", "titlebar", {raise = true}) end) c:connect_signal("unfocus",function() - if menu_widget.visible then - menu_widget.toggle(0,0) + if c.menu.visible then + c.menu.toggle(0,0) end end) return awful.titlebar(c) : setup { diff --git a/core/vars.lua b/core/vars.lua index 8d8c5e3..9c6ef06 100644 --- a/core/vars.lua +++ b/core/vars.lua @@ -5,7 +5,7 @@ global = {} global.awesome_dir = os.getenv("HOME").."/.config/awesome/" global.config_dir = os.getenv("HOME").."/.awesome/" global.themes_dir = os.getenv("HOME").."/.config/awesome/themes/" -global.theme = global.awesome_dir .. "themes/carbon/theme.lua" +global.theme = global.awesome_dir .. "themes/unity/theme.lua" global.terminal = "xterm" global.editor = os.getenv("EDITOR") or "vim" global.editor_cmd = global.terminal .. " -e ".. global.editor diff --git a/widgets/client-volume.lua b/widgets/client-volume.lua index 23b655a..f924b80 100644 --- a/widgets/client-volume.lua +++ b/widgets/client-volume.lua @@ -3,38 +3,38 @@ local gears = require("gears") local wibox = require("wibox") local awmtk = require("awmtk") -local get_app_volume = function(pid) - -- Read pactl data - local pactl_process = io.popen("pactl list sink-inputs","r") +local get_pactl_data = function() + -- Get pactl process data and convert it into a list + local pactl_processes = {} + local pactl_process = io.popen("pactl list sink-inputs", "r") local pactl_data = pactl_process:read("*a") pactl_process:close() - -- Try to find a matching process while pactl_data:match("^(%w.-\n)%w") do local test = pactl_data:match("^(%w.-\n)%w") - -- Return volume - if test:match("application.process.id = \""..tostring(pid).."\"") then - return test:match("Volume: .-(%d?%d?%d)%%") - end + table.insert(pactl_processes,test) pactl_data = pactl_data:gsub("^%w.-\n(%w)","%1") end + table.insert(pactl_processes,pactl_data) + return pactl_processes +end + +local get_app_volume = function(pid) + for key,process in pairs(get_pactl_data()) do + -- Match app by pid + if process:match("application.process.id = \""..tostring(pid).."\"") then + return process:match("Volume: .-(%d?%d?%d)%%") + end + end -- Return nil and an error if not found matching process return nil, "Process doesn't play audio" end local set_app_volume = function(pid,percentage) - -- Read pactl data - local pactl_process = io.popen("pactl list sink-inputs","r") - local pactl_data = pactl_process:read("*a") - pactl_process:close() - -- Try to find a matching process - while pactl_data:match("^(%w.-\n)%w") do - local test = pactl_data:match("^(%w.-\n)%w") - -- If the application matches, get stream ID and set its volume - if test:match("application.process.id = \""..tostring(pid).."\"") then - local sink_input_id = test:match("Sink Input #(%d*)") + for key,process in pairs(get_pactl_data()) do + if process:match("application.process.id = \""..tostring(pid).."\"") then + local sink_input_id = process:match("Sink Input #(%d*)") os.execute("pactl set-sink-input-volume "..sink_input_id.." "..tostring(percentage).."%") end - pactl_data = pactl_data:gsub("^%w.-\n(%w)","%1") end end @@ -102,6 +102,7 @@ return function(args) end) slider:connect_signal("widget::redraw_needed",function() set_app_volume(client.focus.pid,slider.value) + widget.children[1].image = get_icon(tonumber(slider.value)) end) else warning_text.markup = "pactl is not available" diff --git a/widgets/wallpapers.lua.old b/widgets/wallpapers.lua.old deleted file mode 100644 index 175579b..0000000 --- a/widgets/wallpapers.lua.old +++ /dev/null @@ -1,108 +0,0 @@ -local awful = require("awful") -local beautiful = require("beautiful") -local gears = require("gears") -local spawn = require("awful.spawn") -local wibox = require("wibox") -local awmtk = require("awmtk") -local thumbnailer = require("thumbnail") -local widget = {} -local function ls(path) - local ls_data = io.popen("ls -1 "..path) - local output = {} - if ls_data then - ls_data:read("*a"):gsub("[^\n]+",function(capt) table.insert(output,capt) end) - ls_data:close() - else - error("ls "..path.." failed.") - end - return output -end - -local function worker(args) - local args = args or {} - assert(type(args["screen"]) ~= "nil","Screen not specified") - assert(type(args["path"]) ~= "nil","Path to wallpapers folder not specified") - --add an extra slash to path if there is none - if not args["path"]:match("/$") then - args["path"] = args["path"].."/" - end - --create local style - local style = awmtk.style(awmtk.defaults,args.style or {},"wallpapers_") - --set wallpaper - local handler = io.open(global.config_dir.."/.wallpaper","r") - if handler then - local wallpaper_path = handler:read("*a") - gears.wallpaper.maximized(wallpaper_path,args["screen"]) - end - local function update_last_wallpaper(s) - local handler = io.open(global.config_dir.."/.wallpaper","w") - handler:write(s) - handler:close() - end - --read wallpapers from the wallpaper directory - local image_list = ls(args["path"]) - for k,v in pairs(image_list) do - if not (v:match("%.jpg$") or v:match("%.png$")) then - image_list[k] = nil - end - end - --generate thumbnails to save up memory - thumbnailer.generate(args["path"],args["path"]..".thumbnails",60) - --style variables - local button_bg = style.wallpapers_button_bg_focus - local function new_wallpaper_button(image,s) - local new_widget = style.button({ - image = args["path"]..".thumbnails/"..image, - resize = true, - widget = wibox.widget.imagebox - },{ - bg = button_bg, - forced_height = style.wallpapers_button_height or 60, - forced_width = style.wallpapers_button_width or 100 - },{ - function() - gears.wallpaper.maximized(args["path"]..image,s) - update_last_wallpaper(args["path"]..image) - end - }) - return new_widget - end - local copy_list = { - widget = wibox.layout.grid, - forced_num_cols = args.columns or 4, - homogeneous = true, - expand = true, - orientation = "vertical", - spacing = 5 - } - for k,v in pairs(image_list) do - local new_widget = new_wallpaper_button(v,args["screen"]) - table.insert(copy_list,new_widget) - end - local popup = awful.popup(style.container( - copy_list, - { - visible = false, - ontop = true - } - )) - local clip_widget = style.icon({ - image = style["wallpapers_icon"], - resize = true, - widget = wibox.widget.imagebox - },{},{ - function() - if popup.visible then - --rows = nil - popup.visible = not popup.visible - else - --init_popup() - popup:move_next_to(mouse.current_widget_geometry) - end - end - }) - widget = clip_widget - return clip_widget -end - -return setmetatable(widget, { __call = function(_, ...) return worker(...) end })