From 785fe57f1f33b79bc11ba1fbe5257070073ddc24 Mon Sep 17 00:00:00 2001 From: Yessiest Date: Thu, 19 Jan 2023 20:22:33 +0400 Subject: [PATCH] removed duplicate widgets --- widgets/battery.lua | 310 ------------------------------------- widgets/clientbuttons.lua | 88 ----------- widgets/clientcontrols.lua | 72 --------- widgets/clientvolume.lua | 148 ------------------ widgets/launcher.lua | 55 ------- widgets/notifications.lua | 110 ------------- widgets/rootbuttons.lua | 63 -------- widgets/rootcontrols.lua | 33 ---- widgets/soundclown.lua | 142 ----------------- widgets/start/xdgmenu.lua | 91 ----------- widgets/startbutton.lua | 89 ----------- widgets/tasklist.lua | 136 ---------------- widgets/volume.lua | 108 ------------- widgets/wallpapers.lua | 146 ----------------- 14 files changed, 1591 deletions(-) delete mode 100644 widgets/battery.lua delete mode 100644 widgets/clientbuttons.lua delete mode 100644 widgets/clientcontrols.lua delete mode 100644 widgets/clientvolume.lua delete mode 100644 widgets/launcher.lua delete mode 100644 widgets/notifications.lua delete mode 100644 widgets/rootbuttons.lua delete mode 100644 widgets/rootcontrols.lua delete mode 100644 widgets/soundclown.lua delete mode 100644 widgets/start/xdgmenu.lua delete mode 100644 widgets/startbutton.lua delete mode 100644 widgets/tasklist.lua delete mode 100644 widgets/volume.lua delete mode 100644 widgets/wallpapers.lua diff --git a/widgets/battery.lua b/widgets/battery.lua deleted file mode 100644 index cf5d642..0000000 --- a/widgets/battery.lua +++ /dev/null @@ -1,310 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Generic battery widget with support for multiple power sources, backlights and backlight control -local awful = require("awful") -local beautiful = require("beautiful") -local gears = require("gears") -local wibox = require("wibox") -local awmtk2 = require("awmtk2") -local syscontrol = require("syscontrol") -local ask = require("asckey") - -local function get_virtual_icon(data) - -- Get an icon from a cumulative total of battery percentages and current charging state - local count = 0 - local cumulative = 0 - local name = "battery-" - for _,v in pairs(data) do - if type(v) == "number" then - cumulative = cumulative + v - count = count + 1 - end - end - local percentage = math.floor((cumulative/(count*100))*100) - if percentage < 15 then - name = name.."caution-" - elseif percentage < 30 then - name = name.."low-" - elseif percentage < 60 then - name = name.."good-" - else - name = name.."full-" - end - if data["charge"] then - name = name.."charging-" - end - return beautiful[name.."symbolic"],percentage -end - -return function(args) - local style = awmtk2.create_style("battery", - awmtk2.generic.popup,args.style) - local templates = awmtk2.create_template_lib("battery",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - -- set up popup layout - local layout = wibox.widget({ - layout = wibox.layout.fixed.vertical, - spacing = style.base.spacing - }) - -- create popup - local popup = awful.popup(t.popup(layout)) - local battery_widget - do -- create battery widget - local style = awmtk2.create_style("battery", - awmtk2.generic.status_widget,args.style) - local templates = awmtk2.create_template_lib("battery",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - battery_widget = wibox.widget(t.button({ - t.icon({ - image = beautiful["battery-missing-symbolic"], - resize = true, - id = "virtual_id" - }), - (args.percentage and { - markup = "0%", - id = "percentage_id", - widget = wibox.widget.textbox - }), - layout = wibox.layout.fixed.horizontal, - spacing = style.base.spacing - })) - -- make it possible to press the button and make it toggle the popup - battery_widget:connect_signal("button::press",style.button.onpress) - battery_widget:connect_signal("button::release",style.button.onrelease) - battery_widget:connect_signal("button::press",function(_,_,_,button) - if button == 1 then - popup.visible = (not popup.visible) - if popup.visible then - popup:move_next_to(mouse.current_widget_geometry) - end - end - end) - end - -- map widgets to their names to make it easier to update separate components - local widget_map = {} - -- also map current charge state of every device to get the icon for the tray - local percentage_map = {} - -- {{{ Power supply devices - local power_devices = syscontrol.power_supply.enumerate() - for _,device in pairs(power_devices) do - local data = syscontrol.power_supply.read_attribs(device) - if data.type == "Battery" then - widget_map[data.name] = wibox.widget(t.container({ - t.article({ - icon = get_virtual_icon({ - data.capacity, - charge = data.charging - }), - icon_id = "battery_icon", - title = "Battery ("..data.model..")", - }), - t.textbox({ - markup = ("Capacity: %d%%"):format(data.capacity), - id = "capacity_id" - }), - t.textbox({ - markup = ("Quality: %.4f%%"):format(data.quality), - id = "quality_id", - }), - layout = wibox.layout.fixed.vertical - },{ - bg = style.container.bg_highlight, - bgimage = style.container.bgimage_highlight - })) - layout:add(widget_map[data.name]) - percentage_map[data.name] = data.capacity - elseif data.type == "Mains" then - widget_map[data.name] = wibox.widget(t.container({ - t.article({ - icon = beautiful["ac-adapter-symbolic"], - title = "Power supply", - }), - t.textbox({ - markup = "Powered: "..tostring(data.online), - id = "online_id", - }), - layout = wibox.layout.fixed.vertical - },{ - bg = style.container.bg_highlight, - bgimage = style.container.bgimage_highlight - })) - layout:add(widget_map[data.name]) - percentage_map["charge"] = data.online - end - end - -- "Virtual" here means a battery that displays the state of a cumulative total of all attached batteries (as if there are any devices that even have more than 1 battery) - local function update_virtual_battery() - local icon = battery_widget:get_children_by_id("virtual_id")[1] - local percentage = battery_widget:get_children_by_id("percentage_id")[1] - local capacity - icon.image,capacity = get_virtual_icon(percentage_map) - if percentage then - percentage:set_markup(tostring(capacity).."%") - end - end - update_virtual_battery() - -- Update loop - local power_update = gears.timer({ - timeout = args.power_polling or 2, - autostart = true, - callback = function() - for _,v in pairs(power_devices) do - local data,err = syscontrol.power_supply.read_attribs(v) - if data and data.type == "Mains" then - local w = widget_map[data.name] - local online = w:get_children_by_id("online_id")[1] - online:set_markup("Powered: "..tostring(data.online)) - percentage_map["charge"] = data.online - elseif data and data.type == "Battery" then - local w = widget_map[data.name] - local icon = w:get_children_by_id("battery_icon")[1] - local capacity = w:get_children_by_id("capacity_id")[1] - local quality = w:get_children_by_id("quality_id")[1] - icon.image = get_virtual_icon({ - data.capacity, - charge = data.charging - }) - capacity:set_markup(("Capacity: %d%%"):format(data.capacity)) - quality:set_markup(("Quality: %.4f%%"):format(data.quality)) - percentage_map[data.name] = data.capacity - else - print(err) - end - update_virtual_battery() - end - end - }) - -- }}} - -- {{{ Backlight - local backlight_devices = syscontrol.backlight.enumerate() - local default_backlight_device - for _,v in pairs(backlight_devices) do - local data = syscontrol.backlight.read_attribs(v) - if data then - widget_map[data.name] = wibox.widget(t.container({ - { - t.article({ - icon = beautiful["backlight-symbolic"], - title = "Backlight", - }), - (data.writable and t.center( - t.checkbox({ - checked = false, - id = "checkbox", - forced_height = style.article.icon_size, - forced_width = style.article.icon_size - }), - { - width = style.checkbox.width, - height = style.checkbox.height - }) - ), - layout = wibox.layout.fixed.horizontal, - spacing = style.base.spacing - }, - t.textbox({ - markup = "Brightness: "..tostring(data.brightness), - id = "brightness_id" - }), - t.textbox({ - markup = "Max brightness: "..tostring(data.max_brightness), - id = "max_brightness" - }), - (data.writable and t.slider({ - minimum = data.max_brightness*0.05, - maximum = data.max_brightness, - value = tonumber(data.brightness), - id = "slider" - })), - layout = wibox.layout.fixed.vertical - },{ - bg = style.container.bg_highlight, - bgimage = style.container.bgimage_highlight - })) - if data.writable then - local w = widget_map[data.name] - local slider = w:get_children_by_id("slider")[1] - slider:connect_signal("widget::redraw_needed",function(self) - local value = self.value - syscontrol.backlight.set_brightness(data,math.floor(value)) - end) - slider.value = tonumber(data.brightness) - local checkbox = w:get_children_by_id("checkbox")[1] - checkbox:connect_signal("button::press",function() - if default_backlight_device then - local check2 = widget_map[default_backlight_device.name] - :get_children_by_id("checkbox")[1] - check2.checked = true - end - default_backlight_device = data - end) - end - layout:add(widget_map[data.name]) - end - end - -- Update loop - local backlight_update = gears.timer({ - timeout = args.backlight_polling or 2, - autostart = true, - callback = function() - for _,v in pairs(backlight_devices) do - local data,err = syscontrol.backlight.read_attribs(v) - if data then - local w = widget_map[data.name] - local online = w:get_children_by_id("brightness_id")[1] - online:set_markup("Brightness: "..tostring(data.brightness)) - else - print(err) - end - end - end - }) - -- Keybindings - root.keys(gears.table.join( - root.keys(), - ask.k(":battery.brightness_up",function() - if default_backlight_device then - local data = default_backlight_device - local s = widget_map[data.name]:get_children_by_id("slider")[1] - local value = s.value+(data.max_brightness*0.05) - if value > data.max_brightness then - value = data.max_brightness - end - syscontrol.backlight.set_brightness(data,math.floor(value)) - s.value = math.floor(value) - end - end,{description="increase brightness", group = "widgets"}), - ask.k(":battery.brightness_down",function() - if default_backlight_device then - local data = default_backlight_device - local s = widget_map[data.name]:get_children_by_id("slider")[1] - local value = s.value-(data.max_brightness*0.05) - if value < data.max_brightness*0.05 then - value = data.max_brightness*0.05 - end - syscontrol.backlight.set_brightness(data,math.floor(value)) - s.value = math.floor(value) - end - end,{description="decrease brightness", group = "widgets"}) - )) - -- }}} - -- We don't need this widget if we don't have anything to show - local function count(t) - local count = 0 - for k,v in pairs(t) do - count = count + 1 - end - return count - end - if count(widget_map) == 0 then - backlight_update:stop() - power_update:stop() - return - end - return battery_widget -end diff --git a/widgets/clientbuttons.lua b/widgets/clientbuttons.lua deleted file mode 100644 index 00fc2a2..0000000 --- a/widgets/clientbuttons.lua +++ /dev/null @@ -1,88 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Additional client controls, hidden for cleaner UI in the submenu. -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local beautiful = require("beautiful") - -return function(args) - local style = awmtk2.create_style("client_buttons", - awmtk2.generic.button_list,args.style) - local templates = awmtk2.create_template_lib("client_buttons",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local floating_on = beautiful.titlebar_floating_button_normal_inactive - local floating_off = beautiful.titlebar_floating_button_normal_active - local ontop_on = beautiful.titlebar_ontop_button_normal_inactive - local ontop_off = beautiful.titlebar_ontop_button_normal_active - local sticky_on = beautiful.titlebar_sticky_button_normal_inactive - local sticky_off = beautiful.titlebar_sticky_button_normal_active - local floating = wibox.widget(t.button(t.icon({ - image = (client.focus and client.focus.floating and floating_on) or floating_off, - id = "icon" - }),{ - forced_height = style.button.forced_height, - forced_width = style.button.forced_width - })) - floating:connect_signal("button::press",style.button.onpress) - floating:connect_signal("button::release",style.button.onrelease) - floating:connect_signal("button::press",function(widget) - client.focus.floating = (not client.focus.floating) - widget:emit_signal("widget::update",widget) - end) - floating:connect_signal("widget::update",function(widget) - local icon = widget:get_children_by_id("icon")[1] - icon.image = (client.focus.floating and floating_on) or floating_off - end) - local ontop = wibox.widget(t.button(t.icon({ - image = (client.focus and client.focus.ontop and ontop_on) or ontop_off, - id = "icon" - }),{ - forced_height = style.button.forced_height, - forced_width = style.button.forced_width - })) - ontop:connect_signal("button::press",style.button.onpress) - ontop:connect_signal("button::release",style.button.onrelease) - ontop:connect_signal("button::press",function(widget) - client.focus.ontop = (not client.focus.ontop) - widget:emit_signal("widget::update",widget) - end) - ontop:connect_signal("widget::update",function(widget) - local icon = widget:get_children_by_id("icon")[1] - icon.image = (client.focus.ontop and ontop_on) or ontop_off - end) - local sticky = wibox.widget(t.button(t.icon({ - image = (client.focus and client.focus.sticky and sticky_on) or sticky_off, - id = "icon" - }),{ - forced_height = style.button.forced_height, - forced_width = style.button.forced_width - })) - sticky:connect_signal("button::press",style.button.onpress) - sticky:connect_signal("button::release",style.button.onrelease) - sticky:connect_signal("button::press",function(widget) - client.focus.sticky = (not client.focus.sticky) - widget:emit_signal("widget::update",widget) - end) - sticky:connect_signal("widget::update",function(widget) - local icon = widget:get_children_by_id("icon")[1] - icon.image = (client.focus.sticky and sticky_on) or sticky_off - end) - client.connect_signal("focus",function(c) - sticky:emit_signal("widget::update") - ontop:emit_signal("widget::update") - floating:emit_signal("widget::update") - end) - local widget = wibox.widget({ - floating, - ontop, - sticky, - layout = wibox.layout.fixed.horizontal, - spacing = style.base.spacing - }) - return widget -end diff --git a/widgets/clientcontrols.lua b/widgets/clientcontrols.lua deleted file mode 100644 index 1af37d3..0000000 --- a/widgets/clientcontrols.lua +++ /dev/null @@ -1,72 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Basic client control menu -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") -local menugen = require("context_menu") - -return function(args) - local style = awmtk2.create_style("client_controls", - awmtk2.generic.menu,args.style) - local templates = awmtk2.create_template_lib("client_controls",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local move_to_tag = {} - local add_to_tag = {} - awful.screen.connect_for_each_screen(function(s) - table.insert(move_to_tag,{ - "Screen "..s.index, - (function() - local t = {} - for k,v in pairs(s.tags) do - table.insert(t,{v.name,function() - if client.focus then - client.focus:tags({v}) - end - end}) - end - return t - end)() - }) - table.insert(add_to_tag,{ - "Screen "..s.index, - (function() - local t = {} - for k,v in pairs(s.tags) do - table.insert(t,{v.name,function() - if client.focus then - local tags = client.focus:tags() - for k,tag in pairs(tags) do - if v == tag then - table.remove(tags,k) - client.focus:tags(tags) - return - end - end - table.insert(tags,v) - client.focus:tags(tags) - end - end}) - end - return t - end)() - }) - end) - local widget = menugen({ - items = { - { "Kill client", function() client.focus:kill() end }, - { "Raise client", function() client.focus:raise() end}, - { "Lower client", function() client.focus:lower() end}, - { "Move to tag", move_to_tag }, - { "Switch on tag", add_to_tag } - }, - }) - return widget -end diff --git a/widgets/clientvolume.lua b/widgets/clientvolume.lua deleted file mode 100644 index acc1863..0000000 --- a/widgets/clientvolume.lua +++ /dev/null @@ -1,148 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Pulseaudio per-client volume setting -local awful = require("awful") -local gears = require("gears") -local wibox = require("wibox") -local awmtk2 = require("awmtk2") -local fastyaml = require("parsers").fast_split_yaml -local beautiful = require("beautiful") -local ask = require("asckey") - -local test_pactl = os.execute("pactl --version") -local result = test_pactl -if _VERSION:match("5.1") then - result = (test_pactl == 0) -end -if not result then - return -end - -local function get_icon(percent) - if percent >= 66 then - return beautiful["volume-high-symbolic"] - elseif percent >= 33 then - return beautiful["volume-medium-symbolic"] - elseif percent > 0 then - return beautiful["volume-low-symbolic"] - else - return beautiful["volume-muted-symbolic"] - end -end - - -return function(args) - local style = awmtk2.create_style("client_volume", - awmtk2.generic.oneline_widget, args.style) - local templates = awmtk2.create_template_lib("client_volume",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local widget = wibox.widget(t.container({ - t.icon({ - id = "client_volume_icon", - resize = true, - }), - t.textbox({ - id = "error" - }), - t.slider({ - minimum = 0, - maximum = 100, - id = "client_volume", - value = -1 - }), - layout = wibox.layout.fixed.horizontal - })) - local errorbox = widget:get_children_by_id("error")[1] - local icon = widget:get_children_by_id("client_volume_icon")[1] - local slider = widget:get_children_by_id("client_volume")[1] - -- Local tracking value to prevent zero volume on start - local touched = false - -- Attach to focus change - client.connect_signal("update_volume",function(c) - awful.spawn.easy_async("pactl list sink-inputs",function(stdout) - local pactl_data = fastyaml(stdout) - local cl - for _,v in pairs(pactl_data) do - if not c then return end - if v:match("application.process.id = \""..tostring(c.pid).."\"") then - cl = v - end - end - if not cl then - slider.visible = false - errorbox.visible = true - errorbox:set_markup("No sound/Not available") - icon:set_image(beautiful["volume-muted-symbolic"]) - return - end - local volume = tonumber(cl:match("Volume:[^\n]-(%d*)%%")) - slider.visible = true - errorbox.visible = false - icon:set_image(get_icon(volume)) - slider.value = volume - touched = true - end) - end) - client.connect_signal("focus",function(c) - touched = false - c:emit_signal("update_volume") - end) - local update_timer = gears.timer({ - timeout = 0.5, - autostart = true, - callback = function() - if client.focus then - client.focus:emit_signal("update_volume") - end - end - }) - -- Async lock to prevent callback interference - local volume_lock = false - -- Function to set client volume - local function volume(value) - if volume_lock then return end - volume_lock = true - awful.spawn.easy_async("pactl list sink-inputs",function(stdout) - local pactl_data = fastyaml(stdout) - if not (client.focus and client.focus.pid) then - volume_lock = false - return - end - for _,v in pairs(pactl_data) do - if v:match("application.process.id = \""..tostring(client.focus.pid).."\"") then - local sink_id = v:match("^%s*Sink Input #(%d+)") - if sink_id then - print(sink_id, value) - awful.spawn("pactl set-sink-input-volume "..tostring(sink_id).." "..tostring(value).."%") - end - end - end - volume_lock = false - end) - end - -- Attach change to slider - slider:connect_signal("widget::redraw_needed",function() - if touched then - volume(slider.value) - update_timer:again() - end - end) - root.keys(gears.table.join( - root.keys(), - ask.k(":client.volume_up", function() - volume("+5") - end,{description = "increase client volume", group = "client"}), - ask.k(":client.volume_down", function() - volume("-5") - end,{description = "decrease client volume", group = "client"}), - ask.k(":client.volume_mute", function() - volume(0) - end,{description = "mute client", group = "client"}) - )) - return widget -end diff --git a/widgets/launcher.lua b/widgets/launcher.lua deleted file mode 100644 index b224b64..0000000 --- a/widgets/launcher.lua +++ /dev/null @@ -1,55 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Quick application launcher -local awful = require("awful") -local wibox = require("wibox") -local gears = require("gears") -local awmtk2 = require("awmtk2") -local beautiful = require("beautiful") -local menubar_utils = require("menubar").utils - -local function synchronous_ls(dir) - local filenames = {} - local handler = io.popen("ls -1 "..dir,"r") - handler:read("*a"):gsub("[^\n]+",function(filename) - table.insert(filenames,filename) - end) - return filenames -end - -return function(args) - local style = awmtk2.create_style("launcher", - awmtk2.generic.button_list, args.style) - local templates = awmtk2.create_template_lib("launcher", awmtk2.templates, args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local w = wibox.widget({ - layout = ((args.vertical and - wibox.layout.fixed.vertical) or - wibox.layout.fixed.horizontal - ), - spacing = style.base.spacing - }) - local path = args.path or root_path.."/links" - if gears.filesystem.dir_readable(path) then - local files = synchronous_ls(path) - for _,v in pairs(files) do - local data = menubar_utils.parse_desktop_file(path.."/"..v) - local new_widget = wibox.widget(t.button(t.icon({ - image = menubar_utils.lookup_icon_uncached(data.Icon), - }))) - local exec = data.Exec:gsub("%%%w","") - new_widget:connect_signal("button::press",style.button.onpress) - new_widget:connect_signal("button::release",style.button.onrelease) - new_widget:connect_signal("button::press",function() - awful.spawn(exec) - end) - w:add(new_widget) - end - end - return w -end diff --git a/widgets/notifications.lua b/widgets/notifications.lua deleted file mode 100644 index 5e106cc..0000000 --- a/widgets/notifications.lua +++ /dev/null @@ -1,110 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Notifications pager -local awful = require("awful") -local pager = require("pager") -local beautiful = require("beautiful") -local gears = require("gears") -local wibox = require("wibox") -local awmtk2 = require("awmtk2") -local naughty = require("naughty") - -return function(args) - local style = awmtk2.create_style("notifications", - awmtk2.generic.popup,args.style) - local templates = awmtk2.create_template_lib("notifications",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local layout = wibox.widget({ - layout = wibox.layout.fixed.vertical, - spacing = style.base.spacing - }) - local pager = pager(layout,{},args.max_notifications or 8) - local test_xclip = os.execute("xclip -version") - local result = test_xclip - if _VERSION:match("5.1") then - result = (test_xclip == 0) - end - local count = 0 - local popup = awful.popup(t.popup({ - t.textbox({ - markup = "Click to copy text" - }), - ((not result) and t.textbox({ - markup = "(xclip is not installed)" - })), - t.container(layout,{ - bg = style.container.bg_highlight, - bgimage = style.container.bgimage_highlight - }), - t.textbox({ - id = "page_id", - markup = "Page 0/0" - }), - layout = wibox.layout.fixed.vertical - },{ - visible = false - })) - naughty.config.notify_callback = function(update_args) - count = count + 1 - local w = wibox.widget(t.button(t.article({ - icon = update_args.icon, - title = update_args.title or "(No title)", - description = update_args.text - }),{ - forced_height = style.button.height, - forced_width = style.button.width - })) - local page_index = popup.widget:get_children_by_id("page_id")[1] - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(count/(args.max_notifications or 8)))) - w:connect_signal("button::press",style.button.onpress) - w:connect_signal("button::release",style.button.onrelease) - w:connect_signal("button::press",function(self,x,y,button) - if button == 1 then - clip = io.open("/tmp/clip","w") - clip:write(update_args.text) - clip:close() - awful.spawn.with_shell("cat /tmp/clip | xclip -selection clipboard") - elseif button == 4 then - pager:prev() - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(count/(args.max_notifications or 8)))) - elseif button == 5 then - pager:next() - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(count/(args.max_notifications or 8)))) - end - end) - table.insert(pager.list,1,w) - pager:update() - return update_args - end - -- create popup button - local clip_widget - do - local style = awmtk2.create_style("notifications", - awmtk2.generic.iconified_widget,args.style) - local templates = awmtk2.create_template_lib("notifications",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - clip_widget = wibox.widget(t.button(t.icon({ - image = beautiful["notifications-area-symbolic"], - resize = true, - }))) - clip_widget:connect_signal("button::press",style.button.onpress) - clip_widget:connect_signal("button::release",style.button.onrelease) - clip_widget:connect_signal("button::press",function(self,x,y,button) - if button == 1 then - popup.visible = (not popup.visible) - if popup.visible then - popup:move_next_to(mouse.current_widget_geometry) - end - end - end) - end - return clip_widget -end diff --git a/widgets/rootbuttons.lua b/widgets/rootbuttons.lua deleted file mode 100644 index 923504e..0000000 --- a/widgets/rootbuttons.lua +++ /dev/null @@ -1,63 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Power/lock/suspend buttons for the global context menu -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") - -return function(args) - local style = awmtk2.create_style("root_buttons", - awmtk2.generic.button_list,args.style) - local templates = awmtk2.create_template_lib("root_buttons",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local poweroff = wibox.widget(t.button(t.icon({ - image = beautiful["action-poweroff-symbolic"], - }),{ - forced_width = style.button.forced_width, - forced_height = style.button.forced_height - })) - poweroff:connect_signal("button::press",style.button.onpress) - poweroff:connect_signal("button::release",style.button.onrelease) - poweroff:connect_signal("button::press",function() - awful.spawn("systemctl poweroff") -- Works only with systemd - awful.spawn("loginctl poweroff") -- Works only with elogind - end) - local lock = wibox.widget(t.button(t.icon({ - image = beautiful["action-lock-screen-symbolic"], - }),{ - forced_width = style.button.forced_width, - forced_height = style.button.forced_height - })) - lock:connect_signal("button::press",style.button.onpress) - lock:connect_signal("button::release",style.button.onrelease) - lock:connect_signal("button::press",function() - awesome.emit_signal("lock_screen") - end) - local suspend = wibox.widget(t.button(t.icon({ - image = beautiful["action-suspend-symbolic"], - }),{ - forced_width = style.button.forced_width, - forced_height = style.button.forced_height - })) - suspend:connect_signal("button::press",style.button.onpress) - suspend:connect_signal("button::release",style.button.onrelease) - suspend:connect_signal("button::press",function() - awful.spawn("systemctl suspend") - awful.spawn("loginctl suspend") - end) - local widget = wibox.widget { - poweroff, - lock, - suspend, - layout = wibox.layout.fixed.horizontal, - spacing = style.base.spacing - } - return widget -end diff --git a/widgets/rootcontrols.lua b/widgets/rootcontrols.lua deleted file mode 100644 index e502ded..0000000 --- a/widgets/rootcontrols.lua +++ /dev/null @@ -1,33 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Simple global context menu controls -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") -local menugen = require("context_menu") - -return function(args) - local style = awmtk2.create_style("root_menu", - awmtk2.generic.menu,args.style) - local templates = awmtk2.create_template_lib("root_menu",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local widget = menugen({ - items = { - {"Awesome", { - {"open config dir", "xdg-open "..root_path}, - {"open docs", "xdg-open https://awesomewm.org/doc/api/"}, - {"restart", function() awesome.restart() end}, - {"quit", function() awesome.quit() end} - }, beautiful.awesome_icon}, - {"open terminal", global.terminal}, - }, - }) - return widget -end diff --git a/widgets/soundclown.lua b/widgets/soundclown.lua deleted file mode 100644 index 183ff27..0000000 --- a/widgets/soundclown.lua +++ /dev/null @@ -1,142 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Widget for interacting with mpd --- MPC IS REQUIRED -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") -local ask = require("asckey") - -return function(args) - local style = awmtk2.create_style("soundclown", - awmtk2.generic.oneline_widget,args.style) - local templates = awmtk2.create_template_lib("soundclown",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local test = os.execute("mpc help") - if type(test) == "number" then - test = (test == 0) - end - if not test then - return - end - local widget = wibox.widget({ - t.container({ - { - t.textbox({ - markup = "MPC Loading..", - id = "display" - }), - widget = wibox.container.scroll.horizontal, - step_function = wibox.container.scroll.step_functions - .linear_back_and_forth, - speed = 50, - }, - widget = wibox.container.constraint, - height = style.base.height, - width = style.base.width, - strategy = "exact" - }), - ((not args.hide_controls) and { - t.button(t.icon({ - image = beautiful["mpc-previous-symbolic"], - }),{ - id = "prev" - }), - t.button(t.icon({ - image = beautiful["mpc-play-symbolic"], - id = "statusicon" - }),{ - id = "play" - }), - t.button(t.icon({ - image = beautiful["mpc-next-symbolic"], - }),{ - id = "next" - }), - spacing = style.base.spacing, - layout = wibox.layout.fixed.horizontal - }), - spacing = style.base.spacing, - layout = wibox.layout.fixed.horizontal - }) - local display = widget:get_children_by_id("display")[1] - local bprev = widget:get_children_by_id("prev")[1] - bprev:connect_signal("button::press",style.button.onpress) - bprev:connect_signal("button::release",style.button.onrelease) - local function prev() - awful.spawn("mpc cdprev") - end - bprev:connect_signal("button::press",prev) - local pause_state = true - local icon = widget:get_children_by_id("statusicon")[1] - local bplay = widget:get_children_by_id("play")[1] - bplay:connect_signal("button::press",style.button.onpress) - bplay:connect_signal("button::release",style.button.onrelease) - local function play() - pause_state = (not pause_state) - if pause_state == false then - icon.image = beautiful["mpc-pause-symbolic"] - awful.spawn("mpc pause") - else - icon.image = beautiful["mpc-play-symbolic"] - awful.spawn("mpc play") - end - end - bplay:connect_signal("button::press",play) - local bnext = widget:get_children_by_id("next")[1] - bnext:connect_signal("button::press",style.button.onpress) - bnext:connect_signal("button::release",style.button.onrelease) - local function nextb() - awful.spawn("mpc next") - end - bnext:connect_signal("button::press",nextb) - local update_ready = true - local function update_mpd_status() - awful.spawn.easy_async("mpc",function(out) - local status = "" - if not out:match("playing") then - if not out:match("paused") then - state = true - icon.image = beautiful["mpc-play-symbolic"] - display:set_markup(status) - update_ready = true - return - else - status = status.."[PAUSED] " - end - end - status = status..out:match("#%d*").." ".. - out:match("[^\n]*").." ".. - out:match("%d*:%d*/%d*:%d*%s*%(%d*%%%)") - display:set_markup(status) - update_ready = true - end) - end - update_mpd_status() - gears.timer { - timeout = args.polling_delay or 1, - autostart = true, - callback = function() - if not update_ready then return end - update_ready = false - update_mpd_status() - end - } - root.keys(gears.table.join( - root.keys(), - ask.k(":mpc.prev",prev, - {description = "switch to previous MPD track",group="widgets"}), - ask.k(":mpc.play",play, - {description = "play/pause MPD",group="widgets"}), - ask.k(":mpc.next",nextb, - {description = "switch to next MPD track",group="widgets"}) - )) - return widget -end diff --git a/widgets/start/xdgmenu.lua b/widgets/start/xdgmenu.lua deleted file mode 100644 index cde99f2..0000000 --- a/widgets/start/xdgmenu.lua +++ /dev/null @@ -1,91 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- XDG application menu for the global context menu -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") -local menugen = require("context_menu") -local menuutils = require("menubar").utils - -return function(args) - local style = awmtk2.create_style("xdg_menu", - awmtk2.generic.menu,args.style) - local templates = awmtk2.create_template_lib("xdg_menu",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - -- Add a "loading" indicator while XDG is still parsing data - local widget = wibox.widget({ - t.container({ - markup = "Loading XDG menu...", - widget = wibox.widget.textbox - }), - layout = wibox.layout.fixed.vertical, - spacing = style.base.spacing, - id = "xdg_menu_root" - }) - - local function exclude(name) - for k,v in pairs(args.exclude or {}) do - if name:match(v) then - return true - end - end - return false - end - - awesome.connect_signal("xdg::all_finished",function() - if not args.parent then return end - local items = {} - for k,v in pairs(xdg.categories) do - local noprocess = false - for k2,v2 in pairs(args.exclude_category or {}) do - if k == v2 then - noprocess = true - end - end - if (not noprocess) and (#v.apps > 0) then - local category = {k,{},menuutils.lookup_icon_uncached(v.icon)} - for _,item in pairs(v.apps) do - if not exclude(item.name) then - table.insert(category[2], { - item.name, - item.exec:gsub("%%%w","") or "", - gears.filesystem.file_readable(item.icon or "") and item.icon - }) - end - end - table.insert(items,category) - end - end - -- uhhh there's a lot of things about async, some of which i can't explain - local xdg_menu_root = widget:get_children_by_id("xdg_menu_root")[1] - xdg_menu_root:reset() - local menu = wibox.widget(menugen({ - items = items, - })) - local menu_root = menu:get_children_by_id("menu_root")[1] - for k,v in pairs(menu_root.children) do - v:connect_signal("cascade::kill",function() - args.parent.visible = false - end) - args.parent:connect_signal("property::visible",function() - if not args.parent.visible then - v:emit_signal("cascade::close") - end - end) - menu:connect_signal("widget::redraw_needed",function() - if not menu.visible then - v:emit_signal("cascade::close") - end - end) - end - xdg_menu_root:add(menu) - end) - return widget -end diff --git a/widgets/startbutton.lua b/widgets/startbutton.lua deleted file mode 100644 index a9bcdfc..0000000 --- a/widgets/startbutton.lua +++ /dev/null @@ -1,89 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Start button that summons the root menu or any other menu if needed -local awmtk2 = require("awmtk2") -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local beautiful = require("beautiful") -local builder = require("builder") - -return function(args) - local popup - do - local style = awmtk2.create_style("startbutton", - awmtk2.generic.popup,args.style) - local templates = awmtk2.create_template_lib("startbutton",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local config_file = io.open(root_path.."/themes/"..global.theme.."/config/startbutton.lua","r") - local config - if config_file then - config = config_file:read("*a") - config_file:close() - else - config = [[{"list": [{"widget": "widgets.base.popuptitle","options":{"vertical":true}},{"widget":"widgets.start.xdgmenu"}]}]] - end - popup = awful.popup(t.popup({ - markup = "brainhurt 2", - widget = wibox.widget.textbox - })) - popup.widget = wibox.widget(t.popup(builder( - config, - { - style = style.base, - screen = mouse.screen, - passthrough = { - parent = popup - } - } - )).widget) - for _,layout in pairs(popup.widget:get_children_by_id("menu_root")) do - for _,button in pairs(layout.children) do - button:connect_signal("cascade::kill",function() - popup.visible = false - end) - end - end - popup:connect_signal("property::visible",function() - local roots = popup.widget:get_children_by_id("menu_root") - for k,v in pairs(roots) do - for _,w in ipairs(v.children) do - w:emit_signal("cascade::close") - end - end - end) - end - local style = awmtk2.create_style("startbutton", - awmtk2.generic.iconified_widget,args.style) - local templates = awmtk2.create_template_lib("startbutton",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local widget = wibox.widget(t.button(t.article({ - icon = style.article.icon, - title = style.article.title or "Start" - }))) - widget:connect_signal("button::press",style.button.onpress) - widget:connect_signal("button::release",style.button.onrelease) - widget:connect_signal("button::press",function() - popup.visible = (not popup.visible) - if popup.visible then - local _, corner = awful.placement.closest_corner( - mouse, - {parent = mouse.screen,pretend = true} - ) - if corner then - (awful.placement[corner]+ - awful.placement.no_offscreen+ - awful.placement.no_overlap) ( - popup, - {parent = mouse.screen} - ) - end - end - end) - return widget -end diff --git a/widgets/tasklist.lua b/widgets/tasklist.lua deleted file mode 100644 index eac94dd..0000000 --- a/widgets/tasklist.lua +++ /dev/null @@ -1,136 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- awful.widget.tasklist but it can change geometry based on "vertical" property -local awful = require("awful") -local wibox = require("wibox") -local gears = require("gears") -local awmtk2 = require("awmtk2") -local tasklist_buttons = gears.table.join( - awful.button({}, 1, function(c) - if c == client.focus then - c.minimized = true - else - c:emit_signal( - "request::activate", - "tasklist", - {raise = true} - ) - end - end), - awful.button({}, 4, function() - awful.client.focus.byidx(1) - end), - awful.button({}, 5, function() - awful.client.focus.byidx(-1) - end) -) - -return function(args) - local style = awmtk2.create_style("tasklist", - awmtk2.generic.oneline_widget, args.style) - local templates = awmtk2.create_template_lib("tasklist", awmtk2.templates, args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local button = t.button({ - { - { - id = "clienticon", - widget = awful.widget.clienticon - }, - (not args.vertical) and t.textbox({ - id = "text_role" - }), - layout = wibox.layout.fixed.horizontal, - spacing = style.button.spacing - }, - widget = wibox.container.constraint, - strategy="exact", - width = style.button.width, - height = style.button.height, - id = "constraint_task" - },{ - create_callback = function(self, c, index, objects) - self:get_children_by_id('clienticon')[1].client = c - -- If for some ungodly reason you enabled the behaviour of the original awesomewm, this script will just stop after setting the client icon. - if self.id == "background_role" then - return - end - local textbox = self:get_children_by_id("text_role")[1] or {} - -- Apparently the original system for changing bgimage is - -- 1) broken - -- 2) uses deprecated functions (nice code practices awesomewm) - -- Solution: write my own. I blame material design for all this. - -- (P.S: Not to bullshit you, check it yourself - replicatable - -- by adding theme.tasklist_bg_image_normal or - -- theme.tasklist_bg_image_focus in current beautiful theme.) - local onfocus = function() - self.bgimage = style.button.bgimage_focus - self.bg = style.button.bg_focus - self.shape = style.button.shape_focus - self.shape_border_width = style.button.shape_border_width_focus - self.shape_border_color = style.button.shape_border_color_focus - textbox.font = style.textbox.font_focus - end - local onunfocus = function() - self.bgimage = style.button.bgimage_normal - self.bg = style.button.bg_normal - self.shape = style.button.shape_normal - self.shape_border_width = style.button.shape_border_width_normal - self.shape_border_color = style.button.shape_border_color_normal - textbox.font = style.textbox.font_normal - end - local onurgent = function() - if not c.urgent then return end - self.bgimage = style.button.bgimage_urgent - self.bg = style.button.bg_urgent - self.shape = style.button.shape_urgent - self.shape_border_width = style.button.shape_border_width_urgent - self.shape_border_color = style.button.shape_border_color_urgent - textbox.font = style.textbox.font_urgent - end - local onminimize = function() - if not c.minimized then return end - self.bgimage = style.button.bgimage_minimize - self.bg = style.button.bg_minimize - self.shape = style.button.shape_minimize - self.shape_border_width = style.button.shape_border_width_minimize - self.shape_border_color = style.button.shape_border_color_minimize - textbox.font = style.textbox.font_minimize - end - c:connect_signal("focus",onfocus) - c:connect_signal("unfocus",onunfocus) - c:connect_signal("property::urgent",onurgent) - c:connect_signal("property::minimized",onminimize) - if client.focus == c then - onfocus() - else - onunfocus() - end - end, - -- Uncomment this only, and **ONLY** if you actually need it. - --id = "background_role" - }) - return awful.widget.tasklist { - screen = args.screen, - filter = awful.widget.tasklist.filter.currenttags, - buttons = tasklist_buttons, - layout = { - -- basically we just map every property of this to beautiful.tasklist.base - spacing = style.base.spacing, - spacing_widget = style.base.spacing_widget, - -- Now THIS is shit racing - layout = ( - (args.vertical and style.base.layout_vertical) or - style.base.layout_horizontal - ) or ( - (args.vertical and wibox.layout.fixed.vertical) or - wibox.layout.fixed.horizontal - ) - }, - widget_template = button - } -end diff --git a/widgets/volume.lua b/widgets/volume.lua deleted file mode 100644 index 8265fcd..0000000 --- a/widgets/volume.lua +++ /dev/null @@ -1,108 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Pulseaudio per-client volume setting -local awful = require("awful") -local gears = require("gears") -local wibox = require("wibox") -local awmtk2 = require("awmtk2") -local beautiful = require("beautiful") -local ask = require("asckey") - -local test_pactl = os.execute("pactl --version") -local pactl_found = test_pactl -if _VERSION:match("5.1") then - pactl_found = (test_pactl == 0) -end -local test_amixer = os.execute("amixer --version") -local amixer_found = test_amixer -if _VERSION:match("5.1") then - amixer_found = (test_amixer == 0) -end -if (not (amixer_found or pactl_found)) then - return -end - -local try_launch = [[which pavucontrol && pavucontrol || which pulsemixer && ]]..global.terminal..[[ -e pulsemixer || which alsamixer && ]]..global.terminal..[[ -e alsamixer ]] - -local function get_icon(percent) - if percent >= 66 then - return beautiful["volume-high-symbolic"] - elseif percent >= 33 then - return beautiful["volume-medium-symbolic"] - elseif percent > 0 then - return beautiful["volume-low-symbolic"] - else - return beautiful["volume-muted-symbolic"] - end -end - -return function(args) - local style = awmtk2.create_style("volume", - awmtk2.generic.oneline_widget, args.style) - local templates = awmtk2.create_template_lib("volume",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - local widget = wibox.widget({ - t.button(t.icon({ - image = get_icon(0), - id = "volume_icon", - resize = true, - })), - t.container({ - t.slider({ - minimum = 0, - maximum = 100, - id = "volume", - value = -1 - }), - layout = (args.vertical and wibox.layout.fixed.vertical) or - wibox.layout.fixed.horizontal - },{ - visible = false, - id = "slidercontainer" - }), - t.textbox({ - markup = "nassal" - }), - layout = (args.veritcal and wibox.layout.fixed.vertical) or - wibox.layout.fixed.horizontal - }) - local icon = widget:get_children_by_id("volume_icon")[1] - local slider = widget:get_children_by_id("volume")[1] - local container = widget:get_children_by_id("slidercontainer")[1] - -- Alsa master handle - args.device = args.device or "default" - gears.timer { - autostart = true, - timeout = 0.5, - call_now = true, - callback = function() - awful.spawn.easy_async_with_shell("amixer -D "..args.device.." sget Master",function(stdout) - local volume_percent = stdout:match("%[(%d+)%%%]") - volume_percent = tonumber(volume_percent) - if not volume_percent then - return - end - slider.value = volume_percent - icon.image = get_icon(volume_percent) - end) - end - } - slider:connect_signal("widget::redraw_needed",function() - awful.spawn("amixer -D "..args.device.." sset Master "..slider.value.."%") - icon.image = get_icon(slider.value) - end) - icon:connect_signal("button::press",function(self,lx,ly,button) - if button == 1 then - container.visible = not container.visible - end - if button == 2 then - awful.spawn.with_shell(args.mixer or try_launch) - end - end) - return widget -end diff --git a/widgets/wallpapers.lua b/widgets/wallpapers.lua deleted file mode 100644 index cd71b99..0000000 --- a/widgets/wallpapers.lua +++ /dev/null @@ -1,146 +0,0 @@ --- This file is part of Reno desktop. --- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. --- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- Wallpaper list widget -local awful = require("awful") -local pager = require("pager") -local beautiful = require("beautiful") -local gears = require("gears") -local wibox = require("wibox") -local awmtk2 = require("awmtk2") -local thumbnailer = require("thumbnail") - -local function ls(path) - local ls_data = io.popen("find "..path.." -maxdepth 1 -type f \\( -name \\*.jpg -o -name \\*.png \\) -exec realpath {} \\;") - local output = {} - if ls_data then - ls_data:read("*a"):gsub("[^\n]+",function(capt) - table.insert(output,capt) - end) - ls_data:close() - return output - end - error("Failed to process directory "..path) -end - -return function(args) - local style = awmtk2.create_style("wallpapers", - awmtk2.generic.popup,args.style) - local templates = awmtk2.create_template_lib("wallpapers",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - -- set wallpaper - local fhandler = io.open(root_path.."/wallpaper.txt","r") - if fhandler then - local wallpaper_path = fhandler:read("*a") - gears.wallpaper.maximized(wallpaper_path,args.screen) - else - -- try to set wallpaper from theme settings - if beautiful.wallpaper then - gears.wallpaper.maximized(beautiful.wallpaper,args.screen) - end - end - -- update wallpaper preference and set wallpaper - local function set_wallpaper(s) - local handler = io.open(root_path.."/wallpaper.txt","w") - handler:write(s) - handler:close() - gears.wallpaper.maximized(s,args.screen) - end - if not args.path then - args.path = os.getenv("HOME")..".local/share/wallpapers/" - end - args.path = args.path:gsub("$HOME",os.getenv("HOME")) - -- read wallpapers from wallpaper directory - local image_list = ls(args.path) - -- generate thumbnails to save memory - thumbnailer.generate(args.path,args.path.."/.thumbnails",60) - -- create a layout for wallpaper buttons - local layout = wibox.widget({ - layout = wibox.layout.grid, - forced_num_cols = args.columns or 4, - homogenous = true, - expand = true, - orientation = "vertical", - spacing = style.base.spacing - }) - -- create layout popup - local popup = awful.popup(t.popup({ - t.container(layout,{ - bg = style.container.bg_highlight, - bgimage = style.container.bgimage_highlight - }), - t.textbox({ - markup = "Page 0/0", - id = "page_index" - }), - layout = wibox.layout.fixed.vertical - },{ - visible = false - })) - local page_index = popup.widget:get_children_by_id("page_index")[1] - -- set up a pager for having multiple pages of wallpapers - local pager_size = ((args.rows and args.columns) and args.rows*args.columns) or 20 - local pager = pager(layout,{},pager_size) - -- add wallpaper buttons - for _,v in pairs(image_list) do - local new_button = wibox.widget(t.button(t.icon({ - image = args.path.."/.thumbnails/"..v:match("/[^/]*$"), - resize = true, - height = args.height or 60, - width = args.width or 100 - }))) - new_button:connect_signal("button::press",style.button.onpress) - new_button:connect_signal("button::release",style.button.onrelease) - new_button:connect_signal("button::press",function(self,x,y,button) - if button == 1 then - set_wallpaper(v) - elseif button == 4 then - pager:prev() - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(#image_list/pager_size))) - elseif button == 5 then - pager:next() - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(#image_list/pager_size))) - end - end) - table.insert(pager.list,new_button) - end - page_index:set_markup("Page "..tostring(pager.index+1).."/".. - tostring(math.ceil(#image_list/pager_size))) - -- update pager - pager:update() - -- make popup togglable - popup:connect_signal("button::press",function(self,x,y,button) - if button == 3 then - popup.visible = false - end - end) - -- create popup button - local clip_widget - do - local style = awmtk2.create_style("wallpapers", - awmtk2.generic.iconified_widget,args.style) - local templates = awmtk2.create_template_lib("wallpapers",awmtk2.templates,args.templates) - local t = awmtk2.build_templates(templates,style,args.vertical) - clip_widget = wibox.widget(t.button(t.icon({ - image = beautiful.wallpapers_icon, - resize = true, - }))) - clip_widget:connect_signal("button::press",style.button.onpress) - clip_widget:connect_signal("button::release",style.button.onrelease) - clip_widget:connect_signal("button::press",function(self,x,y,button) - if button == 1 then - popup.visible = (not popup.visible) - if popup.visible then - popup:move_next_to(mouse.current_widget_geometry) - end - end - end) - end - return clip_widget -end