Name change

This commit is contained in:
Adam Cooper 2025-02-27 09:28:02 -05:00
parent 3f23185a5c
commit d96b3a1258
30 changed files with 938 additions and 835 deletions

View file

@ -28,7 +28,7 @@ If you want to create a pull request, make sure that:
- Your code fits with the general style of the module. In particular, you should use the same indentation pattern that the code uses, and also avoid adding space at the ends of lines.
- Your code its easy to understand, maintainable, and modularized. You should also avoid code duplication wherever possible by adding functions to or using lain.helpers_. If something is unclear, or you can not write it in such a way that it will be clear, explain it with a comment.
- Your code its easy to understand, maintainable, and modularized. You should also avoid code duplication wherever possible by adding functions to or using lina.helpers_. If something is unclear, or you can not write it in such a way that it will be clear, explina it with a comment.
- You test your changes before submitting to make sure that your code works and does not break other parts of the module.

View file

@ -15,13 +15,13 @@ local rawget = rawget
local tsort = table.sort
local unpack = unpack or table.unpack -- lua 5.1 retro-compatibility
-- Lain helper functions for internal use
-- lain.helpers
-- Lina helper functions for internal use
-- lina.helpers
local helpers = {}
helpers.lain_dir = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]]
helpers.icons_dir = helpers.lain_dir .. 'icons/'
helpers.scripts_dir = helpers.lain_dir .. 'scripts/'
helpers.lina_dir = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]]
helpers.icons_dir = helpers.lina_dir .. 'icons/'
helpers.scripts_dir = helpers.lina_dir .. 'scripts/'
-- {{{ Modules loader

View file

@ -1,6 +1,6 @@
--[[
Lain
Lina
Layouts, widgets and utilities for Awesome WM
Licensed under GNU General Public License v2

View file

@ -1,6 +1,6 @@
--[[
Lain
Lina
Layouts, widgets and utilities for Awesome WM
Layouts section
@ -11,9 +11,9 @@
--]]
local wrequire = require("lain.helpers").wrequire
local wrequire = require("lina.helpers").wrequire
local setmetatable = setmetatable
local layout = { _NAME = "lain.layout" }
local layout = { _NAME = "lina.layout" }
return setmetatable(layout, { __index = wrequire })

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
--[[
Lain
Lina
Layouts, widgets and utilities for Awesome WM
Utilities section
@ -11,180 +11,200 @@
--]]
local awful = require("awful")
local sqrt = math.sqrt
local pairs = pairs
local client = client
local tonumber = tonumber
local wrequire = require("lina.helpers").wrequire
local awful = require("awful")
local sqrt = math.sqrt
local pairs = pairs
local client = client
local tonumber = tonumber
local wrequire = require("lina.helpers").wrequire
local setmetatable = setmetatable
-- Lain utilities submodule
-- lain.util
local util = { _NAME = "lain.util" }
-- Lina utilities submodule
-- lina.util
local util = { _NAME = "lina.util" }
-- Like awful.menu.clients, but only show clients of currently selected tags
function util.menu_clients_current_tags(menu, args)
-- List of currently selected tags.
local cls_tags = awful.screen.focused().selected_tags
-- List of currently selected tags.
local cls_tags = awful.screen.focused().selected_tags
if cls_tags == nil then return nil end
if cls_tags == nil then
return nil
end
-- Final list of menu items.
local cls_t = {}
-- Final list of menu items.
local cls_t = {}
-- For each selected tag get all clients of that tag and add them to
-- the menu. A click on a menu item will raise that client.
for i = 1,#cls_tags do
local t = cls_tags[i]
local cls = t:clients()
-- For each selected tag get all clients of that tag and add them to
-- the menu. A click on a menu item will raise that client.
for i = 1, #cls_tags do
local t = cls_tags[i]
local cls = t:clients()
for _, c in pairs(cls) do
cls_t[#cls_t + 1] = { awful.util.escape(c.name) or "",
function ()
c.minimized = false
client.focus = c
c:raise()
end,
c.icon }
end
end
for _, c in pairs(cls) do
cls_t[#cls_t + 1] = {
awful.util.escape(c.name) or "",
function()
c.minimized = false
client.focus = c
c:raise()
end,
c.icon,
}
end
end
-- No clients? Then quit.
if #cls_t <= 0 then return nil end
-- No clients? Then quit.
if #cls_t <= 0 then
return nil
end
-- menu may contain some predefined values, otherwise start with a
-- fresh menu.
if not menu then menu = {} end
-- menu may contain some predefined values, otherwise start with a
-- fresh menu.
if not menu then
menu = {}
end
-- Set the list of items and show the menu.
menu.items = cls_t
local m = awful.menu(menu)
m:show(args)
-- Set the list of items and show the menu.
menu.items = cls_t
local m = awful.menu(menu)
m:show(args)
return m
return m
end
-- Magnify a client: set it to "float" and resize it.
function util.magnify_client(c, width_f, height_f)
if c and not c.floating then
util.magnified_client = c
util.mc(c, width_f, height_f)
else
util.magnified_client = nil
c.floating = false
end
if c and not c.floating then
util.magnified_client = c
util.mc(c, width_f, height_f)
else
util.magnified_client = nil
c.floating = false
end
end
-- https://github.com/lcpz/lain/issues/195
function util.mc(c, width_f, height_f)
c = c or util.magnified_client
if not c then return end
c = c or util.magnified_client
if not c then
return
end
c.floating = true
local s = awful.screen.focused()
local mg = s.workarea
local g = {}
local mwfact = width_f or s.selected_tag.master_width_factor or 0.5
g.width = sqrt(mwfact) * mg.width
g.height = sqrt(height_f or mwfact) * mg.height
g.x = mg.x + (mg.width - g.width) / 2
g.y = mg.y + (mg.height - g.height) / 2
c.floating = true
local s = awful.screen.focused()
local mg = s.workarea
local g = {}
local mwfact = width_f or s.selected_tag.master_width_factor or 0.5
g.width = sqrt(mwfact) * mg.width
g.height = sqrt(height_f or mwfact) * mg.height
g.x = mg.x + (mg.width - g.width) / 2
g.y = mg.y + (mg.height - g.height) / 2
if c then c:geometry(g) end -- if c is still a valid object
if c then
c:geometry(g)
end -- if c is still a valid object
end
-- Non-empty tag browsing
-- direction in {-1, 1} <-> {previous, next} non-empty tag
function util.tag_view_nonempty(direction,sc)
direction = direction or 1
local s = sc or awful.screen.focused()
local tags = s.tags
local sel = s.selected_tag
function util.tag_view_nonempty(direction, sc)
direction = direction or 1
local s = sc or awful.screen.focused()
local tags = s.tags
local sel = s.selected_tag
local i = sel.index
repeat
i = i + direction
local i = sel.index
repeat
i = i + direction
-- Wrap around when we reach one of the bounds
if i > #tags then
i = i - #tags
end
if i < 1 then
i = i + #tags
end
-- Wrap around when we reach one of the bounds
if i > #tags then
i = i - #tags
end
if i < 1 then
i = i + #tags
end
local t = tags[i]
local t = tags[i]
-- Stop when we get back to where we started
if t == sel then
break
end
-- Stop when we get back to where we started
if t == sel then
break
end
-- If it's The One, view it.
if #t:clients() > 0 then
t:view_only()
return
end
until false
-- If it's The One, view it.
if #t:clients() > 0 then
t:view_only()
return
end
until false
end
-- {{{ Dynamic tagging
-- Add a new tag
function util.add_tag(layout)
awful.prompt.run {
prompt = "New tag name: ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = function(name)
if not name or #name == 0 then return end
awful.tag.add(name, { screen = awful.screen.focused(), layout = layout or awful.layout.suit.tile }):view_only()
end
}
awful.prompt.run({
prompt = "New tag name: ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = function(name)
if not name or #name == 0 then
return
end
awful.tag
.add(name, { screen = awful.screen.focused(), layout = layout or awful.layout.suit.tile })
:view_only()
end,
})
end
-- Rename current tag
function util.rename_tag()
awful.prompt.run {
prompt = "Rename tag: ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = function(new_name)
if not new_name or #new_name == 0 then return end
local t = awful.screen.focused().selected_tag
if t then
t.name = new_name
end
end
}
awful.prompt.run({
prompt = "Rename tag: ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = function(new_name)
if not new_name or #new_name == 0 then
return
end
local t = awful.screen.focused().selected_tag
if t then
t.name = new_name
end
end,
})
end
-- Move current tag
-- pos in {-1, 1} <-> {previous, next} tag position
function util.move_tag(pos)
local tag = awful.screen.focused().selected_tag
if tonumber(pos) <= -1 then
awful.tag.move(tag.index - 1, tag)
else
awful.tag.move(tag.index + 1, tag)
end
local tag = awful.screen.focused().selected_tag
if tonumber(pos) <= -1 then
awful.tag.move(tag.index - 1, tag)
else
awful.tag.move(tag.index + 1, tag)
end
end
-- Delete current tag
-- Any rule set on the tag shall be broken
function util.delete_tag()
local t = awful.screen.focused().selected_tag
if not t then return end
t:delete()
local t = awful.screen.focused().selected_tag
if not t then
return
end
t:delete()
end
-- }}}
-- On the fly useless gaps change
function util.useless_gaps_resize(thatmuch, s, t)
local scr = s or awful.screen.focused()
local tag = t or scr.selected_tag
tag.gap = tag.gap + tonumber(thatmuch)
awful.layout.arrange(scr)
local scr = s or awful.screen.focused()
local tag = t or scr.selected_tag
tag.gap = tag.gap + tonumber(thatmuch)
awful.layout.arrange(scr)
end
return setmetatable(util, { __index = wrequire })

View file

@ -10,8 +10,8 @@
local format = string.format
local setmetatable = setmetatable
-- Lain markup util submodule
-- lain.util.markup
-- Lina markup util submodule
-- lina.util.markup
local markup = { fg = {}, bg = {} }
-- Convenience tags

View file

@ -8,10 +8,10 @@
--]]
-- Menu iterator with Naughty notifications
-- lain.util.menu_iterator
-- lina.util.menu_iterator
local naughty = require("naughty")
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local atable = require("awful.util").table
local assert = assert
local pairs = pairs

View file

@ -10,8 +10,8 @@ local wibox = require("wibox")
local gears = require("gears")
local beautiful = require("beautiful")
-- Lain Cairo separators util submodule
-- lain.util.separators
-- Lina Cairo separators util submodule
-- lina.util.separators
local separators = { height = beautiful.separators_height or 0, width = beautiful.separators_width or 9 }
-- [[ Arrow

View file

@ -6,13 +6,13 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local shell = require("awful.util").shell
local wibox = require("wibox")
local string = string
-- ALSA volume
-- lain.widget.alsa
-- lina.widget.alsa
local function factory(args)
args = args or {}

View file

@ -6,7 +6,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local awful = require("awful")
local naughty = require("naughty")
local wibox = require("wibox")
@ -16,7 +16,7 @@ local type = type
local tonumber = tonumber
-- ALSA volume bar
-- lain.widget.alsabar
-- lina.widget.alsabar
local function factory(args)
local alsabar = {

View file

@ -6,7 +6,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local fs = require("gears.filesystem")
local naughty = require("naughty")
local wibox = require("wibox")
@ -16,13 +16,13 @@ local ipairs = ipairs
local tonumber = tonumber
-- Battery infos
-- lain.widget.bat
-- lina.widget.bat
local function factory(args)
local pspath = args.pspath or "/sys/class/power_supply/"
if not fs.is_dir(pspath) then
naughty.notify { text = "lain.widget.bat: invalid power supply path", timeout = 0 }
naughty.notify { text = "lina.widget.bat: invalid power supply path", timeout = 0 }
return
end

View file

@ -5,8 +5,8 @@
--]]
local helpers = require("lain.helpers")
local markup = require("lain.util.markup")
local helpers = require("lina.helpers")
local markup = require("lina.util.markup")
local awful = require("awful")
local naughty = require("naughty")
local floor = math.floor
@ -19,7 +19,7 @@ local tonumber = tonumber
local tostring = tostring
-- Calendar notification
-- lain.widget.cal
-- lina.widget.cal
local function factory(args)
args = args or {}

View file

@ -1,6 +1,6 @@
--[[
Lain
Lina
Layouts, widgets and utilities for Awesome WM
Users contributed widgets section
@ -10,9 +10,9 @@
--]]
local wrequire = require("lain.helpers").wrequire
local wrequire = require("lina.helpers").wrequire
local setmetatable = setmetatable
local widget = { _NAME = "lain.widget.contrib" }
local widget = { _NAME = "lina.widget.contrib" }
return setmetatable(widget, { __index = wrequire })

View file

@ -5,7 +5,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local shell = require("awful.util").shell
local focused = require("awful.screen").focused
local escape_f = require("awful.util").escape
@ -15,7 +15,7 @@ local os = os
local string = string
-- MOC audio player
-- lain.widget.contrib.moc
-- lina.widget.contrib.moc
local function factory(args)
args = args or {}

View file

@ -6,13 +6,13 @@
--]]
local async = require("lain.helpers").async
local async = require("lina.helpers").async
local awful = require("awful")
local execute = os.execute
local type = type
-- Redshift
-- lain.widget.contrib.redshift
-- lina.widget.contrib.redshift
local redshift = { active = false, pid = nil }
function redshift.start()

View file

@ -5,14 +5,14 @@
--]]
local helpers = require("lain.helpers")
local markup = require("lain.util").markup
local helpers = require("lina.helpers")
local markup = require("lina.util").markup
local awful = require("awful")
local naughty = require("naughty")
local mouse = mouse
-- Taskwarrior notification
-- lain.widget.contrib.task
-- lina.widget.contrib.task
local task = {}
function task.hide()

