Name change
This commit is contained in:
parent
3f23185a5c
commit
d96b3a1258
30 changed files with 938 additions and 835 deletions
|
@ -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.
|
||||
|
||||
|
|
10
helpers.lua
10
helpers.lua
|
@ -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
|
||||
|
||||
|
|
2
init.lua
2
init.lua
|
@ -1,6 +1,6 @@
|
|||
--[[
|
||||
|
||||
Lain
|
||||
Lina
|
||||
Layouts, widgets and utilities for Awesome WM
|
||||
|
||||
Licensed under GNU General Public License v2
|
||||
|
|
|
@ -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 })
|
||||
|
|
1246
util/dkjson.lua
1246
util/dkjson.lua
File diff suppressed because it is too large
Load diff
254
util/init.lua
254
util/init.lua
|
@ -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 })
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 })
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
149
widget/imap.lua
149
widget/imap.lua
|
@ -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
|
||||
|
|
|
@ -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 })
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {}
|
||||
|
|
Loading…
Add table
Reference in a new issue