View file

@ -6,7 +6,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local focused = require("awful.screen").focused
local naughty = require("naughty")
local wibox = require("wibox")
@ -15,7 +15,7 @@ local type = type
-- ThinkPad battery infos and widget creator
-- http://www.thinkwiki.org/wiki/Tp_smapi
-- lain.widget.contrib.tp_smapi
-- lina.widget.contrib.tp_smapi
local function factory(apipath)
local tp_smapi = {

View file

@ -6,13 +6,13 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local wibox = require("wibox")
local math = math
local string = string
-- CPU usage
-- lain.widget.cpu
-- lina.widget.cpu
local function factory(args)
args = args or {}

View file

@ -7,7 +7,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local Gio = require("lgi").Gio
local focused = require("awful.screen").focused
local wibox = require("wibox")
@ -23,7 +23,7 @@ local query_used = Gio.FILE_ATTRIBUTE_FILESYSTEM_USED
local query = query_size .. "," .. query_free .. "," .. query_used
-- File systems info
-- lain.widget.fs
-- lina.widget.fs
local function factory(args)
args = args or {}

View file

@ -5,90 +5,111 @@
--]]
local helpers = require("lain.helpers")
local naughty = require("naughty")
local wibox = require("wibox")
local awful = require("awful")
local string = string
local type = type
local helpers = require("lina.helpers")
local naughty = require("naughty")
local wibox = require("wibox")
local awful = require("awful")
local string = string
local type = type
local tonumber = tonumber
-- Mail IMAP check
-- lain.widget.imap
-- lina.widget.imap
local function factory(args)
args = args or {}
args = args or {}
local imap = { widget = args.widget or wibox.widget.textbox() }
local server = args.server
local mail = args.mail
local password = args.password
local port = args.port or 993
local timeout = args.timeout or 60
local pwdtimeout = args.pwdtimeout or 10
local is_plain = args.is_plain or false
local followtag = args.followtag or false
local notify = args.notify or "on"
local settings = args.settings or function() end
local imap = { widget = args.widget or wibox.widget.textbox() }
local server = args.server
local mail = args.mail
local password = args.password
local port = args.port or 993
local timeout = args.timeout or 60
local pwdtimeout = args.pwdtimeout or 10
local is_plain = args.is_plain or false
local followtag = args.followtag or false
local notify = args.notify or "on"
local settings = args.settings or function() end
local head_command = "curl --connect-timeout 3 -fsm 3"
local request = "-X 'STATUS INBOX (MESSAGES RECENT UNSEEN)'"
local head_command = "curl --connect-timeout 3 -fsm 3"
local request = "-X 'STATUS INBOX (MESSAGES RECENT UNSEEN)'"
if not server or not mail or not password then return end
if not server or not mail or not password then
return
end
mail_notification_preset = {
icon = helpers.icons_dir .. "mail.png",
position = "top_left"
}
mail_notification_preset = {
icon = helpers.icons_dir .. "mail.png",
position = "top_left",
}
helpers.set_map(mail, 0)
helpers.set_map(mail, 0)
if not is_plain then
if type(password) == "string" or type(password) == "table" then
helpers.async(password, function(f) password = f:gsub("\n", "") end)
elseif type(password) == "function" then
imap.pwdtimer = helpers.newtimer(mail .. "-password", pwdtimeout, function()
local retrieved_password, try_again = password()
if not try_again then
imap.pwdtimer:stop() -- stop trying to retrieve
password = retrieved_password or "" -- failsafe
end
end, true, true)
end
end
if not is_plain then
if type(password) == "string" or type(password) == "table" then
helpers.async(password, function(f)
password = f:gsub("\n", "")
end)
elseif type(password) == "function" then
imap.pwdtimer = helpers.newtimer(mail .. "-password", pwdtimeout, function()
local retrieved_password, try_again = password()
if not try_again then
imap.pwdtimer:stop() -- stop trying to retrieve
password = retrieved_password or "" -- failsafe
end
end, true, true)
end
end
function imap.update()
-- do not update if the password has not been retrieved yet
if type(password) ~= "string" then return end
function imap.update()
-- do not update if the password has not been retrieved yet
if type(password) ~= "string" then
return
end
local curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:'%s' %s -k",
head_command, server, port, mail, password, request)
local curl = string.format(
"%s --url imaps://%s:%s/INBOX -u %s:'%s' %s -k",
head_command,
server,
port,
mail,
password,
request
)
helpers.async(curl, function(f)
imap_now = { ["MESSAGES"] = 0, ["RECENT"] = 0, ["UNSEEN"] = 0 }
helpers.async(curl, function(f)
imap_now = { ["MESSAGES"] = 0, ["RECENT"] = 0, ["UNSEEN"] = 0 }
for s,d in f:gmatch("(%w+)%s+(%d+)") do imap_now[s] = tonumber(d) end
mailcount = imap_now["UNSEEN"] -- backwards compatibility
widget = imap.widget
for s, d in f:gmatch("(%w+)%s+(%d+)") do
imap_now[s] = tonumber(d)
end
mailcount = imap_now["UNSEEN"] -- backwards compatibility
widget = imap.widget
settings()
settings()
if notify == "on" and mailcount and mailcount >= 1 and mailcount > helpers.get_map(mail) then
if followtag then mail_notification_preset.screen = awful.screen.focused() end
naughty.notify {
preset = mail_notification_preset,
text = string.format("%s has <b>%d</b> new message%s", mail, mailcount, mailcount == 1 and "" or "s")
}
end
if notify == "on" and mailcount and mailcount >= 1 and mailcount > helpers.get_map(mail) then
if followtag then
mail_notification_preset.screen = awful.screen.focused()
end
naughty.notify({
preset = mail_notification_preset,
text = string.format(
"%s has <b>%d</b> new message%s",
mail,
mailcount,
mailcount == 1 and "" or "s"
),
})
end
helpers.set_map(mail, imap_now["UNSEEN"])
end)
helpers.set_map(mail, imap_now["UNSEEN"])
end)
end
end
imap.timer = helpers.newtimer(mail, timeout, imap.update, true, true)
imap.timer = helpers.newtimer(mail, timeout, imap.update, true, true)
return imap
return imap
end
return factory

View file

@ -1,6 +1,6 @@
--[[
Lain
Lina
Layouts, widgets and utilities for Awesome WM
Widgets section
@ -11,9 +11,9 @@
--]]
local wrequire = require("lain.helpers").wrequire
local wrequire = require("lina.helpers").wrequire
local setmetatable = setmetatable
local widget = { _NAME = "lain.widget" }
local widget = { _NAME = "lina.widget" }
return setmetatable(widget, { __index = wrequire })

View file

@ -6,12 +6,12 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local wibox = require("wibox")
local gmatch, lines, floor = string.gmatch, io.lines, math.floor
-- Memory usage (ignoring caches)
-- lain.widget.mem
-- lina.widget.mem
local function factory(args)
args = args or {}

View file

@ -6,7 +6,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local shell = require("awful.util").shell
local escape_f = require("awful.util").escape
local focused = require("awful.screen").focused
@ -16,7 +16,7 @@ local os = os
local string = string
-- MPD infos
-- lain.widget.mpd
-- lina.widget.mpd
local function factory(args)
args = args or {}

View file

@ -6,13 +6,13 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local naughty = require("naughty")
local wibox = require("wibox")
local string = string
-- Network infos
-- lain.widget.net
-- lina.widget.net
local function factory(args)
args = args or {}

View file

@ -5,14 +5,14 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local shell = require("awful.util").shell
local wibox = require("wibox")
local string = string
local type = type
-- PulseAudio volume
-- lain.widget.pulse
-- lina.widget.pulse
local function factory(args)
args = args or {}

View file

@ -6,7 +6,7 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local awful = require("awful")
local naughty = require("naughty")
local wibox = require("wibox")
@ -16,7 +16,7 @@ local type = type
local tonumber = tonumber
-- PulseAudio volume bar
-- lain.widget.pulsebar
-- lina.widget.pulsebar
local function factory(args)
local pulsebar = {

View file

@ -6,12 +6,12 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local wibox = require("wibox")
local open, match = io.open, string.match
-- System load
-- lain.widget.sysload
-- lina.widget.sysload
local function factory(args)
args = args or {}

View file

@ -5,12 +5,12 @@
--]]
local helpers = require("lain.helpers")
local helpers = require("lina.helpers")
local wibox = require("wibox")
local tonumber = tonumber
-- {thermal,core} temperature info
-- lain.widget.temp
-- lina.widget.temp
local function factory(args)
args = args or {}

View file

@ -5,8 +5,8 @@
--]]
local helpers = require("lain.helpers")
local json = require("lain.util").dkjson
local helpers = require("lina.helpers")
local json = require("lina.util").dkjson
local focused = require("awful.screen").focused
local naughty = require("naughty")
local wibox = require("wibox")
@ -18,7 +18,7 @@ local tonumber = tonumber
-- OpenWeatherMap
-- current weather and X-days forecast
-- lain.widget.weather
-- lina.widget.weather
local function factory(args)
args = args or {}