Auto: format source code
This commit is contained in:
parent
489f2a3490
commit
3fc80c7dfd
|
@ -8,10 +8,14 @@ local _client = {}
|
|||
--
|
||||
-- @param c A client
|
||||
function _client.turn_off(c, current_tag)
|
||||
if current_tag == nil then current_tag = c.screen.selected_tag end
|
||||
if current_tag == nil then
|
||||
current_tag = c.screen.selected_tag
|
||||
end
|
||||
local ctags = {}
|
||||
for k, tag in pairs(c:tags()) do
|
||||
if tag ~= current_tag then table.insert(ctags, tag) end
|
||||
if tag ~= current_tag then
|
||||
table.insert(ctags, tag)
|
||||
end
|
||||
end
|
||||
c:tags(ctags)
|
||||
end
|
||||
|
@ -21,9 +25,11 @@ end
|
|||
-- @param c A client
|
||||
function _client.turn_on(c)
|
||||
local current_tag = c.screen.selected_tag
|
||||
ctags = {current_tag}
|
||||
ctags = { current_tag }
|
||||
for k, tag in pairs(c:tags()) do
|
||||
if tag ~= current_tag then table.insert(ctags, tag) end
|
||||
if tag ~= current_tag then
|
||||
table.insert(ctags, tag)
|
||||
end
|
||||
end
|
||||
c:tags(ctags)
|
||||
c:raise()
|
||||
|
@ -35,9 +41,15 @@ end
|
|||
-- @param to_c The client to which to write all properties
|
||||
-- @param from_c The client from which to read all properties
|
||||
function _client.sync(to_c, from_c)
|
||||
if not from_c or not to_c then return end
|
||||
if not from_c.valid or not to_c.valid then return end
|
||||
if from_c.modal then return end
|
||||
if not from_c or not to_c then
|
||||
return
|
||||
end
|
||||
if not from_c.valid or not to_c.valid then
|
||||
return
|
||||
end
|
||||
if from_c.modal then
|
||||
return
|
||||
end
|
||||
to_c.floating = from_c.floating
|
||||
to_c.maximized = from_c.maximized
|
||||
to_c.above = from_c.above
|
||||
|
@ -52,16 +64,21 @@ end
|
|||
-- @param pid The process ID
|
||||
-- @return True if the passed client is a childprocess of the given PID otherwise false
|
||||
function _client.is_child_of(c, pid)
|
||||
-- io.popen is normally discouraged. Should probably be changed
|
||||
if not c or not c.valid then return false end
|
||||
if tostring(c.pid) == tostring(pid) then return true end
|
||||
local pid_cmd = [[pstree -T -p -a -s ]] .. tostring(c.pid) ..
|
||||
[[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']]
|
||||
-- io.popen is normally discouraged. Should probably be changed
|
||||
if not c or not c.valid then
|
||||
return false
|
||||
end
|
||||
if tostring(c.pid) == tostring(pid) then
|
||||
return true
|
||||
end
|
||||
local pid_cmd = [[pstree -T -p -a -s ]]
|
||||
.. tostring(c.pid)
|
||||
.. [[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']]
|
||||
local handle = io.popen(pid_cmd)
|
||||
local parent_pid = handle:read("*a")
|
||||
handle:close()
|
||||
return tostring(parent_pid) == tostring(pid) or tostring(parent_pid) ==
|
||||
tostring(c.pid)
|
||||
return tostring(parent_pid) == tostring(pid)
|
||||
or tostring(parent_pid) == tostring(c.pid)
|
||||
end
|
||||
|
||||
--- Finds all clients that satisfy the passed rule
|
||||
|
@ -69,7 +86,9 @@ end
|
|||
-- @param rule The rule to be searched for
|
||||
-- @retrun A list of clients that match the given rule
|
||||
function _client.find(rule)
|
||||
local function matcher(c) return awful.rules.match(c, rule) end
|
||||
local function matcher(c)
|
||||
return awful.rules.match(c, rule)
|
||||
end
|
||||
local clients = client.get()
|
||||
local findex = gears.table.hasitem(clients, client.focus) or 1
|
||||
local start = gears.math.cycle(#clients, findex + 1)
|
||||
|
@ -82,22 +101,26 @@ function _client.find(rule)
|
|||
return matches
|
||||
end
|
||||
|
||||
|
||||
--- Gets the next client by direction from the focused one
|
||||
--
|
||||
--
|
||||
-- @param direction it the direction as a string ("up", "down", "left" or "right")
|
||||
-- @retrun the client in the given direction starting at the currently focused one, nil otherwise
|
||||
function _client.get_by_direction(direction)
|
||||
local sel = client.focus
|
||||
if not sel then return nil end
|
||||
if not sel then
|
||||
return nil
|
||||
end
|
||||
local cltbl = sel.screen:get_clients()
|
||||
local geomtbl = {}
|
||||
for i, cl in ipairs(cltbl) do
|
||||
geomtbl[i] = cl:geometry()
|
||||
end
|
||||
local target = gears.geometry.rectangle.get_in_direction(direction, geomtbl, sel:geometry())
|
||||
local target = gears.geometry.rectangle.get_in_direction(
|
||||
direction,
|
||||
geomtbl,
|
||||
sel:geometry()
|
||||
)
|
||||
return cltbl[target]
|
||||
end
|
||||
|
||||
|
||||
return _client
|
||||
|
|
|
@ -1,23 +1,18 @@
|
|||
|
||||
|
||||
local _color = {}
|
||||
|
||||
|
||||
|
||||
--- Try to guess if a color is dark or light.
|
||||
--
|
||||
-- @string color The color with hexadecimal HTML format `"#RRGGBB"`.
|
||||
-- @treturn bool `true` if the color is dark, `false` if it is light.
|
||||
function _color.is_dark(color)
|
||||
-- Try to determine if the color is dark or light
|
||||
local numeric_value = 0;
|
||||
local numeric_value = 0
|
||||
for s in color:gmatch("[a-fA-F0-9][a-fA-F0-9]") do
|
||||
numeric_value = numeric_value + tonumber("0x"..s);
|
||||
numeric_value = numeric_value + tonumber("0x" .. s)
|
||||
end
|
||||
return (numeric_value < 383)
|
||||
end
|
||||
|
||||
|
||||
--- Lighten a color.
|
||||
--
|
||||
-- @string color The color to lighten with hexadecimal HTML format `"#RRGGBB"`.
|
||||
|
@ -26,9 +21,9 @@ end
|
|||
function _color.lighten(color, amount)
|
||||
amount = amount or 26
|
||||
local c = {
|
||||
r = tonumber("0x"..color:sub(2,3)),
|
||||
g = tonumber("0x"..color:sub(4,5)),
|
||||
b = tonumber("0x"..color:sub(6,7)),
|
||||
r = tonumber("0x" .. color:sub(2, 3)),
|
||||
g = tonumber("0x" .. color:sub(4, 5)),
|
||||
b = tonumber("0x" .. color:sub(6, 7)),
|
||||
}
|
||||
|
||||
c.r = c.r + amount
|
||||
|
@ -41,7 +36,7 @@ function _color.lighten(color, amount)
|
|||
c.b = c.b < 0 and 0 or c.b
|
||||
c.b = c.b > 255 and 255 or c.b
|
||||
|
||||
return string.format('#%02x%02x%02x', c.r, c.g, c.b)
|
||||
return string.format("#%02x%02x%02x", c.r, c.g, c.b)
|
||||
end
|
||||
|
||||
--- Darken a color.
|
||||
|
@ -54,6 +49,4 @@ function _color.darken(color, amount)
|
|||
return _color.lighten(color, -amount)
|
||||
end
|
||||
|
||||
|
||||
|
||||
return _color
|
||||
|
|
|
@ -13,21 +13,36 @@ function _filesystem.list_directory_files(path, exts, recursive)
|
|||
local files, valid_exts = {}, {}
|
||||
|
||||
-- Transforms { "jpg", ... } into { [jpg] = #, ... }
|
||||
if exts then for i, j in ipairs(exts) do valid_exts[j:lower()] = i end end
|
||||
if exts then
|
||||
for i, j in ipairs(exts) do
|
||||
valid_exts[j:lower()] = i
|
||||
end
|
||||
end
|
||||
|
||||
-- Build a table of files from the path with the required extensions
|
||||
local file_list = Gio.File.new_for_path(path):enumerate_children("standard::*", 0)
|
||||
local file_list = Gio.File.new_for_path(path):enumerate_children(
|
||||
"standard::*",
|
||||
0
|
||||
)
|
||||
if file_list then
|
||||
for file in function() return file_list:next_file() end do
|
||||
for file in function()
|
||||
return file_list:next_file()
|
||||
end do
|
||||
local file_type = file:get_file_type()
|
||||
if file_type == "REGULAR" then
|
||||
local file_name = file:get_display_name()
|
||||
if not exts or valid_exts[file_name:lower():match(".+%.(.*)$") or ""] then
|
||||
if
|
||||
not exts
|
||||
or valid_exts[file_name:lower():match(".+%.(.*)$") or ""]
|
||||
then
|
||||
table.insert(files, file_name)
|
||||
end
|
||||
elseif recursive and file_type == "DIRECTORY" then
|
||||
local file_name = file:get_display_name()
|
||||
files = gears.table.join(files, list_directory_files(file_name, exts, recursive))
|
||||
files = gears.table.join(
|
||||
files,
|
||||
list_directory_files(file_name, exts, recursive)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -35,5 +50,4 @@ function _filesystem.list_directory_files(path, exts, recursive)
|
|||
return files
|
||||
end
|
||||
|
||||
|
||||
return _filesystem
|
||||
|
|
|
@ -3,5 +3,5 @@ return {
|
|||
color = require(... .. ".color"),
|
||||
filesystem = require(... .. ".filesystem"),
|
||||
shape = require(... .. ".shape"),
|
||||
time = require(... .. ".time")
|
||||
time = require(... .. ".time"),
|
||||
}
|
||||
|
|
|
@ -14,10 +14,17 @@ end
|
|||
|
||||
function shape.prrect(radius, tl, tr, br, bl)
|
||||
return function(cr, width, height)
|
||||
gears.shape.partially_rounded_rect(cr, width, height, tl, tr, br, bl,
|
||||
radius)
|
||||
gears.shape.partially_rounded_rect(
|
||||
cr,
|
||||
width,
|
||||
height,
|
||||
tl,
|
||||
tr,
|
||||
br,
|
||||
bl,
|
||||
radius
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return shape
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
|
||||
|
||||
local time = {}
|
||||
|
||||
|
||||
--- Parse a time string to seconds (from midnight)
|
||||
--
|
||||
-- @string time The time (`HH:MM:SS`)
|
||||
|
@ -14,7 +11,6 @@ function time.hhmmss_to_seconds(time)
|
|||
return (hour_sec + min_sec + get_sec)
|
||||
end
|
||||
|
||||
|
||||
--- Get time difference in seconds.
|
||||
--
|
||||
-- @tparam string base The time to compare from (`HH:MM:SS`).
|
||||
|
@ -25,5 +21,4 @@ function time.time_diff(base, compare)
|
|||
return diff
|
||||
end
|
||||
|
||||
|
||||
return time
|
||||
|
|
5
init.lua
5
init.lua
|
@ -1,10 +1,11 @@
|
|||
--[[
|
||||
Bling
|
||||
Layouts, widgets and utilities for Awesome WM
|
||||
--]] return {
|
||||
--]]
|
||||
return {
|
||||
layout = require(... .. ".layout"),
|
||||
module = require(... .. ".module"),
|
||||
helpers = require(... .. ".helpers"),
|
||||
signal = require(... .. ".signal"),
|
||||
widget = require(... .. ".widget")
|
||||
widget = require(... .. ".widget"),
|
||||
}
|
||||
|
|
|
@ -16,10 +16,10 @@ function mylayout.arrange(p)
|
|||
local nslaves = #p.clients - nmaster
|
||||
|
||||
local master_area_width = area.width * mwfact
|
||||
local slave_area_width = area.width - master_area_width
|
||||
local master_area_x = area.x + 0.5*slave_area_width
|
||||
local slave_area_width = area.width - master_area_width
|
||||
local master_area_x = area.x + 0.5 * slave_area_width
|
||||
|
||||
local number_of_left_sided_slaves =math.floor(nslaves/2)
|
||||
local number_of_left_sided_slaves = math.floor(nslaves / 2)
|
||||
local number_of_right_sided_slaves = nslaves - number_of_left_sided_slaves
|
||||
local left_iterator = 0
|
||||
local right_iterator = 0
|
||||
|
@ -30,69 +30,73 @@ function mylayout.arrange(p)
|
|||
return
|
||||
end
|
||||
|
||||
-- Special case: one slave -> relapse into awesomes masterstack tile layout
|
||||
-- Special case: one slave -> relapse into awesomes masterstack tile layout
|
||||
if nslaves == 1 then
|
||||
awful.layout.suit.tile.right.arrange(p)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Special case: no slaves -> fullscreen master area
|
||||
if nslaves < 1 then
|
||||
master_area_width = area.width
|
||||
master_area_width = area.width
|
||||
master_area_x = area.x
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- iterate through masters
|
||||
for idx=1,nmaster do
|
||||
local c = p.clients[idx]
|
||||
local g
|
||||
g = {
|
||||
x = master_area_x,
|
||||
y = area.y + (nmaster-idx)*(area.height/nmaster),
|
||||
width = master_area_width,
|
||||
height = area.height/nmaster,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
for idx = 1, nmaster do
|
||||
local c = p.clients[idx]
|
||||
local g
|
||||
g = {
|
||||
x = master_area_x,
|
||||
y = area.y + (nmaster - idx) * (area.height / nmaster),
|
||||
width = master_area_width,
|
||||
height = area.height / nmaster,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
|
||||
-- iterate through slaves
|
||||
for idx=1,nslaves do -- idx=nmaster+1,#p.clients do
|
||||
local c = p.clients[idx+nmaster]
|
||||
if idx % 2 == 0 then
|
||||
g = {
|
||||
x = area.x,
|
||||
y = area.y + left_iterator * (area.height/number_of_left_sided_slaves),
|
||||
width = slave_area_width/2,
|
||||
height = area.height/number_of_left_sided_slaves,
|
||||
}
|
||||
left_iterator = left_iterator + 1
|
||||
else
|
||||
g = {
|
||||
x = area.x + master_area_width + slave_area_width/2,
|
||||
y = area.y + right_iterator * (area.height/number_of_right_sided_slaves),
|
||||
width = slave_area_width/2,
|
||||
height = area.height/number_of_right_sided_slaves,
|
||||
}
|
||||
right_iterator = right_iterator + 1
|
||||
|
||||
end
|
||||
p.geometries[c] = g
|
||||
for idx = 1, nslaves do -- idx=nmaster+1,#p.clients do
|
||||
local c = p.clients[idx + nmaster]
|
||||
if idx % 2 == 0 then
|
||||
g = {
|
||||
x = area.x,
|
||||
y = area.y
|
||||
+ left_iterator
|
||||
* (area.height / number_of_left_sided_slaves),
|
||||
width = slave_area_width / 2,
|
||||
height = area.height / number_of_left_sided_slaves,
|
||||
}
|
||||
left_iterator = left_iterator + 1
|
||||
else
|
||||
g = {
|
||||
x = area.x + master_area_width + slave_area_width / 2,
|
||||
y = area.y
|
||||
+ right_iterator
|
||||
* (area.height / number_of_right_sided_slaves),
|
||||
width = slave_area_width / 2,
|
||||
height = area.height / number_of_right_sided_slaves,
|
||||
}
|
||||
right_iterator = right_iterator + 1
|
||||
end
|
||||
p.geometries[c] = g
|
||||
end
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() .. tostring(...):match("^.*bling"):gsub("%.", "/") .. "/icons/layouts/centered.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/centered.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
return gcolor.recolor_image(icon_raw, beautiful.fg_normal)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
if icon_raw ~= nil then
|
||||
return gcolor.recolor_image(icon_raw, beautiful.fg_normal)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return {
|
||||
layout = mylayout,
|
||||
icon_raw = icon_raw,
|
||||
get_icon = get_icon,
|
||||
layout = mylayout,
|
||||
icon_raw = icon_raw,
|
||||
get_icon = get_icon,
|
||||
}
|
||||
|
|
|
@ -25,9 +25,9 @@ function mylayout.arrange(p)
|
|||
end
|
||||
|
||||
local xoffset = area.width * 0.1 / (client_count - 1)
|
||||
local yoffset = area.height * 0.1 / (client_count - 1)
|
||||
local yoffset = area.height * 0.1 / (client_count - 1)
|
||||
|
||||
for idx=1,client_count do
|
||||
for idx = 1, client_count do
|
||||
local c = p.clients[idx]
|
||||
local g = {
|
||||
x = area.x + (idx - 1) * xoffset,
|
||||
|
@ -39,7 +39,9 @@ function mylayout.arrange(p)
|
|||
end
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() .. tostring(...):match("^.*bling"):gsub("%.", "/") .. "/icons/layouts/deck.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/deck.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
|
|
|
@ -1,84 +1,96 @@
|
|||
local gears = require("gears")
|
||||
local gcolor = require("gears.color")
|
||||
local beautiful = require("beautiful")
|
||||
local math = math
|
||||
local screen = screen
|
||||
local math = math
|
||||
local screen = screen
|
||||
local mylayout = {}
|
||||
mylayout.name = "equalarea"
|
||||
|
||||
local function divide(p,g,low,high,cls,mwfact,mcount)
|
||||
if low == high then
|
||||
p.geometries[cls[low]] = g
|
||||
else
|
||||
local masters = math.max(0,math.min(mcount,high)-low+1)
|
||||
local numblock = high-low + 1
|
||||
local slaves = numblock - masters
|
||||
local smalldiv
|
||||
if numblock > 5 and (numblock % 5) == 0 then
|
||||
smalldiv = math.floor(numblock/5)
|
||||
local function divide(p, g, low, high, cls, mwfact, mcount)
|
||||
if low == high then
|
||||
p.geometries[cls[low]] = g
|
||||
else
|
||||
if (numblock % 3) == 0 then
|
||||
smalldiv = math.floor(numblock/3)
|
||||
else
|
||||
smalldiv = math.floor(numblock/2)
|
||||
end
|
||||
local masters = math.max(0, math.min(mcount, high) - low + 1)
|
||||
local numblock = high - low + 1
|
||||
local slaves = numblock - masters
|
||||
local smalldiv
|
||||
if numblock > 5 and (numblock % 5) == 0 then
|
||||
smalldiv = math.floor(numblock / 5)
|
||||
else
|
||||
if (numblock % 3) == 0 then
|
||||
smalldiv = math.floor(numblock / 3)
|
||||
else
|
||||
smalldiv = math.floor(numblock / 2)
|
||||
end
|
||||
end
|
||||
local bigdiv = numblock - smalldiv
|
||||
local smallmasters = math.min(masters, smalldiv)
|
||||
local bigmasters = masters - smallmasters
|
||||
local smallg = {}
|
||||
local bigg = {}
|
||||
smallg.x = g.x
|
||||
smallg.y = g.y
|
||||
if g.width > (g.height * 1.3) then
|
||||
smallg.height = g.height
|
||||
bigg.height = g.height
|
||||
bigg.width = math.floor(
|
||||
g.width
|
||||
* (bigmasters * (mwfact - 1) + bigdiv)
|
||||
/ (slaves + mwfact * masters)
|
||||
)
|
||||
smallg.width = g.width - bigg.width
|
||||
bigg.y = g.y
|
||||
bigg.x = g.x + smallg.width
|
||||
else
|
||||
smallg.width = g.width
|
||||
bigg.width = g.width
|
||||
bigg.height = math.floor(
|
||||
g.height
|
||||
* (bigmasters * (mwfact - 1) + bigdiv)
|
||||
/ (slaves + mwfact * masters)
|
||||
)
|
||||
smallg.height = g.height - bigg.height
|
||||
bigg.x = g.x
|
||||
bigg.y = g.y + smallg.height
|
||||
end
|
||||
divide(p, smallg, low, high - bigdiv, cls, mwfact, mcount)
|
||||
divide(p, bigg, low + smalldiv, high, cls, mwfact, mcount)
|
||||
end
|
||||
local bigdiv = numblock - smalldiv
|
||||
local smallmasters = math.min(masters,smalldiv)
|
||||
local bigmasters = masters-smallmasters
|
||||
local smallg = {}
|
||||
local bigg = {}
|
||||
smallg.x = g.x
|
||||
smallg.y = g.y
|
||||
if g.width > (g.height*1.3) then
|
||||
smallg.height = g.height
|
||||
bigg.height = g.height
|
||||
bigg.width = math.floor(g.width*(bigmasters*(mwfact-1)+bigdiv)/(slaves+mwfact*masters))
|
||||
smallg.width = g.width-bigg.width
|
||||
bigg.y = g.y
|
||||
bigg.x = g.x + smallg.width
|
||||
else
|
||||
smallg.width = g.width
|
||||
bigg.width = g.width
|
||||
bigg.height = math.floor(g.height*(bigmasters*(mwfact-1)+bigdiv)/(slaves+mwfact*masters))
|
||||
smallg.height = g.height-bigg.height
|
||||
bigg.x = g.x
|
||||
bigg.y = g.y + smallg.height
|
||||
end
|
||||
divide(p,smallg,low,high-bigdiv,cls,mwfact,mcount)
|
||||
divide(p,bigg,low+smalldiv,high,cls,mwfact,mcount)
|
||||
end
|
||||
return
|
||||
return
|
||||
end
|
||||
|
||||
function mylayout.arrange(p)
|
||||
local t = p.tag or screen[p.screen].selected_tag
|
||||
local wa = p.workarea
|
||||
local cls = p.clients
|
||||
local t = p.tag or screen[p.screen].selected_tag
|
||||
local wa = p.workarea
|
||||
local cls = p.clients
|
||||
|
||||
if #cls == 0 then return end
|
||||
local mwfact = t.master_width_factor*2
|
||||
local mcount = t.master_count
|
||||
local g = {}
|
||||
g.height = wa.height
|
||||
g.width = wa.width
|
||||
g.x = wa.x
|
||||
g.y = wa.y
|
||||
divide(p,g,1,#cls,cls,mwfact,mcount)
|
||||
if #cls == 0 then
|
||||
return
|
||||
end
|
||||
local mwfact = t.master_width_factor * 2
|
||||
local mcount = t.master_count
|
||||
local g = {}
|
||||
g.height = wa.height
|
||||
g.width = wa.width
|
||||
g.x = wa.x
|
||||
g.y = wa.y
|
||||
divide(p, g, 1, #cls, cls, mwfact, mcount)
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() .. tostring(...):match("^.*bling"):gsub("%.", "/") .. "/icons/layouts/equalarea.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/equalarea.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
return gcolor.recolor_image(icon_raw, beautiful.fg_normal)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
if icon_raw ~= nil then
|
||||
return gcolor.recolor_image(icon_raw, beautiful.fg_normal)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
layout = mylayout,
|
||||
icon_raw = icon_raw,
|
||||
get_icon = get_icon,
|
||||
layout = mylayout,
|
||||
icon_raw = icon_raw,
|
||||
get_icon = get_icon,
|
||||
}
|
||||
|
|
|
@ -19,43 +19,47 @@ function mylayout.arrange(p)
|
|||
local slave_area_height = area.height - master_area_height
|
||||
|
||||
-- Special case: no slaves
|
||||
if nslaves == 0 then
|
||||
if nslaves == 0 then
|
||||
master_area_height = area.height
|
||||
slave_area_height = 0
|
||||
end
|
||||
end
|
||||
|
||||
-- Special case: no masters
|
||||
if nmaster == 0 then
|
||||
master_area_height = 0
|
||||
if nmaster == 0 then
|
||||
master_area_height = 0
|
||||
slave_area_height = area.height
|
||||
end
|
||||
end
|
||||
|
||||
-- itearte through masters
|
||||
for idx=1,nmaster do
|
||||
for idx = 1, nmaster do
|
||||
local c = p.clients[idx]
|
||||
local g = {
|
||||
x = area.x + (idx-1)*(area.width/nmaster),
|
||||
x = area.x + (idx - 1) * (area.width / nmaster),
|
||||
y = area.y,
|
||||
width = area.width/nmaster,
|
||||
width = area.width / nmaster,
|
||||
height = master_area_height,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
|
||||
-- iterate through slaves
|
||||
for idx=1,nslaves do
|
||||
local c = p.clients[idx+nmaster]
|
||||
for idx = 1, nslaves do
|
||||
local c = p.clients[idx + nmaster]
|
||||
local g = {
|
||||
x = area.x,
|
||||
y = area.y + master_area_height + (idx-1)*(slave_area_height/nslaves),
|
||||
y = area.y
|
||||
+ master_area_height
|
||||
+ (idx - 1) * (slave_area_height / nslaves),
|
||||
width = area.width,
|
||||
height = slave_area_height/nslaves,
|
||||
height = slave_area_height / nslaves,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() .. tostring(...):match("^.*bling"):gsub("%.", "/") .. "/icons/layouts/horizontal.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/horizontal.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
|
|
|
@ -24,7 +24,7 @@ local layout = {
|
|||
vertical = vertical.layout,
|
||||
horizontal = horizontal.layout,
|
||||
equalarea = equalarea.layout,
|
||||
deck = deck.layout
|
||||
deck = deck.layout,
|
||||
}
|
||||
|
||||
return layout
|
||||
|
|
180
layout/mstab.lua
180
layout/mstab.lua
|
@ -10,33 +10,50 @@ mylayout.name = "mstab"
|
|||
|
||||
local tabbar_ontop = beautiful.mstab_bar_ontop or false
|
||||
local tabbar_padding = beautiful.mstab_bar_padding or "default"
|
||||
local border_radius = beautiful.mstab_border_radius or
|
||||
beautiful.border_radius or 0
|
||||
local tabbar_position = beautiful.mstab_tabbar_position or
|
||||
beautiful.tabbar_position or "top"
|
||||
local border_radius = beautiful.mstab_border_radius
|
||||
or beautiful.border_radius
|
||||
or 0
|
||||
local tabbar_position = beautiful.mstab_tabbar_position
|
||||
or beautiful.tabbar_position
|
||||
or "top"
|
||||
|
||||
local bar_style = beautiful.mstab_tabbar_style or beautiful.tabbar_style or
|
||||
"default"
|
||||
local bar = require(tostring(...):match(".*bling") .. ".widget.tabbar." ..
|
||||
bar_style)
|
||||
local tabbar_size = bar.size or beautiful.mstab_bar_height or beautiful.tabbar_size or 40
|
||||
local bar_style = beautiful.mstab_tabbar_style
|
||||
or beautiful.tabbar_style
|
||||
or "default"
|
||||
local bar = require(
|
||||
tostring(...):match(".*bling") .. ".widget.tabbar." .. bar_style
|
||||
)
|
||||
local tabbar_size = bar.size
|
||||
or beautiful.mstab_bar_height
|
||||
or beautiful.tabbar_size
|
||||
or 40
|
||||
local dont_resize_slaves = beautiful.mstab_dont_resize_slaves or false
|
||||
|
||||
-- The top_idx is the idx of the slave clients (excluding all master clients)
|
||||
-- The top_idx is the idx of the slave clients (excluding all master clients)
|
||||
-- that should be on top of all other slave clients ("the focused slave")
|
||||
-- by creating a variable outside of the arrange function, this layout can "remember" that client
|
||||
-- by creating it as a new property of every tag, this layout can be active on different tags and
|
||||
-- by creating it as a new property of every tag, this layout can be active on different tags and
|
||||
-- still have different "focused slave clients"
|
||||
for idx, tag in ipairs(root.tags()) do tag.top_idx = 1 end
|
||||
for idx, tag in ipairs(root.tags()) do
|
||||
tag.top_idx = 1
|
||||
end
|
||||
|
||||
-- Haven't found a signal that is emitted when a new tag is added. That should work though
|
||||
-- since you can't use a layout on a tag that you haven't selected previously
|
||||
tag.connect_signal("property::selected",
|
||||
function(t) if not t.top_idx then t.top_idx = 1 end end)
|
||||
|
||||
function update_tabbar(clients, t, top_idx, area, master_area_width,
|
||||
slave_area_width)
|
||||
tag.connect_signal("property::selected", function(t)
|
||||
if not t.top_idx then
|
||||
t.top_idx = 1
|
||||
end
|
||||
end)
|
||||
|
||||
function update_tabbar(
|
||||
clients,
|
||||
t,
|
||||
top_idx,
|
||||
area,
|
||||
master_area_width,
|
||||
slave_area_width
|
||||
)
|
||||
local s = t.screen
|
||||
|
||||
-- create the list of clients for the tabbar
|
||||
|
@ -47,42 +64,50 @@ function update_tabbar(clients, t, top_idx, area, master_area_width,
|
|||
awful.button({}, 1, function()
|
||||
c:raise()
|
||||
client.focus = c
|
||||
end),
|
||||
awful.button({}, 2, function()
|
||||
c:kill()
|
||||
end),
|
||||
awful.button({}, 2, function()
|
||||
c:kill()
|
||||
end),
|
||||
awful.button({}, 3, function()
|
||||
c.minimized = true
|
||||
end))
|
||||
end)
|
||||
)
|
||||
local client_box = bar.create(c, (idx == top_idx), buttons)
|
||||
clientlist:add(client_box)
|
||||
end
|
||||
|
||||
-- if no tabbar exists, create one
|
||||
if not s.tabbar then
|
||||
s.tabbar = wibox {
|
||||
s.tabbar = wibox({
|
||||
ontop = tabbar_ontop,
|
||||
shape = function(cr, width, height)
|
||||
gears.shape.rounded_rect(cr, width, height, border_radius)
|
||||
end,
|
||||
bg = bar.bg_normal,
|
||||
visible = true
|
||||
}
|
||||
visible = true,
|
||||
})
|
||||
|
||||
-- Change visibility of the tab bar when layout, selected tag or number of clients (visible, master, slave) changes
|
||||
local function adjust_visiblity(t)
|
||||
s.tabbar.visible = (#t:clients() - t.master_count > 1) and
|
||||
(t.layout.name == mylayout.name)
|
||||
s.tabbar.visible = (#t:clients() - t.master_count > 1)
|
||||
and (t.layout.name == mylayout.name)
|
||||
end
|
||||
|
||||
tag.connect_signal("property::selected",
|
||||
function(t) adjust_visiblity(t) end)
|
||||
tag.connect_signal("property::layout",
|
||||
function(t, layout) adjust_visiblity(t) end)
|
||||
tag.connect_signal("tagged", function(t, c) adjust_visiblity(t) end)
|
||||
tag.connect_signal("untagged", function(t, c) adjust_visiblity(t) end)
|
||||
tag.connect_signal("property::master_count",
|
||||
function(t) adjust_visiblity(t) end)
|
||||
tag.connect_signal("property::selected", function(t)
|
||||
adjust_visiblity(t)
|
||||
end)
|
||||
tag.connect_signal("property::layout", function(t, layout)
|
||||
adjust_visiblity(t)
|
||||
end)
|
||||
tag.connect_signal("tagged", function(t, c)
|
||||
adjust_visiblity(t)
|
||||
end)
|
||||
tag.connect_signal("untagged", function(t, c)
|
||||
adjust_visiblity(t)
|
||||
end)
|
||||
tag.connect_signal("property::master_count", function(t)
|
||||
adjust_visiblity(t)
|
||||
end)
|
||||
client.connect_signal("property::minimized", function(c)
|
||||
local t = c.first_tag
|
||||
adjust_visiblity(t)
|
||||
|
@ -100,21 +125,24 @@ function update_tabbar(clients, t, top_idx, area, master_area_width,
|
|||
s.tabbar.y = area.y + area.height - tabbar_size - t.gap
|
||||
s.tabbar.width = slave_area_width - 2 * t.gap
|
||||
s.tabbar.height = tabbar_size
|
||||
elseif tabbar_position == "left" then
|
||||
elseif tabbar_position == "left" then
|
||||
s.tabbar.x = area.x + master_area_width + t.gap
|
||||
s.tabbar.y = area.y + t.gap
|
||||
s.tabbar.width = tabbar_size
|
||||
s.tabbar.width = tabbar_size
|
||||
s.tabbar.height = area.height - 2 * t.gap
|
||||
elseif tabbar_position == "right" then
|
||||
s.tabbar.x = area.x + master_area_width + slave_area_width - tabbar_size - t.gap
|
||||
elseif tabbar_position == "right" then
|
||||
s.tabbar.x = area.x
|
||||
+ master_area_width
|
||||
+ slave_area_width
|
||||
- tabbar_size
|
||||
- t.gap
|
||||
s.tabbar.y = area.y + t.gap
|
||||
s.tabbar.width = tabbar_size
|
||||
s.tabbar.height = area.height - 2 * t.gap
|
||||
end
|
||||
|
||||
-- update clientlist
|
||||
s.tabbar:setup{layout = wibox.layout.flex.horizontal, clientlist}
|
||||
|
||||
-- update clientlist
|
||||
s.tabbar:setup({ layout = wibox.layout.flex.horizontal, clientlist })
|
||||
end
|
||||
|
||||
function mylayout.arrange(p)
|
||||
|
@ -129,7 +157,9 @@ function mylayout.arrange(p)
|
|||
local slave_area_width = area.width - master_area_width
|
||||
|
||||
-- "default" means that it uses standard useless gap size
|
||||
if tabbar_padding == "default" then tabbar_padding = 2 * t.gap end
|
||||
if tabbar_padding == "default" then
|
||||
tabbar_padding = 2 * t.gap
|
||||
end
|
||||
|
||||
-- Special case: No masters -> full screen slave width
|
||||
if nmaster == 0 then
|
||||
|
@ -140,8 +170,10 @@ function mylayout.arrange(p)
|
|||
-- Special case: One or zero slaves -> no tabbar (essentially tile right)
|
||||
if nslaves <= 1 then
|
||||
-- since update_tabbar isnt called that way we have to hide it manually
|
||||
if s.tabbar then s.tabbar.visible = false end
|
||||
-- otherwise just do tile right
|
||||
if s.tabbar then
|
||||
s.tabbar.visible = false
|
||||
end
|
||||
-- otherwise just do tile right
|
||||
awful.layout.suit.tile.right.arrange(p)
|
||||
return
|
||||
end
|
||||
|
@ -153,25 +185,25 @@ function mylayout.arrange(p)
|
|||
x = area.x,
|
||||
y = area.y + (idx - 1) * (area.height / nmaster),
|
||||
width = master_area_width,
|
||||
height = area.height / nmaster
|
||||
height = area.height / nmaster,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
|
||||
local tabbar_size_change = 0
|
||||
local tabbar_width_change = 0
|
||||
local tabbar_y_change = 0
|
||||
local tabbar_x_change = 0
|
||||
if tabbar_position == "top" then
|
||||
local tabbar_size_change = 0
|
||||
local tabbar_width_change = 0
|
||||
local tabbar_y_change = 0
|
||||
local tabbar_x_change = 0
|
||||
if tabbar_position == "top" then
|
||||
tabbar_size_change = tabbar_size + tabbar_padding
|
||||
tabbar_y_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "bottom" then
|
||||
tabbar_y_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "bottom" then
|
||||
tabbar_size_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "left" then
|
||||
tabbar_width_change = tabbar_size + tabbar_padding
|
||||
tabbar_x_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "right" then
|
||||
tabbar_width_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "left" then
|
||||
tabbar_width_change = tabbar_size + tabbar_padding
|
||||
tabbar_x_change = tabbar_size + tabbar_padding
|
||||
elseif tabbar_position == "right" then
|
||||
tabbar_width_change = tabbar_size + tabbar_padding
|
||||
end
|
||||
|
||||
-- Iterate through slaves
|
||||
|
@ -180,31 +212,39 @@ function mylayout.arrange(p)
|
|||
for idx = 1, nslaves do
|
||||
local c = p.clients[idx + nmaster]
|
||||
slave_clients[#slave_clients + 1] = c
|
||||
if c == client.focus then t.top_idx = #slave_clients end
|
||||
if c == client.focus then
|
||||
t.top_idx = #slave_clients
|
||||
end
|
||||
local g = {
|
||||
x = area.x + master_area_width + tabbar_x_change,
|
||||
y = area.y + tabbar_y_change,
|
||||
width = slave_area_width - tabbar_width_change,
|
||||
height = area.height - tabbar_size_change
|
||||
x = area.x + master_area_width + tabbar_x_change,
|
||||
y = area.y + tabbar_y_change,
|
||||
width = slave_area_width - tabbar_width_change,
|
||||
height = area.height - tabbar_size_change,
|
||||
}
|
||||
if not dont_resize_slaves and idx ~= t.top_idx then
|
||||
if not dont_resize_slaves and idx ~= t.top_idx then
|
||||
g = {
|
||||
x = area.x + master_area_width + slave_area_width / 4,
|
||||
y = area.y + tabbar_size + area.height / 4,
|
||||
width = slave_area_width / 2,
|
||||
height = area.height / 4 - tabbar_size
|
||||
height = area.height / 4 - tabbar_size,
|
||||
}
|
||||
end
|
||||
p.geometries[c] = g
|
||||
end
|
||||
|
||||
update_tabbar(slave_clients, t, t.top_idx, area, master_area_width,
|
||||
slave_area_width)
|
||||
update_tabbar(
|
||||
slave_clients,
|
||||
t,
|
||||
t.top_idx,
|
||||
area,
|
||||
master_area_width,
|
||||
slave_area_width
|
||||
)
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() ..
|
||||
tostring(...):match("^.*bling"):gsub("%.", "/") ..
|
||||
"/icons/layouts/mstab.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/mstab.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
|
@ -214,4 +254,4 @@ local function get_icon()
|
|||
end
|
||||
end
|
||||
|
||||
return {layout = mylayout, icon_raw = icon_raw, get_icon = get_icon}
|
||||
return { layout = mylayout, icon_raw = icon_raw, get_icon = get_icon }
|
||||
|
|
|
@ -18,44 +18,48 @@ function mylayout.arrange(p)
|
|||
local master_area_width = area.width * mwfact
|
||||
local slave_area_width = area.width - master_area_width
|
||||
|
||||
-- Special case: no slaves
|
||||
if nslaves == 0 then
|
||||
-- Special case: no slaves
|
||||
if nslaves == 0 then
|
||||
master_area_width = area.width
|
||||
slave_area_width = 0
|
||||
end
|
||||
end
|
||||
|
||||
-- Special case: no masters
|
||||
if nmaster == 0 then
|
||||
-- Special case: no masters
|
||||
if nmaster == 0 then
|
||||
master_area_width = 0
|
||||
slave_area_width = area.width
|
||||
end
|
||||
end
|
||||
|
||||
-- iterate through masters
|
||||
for idx=1,nmaster do
|
||||
for idx = 1, nmaster do
|
||||
local c = p.clients[idx]
|
||||
local g = {
|
||||
x = area.x,
|
||||
y = area.y + (idx-1)*(area.height/nmaster),
|
||||
y = area.y + (idx - 1) * (area.height / nmaster),
|
||||
width = master_area_width,
|
||||
height = area.height/nmaster,
|
||||
height = area.height / nmaster,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
|
||||
-- itearte through slaves
|
||||
for idx=1,nslaves do
|
||||
local c = p.clients[idx+nmaster]
|
||||
for idx = 1, nslaves do
|
||||
local c = p.clients[idx + nmaster]
|
||||
local g = {
|
||||
x = area.x + master_area_width + (idx-1)*(slave_area_width/nslaves),
|
||||
x = area.x
|
||||
+ master_area_width
|
||||
+ (idx - 1) * (slave_area_width / nslaves),
|
||||
y = area.y,
|
||||
width = slave_area_width/nslaves,
|
||||
width = slave_area_width / nslaves,
|
||||
height = area.height,
|
||||
}
|
||||
p.geometries[c] = g
|
||||
end
|
||||
end
|
||||
|
||||
local icon_raw = gears.filesystem.get_configuration_dir() .. tostring(...):match("^.*bling"):gsub("%.", "/") .. "/icons/layouts/vertical.png"
|
||||
local icon_raw = gears.filesystem.get_configuration_dir()
|
||||
.. tostring(...):match("^.*bling"):gsub("%.", "/")
|
||||
.. "/icons/layouts/vertical.png"
|
||||
|
||||
local function get_icon()
|
||||
if icon_raw ~= nil then
|
||||
|
|
|
@ -8,14 +8,16 @@ local flashfocus = function(c)
|
|||
if c then
|
||||
c.opacity = op
|
||||
local q = op
|
||||
local g = gears.timer {
|
||||
local g = gears.timer({
|
||||
timeout = stp,
|
||||
call_now = false,
|
||||
autostart = true
|
||||
}
|
||||
autostart = true,
|
||||
})
|
||||
|
||||
g:connect_signal("timeout", function()
|
||||
if not c.valid then return end
|
||||
if not c.valid then
|
||||
return
|
||||
end
|
||||
if q >= 1 then
|
||||
c.opacity = 1
|
||||
g:stop()
|
||||
|
@ -27,10 +29,16 @@ local flashfocus = function(c)
|
|||
end
|
||||
|
||||
-- Bring the focused client to the top
|
||||
if c then c:raise() end
|
||||
if c then
|
||||
c:raise()
|
||||
end
|
||||
end
|
||||
|
||||
local enable = function() client.connect_signal("focus", flashfocus) end
|
||||
local disable = function() client.disconnect_signal("focus", flashfocus) end
|
||||
local enable = function()
|
||||
client.connect_signal("focus", flashfocus)
|
||||
end
|
||||
local disable = function()
|
||||
client.disconnect_signal("focus", flashfocus)
|
||||
end
|
||||
|
||||
return {enable = enable, disable = disable, flashfocus = flashfocus}
|
||||
return { enable = enable, disable = disable, flashfocus = flashfocus }
|
||||
|
|
|
@ -4,5 +4,5 @@ return {
|
|||
wallpaper = require(... .. ".wallpaper"),
|
||||
flash_focus = require(... .. ".flash_focus"),
|
||||
tabbed = require(... .. ".tabbed"),
|
||||
scratchpad = require(... .. ".scratchpad")
|
||||
scratchpad = require(... .. ".scratchpad"),
|
||||
}
|
||||
|
|
|
@ -3,7 +3,9 @@ local gears = require("gears")
|
|||
local naughty = require("naughty")
|
||||
|
||||
local ruled
|
||||
if awesome.version ~= "v4.3" then ruled = require("ruled") end
|
||||
if awesome.version ~= "v4.3" then
|
||||
ruled = require("ruled")
|
||||
end
|
||||
|
||||
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
|
||||
|
||||
|
@ -16,12 +18,15 @@ local Scratchpad = { mt = {} }
|
|||
function Scratchpad:new(args)
|
||||
args = args or {}
|
||||
if args.awestore then
|
||||
naughty.notify({title = "Bling Error", text = "Awestore is no longer supported! Please take a look at the scratchpad documentation and use rubato for animations instead."})
|
||||
naughty.notify({
|
||||
title = "Bling Error",
|
||||
text = "Awestore is no longer supported! Please take a look at the scratchpad documentation and use rubato for animations instead.",
|
||||
})
|
||||
end
|
||||
|
||||
args.rubato = args.rubato or {}
|
||||
args.in_anim = false
|
||||
local ret = gears.object {}
|
||||
local ret = gears.object({})
|
||||
gears.table.crush(ret, Scratchpad)
|
||||
gears.table.crush(ret, args)
|
||||
return ret
|
||||
|
@ -30,13 +35,17 @@ end
|
|||
--- Find all clients that satisfy the the rule
|
||||
--
|
||||
-- @return A list of all clients that satisfy the rule
|
||||
function Scratchpad:find() return helpers.client.find(self.rule) end
|
||||
function Scratchpad:find()
|
||||
return helpers.client.find(self.rule)
|
||||
end
|
||||
|
||||
--- Applies the objects scratchpad properties to a given client
|
||||
--
|
||||
-- @param c A client to which to apply the properties
|
||||
function Scratchpad:apply(c)
|
||||
if not c or not c.valid then return end
|
||||
if not c or not c.valid then
|
||||
return
|
||||
end
|
||||
c.floating = self.floating
|
||||
c.sticky = self.sticky
|
||||
c.fullscreen = false
|
||||
|
@ -45,7 +54,7 @@ function Scratchpad:apply(c)
|
|||
x = self.geometry.x + awful.screen.focused().geometry.x,
|
||||
y = self.geometry.y + awful.screen.focused().geometry.y,
|
||||
width = self.geometry.width,
|
||||
height = self.geometry.height
|
||||
height = self.geometry.height,
|
||||
})
|
||||
if self.autoclose then
|
||||
c:connect_signal("unfocus", function(c1)
|
||||
|
@ -67,19 +76,27 @@ function Scratchpad:turn_on()
|
|||
if axis == "x" and anim.pos == self.geometry.x then
|
||||
anim.pos = anim:initial()
|
||||
else
|
||||
if anim.pos == self.geometry.y then anim.pos = anim:initial() end
|
||||
if anim.pos == self.geometry.y then
|
||||
anim.pos = anim:initial()
|
||||
end
|
||||
end
|
||||
|
||||
anim:subscribe(function(pos)
|
||||
if c and c.valid then
|
||||
if axis == "x" then c.x = pos
|
||||
else c.y = pos end
|
||||
if axis == "x" then
|
||||
c.x = pos
|
||||
else
|
||||
c.y = pos
|
||||
end
|
||||
end
|
||||
self.in_anim = true
|
||||
end)
|
||||
|
||||
if axis == "x" then anim:set(self.geometry.x)
|
||||
else anim:set(self.geometry.y) end
|
||||
if axis == "x" then
|
||||
anim:set(self.geometry.x)
|
||||
else
|
||||
anim:set(self.geometry.y)
|
||||
end
|
||||
|
||||
anim.ended:subscribe(function()
|
||||
self.in_anim = false
|
||||
|
@ -100,12 +117,18 @@ function Scratchpad:turn_on()
|
|||
end
|
||||
if c and not self.in_anim then
|
||||
-- if a client was found, turn it on
|
||||
if self.reapply then self:apply(c) end
|
||||
if self.reapply then
|
||||
self:apply(c)
|
||||
end
|
||||
-- c.sticky was set to false in turn_off so it has to be reapplied anyway
|
||||
c.sticky = self.sticky
|
||||
|
||||
if anim_x then animate(c, anim_x, "x") end
|
||||
if anim_y then animate(c, anim_y, "y") end
|
||||
if anim_x then
|
||||
animate(c, anim_x, "x")
|
||||
end
|
||||
if anim_y then
|
||||
animate(c, anim_y, "y")
|
||||
end
|
||||
|
||||
helpers.client.turn_on(c)
|
||||
self:emit_signal("turn_on", c)
|
||||
|
@ -117,49 +140,64 @@ function Scratchpad:turn_on()
|
|||
-- apply the properties only once (until the next closing)
|
||||
local pid = awful.spawn.with_shell(self.command)
|
||||
if awesome.version ~= "v4.3" then
|
||||
ruled.client.append_rule
|
||||
{
|
||||
ruled.client.append_rule({
|
||||
id = "scratchpad",
|
||||
rule = self.rule,
|
||||
properties =
|
||||
{
|
||||
properties = {
|
||||
-- If a scratchpad is opened it should spawn at the current tag
|
||||
-- the same way it will behave if the client was already open
|
||||
tag = awful.screen.focused().selected_tag,
|
||||
switch_to_tags = false,
|
||||
-- Hide the client until the gemoetry rules are applied
|
||||
hidden = true,
|
||||
minimized = true
|
||||
minimized = true,
|
||||
},
|
||||
callback = function(c)
|
||||
-- For a reason I can't quite get the gemotery rules will fail to apply unless we use this timer
|
||||
gears.timer{timeout = 0.15, autostart = true, single_shot = true, callback = function()
|
||||
self:apply(c)
|
||||
c.hidden = false
|
||||
c.minimized = false
|
||||
-- Some clients fail to gain focus
|
||||
c:activate{}
|
||||
gears.timer({
|
||||
timeout = 0.15,
|
||||
autostart = true,
|
||||
single_shot = true,
|
||||
callback = function()
|
||||
self:apply(c)
|
||||
c.hidden = false
|
||||
c.minimized = false
|
||||
-- Some clients fail to gain focus
|
||||
c:activate({})
|
||||
|
||||
if anim_x then animate(c, anim_x, "x") end
|
||||
if anim_y then animate(c, anim_y, "y") end
|
||||
if anim_x then
|
||||
animate(c, anim_x, "x")
|
||||
end
|
||||
if anim_y then
|
||||
animate(c, anim_y, "y")
|
||||
end
|
||||
|
||||
self:emit_signal("inital_apply", c)
|
||||
self:emit_signal("inital_apply", c)
|
||||
|
||||
-- Discord spawns 2 windows, so keep the rule until the 2nd window shows
|
||||
if c.name ~= "Discord Updater" then ruled.client.remove_rule("scratchpad") end
|
||||
-- In a case Discord is killed before the second window spawns
|
||||
c:connect_signal("request::unmanage", function() ruled.client.remove_rule("scratchpad") end)
|
||||
end}
|
||||
end
|
||||
}
|
||||
-- Discord spawns 2 windows, so keep the rule until the 2nd window shows
|
||||
if c.name ~= "Discord Updater" then
|
||||
ruled.client.remove_rule("scratchpad")
|
||||
end
|
||||
-- In a case Discord is killed before the second window spawns
|
||||
c:connect_signal("request::unmanage", function()
|
||||
ruled.client.remove_rule("scratchpad")
|
||||
end)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
})
|
||||
else
|
||||
local function inital_apply(c1)
|
||||
if helpers.client.is_child_of(c1, pid) then
|
||||
self:apply(c1)
|
||||
if anim_x then animate(c1, anim_x, "x") end
|
||||
if anim_y then animate(c1, anim_y, "y") end
|
||||
if anim_x then
|
||||
animate(c1, anim_x, "x")
|
||||
end
|
||||
if anim_y then
|
||||
animate(c1, anim_y, "y")
|
||||
end
|
||||
self:emit_signal("inital_apply", c1)
|
||||
client.disconnect_signal("manage", inital_apply)
|
||||
client.disconnect_signal("manage", inital_apply)
|
||||
end
|
||||
end
|
||||
client.connect_signal("manage", inital_apply)
|
||||
|
@ -177,13 +215,19 @@ function Scratchpad:turn_off()
|
|||
-- Can't animate non floating clients
|
||||
c.floating = true
|
||||
|
||||
if axis == "x" then anim.pos = c.x
|
||||
else anim.pos = c.y end
|
||||
if axis == "x" then
|
||||
anim.pos = c.x
|
||||
else
|
||||
anim.pos = c.y
|
||||
end
|
||||
|
||||
anim:subscribe(function(pos)
|
||||
if c and c.valid then
|
||||
if axis == "x" then c.x = pos
|
||||
else c.y = pos end
|
||||
if axis == "x" then
|
||||
c.x = pos
|
||||
else
|
||||
c.y = pos
|
||||
end
|
||||
end
|
||||
self.in_anim = true
|
||||
|
||||
|
@ -195,15 +239,23 @@ function Scratchpad:turn_off()
|
|||
-- Switch to tag 2
|
||||
-- The client will remain on tag 1
|
||||
-- The client will be removed from tag 2
|
||||
if c.screen.selected_tag ~= current_tag_on_toggled_scratchpad then
|
||||
if
|
||||
c.screen.selected_tag ~= current_tag_on_toggled_scratchpad
|
||||
then
|
||||
self.in_anim = false
|
||||
anim:abort()
|
||||
anim:reset()
|
||||
anim:unsubscribe()
|
||||
anim.ended:unsubscribe()
|
||||
if axis == "x" then anim.pos = self.geometry.x
|
||||
else anim.pos = self.geometry.y end
|
||||
helpers.client.turn_off(c, current_tag_on_toggled_scratchpad)
|
||||
if axis == "x" then
|
||||
anim.pos = self.geometry.x
|
||||
else
|
||||
anim.pos = self.geometry.y
|
||||
end
|
||||
helpers.client.turn_off(
|
||||
c,
|
||||
current_tag_on_toggled_scratchpad
|
||||
)
|
||||
self:apply(c)
|
||||
self:emit_signal("turn_off", c)
|
||||
end
|
||||
|
@ -233,8 +285,12 @@ function Scratchpad:turn_off()
|
|||
local anim_x = self.rubato.x
|
||||
local anim_y = self.rubato.y
|
||||
|
||||
if anim_x then animate(anim_x, self.geometry.x, "x") end
|
||||
if anim_y then animate(anim_y, self.geometry.y, "y") end
|
||||
if anim_x then
|
||||
animate(anim_x, self.geometry.x, "x")
|
||||
end
|
||||
if anim_y then
|
||||
animate(anim_y, self.geometry.y, "y")
|
||||
end
|
||||
|
||||
if not anim_x and not anim_y then
|
||||
helpers.client.turn_off(c)
|
||||
|
@ -260,8 +316,8 @@ function Scratchpad:toggle()
|
|||
end
|
||||
end
|
||||
else
|
||||
is_turn_off = client.focus and
|
||||
awful.rules.match(client.focus, self.rule)
|
||||
is_turn_off = client.focus
|
||||
and awful.rules.match(client.focus, self.rule)
|
||||
end
|
||||
|
||||
if is_turn_off then
|
||||
|
|
|
@ -17,24 +17,33 @@ local beautiful = require("beautiful")
|
|||
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
|
||||
|
||||
local bar_style = beautiful.tabbar_style or "default"
|
||||
local bar = require(tostring(...):match(".*bling") .. ".widget.tabbar." ..
|
||||
bar_style)
|
||||
local bar = require(
|
||||
tostring(...):match(".*bling") .. ".widget.tabbar." .. bar_style
|
||||
)
|
||||
|
||||
tabbed = {}
|
||||
|
||||
-- used to change focused tab relative to the currently focused one
|
||||
-- used to change focused tab relative to the currently focused one
|
||||
tabbed.iter = function(idx)
|
||||
if not idx then idx = 1 end
|
||||
if not client.focus or not client.focus.bling_tabbed then return end
|
||||
if not idx then
|
||||
idx = 1
|
||||
end
|
||||
if not client.focus or not client.focus.bling_tabbed then
|
||||
return
|
||||
end
|
||||
local tabobj = client.focus.bling_tabbed
|
||||
local new_idx = (tabobj.focused_idx + idx) % #tabobj.clients
|
||||
if new_idx == 0 then new_idx = #tabobj.clients end
|
||||
if new_idx == 0 then
|
||||
new_idx = #tabobj.clients
|
||||
end
|
||||
tabbed.switch_to(tabobj, new_idx)
|
||||
end
|
||||
|
||||
-- removes a given client from its tab object
|
||||
tabbed.remove = function(c)
|
||||
if not c or not c.bling_tabbed then return end
|
||||
if not c or not c.bling_tabbed then
|
||||
return
|
||||
end
|
||||
local tabobj = c.bling_tabbed
|
||||
table.remove(tabobj.clients, tabobj.focused_idx)
|
||||
if not beautiful.tabbar_disable then
|
||||
|
@ -47,7 +56,9 @@ end
|
|||
|
||||
-- removes the currently focused client from the tab object
|
||||
tabbed.pop = function()
|
||||
if not client.focus or not client.focus.bling_tabbed then return end
|
||||
if not client.focus or not client.focus.bling_tabbed then
|
||||
return
|
||||
end
|
||||
tabbed.remove(client.focus)
|
||||
end
|
||||
|
||||
|
@ -60,7 +71,7 @@ tabbed.add = function(c, tabobj)
|
|||
tabobj.clients[#tabobj.clients + 1] = c
|
||||
tabobj.focused_idx = #tabobj.clients
|
||||
-- calls update even though switch_to calls update again
|
||||
-- but the new client needs to have the tabobj property
|
||||
-- but the new client needs to have the tabobj property
|
||||
-- before a clean switch can happen
|
||||
tabbed.update(tabobj)
|
||||
awesome.emit_signal("bling::tabbed::client_added", tabobj, c)
|
||||
|
@ -69,11 +80,14 @@ end
|
|||
|
||||
-- use xwininfo to select one client and make it tab in the currently focused tab
|
||||
tabbed.pick = function()
|
||||
if not client.focus then return end
|
||||
if not client.focus then
|
||||
return
|
||||
end
|
||||
-- this function uses xwininfo to grab a client window id which is then
|
||||
-- compared to all other clients window ids
|
||||
|
||||
local xwininfo_cmd = [[ xwininfo | grep 'xwininfo: Window id:' | cut -d " " -f 4 ]]
|
||||
local xwininfo_cmd =
|
||||
[[ xwininfo | grep 'xwininfo: Window id:' | cut -d " " -f 4 ]]
|
||||
awful.spawn.easy_async_with_shell(xwininfo_cmd, function(output)
|
||||
for _, c in ipairs(client.get()) do
|
||||
if tonumber(c.window) == tonumber(output) then
|
||||
|
@ -95,20 +109,30 @@ tabbed.pick = function()
|
|||
end
|
||||
|
||||
-- select a client by direction and make it tab in the currently focused tab
|
||||
tabbed.pick_by_direction = function(direction)
|
||||
tabbed.pick_by_direction = function(direction)
|
||||
local sel = client.focus
|
||||
if not sel then return end
|
||||
if not sel.bling_tabbed then tabbed.init(sel) end
|
||||
if not sel then
|
||||
return
|
||||
end
|
||||
if not sel.bling_tabbed then
|
||||
tabbed.init(sel)
|
||||
end
|
||||
local c = helpers.client.get_by_direction(direction)
|
||||
if not c then return end
|
||||
if not c then
|
||||
return
|
||||
end
|
||||
tabbed.add(c, sel.bling_tabbed)
|
||||
end
|
||||
|
||||
-- use dmenu to select a client and make it tab in the currently focused tab
|
||||
-- use dmenu to select a client and make it tab in the currently focused tab
|
||||
tabbed.pick_with_dmenu = function(dmenu_command)
|
||||
if not client.focus then return end
|
||||
if not client.focus then
|
||||
return
|
||||
end
|
||||
|
||||
if not dmenu_command then dmenu_command = "rofi -dmenu -i" end
|
||||
if not dmenu_command then
|
||||
dmenu_command = "rofi -dmenu -i"
|
||||
end
|
||||
|
||||
-- get all clients from the current tag
|
||||
-- ignores the case where multiple tags are selected
|
||||
|
@ -121,17 +145,28 @@ tabbed.pick_with_dmenu = function(dmenu_command)
|
|||
if #list_clients ~= 1 then
|
||||
list_clients_string = list_clients_string .. "\\n"
|
||||
end
|
||||
list_clients_string = list_clients_string .. tostring(c.window) .. " " .. c.name
|
||||
list_clients_string = list_clients_string
|
||||
.. tostring(c.window)
|
||||
.. " "
|
||||
.. c.name
|
||||
end
|
||||
end
|
||||
|
||||
if #list_clients == 0 then return end
|
||||
if #list_clients == 0 then
|
||||
return
|
||||
end
|
||||
-- calls the actual dmenu
|
||||
local xprop_cmd = [[ echo -e "]] .. list_clients_string .. [[" | ]] .. dmenu_command .. [[ | awk '{ print $1 }' ]]
|
||||
local xprop_cmd = [[ echo -e "]]
|
||||
.. list_clients_string
|
||||
.. [[" | ]]
|
||||
.. dmenu_command
|
||||
.. [[ | awk '{ print $1 }' ]]
|
||||
awful.spawn.easy_async_with_shell(xprop_cmd, function(output)
|
||||
for _, c in ipairs(list_clients) do
|
||||
if tonumber(c.window) == tonumber(output) then
|
||||
if not client.focus.bling_tabbed then tabbed.init(client.focus) end
|
||||
if not client.focus.bling_tabbed then
|
||||
tabbed.init(client.focus)
|
||||
end
|
||||
local tabobj = client.focus.bling_tabbed
|
||||
tabbed.add(c, tabobj)
|
||||
end
|
||||
|
@ -148,13 +183,15 @@ tabbed.update = function(tabobj)
|
|||
c.bling_tabbed = tabobj
|
||||
helpers.client.sync(c, currently_focused_c)
|
||||
-- the following handles killing a client while the client is tabbed
|
||||
c:connect_signal("unmanage", function(c) tabbed.remove(c) end)
|
||||
c:connect_signal("unmanage", function(c)
|
||||
tabbed.remove(c)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
-- Maybe remove if I'm the only one using it?
|
||||
awesome.emit_signal("bling::tabbed::update", tabobj)
|
||||
if not beautiful.tabbar_disable then
|
||||
if not beautiful.tabbar_disable then
|
||||
tabbed.update_tabbar(tabobj)
|
||||
end
|
||||
end
|
||||
|
@ -183,10 +220,9 @@ tabbed.update_tabbar = function(tabobj)
|
|||
local flexlist = bar.layout()
|
||||
-- itearte over all tabbed clients to create the widget tabbed list
|
||||
for idx, c in ipairs(tabobj.clients) do
|
||||
local buttons = gears.table.join(
|
||||
awful.button({}, 1, function()
|
||||
tabbed.switch_to(tabobj, idx)
|
||||
end))
|
||||
local buttons = gears.table.join(awful.button({}, 1, function()
|
||||
tabbed.switch_to(tabobj, idx)
|
||||
end))
|
||||
wid_temp = bar.create(c, (idx == tabobj.focused_idx), buttons)
|
||||
flexlist:add(wid_temp)
|
||||
end
|
||||
|
@ -195,15 +231,15 @@ tabbed.update_tabbar = function(tabobj)
|
|||
local titlebar = awful.titlebar(c, {
|
||||
bg = bar.bg_normal,
|
||||
size = bar.size,
|
||||
position = bar.position
|
||||
position = bar.position,
|
||||
})
|
||||
titlebar:setup{layout = wibox.layout.flex.horizontal, flexlist}
|
||||
titlebar:setup({ layout = wibox.layout.flex.horizontal, flexlist })
|
||||
end
|
||||
end
|
||||
|
||||
tabbed.init = function(c)
|
||||
local tabobj = {}
|
||||
tabobj.clients = {c}
|
||||
tabobj.clients = { c }
|
||||
tabobj.focused_idx = 1
|
||||
tabbed.update(tabobj)
|
||||
end
|
||||
|
|
|
@ -16,7 +16,6 @@ local cairo = require("lgi").cairo
|
|||
local gears = require("gears")
|
||||
|
||||
function create_tiled_wallpaper(str, s, args_table)
|
||||
|
||||
-- user input
|
||||
args_table = args_table or {}
|
||||
local fg = args_table.fg or "#ff0000"
|
||||
|
@ -27,7 +26,7 @@ function create_tiled_wallpaper(str, s, args_table)
|
|||
local font_size = tonumber(args_table.font_size) or 16
|
||||
local zickzack_bool = args_table.zickzack or false
|
||||
local padding = args_table.padding or 100
|
||||
|
||||
|
||||
-- create cairo image wallpaper
|
||||
local img = cairo.ImageSurface(cairo.Format.RGB24, padding, padding)
|
||||
cr = cairo.Context(img)
|
||||
|
@ -40,19 +39,18 @@ function create_tiled_wallpaper(str, s, args_table)
|
|||
cr:set_font_size(font_size)
|
||||
cr:select_font_face(font)
|
||||
|
||||
if zickzack_bool then
|
||||
if zickzack_bool then
|
||||
cr:set_source(gears.color(fg))
|
||||
cr:move_to(padding/2 + font_size, padding/2 + font_size)
|
||||
cr:move_to(padding / 2 + font_size, padding / 2 + font_size)
|
||||
cr:show_text(str)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
cr:set_source(gears.color(fg))
|
||||
cr:move_to(font_size, font_size)
|
||||
cr:show_text(str)
|
||||
|
||||
|
||||
-- tile cairo image
|
||||
gears.wallpaper.tiled(img, s, {x=offset_x, y=offset_y})
|
||||
end
|
||||
gears.wallpaper.tiled(img, s, { x = offset_x, y = offset_y })
|
||||
end
|
||||
|
||||
return create_tiled_wallpaper
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
--
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
|
||||
local awful = require("awful")
|
||||
local beautiful = require("beautiful")
|
||||
local gears = require("gears")
|
||||
|
@ -50,23 +49,47 @@ local setters = {}
|
|||
-- @int[opt=1] args.scale See `gears.wallpaper`.
|
||||
function apply(wallpaper_object, args)
|
||||
args.background = args.background or beautiful.bg_normal or "black"
|
||||
args.ignore_aspect = args.ignore_aspect or false -- false = keep aspect ratio
|
||||
args.offset = args.offset or {x = 0, y = 0}
|
||||
args.ignore_aspect = args.ignore_aspect or false -- false = keep aspect ratio
|
||||
args.offset = args.offset or { x = 0, y = 0 }
|
||||
args.scale = args.scale or 1
|
||||
local positions = {
|
||||
["centered"] = function() gears.wallpaper.centered(wallpaper_object, args.screen, args.background, args.scale) end,
|
||||
["tiled"] = function() gears.wallpaper.tiled(wallpaper_object, args.screen, args.offset) end,
|
||||
["maximized"] = function() gears.wallpaper.maximized(wallpaper_object, args.screen, args.ignore_aspect, args.offset) end,
|
||||
["fit"] = function() gears.wallpaper.fit(wallpaper_object, args.screen, args.background) end,
|
||||
["centered"] = function()
|
||||
gears.wallpaper.centered(
|
||||
wallpaper_object,
|
||||
args.screen,
|
||||
args.background,
|
||||
args.scale
|
||||
)
|
||||
end,
|
||||
["tiled"] = function()
|
||||
gears.wallpaper.tiled(wallpaper_object, args.screen, args.offset)
|
||||
end,
|
||||
["maximized"] = function()
|
||||
gears.wallpaper.maximized(
|
||||
wallpaper_object,
|
||||
args.screen,
|
||||
args.ignore_aspect,
|
||||
args.offset
|
||||
)
|
||||
end,
|
||||
["fit"] = function()
|
||||
gears.wallpaper.fit(wallpaper_object, args.screen, args.background)
|
||||
end,
|
||||
}
|
||||
if type(wallpaper_object) == "string" and gears.filesystem.file_readable(wallpaper_object) then
|
||||
if
|
||||
type(wallpaper_object) == "string"
|
||||
and gears.filesystem.file_readable(wallpaper_object)
|
||||
then
|
||||
-- path of an image file, we use a position function
|
||||
local p = args.position or "centered"
|
||||
positions[p]()
|
||||
elseif type(wallpaper_object) == "function" then
|
||||
-- function
|
||||
wallpaper_object(args)
|
||||
elseif (not gears.color.ensure_pango_color(wallpaper_object, nil)) and args.position then
|
||||
elseif
|
||||
(not gears.color.ensure_pango_color(wallpaper_object, nil))
|
||||
and args.position
|
||||
then
|
||||
-- if the user sets a position function, wallpaper_object should be a cairo surface
|
||||
positions[args.position]()
|
||||
else
|
||||
|
@ -92,15 +115,13 @@ end
|
|||
-- @treturn table A list of `wallpaper_objects` (what `apply` can read).
|
||||
-- @see apply
|
||||
function prepare_list(args)
|
||||
args.image_formats = args.image_formats or {"jpg", "jpeg", "png", "bmp"}
|
||||
args.image_formats = args.image_formats or { "jpg", "jpeg", "png", "bmp" }
|
||||
args.recursive = args.recursive or true
|
||||
|
||||
local wallpapers = (args.wallpaper
|
||||
or beautiful.wallpaper_path
|
||||
or "black")
|
||||
local wallpapers = (args.wallpaper or beautiful.wallpaper_path or "black")
|
||||
local res = {}
|
||||
if type(wallpapers) ~= "table" then
|
||||
wallpapers = {wallpapers}
|
||||
wallpapers = { wallpapers }
|
||||
end
|
||||
for _, w in ipairs(wallpapers) do
|
||||
-- w is either:
|
||||
|
@ -109,7 +130,11 @@ function prepare_list(args)
|
|||
-- - a cairo surface or a cairo pattern
|
||||
-- - a function for setting the wallpaper
|
||||
if type(w) == "string" and gears.filesystem.dir_readable(w) then
|
||||
local file_list = helpers.filesystem.list_directory_files(w, args.image_formats, args.recursive)
|
||||
local file_list = helpers.filesystem.list_directory_files(
|
||||
w,
|
||||
args.image_formats,
|
||||
args.recursive
|
||||
)
|
||||
for _, f in ipairs(file_list) do
|
||||
res[#res + 1] = w .. "/" .. f
|
||||
end
|
||||
|
@ -142,7 +167,6 @@ function setters.random(args)
|
|||
apply(wallpapers[math.random(#wallpapers)], args)
|
||||
end
|
||||
|
||||
|
||||
local simple_schedule_object = nil
|
||||
--- A schedule setter.
|
||||
--
|
||||
|
@ -158,22 +182,31 @@ local simple_schedule_object = nil
|
|||
-- @tparam[opt=`setters.simple`] function args.wallpaper_set_function The set_function used by default
|
||||
function setters.simple_schedule(args)
|
||||
local function update_wallpaper()
|
||||
local fake_args = gears.table.join(args, {wallpaper = args.wallpaper[simple_schedule_object.closest_lower_time]})
|
||||
local fake_args = gears.table.join(
|
||||
args,
|
||||
{
|
||||
wallpaper = args.wallpaper[simple_schedule_object.closest_lower_time],
|
||||
}
|
||||
)
|
||||
simple_schedule_object.schedule_set_function(fake_args)
|
||||
end
|
||||
if not simple_schedule_object then
|
||||
simple_schedule_object = {}
|
||||
-- initialize the schedule object, so we don't do it for every call
|
||||
simple_schedule_object.schedule_set_function = args.schedule_set_function or setters.simple
|
||||
simple_schedule_object.schedule_set_function = args.schedule_set_function
|
||||
or setters.simple
|
||||
-- we get the sorted time keys
|
||||
simple_schedule_object.times = {}
|
||||
for k in pairs(args.wallpaper) do table.insert(simple_schedule_object.times, k) end
|
||||
for k in pairs(args.wallpaper) do
|
||||
table.insert(simple_schedule_object.times, k)
|
||||
end
|
||||
table.sort(simple_schedule_object.times)
|
||||
-- now we get the closest time which is below current time (the current applicable period)
|
||||
local function update_timer()
|
||||
local current_time = os.date("%H:%M:%S")
|
||||
local next_time = simple_schedule_object.times[1]
|
||||
simple_schedule_object.closest_lower_time = simple_schedule_object.times[#(simple_schedule_object.times)]
|
||||
simple_schedule_object.closest_lower_time =
|
||||
simple_schedule_object.times[#simple_schedule_object.times]
|
||||
for _, k in ipairs(simple_schedule_object.times) do
|
||||
if k > current_time then
|
||||
next_time = k
|
||||
|
@ -181,17 +214,21 @@ function setters.simple_schedule(args)
|
|||
end
|
||||
simple_schedule_object.closest_lower_time = k
|
||||
end
|
||||
simple_schedule_object.timer.timeout = helpers.time.time_diff(next_time, current_time)
|
||||
simple_schedule_object.timer.timeout = helpers.time.time_diff(
|
||||
next_time,
|
||||
current_time
|
||||
)
|
||||
if simple_schedule_object.timer.timeout < 0 then
|
||||
-- the next_time is the day after, so we add 24 hours to the timer
|
||||
simple_schedule_object.timer.timeout = simple_schedule_object.timer.timeout + 86400
|
||||
simple_schedule_object.timer.timeout = simple_schedule_object.timer.timeout
|
||||
+ 86400
|
||||
end
|
||||
simple_schedule_object.timer:again()
|
||||
update_wallpaper()
|
||||
end
|
||||
simple_schedule_object.timer = gears.timer {
|
||||
simple_schedule_object.timer = gears.timer({
|
||||
callback = update_timer,
|
||||
}
|
||||
})
|
||||
update_timer()
|
||||
else
|
||||
-- if called again (usually when the change_timer is set), we just change the wallpaper depending on current parameters
|
||||
|
@ -199,10 +236,6 @@ function setters.simple_schedule(args)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
--- Set the AWESOME wallpaper.
|
||||
--
|
||||
-- @tparam table args The argument table containing the argument below.
|
||||
|
@ -214,31 +247,43 @@ end
|
|||
--
|
||||
-- see beautiful.theme_assets.wallpaper
|
||||
function setters.awesome_wallpaper(args)
|
||||
local colors = {bg = beautiful.bg_normal, fg = beautiful.fg_normal, alt_fg = beautiful.bg_focus }
|
||||
local colors = {
|
||||
bg = beautiful.bg_normal,
|
||||
fg = beautiful.fg_normal,
|
||||
alt_fg = beautiful.bg_focus,
|
||||
}
|
||||
colors.bg = helpers.color.is_dark(beautiful.bg_normal)
|
||||
and helpers.color.lighten(colors.bg)
|
||||
and helpers.color.lighten(colors.bg)
|
||||
or helpers.color.darken(colors.bg)
|
||||
if (type(args.colors) == "table") then
|
||||
colors.bg = args.colors.bg or colors.bg
|
||||
colors.fg = args.colors.fg or colors.fg
|
||||
if type(args.colors) == "table" then
|
||||
colors.bg = args.colors.bg or colors.bg
|
||||
colors.fg = args.colors.fg or colors.fg
|
||||
colors.alt_fg = args.colors.alt_fg or colors.alt_fg
|
||||
end
|
||||
-- Generate wallpaper:
|
||||
if not args.screen then
|
||||
for s in screen do
|
||||
gears.wallpaper.set(
|
||||
beautiful.theme_assets.wallpaper(colors.bg, colors.fg, colors.alt_fg, s)
|
||||
beautiful.theme_assets.wallpaper(
|
||||
colors.bg,
|
||||
colors.fg,
|
||||
colors.alt_fg,
|
||||
s
|
||||
)
|
||||
)
|
||||
end
|
||||
else
|
||||
gears.wallpaper.set(
|
||||
beautiful.theme_assets.wallpaper(colors.bg, colors.fg, colors.alt_fg, args.screen)
|
||||
beautiful.theme_assets.wallpaper(
|
||||
colors.bg,
|
||||
colors.fg,
|
||||
colors.alt_fg,
|
||||
args.screen
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
--- Setup a wallpaper.
|
||||
--
|
||||
-- @tparam table args Parameters for the wallpaper. It may also contain all parameters your `args.set_function` needs
|
||||
|
@ -265,30 +310,30 @@ end
|
|||
-- @see setters.simple
|
||||
function setup(args)
|
||||
local config = args or {}
|
||||
config.set_function = config.set_function or (config.wallpaper and setters.simple or setters.awesome_wallpaper)
|
||||
config.set_function = config.set_function
|
||||
or (config.wallpaper and setters.simple or setters.awesome_wallpaper)
|
||||
local function set_wallpaper(s)
|
||||
config.screen = s or config.screen
|
||||
config.set_function(config)
|
||||
end
|
||||
|
||||
if config.change_timer and config.change_timer > 0 then
|
||||
gears.timer {
|
||||
gears.timer({
|
||||
timeout = config.change_timer,
|
||||
call_now = false,
|
||||
autostart = true,
|
||||
callback = function() set_wallpaper() end
|
||||
}
|
||||
callback = function()
|
||||
set_wallpaper()
|
||||
end,
|
||||
})
|
||||
end
|
||||
if awesome.version == "v4.3" then
|
||||
if awesome.version == "v4.3" then
|
||||
awful.screen.connect_for_each_screen(set_wallpaper)
|
||||
else
|
||||
screen.connect_signal("request::wallpaper", set_wallpaper)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
return {
|
||||
setup = setup,
|
||||
setters = setters,
|
||||
|
|
|
@ -5,15 +5,16 @@ local beautiful = require("beautiful")
|
|||
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
|
||||
|
||||
-- It might actually swallow too much, that's why there is a filter option by classname
|
||||
-- without the don't-swallow-list it would also swallow for example
|
||||
-- without the don't-swallow-list it would also swallow for example
|
||||
-- file pickers or new firefox windows spawned by an already existing one
|
||||
|
||||
local window_swallowing_activated = false
|
||||
|
||||
-- you might want to add or remove applications here
|
||||
local dont_swallow_classname_list = beautiful.dont_swallow_classname_list or {"firefox", "Gimp", "Google-chrome"}
|
||||
local activate_dont_swallow_filter = beautiful.dont_swallow_filter_activated or true
|
||||
|
||||
local dont_swallow_classname_list = beautiful.dont_swallow_classname_list
|
||||
or { "firefox", "Gimp", "Google-chrome" }
|
||||
local activate_dont_swallow_filter = beautiful.dont_swallow_filter_activated
|
||||
or true
|
||||
|
||||
-- checks if client classname matches with any entry of the dont-swallow-list
|
||||
local function check_if_swallow(c)
|
||||
|
@ -31,16 +32,24 @@ end
|
|||
-- the function that will be connected to / disconnected from the spawn client signal
|
||||
local function manage_clientspawn(c)
|
||||
-- get the last focused window to check if it is a parent window
|
||||
local parent_client=awful.client.focus.history.get(c.screen, 1)
|
||||
if not parent_client then return end
|
||||
local parent_client = awful.client.focus.history.get(c.screen, 1)
|
||||
if not parent_client then
|
||||
return
|
||||
end
|
||||
|
||||
-- io.popen is normally discouraged. Should probably be changed
|
||||
local handle = io.popen([[pstree -T -p -a -s ]] .. tostring(c.pid) .. [[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']])
|
||||
local handle = io.popen(
|
||||
[[pstree -T -p -a -s ]]
|
||||
.. tostring(c.pid)
|
||||
.. [[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']]
|
||||
)
|
||||
local parent_pid = handle:read("*a")
|
||||
handle:close()
|
||||
|
||||
if (tostring(parent_pid) == tostring(parent_client.pid)) and check_if_swallow(c) then
|
||||
|
||||
if
|
||||
(tostring(parent_pid) == tostring(parent_client.pid))
|
||||
and check_if_swallow(c)
|
||||
then
|
||||
c:connect_signal("unmanage", function()
|
||||
helpers.client.turn_on(parent_client)
|
||||
helpers.client.sync(parent_client, c)
|
||||
|
@ -48,7 +57,6 @@ local function manage_clientspawn(c)
|
|||
|
||||
helpers.client.sync(c, parent_client)
|
||||
helpers.client.turn_off(parent_client)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -58,12 +66,12 @@ end
|
|||
local function start()
|
||||
client.connect_signal("manage", manage_clientspawn)
|
||||
window_swallowing_activated = true
|
||||
end
|
||||
end
|
||||
|
||||
local function stop()
|
||||
client.disconnect_signal("manage", manage_clientspawn)
|
||||
window_swallowing_activated = false
|
||||
end
|
||||
end
|
||||
|
||||
local function toggle()
|
||||
if window_swallowing_activated then
|
||||
|
@ -76,6 +84,5 @@ end
|
|||
return {
|
||||
start = start,
|
||||
stop = stop,
|
||||
toggle = toggle
|
||||
toggle = toggle,
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
return {playerctl = require(... .. ".playerctl")}
|
||||
return { playerctl = require(... .. ".playerctl") }
|
||||
|
|
|
@ -4,7 +4,7 @@ local beautiful = require("beautiful")
|
|||
local backend_config = beautiful.playerctl_backend or "playerctl_cli"
|
||||
local backends = {
|
||||
playerctl_cli = require(... .. ".playerctl_cli"),
|
||||
playerctl_lib = require(... .. ".playerctl_lib")
|
||||
playerctl_lib = require(... .. ".playerctl_lib"),
|
||||
}
|
||||
|
||||
local function enable_wrapper(args)
|
||||
|
@ -16,4 +16,4 @@ local function disable_wrapper()
|
|||
backends[backend_config].disable()
|
||||
end
|
||||
|
||||
return {enable = enable_wrapper, disable = disable_wrapper}
|
||||
return { enable = enable_wrapper, disable = disable_wrapper }
|
||||
|
|
|
@ -21,7 +21,11 @@ local function emit_player_status()
|
|||
|
||||
-- Follow status
|
||||
awful.spawn.easy_async({
|
||||
"pkill", "--full", "--uid", os.getenv("USER"), "^playerctl status"
|
||||
"pkill",
|
||||
"--full",
|
||||
"--uid",
|
||||
os.getenv("USER"),
|
||||
"^playerctl status",
|
||||
}, function()
|
||||
awful.spawn.with_line_callback(status_cmd, {
|
||||
stdout = function(line)
|
||||
|
@ -32,7 +36,7 @@ local function emit_player_status()
|
|||
playing = false
|
||||
end
|
||||
awesome.emit_signal("bling::playerctl::status", playing)
|
||||
end
|
||||
end,
|
||||
})
|
||||
collectgarbage("collect")
|
||||
end)
|
||||
|
@ -75,8 +79,11 @@ echo "$tmp_cover_path"
|
|||
local interval_sec = tonumber(interval) -- in seconds
|
||||
if length_sec and interval_sec then
|
||||
if interval_sec >= 0 and length_sec > 0 then
|
||||
awesome.emit_signal("bling::playerctl::position",
|
||||
interval_sec, length_sec / 1000000)
|
||||
awesome.emit_signal(
|
||||
"bling::playerctl::position",
|
||||
interval_sec,
|
||||
length_sec / 1000000
|
||||
)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
@ -85,28 +92,35 @@ echo "$tmp_cover_path"
|
|||
|
||||
-- Follow title
|
||||
awful.spawn.easy_async({
|
||||
"pkill", "--full", "--uid", os.getenv("USER"), "^playerctl metadata"
|
||||
"pkill",
|
||||
"--full",
|
||||
"--uid",
|
||||
os.getenv("USER"),
|
||||
"^playerctl metadata",
|
||||
}, function()
|
||||
awful.spawn.with_line_callback(song_follow_cmd, {
|
||||
stdout = function(line)
|
||||
local album_path = ""
|
||||
awful.spawn.easy_async_with_shell(art_script, function(out)
|
||||
-- Get album path
|
||||
album_path = out:gsub('%\n', '')
|
||||
album_path = out:gsub("%\n", "")
|
||||
-- Get title and artist
|
||||
local artist = line:match('artist_(.*)title_')
|
||||
local title = line:match('title_(.*)')
|
||||
local artist = line:match("artist_(.*)title_")
|
||||
local title = line:match("title_(.*)")
|
||||
-- If the title is nil or empty then the players stopped
|
||||
if title and title ~= "" then
|
||||
awesome.emit_signal(
|
||||
"bling::playerctl::title_artist_album", title,
|
||||
artist, album_path)
|
||||
"bling::playerctl::title_artist_album",
|
||||
title,
|
||||
artist,
|
||||
album_path
|
||||
)
|
||||
else
|
||||
awesome.emit_signal("bling::playerctl::no_players")
|
||||
end
|
||||
end)
|
||||
collectgarbage("collect")
|
||||
end
|
||||
end,
|
||||
})
|
||||
collectgarbage("collect")
|
||||
end)
|
||||
|
@ -123,11 +137,15 @@ local enable = function(args)
|
|||
end
|
||||
|
||||
local disable = function()
|
||||
awful.spawn.with_shell("pkill --full --uid " .. os.getenv("USER") ..
|
||||
" '^playerctl status -F'")
|
||||
awful.spawn.with_shell(
|
||||
"pkill --full --uid " .. os.getenv("USER") .. " '^playerctl status -F'"
|
||||
)
|
||||
|
||||
awful.spawn.with_shell("pkill --full --uid " .. os.getenv("USER") ..
|
||||
" '^playerctl metadata --format'")
|
||||
awful.spawn.with_shell(
|
||||
"pkill --full --uid "
|
||||
.. os.getenv("USER")
|
||||
.. " '^playerctl metadata --format'"
|
||||
)
|
||||
end
|
||||
|
||||
return {enable = enable, disable = disable}
|
||||
return { enable = enable, disable = disable }
|
||||
|
|
|
@ -39,10 +39,12 @@ local function position_cb()
|
|||
local position = player:get_position() / 1000000
|
||||
local length = (player.metadata.value["mpris:length"] or 0) / 1000000
|
||||
if position ~= last_position or length ~= last_length then
|
||||
awesome.emit_signal("bling::playerctl::position",
|
||||
position,
|
||||
length,
|
||||
player.player_name)
|
||||
awesome.emit_signal(
|
||||
"bling::playerctl::position",
|
||||
position,
|
||||
length,
|
||||
player.player_name
|
||||
)
|
||||
last_position = position
|
||||
last_length = length
|
||||
end
|
||||
|
@ -50,7 +52,8 @@ local function position_cb()
|
|||
end
|
||||
|
||||
local function get_album_art(url)
|
||||
return awful.util.shell .. [[ -c '
|
||||
return awful.util.shell
|
||||
.. [[ -c '
|
||||
|
||||
tmp_dir="$XDG_CACHE_HOME/awesome/"
|
||||
|
||||
|
@ -64,7 +67,9 @@ if [ ! -d "$tmp_dir" ]; then
|
|||
mkdir -p $tmp_dir
|
||||
fi
|
||||
|
||||
curl -s ']] .. url .. [[' --output $tmp_cover_path
|
||||
curl -s ']]
|
||||
.. url
|
||||
.. [[' --output $tmp_cover_path
|
||||
|
||||
echo "$tmp_cover_path"
|
||||
']]
|
||||
|
@ -96,10 +101,15 @@ local function metadata_cb(player, metadata)
|
|||
if player == manager.players[1] then
|
||||
-- Callback can be called even though values we care about haven't
|
||||
-- changed, so check to see if they have
|
||||
if player ~= last_player or title ~= last_title or
|
||||
artist ~= last_artist or artUrl ~= last_artUrl
|
||||
if
|
||||
player ~= last_player
|
||||
or title ~= last_title
|
||||
or artist ~= last_artist
|
||||
or artUrl ~= last_artUrl
|
||||
then
|
||||
if (title == "" and artist == "" and artUrl == "") then return end
|
||||
if title == "" and artist == "" and artUrl == "" then
|
||||
return
|
||||
end
|
||||
|
||||
if metadata_timer ~= nil then
|
||||
if metadata_timer.started then
|
||||
|
@ -107,7 +117,7 @@ local function metadata_cb(player, metadata)
|
|||
end
|
||||
end
|
||||
|
||||
metadata_timer = gears.timer {
|
||||
metadata_timer = gears.timer({
|
||||
timeout = 0.3,
|
||||
autostart = true,
|
||||
single_shot = true,
|
||||
|
@ -122,7 +132,7 @@ local function metadata_cb(player, metadata)
|
|||
line,
|
||||
player.player_name
|
||||
)
|
||||
end
|
||||
end,
|
||||
})
|
||||
else
|
||||
awesome.emit_signal(
|
||||
|
@ -133,8 +143,8 @@ local function metadata_cb(player, metadata)
|
|||
player.player_name
|
||||
)
|
||||
end
|
||||
end
|
||||
}
|
||||
end,
|
||||
})
|
||||
|
||||
-- Re-sync with position timer when track changes
|
||||
position_timer:again()
|
||||
|
@ -155,9 +165,17 @@ local function playback_status_cb(player, status)
|
|||
|
||||
if player == manager.players[1] then
|
||||
if status == "PLAYING" then
|
||||
awesome.emit_signal("bling::playerctl::status", true, player.player_name)
|
||||
awesome.emit_signal(
|
||||
"bling::playerctl::status",
|
||||
true,
|
||||
player.player_name
|
||||
)
|
||||
else
|
||||
awesome.emit_signal("bling::playerctl::status", false, player.player_name)
|
||||
awesome.emit_signal(
|
||||
"bling::playerctl::status",
|
||||
false,
|
||||
player.player_name
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -243,10 +261,10 @@ local function start_manager()
|
|||
end
|
||||
|
||||
-- Timer to update track position at specified interval
|
||||
position_timer = gears.timer {
|
||||
position_timer = gears.timer({
|
||||
timeout = interval,
|
||||
callback = position_cb
|
||||
}
|
||||
callback = position_cb,
|
||||
})
|
||||
|
||||
-- Manage existing players on startup
|
||||
for _, name in ipairs(manager.player_names) do
|
||||
|
@ -295,9 +313,10 @@ local function playerctl_enable(args)
|
|||
-- Grab settings from beautiful variables if not set explicitly
|
||||
args.ignore = args.ignore or beautiful.playerctl_ignore
|
||||
args.player = args.player or beautiful.playerctl_player
|
||||
args.update_on_activity = args.update_on_activity or
|
||||
beautiful.playerctl_update_on_activity
|
||||
args.interval = args.interval or beautiful.playerctl_position_update_interval
|
||||
args.update_on_activity = args.update_on_activity
|
||||
or beautiful.playerctl_update_on_activity
|
||||
args.interval = args.interval
|
||||
or beautiful.playerctl_position_update_interval
|
||||
parse_args(args)
|
||||
|
||||
-- Grab playerctl library
|
||||
|
@ -328,4 +347,4 @@ local function playerctl_disable()
|
|||
last_artUrl = ""
|
||||
end
|
||||
|
||||
return {enable = playerctl_enable, disable = playerctl_disable}
|
||||
return { enable = playerctl_enable, disable = playerctl_disable }
|
||||
|
|
|
@ -4,10 +4,11 @@ This file has all theme variables of the bling module.
|
|||
Every variable has a small comment on what it does.
|
||||
You might just want to copy that whole part into your theme.lua and start adjusting from there.
|
||||
|
||||
--]] -- LuaFormatter off
|
||||
--]]
|
||||
-- LuaFormatter off
|
||||
-- window swallowing
|
||||
theme.dont_swallow_classname_list = {"firefox", "Gimp"} -- list of class names that should not be swallowed
|
||||
theme.dont_swallow_filter_activated = true -- whether the filter above should be active
|
||||
theme.dont_swallow_classname_list = { "firefox", "Gimp" } -- list of class names that should not be swallowed
|
||||
theme.dont_swallow_filter_activated = true -- whether the filter above should be active
|
||||
|
||||
-- flash focus
|
||||
theme.flash_focus_start_opacity = 0.6 -- the starting opacity
|
||||
|
@ -21,7 +22,7 @@ theme.playerctl_update_on_activity = true -- whether to prioritize the most rece
|
|||
theme.playerctl_position_update_interval = 1 -- the update interval for fetching the position from playerctl
|
||||
|
||||
-- tabbed
|
||||
theme.tabbed_spawn_in_tab = false -- whether a new client should spawn into the focused tabbing container
|
||||
theme.tabbed_spawn_in_tab = false -- whether a new client should spawn into the focused tabbing container
|
||||
|
||||
-- tabbar general
|
||||
theme.tabbar_disable = false -- disable the tab bar entirely
|
||||
|
@ -42,7 +43,7 @@ theme.mstab_dont_resize_slaves = false -- whether the tabbed stack windows shoul
|
|||
-- currently focused stack window (set it to true if you use
|
||||
-- transparent terminals. False if you use shadows on solid ones
|
||||
theme.mstab_bar_padding = "default" -- how much padding there should be between clients and your tabbar
|
||||
-- by default it will adjust based on your useless gaps.
|
||||
-- by default it will adjust based on your useless gaps.
|
||||
-- If you want a custom value. Set it to the number of pixels (int)
|
||||
theme.mstab_border_radius = 0 -- border radius of the tabbar
|
||||
theme.mstab_bar_height = 40 -- height of the tabbar
|
||||
|
@ -51,7 +52,7 @@ theme.mstab_tabbar_style = "default" -- style of the tabbar ("default", "boxes"
|
|||
-- defaults to the tabbar_style so only change if you want a
|
||||
-- different style for mstab and tabbed
|
||||
|
||||
-- the following variables are currently only for the "modern" tabbar style
|
||||
-- the following variables are currently only for the "modern" tabbar style
|
||||
theme.tabbar_color_close = "#f9929b" -- changes the color of the close button
|
||||
theme.tabbar_color_min = "#fbdf90" -- changes the color of the minimize button
|
||||
theme.tabbar_color_float = "#ccaced" -- changes the color of the float button
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
return {
|
||||
tag_preview = require(... .. ".tag_preview"),
|
||||
task_preview = require(... .. ".task_preview"),
|
||||
tabbed_misc = require(... .. ".tabbed_misc")
|
||||
tabbed_misc = require(... .. ".tabbed_misc"),
|
||||
}
|
||||
|
|
|
@ -6,16 +6,16 @@ local beautiful = require("beautiful")
|
|||
|
||||
local bg_normal = beautiful.tabbar_bg_normal or beautiful.bg_normal or "#ffffff"
|
||||
local fg_normal = beautiful.tabbar_fg_normal or beautiful.fg_normal or "#000000"
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 40
|
||||
local position = beautiful.tabbar_position or "bottom"
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 40
|
||||
local position = beautiful.tabbar_position or "bottom"
|
||||
|
||||
local function create(c, focused_bool, buttons)
|
||||
local bg_temp = bg_normal
|
||||
local fg_temp = fg_normal
|
||||
if focused_bool then
|
||||
if focused_bool then
|
||||
bg_temp = bg_focus
|
||||
fg_temp = fg_focus
|
||||
end
|
||||
|
@ -25,21 +25,21 @@ local function create(c, focused_bool, buttons)
|
|||
awful.widget.clienticon(c),
|
||||
left = 10,
|
||||
right = 10,
|
||||
bottom= 10,
|
||||
top= 10,
|
||||
widget = wibox.container.margin()
|
||||
bottom = 10,
|
||||
top = 10,
|
||||
widget = wibox.container.margin(),
|
||||
},
|
||||
widget = wibox.container.place()
|
||||
widget = wibox.container.place(),
|
||||
},
|
||||
buttons = buttons,
|
||||
bg = bg_temp,
|
||||
widget = wibox.container.background()
|
||||
widget = wibox.container.background(),
|
||||
})
|
||||
return wid_temp
|
||||
end
|
||||
end
|
||||
|
||||
local layout = wibox.layout.fixed.horizontal
|
||||
if position == "left" or position == "right" then
|
||||
if position == "left" or position == "right" then
|
||||
layout = wibox.layout.fixed.vertical
|
||||
end
|
||||
|
||||
|
@ -49,6 +49,5 @@ return {
|
|||
position = position,
|
||||
size = size,
|
||||
bg_normal = bg_normal,
|
||||
bg_focus = bg_normal
|
||||
bg_focus = bg_normal,
|
||||
}
|
||||
|
||||
|
|
|
@ -5,10 +5,10 @@ local beautiful = require("beautiful")
|
|||
|
||||
local bg_normal = beautiful.tabbar_bg_normal or beautiful.bg_normal or "#ffffff"
|
||||
local fg_normal = beautiful.tabbar_fg_normal or beautiful.fg_normal or "#000000"
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 20
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 20
|
||||
local position = beautiful.tabbar_position or "top"
|
||||
|
||||
local function create(c, focused_bool, buttons)
|
||||
|
@ -16,7 +16,7 @@ local function create(c, focused_bool, buttons)
|
|||
local title_temp = c.name or c.class or "-"
|
||||
local bg_temp = bg_normal
|
||||
local fg_temp = fg_normal
|
||||
if focused_bool then
|
||||
if focused_bool then
|
||||
bg_temp = bg_focus
|
||||
fg_temp = fg_focus
|
||||
end
|
||||
|
@ -24,20 +24,27 @@ local function create(c, focused_bool, buttons)
|
|||
text_temp.align = "center"
|
||||
text_temp.valign = "center"
|
||||
text_temp.font = font
|
||||
text_temp.markup = "<span foreground='" .. fg_temp .. "'>" .. title_temp.. "</span>"
|
||||
text_temp.markup = "<span foreground='"
|
||||
.. fg_temp
|
||||
.. "'>"
|
||||
.. title_temp
|
||||
.. "</span>"
|
||||
c:connect_signal("property::name", function(_)
|
||||
local title_temp = c.name or c.class or "-"
|
||||
text_temp.markup = "<span foreground='" .. fg_temp .. "'>" .. title_temp.. "</span>"
|
||||
text_temp.markup = "<span foreground='"
|
||||
.. fg_temp
|
||||
.. "'>"
|
||||
.. title_temp
|
||||
.. "</span>"
|
||||
end)
|
||||
local wid_temp = wibox.widget({
|
||||
text_temp,
|
||||
buttons = buttons,
|
||||
bg = bg_temp,
|
||||
widget = wibox.container.background()
|
||||
widget = wibox.container.background(),
|
||||
})
|
||||
return wid_temp
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return {
|
||||
layout = wibox.layout.flex.horizontal,
|
||||
|
@ -45,5 +52,5 @@ return {
|
|||
position = position,
|
||||
size = size,
|
||||
bg_normal = bg_normal,
|
||||
bg_focus = bg_focus
|
||||
bg_focus = bg_focus,
|
||||
}
|
||||
|
|
|
@ -12,33 +12,36 @@ local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
|||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or dpi(40)
|
||||
local border_radius =
|
||||
beautiful.mstab_border_radius or beautiful.border_radius or 6
|
||||
local border_radius = beautiful.mstab_border_radius
|
||||
or beautiful.border_radius
|
||||
or 6
|
||||
local position = beautiful.tabbar_position or "top"
|
||||
local close_color = beautiful.tabbar_color_close or beautiful.xcolor1 or
|
||||
"#f9929b"
|
||||
local close_color = beautiful.tabbar_color_close
|
||||
or beautiful.xcolor1
|
||||
or "#f9929b"
|
||||
local min_color = beautiful.tabbar_color_min or beautiful.xcolor3 or "#fbdf90"
|
||||
local float_color = beautiful.tabbar_color_float or beautiful.xcolor5 or
|
||||
"#ccaced"
|
||||
local float_color = beautiful.tabbar_color_float
|
||||
or beautiful.xcolor5
|
||||
or "#ccaced"
|
||||
|
||||
-- Helper to create buttons
|
||||
local function create_title_button(c, color_focus, color_unfocus)
|
||||
local tb_color = wibox.widget {
|
||||
local tb_color = wibox.widget({
|
||||
wibox.widget.textbox(),
|
||||
forced_width = dpi(8),
|
||||
forced_height = dpi(8),
|
||||
bg = color_focus,
|
||||
shape = gears.shape.circle,
|
||||
widget = wibox.container.background
|
||||
}
|
||||
widget = wibox.container.background,
|
||||
})
|
||||
|
||||
local tb = wibox.widget {
|
||||
local tb = wibox.widget({
|
||||
tb_color,
|
||||
width = dpi(25),
|
||||
height = dpi(25),
|
||||
strategy = "min",
|
||||
layout = wibox.layout.constraint
|
||||
}
|
||||
layout = wibox.layout.constraint,
|
||||
})
|
||||
|
||||
local function update()
|
||||
if client.focus == c then
|
||||
|
@ -51,10 +54,13 @@ local function create_title_button(c, color_focus, color_unfocus)
|
|||
c:connect_signal("focus", update)
|
||||
c:connect_signal("unfocus", update)
|
||||
|
||||
tb:connect_signal("mouse::enter",
|
||||
function() tb_color.bg = color_focus .. "70" end)
|
||||
tb:connect_signal("mouse::enter", function()
|
||||
tb_color.bg = color_focus .. "70"
|
||||
end)
|
||||
|
||||
tb:connect_signal("mouse::leave", function() tb_color.bg = color_focus end)
|
||||
tb:connect_signal("mouse::leave", function()
|
||||
tb_color.bg = color_focus
|
||||
end)
|
||||
|
||||
tb.visible = true
|
||||
return tb
|
||||
|
@ -73,58 +79,69 @@ local function create(c, focused_bool, buttons)
|
|||
text_temp.align = "center"
|
||||
text_temp.valign = "center"
|
||||
text_temp.font = font
|
||||
text_temp.markup = "<span foreground='" .. fg_temp .. "'>" .. title_temp ..
|
||||
"</span>"
|
||||
text_temp.markup = "<span foreground='"
|
||||
.. fg_temp
|
||||
.. "'>"
|
||||
.. title_temp
|
||||
.. "</span>"
|
||||
c:connect_signal("property::name", function(_)
|
||||
local title_temp = c.name or c.class or "-"
|
||||
text_temp.markup =
|
||||
"<span foreground='" .. fg_temp .. "'>" .. title_temp .. "</span>"
|
||||
text_temp.markup = "<span foreground='"
|
||||
.. fg_temp
|
||||
.. "'>"
|
||||
.. title_temp
|
||||
.. "</span>"
|
||||
end)
|
||||
|
||||
local tab_content = wibox.widget {
|
||||
local tab_content = wibox.widget({
|
||||
{
|
||||
awful.widget.clienticon(c),
|
||||
top = dpi(6),
|
||||
left = dpi(15),
|
||||
bottom = dpi(6),
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
text_temp,
|
||||
nill,
|
||||
expand = "none",
|
||||
layout = wibox.layout.align.horizontal
|
||||
}
|
||||
layout = wibox.layout.align.horizontal,
|
||||
})
|
||||
|
||||
local close = create_title_button(c, close_color, bg_normal)
|
||||
close:connect_signal("button::press", function() c:kill() end)
|
||||
close:connect_signal("button::press", function()
|
||||
c:kill()
|
||||
end)
|
||||
|
||||
local floating = create_title_button(c, float_color, bg_normal)
|
||||
floating:connect_signal("button::press",
|
||||
function() c.floating = not c.floating end)
|
||||
floating:connect_signal("button::press", function()
|
||||
c.floating = not c.floating
|
||||
end)
|
||||
|
||||
local min = create_title_button(c, min_color, bg_normal)
|
||||
min:connect_signal("button::press", function() c.minimized = true end)
|
||||
min:connect_signal("button::press", function()
|
||||
c.minimized = true
|
||||
end)
|
||||
|
||||
if focused_bool then
|
||||
tab_content = wibox.widget {
|
||||
tab_content = wibox.widget({
|
||||
{
|
||||
awful.widget.clienticon(c),
|
||||
top = dpi(10),
|
||||
left = dpi(15),
|
||||
bottom = dpi(10),
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
text_temp,
|
||||
{
|
||||
{min, floating, close, layout = wibox.layout.fixed.horizontal},
|
||||
{ min, floating, close, layout = wibox.layout.fixed.horizontal },
|
||||
top = dpi(10),
|
||||
right = dpi(10),
|
||||
bottom = dpi(10),
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
expand = "none",
|
||||
layout = wibox.layout.align.horizontal
|
||||
}
|
||||
layout = wibox.layout.align.horizontal,
|
||||
})
|
||||
end
|
||||
|
||||
local main_content = nil
|
||||
|
@ -132,39 +149,69 @@ local function create(c, focused_bool, buttons)
|
|||
local right_shape = nil
|
||||
|
||||
if position == "top" then
|
||||
main_content = wibox.widget {
|
||||
main_content = wibox.widget({
|
||||
{
|
||||
tab_content,
|
||||
bg = bg_temp,
|
||||
shape = helpers.shape.prrect(border_radius, true, true, false,
|
||||
false),
|
||||
widget = wibox.container.background
|
||||
shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
false
|
||||
),
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
top = dpi(8),
|
||||
widget = wibox.container.margin
|
||||
}
|
||||
widget = wibox.container.margin,
|
||||
})
|
||||
|
||||
left_shape = helpers.shape.prrect(border_radius, false, false, true,
|
||||
false)
|
||||
right_shape = helpers.shape.prrect(border_radius, false, false, false,
|
||||
true)
|
||||
left_shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false
|
||||
)
|
||||
right_shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true
|
||||
)
|
||||
else
|
||||
main_content = wibox.widget {
|
||||
main_content = wibox.widget({
|
||||
{
|
||||
tab_content,
|
||||
bg = bg_temp,
|
||||
shape = helpers.shape.prrect(border_radius, false, false, true,
|
||||
true),
|
||||
widget = wibox.container.background
|
||||
shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
true
|
||||
),
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
bottom = dpi(8),
|
||||
widget = wibox.container.margin
|
||||
}
|
||||
widget = wibox.container.margin,
|
||||
})
|
||||
|
||||
left_shape = helpers.shape.prrect(border_radius, false, true, false,
|
||||
false)
|
||||
right_shape = helpers.shape.prrect(border_radius, true, false, false,
|
||||
false)
|
||||
left_shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false
|
||||
)
|
||||
right_shape = helpers.shape.prrect(
|
||||
border_radius,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
)
|
||||
end
|
||||
|
||||
local wid_temp = wibox.widget({
|
||||
|
@ -175,16 +222,16 @@ local function create(c, focused_bool, buttons)
|
|||
wibox.widget.textbox(),
|
||||
bg = bg_normal,
|
||||
shape = left_shape,
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
bg = bg_temp,
|
||||
shape = gears.rectangle,
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
width = border_radius + (border_radius / 2),
|
||||
height = size,
|
||||
strategy = "exact",
|
||||
layout = wibox.layout.constraint
|
||||
layout = wibox.layout.constraint,
|
||||
},
|
||||
main_content,
|
||||
{
|
||||
|
@ -193,19 +240,19 @@ local function create(c, focused_bool, buttons)
|
|||
wibox.widget.textbox(),
|
||||
bg = bg_normal,
|
||||
shape = right_shape,
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
bg = bg_temp,
|
||||
shape = gears.rectangle,
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
width = border_radius + (border_radius / 2),
|
||||
height = size,
|
||||
strategy = "exact",
|
||||
layout = wibox.layout.constraint
|
||||
layout = wibox.layout.constraint,
|
||||
},
|
||||
|
||||
layout = wibox.layout.align.horizontal
|
||||
layout = wibox.layout.align.horizontal,
|
||||
})
|
||||
return wid_temp
|
||||
end
|
||||
|
@ -216,5 +263,5 @@ return {
|
|||
position = position,
|
||||
size = size,
|
||||
bg_normal = bg_normal,
|
||||
bg_focus = bg_focus
|
||||
bg_focus = bg_focus,
|
||||
}
|
||||
|
|
|
@ -6,11 +6,11 @@ local beautiful = require("beautiful")
|
|||
|
||||
local bg_normal = beautiful.tabbar_bg_normal or beautiful.bg_normal or "#ffffff"
|
||||
local fg_normal = beautiful.tabbar_fg_normal or beautiful.fg_normal or "#000000"
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 20
|
||||
local position = beautiful.tabbar_position or "top"
|
||||
local bg_focus = beautiful.tabbar_bg_focus or beautiful.bg_focus or "#000000"
|
||||
local fg_focus = beautiful.tabbar_fg_focus or beautiful.fg_focus or "#ffffff"
|
||||
local font = beautiful.tabbar_font or beautiful.font or "Hack 15"
|
||||
local size = beautiful.tabbar_size or 20
|
||||
local position = beautiful.tabbar_position or "top"
|
||||
|
||||
local function create(c, focused_bool, buttons)
|
||||
local bg_temp = focused_bool and bg_focus or bg_normal
|
||||
|
@ -19,40 +19,55 @@ local function create(c, focused_bool, buttons)
|
|||
local wid_temp = wibox.widget({
|
||||
{
|
||||
{ -- Left
|
||||
wibox.widget.base.make_widget(awful.titlebar.widget.iconwidget(c)),
|
||||
wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.iconwidget(c)
|
||||
),
|
||||
buttons = buttons,
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
},
|
||||
{ -- Title
|
||||
wibox.widget.base.make_widget(awful.titlebar.widget.titlewidget(c)),
|
||||
wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.titlewidget(c)
|
||||
),
|
||||
buttons = buttons,
|
||||
widget = wibox.container.place,
|
||||
widget = wibox.container.place,
|
||||
},
|
||||
{ -- Right
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.floatingbutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.stickybutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.ontopbutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.maximizedbutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.minimizebutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(awful.titlebar.widget.closebutton(c)) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.floatingbutton(c)
|
||||
) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.stickybutton(c)
|
||||
) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.ontopbutton(c)
|
||||
) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.maximizedbutton(c)
|
||||
) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.minimizebutton(c)
|
||||
) or nil,
|
||||
focused_bool and wibox.widget.base.make_widget(
|
||||
awful.titlebar.widget.closebutton(c)
|
||||
) or nil,
|
||||
layout = wibox.layout.fixed.horizontal,
|
||||
},
|
||||
layout = wibox.layout.align.horizontal,
|
||||
},
|
||||
bg = bg_temp,
|
||||
fg = fg_temp,
|
||||
widget = wibox.container.background,
|
||||
bg = bg_temp,
|
||||
fg = fg_temp,
|
||||
widget = wibox.container.background,
|
||||
})
|
||||
|
||||
return wid_temp
|
||||
end
|
||||
|
||||
|
||||
return {
|
||||
layout = wibox.layout.flex.horizontal,
|
||||
create = create,
|
||||
position = position,
|
||||
size = size,
|
||||
layout = wibox.layout.flex.horizontal,
|
||||
create = create,
|
||||
position = position,
|
||||
size = size,
|
||||
bg_normal = bg_normal,
|
||||
bg_focus = bg_focus,
|
||||
bg_focus = bg_focus,
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
local wibox = require('wibox')
|
||||
local awful = require('awful')
|
||||
local gears = require('gears')
|
||||
local beautiful = require('beautiful')
|
||||
local wibox = require("wibox")
|
||||
local awful = require("awful")
|
||||
local gears = require("gears")
|
||||
local beautiful = require("beautiful")
|
||||
local dpi = require("beautiful.xresources").apply_dpi
|
||||
|
||||
local function tabobj_support(self, c, index, clients)
|
||||
|
@ -10,11 +10,10 @@ local function tabobj_support(self, c, index, clients)
|
|||
return
|
||||
end
|
||||
|
||||
local group = c.bling_tabbed
|
||||
local group = c.bling_tabbed
|
||||
|
||||
-- Single item tabbed group's dont get special rendering
|
||||
if #group.clients > 1 then
|
||||
|
||||
local wrapper = wibox.widget({
|
||||
{
|
||||
-- This is so dumb... but it works so meh
|
||||
|
@ -29,24 +28,27 @@ local function tabobj_support(self, c, index, clients)
|
|||
spacing = dpi(2),
|
||||
layout = wibox.layout.fixed.vertical,
|
||||
},
|
||||
id = 'click_role',
|
||||
id = "click_role",
|
||||
widget = wibox.container.margin,
|
||||
margins = dpi(5)
|
||||
margins = dpi(5),
|
||||
})
|
||||
|
||||
for idx, c in ipairs(group.clients) do
|
||||
if c and c.icon then
|
||||
-- TODO: Don't do this in a -1iq way
|
||||
if idx <= 2 then
|
||||
wrapper:get_children_by_id("row1")[1]:add(awful.widget.clienticon(c))
|
||||
wrapper
|
||||
:get_children_by_id("row1")[1]
|
||||
:add(awful.widget.clienticon(c))
|
||||
else
|
||||
wrapper:get_children_by_id("row2")[1]:add(awful.widget.clienticon(c))
|
||||
wrapper
|
||||
:get_children_by_id("row2")[1]
|
||||
:add(awful.widget.clienticon(c))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.widget = wrapper
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
return {
|
||||
titlebar_indicator = require(tostring(...):match(".*bling") .. ".widget.tabbed_misc.titlebar_indicator"),
|
||||
custom_tasklist = require(tostring(...):match(".*bling") .. ".widget.tabbed_misc.custom_tasklist")
|
||||
titlebar_indicator = require(
|
||||
tostring(...):match(".*bling")
|
||||
.. ".widget.tabbed_misc.titlebar_indicator"
|
||||
),
|
||||
custom_tasklist = require(
|
||||
tostring(...):match(".*bling") .. ".widget.tabbed_misc.custom_tasklist"
|
||||
),
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
local wibox = require('wibox')
|
||||
local awful = require('awful')
|
||||
local gears = require('gears')
|
||||
local beautiful = require('beautiful')
|
||||
local wibox = require("wibox")
|
||||
local awful = require("awful")
|
||||
local gears = require("gears")
|
||||
local beautiful = require("beautiful")
|
||||
local dpi = require("beautiful.xresources").apply_dpi
|
||||
local tabbed_module = require(tostring(...):match(".*bling") .. ".module.tabbed")
|
||||
local tabbed_module = require(
|
||||
tostring(...):match(".*bling") .. ".module.tabbed"
|
||||
)
|
||||
|
||||
-- Just check if a table contains a value.
|
||||
local function tbl_contains(tbl, item)
|
||||
|
@ -17,7 +19,6 @@ end
|
|||
|
||||
-- Needs to be run, every time a new titlbear is created
|
||||
return function(c, opts)
|
||||
|
||||
-- Args & Fallback -- Widget templates are in their original loactions
|
||||
opts = gears.table.crush({
|
||||
layout_spacing = dpi(4),
|
||||
|
@ -25,8 +26,13 @@ return function(c, opts)
|
|||
icon_margin = dpi(4),
|
||||
bg_color_focus = "#ff0000",
|
||||
bg_color = "#00000000",
|
||||
icon_shape = function(cr,w,h) gears.shape.rounded_rect(cr,w,h,0) end
|
||||
}, gears.table.join(opts, beautiful.bling_tabbed_misc_titlebar_indicator))
|
||||
icon_shape = function(cr, w, h)
|
||||
gears.shape.rounded_rect(cr, w, h, 0)
|
||||
end,
|
||||
}, gears.table.join(
|
||||
opts,
|
||||
beautiful.bling_tabbed_misc_titlebar_indicator
|
||||
))
|
||||
|
||||
-- Container to store icons
|
||||
local tabbed_icons = wibox.widget({
|
||||
|
@ -34,25 +40,30 @@ return function(c, opts)
|
|||
spacing = opts.layout_spacing,
|
||||
})
|
||||
|
||||
awesome.connect_signal("bling::tabbed::client_removed", function(_, removed_c)
|
||||
-- Remove from list
|
||||
for idx, icon in ipairs(tabbed_icons.children) do
|
||||
if icon:get_children_by_id("icon_role")[1].client == removed_c then
|
||||
tabbed_icons:remove(idx)
|
||||
awesome.connect_signal(
|
||||
"bling::tabbed::client_removed",
|
||||
function(_, removed_c)
|
||||
-- Remove from list
|
||||
for idx, icon in ipairs(tabbed_icons.children) do
|
||||
if
|
||||
icon:get_children_by_id("icon_role")[1].client == removed_c
|
||||
then
|
||||
tabbed_icons:remove(idx)
|
||||
end
|
||||
end
|
||||
|
||||
-- Empty list
|
||||
if removed_c == c then
|
||||
tabbed_icons:reset()
|
||||
end
|
||||
end
|
||||
|
||||
-- Empty list
|
||||
if removed_c == c then
|
||||
tabbed_icons:reset()
|
||||
end
|
||||
end)
|
||||
)
|
||||
|
||||
local function recreate(group)
|
||||
if tbl_contains(group.clients, c) then
|
||||
tabbed_icons:reset()
|
||||
local focused = group.clients[group.focused_idx]
|
||||
|
||||
|
||||
-- Autohide?
|
||||
if #group.clients == 1 then
|
||||
return
|
||||
|
@ -63,7 +74,7 @@ return function(c, opts)
|
|||
{
|
||||
{
|
||||
{
|
||||
id = 'icon_role',
|
||||
id = "icon_role",
|
||||
forced_width = opts.icon_size,
|
||||
forced_height = opts.icon_size,
|
||||
widget = awful.widget.clienticon,
|
||||
|
@ -71,9 +82,10 @@ return function(c, opts)
|
|||
margins = opts.icon_margin,
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
bg = (client == focused) and (opts.bg_color_focus) or (opts.bg_color),
|
||||
bg = (client == focused) and opts.bg_color_focus
|
||||
or opts.bg_color,
|
||||
shape = opts.icon_shape,
|
||||
id = 'click_role',
|
||||
id = "click_role",
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
halign = "center",
|
||||
|
@ -90,7 +102,7 @@ return function(c, opts)
|
|||
|
||||
for _, w in ipairs(widget:get_children_by_id("click_role")) do
|
||||
w:add_button(awful.button({}, 1, function()
|
||||
tabbed_module.switch_to(group,idx)
|
||||
tabbed_module.switch_to(group, idx)
|
||||
end))
|
||||
end
|
||||
|
||||
|
@ -101,7 +113,6 @@ return function(c, opts)
|
|||
|
||||
awesome.connect_signal("bling::tabbed::client_added", recreate)
|
||||
awesome.connect_signal("bling::tabbed::changed_focus", recreate)
|
||||
|
||||
|
||||
return tabbed_icons
|
||||
end
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
-- bling::tag_preview::update -- first line is the signal
|
||||
-- t (tag) -- indented lines are function parameters
|
||||
-- bling::tag_preview::visibility
|
||||
-- s (screen)
|
||||
-- s (screen)
|
||||
-- v (boolean)
|
||||
--
|
||||
local awful = require("awful")
|
||||
|
@ -14,26 +14,35 @@ local beautiful = require("beautiful")
|
|||
local dpi = beautiful.xresources.apply_dpi
|
||||
local cairo = require("lgi").cairo
|
||||
|
||||
local function draw_widget(t, tag_preview_image, scale, screen_radius,
|
||||
client_radius, client_opacity, client_bg,
|
||||
client_border_color, client_border_width, widget_bg,
|
||||
widget_border_color, widget_border_width, geo, margin)
|
||||
|
||||
local function draw_widget(
|
||||
t,
|
||||
tag_preview_image,
|
||||
scale,
|
||||
screen_radius,
|
||||
client_radius,
|
||||
client_opacity,
|
||||
client_bg,
|
||||
client_border_color,
|
||||
client_border_width,
|
||||
widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width,
|
||||
geo,
|
||||
margin
|
||||
)
|
||||
local client_list = wibox.layout.manual()
|
||||
client_list.forced_height = geo.height
|
||||
client_list.forced_width = geo.width
|
||||
local tag_screen = t.screen
|
||||
for i, c in ipairs(t:clients()) do
|
||||
|
||||
if not c.hidden and not c.minimized then
|
||||
|
||||
local img_box = wibox.widget {
|
||||
local img_box = wibox.widget({
|
||||
image = gears.surface.load(c.icon),
|
||||
resize = true,
|
||||
forced_height = 100 * scale,
|
||||
forced_width = 100 * scale,
|
||||
widget = wibox.widget.imagebox
|
||||
}
|
||||
widget = wibox.widget.imagebox,
|
||||
})
|
||||
|
||||
if tag_preview_image then
|
||||
if c.prev_content or t.selected then
|
||||
|
@ -45,25 +54,28 @@ local function draw_widget(t, tag_preview_image, scale, screen_radius,
|
|||
end
|
||||
local cr = cairo.Context(content)
|
||||
local x, y, w, h = cr:clip_extents()
|
||||
local img = cairo.ImageSurface.create(cairo.Format.ARGB32,
|
||||
w - x, h - y)
|
||||
local img = cairo.ImageSurface.create(
|
||||
cairo.Format.ARGB32,
|
||||
w - x,
|
||||
h - y
|
||||
)
|
||||
cr = cairo.Context(img)
|
||||
cr:set_source_surface(content, 0, 0)
|
||||
cr.operator = cairo.Operator.SOURCE
|
||||
cr:paint()
|
||||
|
||||
img_box = wibox.widget {
|
||||
img_box = wibox.widget({
|
||||
image = gears.surface.load(img),
|
||||
resize = true,
|
||||
opacity = client_opacity,
|
||||
forced_height = math.floor(c.height * scale),
|
||||
forced_width = math.floor(c.width * scale),
|
||||
widget = wibox.widget.imagebox
|
||||
}
|
||||
widget = wibox.widget.imagebox,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
local client_box = wibox.widget {
|
||||
local client_box = wibox.widget({
|
||||
{
|
||||
nil,
|
||||
{
|
||||
|
@ -71,11 +83,11 @@ local function draw_widget(t, tag_preview_image, scale, screen_radius,
|
|||
img_box,
|
||||
nil,
|
||||
expand = "outside",
|
||||
layout = wibox.layout.align.horizontal
|
||||
layout = wibox.layout.align.horizontal,
|
||||
},
|
||||
nil,
|
||||
expand = "outside",
|
||||
widget = wibox.layout.align.vertical
|
||||
widget = wibox.layout.align.vertical,
|
||||
},
|
||||
forced_height = math.floor(c.height * scale),
|
||||
forced_width = math.floor(c.width * scale),
|
||||
|
@ -83,12 +95,12 @@ local function draw_widget(t, tag_preview_image, scale, screen_radius,
|
|||
shape_border_color = client_border_color,
|
||||
shape_border_width = client_border_width,
|
||||
shape = helpers.shape.rrect(client_radius),
|
||||
widget = wibox.container.background
|
||||
}
|
||||
widget = wibox.container.background,
|
||||
})
|
||||
|
||||
client_box.point = {
|
||||
x = math.floor((c.x - geo.x) * scale),
|
||||
y = math.floor((c.y - geo.y) * scale)
|
||||
y = math.floor((c.y - geo.y) * scale),
|
||||
}
|
||||
|
||||
client_list:add(client_box)
|
||||
|
@ -103,22 +115,20 @@ local function draw_widget(t, tag_preview_image, scale, screen_radius,
|
|||
client_list,
|
||||
forced_height = geo.height,
|
||||
forced_width = geo.width,
|
||||
widget = wibox.container.place
|
||||
widget = wibox.container.place,
|
||||
},
|
||||
layout = wibox.layout.align.horizontal
|
||||
layout = wibox.layout.align.horizontal,
|
||||
},
|
||||
layout = wibox.layout.align.vertical
|
||||
|
||||
layout = wibox.layout.align.vertical,
|
||||
},
|
||||
margins = margin,
|
||||
widget = wibox.container.margin
|
||||
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
bg = widget_bg,
|
||||
shape_border_width = widget_border_width,
|
||||
shape_border_color = widget_border_color,
|
||||
shape = helpers.shape.rrect(screen_radius),
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -138,15 +148,15 @@ local enable = function(opts)
|
|||
local client_radius = beautiful.tag_preview_client_border_radius or dpi(0)
|
||||
local client_opacity = beautiful.tag_preview_client_opacity or 0.5
|
||||
local client_bg = beautiful.tag_preview_client_bg or "#000000"
|
||||
local client_border_color = beautiful.tag_preview_client_border_color or
|
||||
"#ffffff"
|
||||
local client_border_width = beautiful.tag_preview_client_border_width or
|
||||
dpi(3)
|
||||
local client_border_color = beautiful.tag_preview_client_border_color
|
||||
or "#ffffff"
|
||||
local client_border_width = beautiful.tag_preview_client_border_width
|
||||
or dpi(3)
|
||||
local widget_bg = beautiful.tag_preview_widget_bg or "#000000"
|
||||
local widget_border_color = beautiful.tag_preview_widget_border_color or
|
||||
"#ffffff"
|
||||
local widget_border_width = beautiful.tag_preview_widget_border_width or
|
||||
dpi(3)
|
||||
local widget_border_color = beautiful.tag_preview_widget_border_color
|
||||
or "#ffffff"
|
||||
local widget_border_width = beautiful.tag_preview_widget_border_width
|
||||
or dpi(3)
|
||||
|
||||
local tag_preview_box = awful.popup({
|
||||
type = "dropdown_menu",
|
||||
|
@ -155,7 +165,7 @@ local enable = function(opts)
|
|||
placement = placement_fn,
|
||||
widget = wibox.container.background,
|
||||
input_passthrough = true,
|
||||
bg = "#00000000"
|
||||
bg = "#00000000",
|
||||
})
|
||||
|
||||
tag.connect_signal("property::selected", function(t)
|
||||
|
@ -165,20 +175,31 @@ local enable = function(opts)
|
|||
end)
|
||||
|
||||
awesome.connect_signal("bling::tag_preview::update", function(t)
|
||||
local geo = t.screen:get_bounding_geometry{
|
||||
local geo = t.screen:get_bounding_geometry({
|
||||
honor_padding = padding,
|
||||
honor_workarea = work_area
|
||||
}
|
||||
honor_workarea = work_area,
|
||||
})
|
||||
|
||||
tag_preview_box.maximum_width = scale * geo.width + margin * 2
|
||||
tag_preview_box.maximum_height = scale * geo.height + margin * 2
|
||||
tag_preview_box:setup(draw_widget(t, tag_preview_image, scale,
|
||||
screen_radius, client_radius,
|
||||
client_opacity, client_bg,
|
||||
client_border_color,
|
||||
client_border_width, widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width, geo, margin))
|
||||
tag_preview_box:setup(
|
||||
draw_widget(
|
||||
t,
|
||||
tag_preview_image,
|
||||
scale,
|
||||
screen_radius,
|
||||
client_radius,
|
||||
client_opacity,
|
||||
client_bg,
|
||||
client_border_color,
|
||||
client_border_width,
|
||||
widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width,
|
||||
geo,
|
||||
margin
|
||||
)
|
||||
)
|
||||
end)
|
||||
|
||||
awesome.connect_signal("bling::tag_preview::visibility", function(s, v)
|
||||
|
@ -191,4 +212,4 @@ local enable = function(opts)
|
|||
end)
|
||||
end
|
||||
|
||||
return {enable = enable}
|
||||
return { enable = enable }
|
||||
|
|
|
@ -14,11 +14,22 @@ local dpi = beautiful.xresources.apply_dpi
|
|||
local cairo = require("lgi").cairo
|
||||
|
||||
-- TODO: rename structure to something better?
|
||||
local function draw_widget(c, widget_template, screen_radius, widget_bg,
|
||||
widget_border_color, widget_border_width, margin,
|
||||
widget_width, widget_height)
|
||||
|
||||
if not pcall(function() return type(c.content) end) then return end
|
||||
local function draw_widget(
|
||||
c,
|
||||
widget_template,
|
||||
screen_radius,
|
||||
widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width,
|
||||
margin,
|
||||
widget_width,
|
||||
widget_height
|
||||
)
|
||||
if not pcall(function()
|
||||
return type(c.content)
|
||||
end) then
|
||||
return
|
||||
end
|
||||
local content = gears.surface(c.content)
|
||||
local cr = cairo.Context(content)
|
||||
local x, y, w, h = cr:clip_extents()
|
||||
|
@ -28,61 +39,61 @@ local function draw_widget(c, widget_template, screen_radius, widget_bg,
|
|||
cr.operator = cairo.Operator.SOURCE
|
||||
cr:paint()
|
||||
|
||||
local widget = wibox.widget {
|
||||
local widget = wibox.widget({
|
||||
(widget_template or {
|
||||
{
|
||||
{
|
||||
{
|
||||
{
|
||||
id = 'icon_role',
|
||||
id = "icon_role",
|
||||
resize = true,
|
||||
forced_height = dpi(20),
|
||||
forced_width = dpi(20),
|
||||
widget = wibox.widget.imagebox
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
{
|
||||
{
|
||||
id = 'name_role',
|
||||
id = "name_role",
|
||||
align = "center",
|
||||
widget = wibox.widget.textbox
|
||||
widget = wibox.widget.textbox,
|
||||
},
|
||||
left = dpi(4),
|
||||
right = dpi(4),
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
layout = wibox.layout.align.horizontal
|
||||
layout = wibox.layout.align.horizontal,
|
||||
},
|
||||
{
|
||||
{
|
||||
{
|
||||
id = 'image_role',
|
||||
id = "image_role",
|
||||
resize = true,
|
||||
clip_shape = helpers.shape.rrect(screen_radius),
|
||||
widget = wibox.widget.imagebox
|
||||
widget = wibox.widget.imagebox,
|
||||
},
|
||||
valign = "center",
|
||||
halign = "center",
|
||||
widget = wibox.container.place
|
||||
widget = wibox.container.place,
|
||||
},
|
||||
top = margin * 0.25,
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
fill_space = true,
|
||||
layout = wibox.layout.fixed.vertical
|
||||
layout = wibox.layout.fixed.vertical,
|
||||
},
|
||||
margins = margin,
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
},
|
||||
bg = widget_bg,
|
||||
shape_border_width = widget_border_width,
|
||||
shape_border_color = widget_border_color,
|
||||
shape = helpers.shape.rrect(screen_radius),
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
}),
|
||||
width = widget_width,
|
||||
height = widget_height,
|
||||
widget = wibox.container.constraint
|
||||
}
|
||||
widget = wibox.container.constraint,
|
||||
})
|
||||
|
||||
-- TODO: have something like a create callback here?
|
||||
|
||||
|
@ -102,7 +113,6 @@ local function draw_widget(c, widget_template, screen_radius, widget_bg,
|
|||
end
|
||||
|
||||
local enable = function(opts)
|
||||
|
||||
local opts = opts or {}
|
||||
|
||||
local widget_x = opts.x or dpi(20)
|
||||
|
@ -114,30 +124,35 @@ local enable = function(opts)
|
|||
local margin = beautiful.task_preview_widget_margin or dpi(0)
|
||||
local screen_radius = beautiful.task_preview_widget_border_radius or dpi(0)
|
||||
local widget_bg = beautiful.task_preview_widget_bg or "#000000"
|
||||
local widget_border_color = beautiful.task_preview_widget_border_color or
|
||||
"#ffffff"
|
||||
local widget_border_width = beautiful.task_preview_widget_border_width or
|
||||
dpi(3)
|
||||
local widget_border_color = beautiful.task_preview_widget_border_color
|
||||
or "#ffffff"
|
||||
local widget_border_width = beautiful.task_preview_widget_border_width
|
||||
or dpi(3)
|
||||
|
||||
local task_preview_box = awful.popup(
|
||||
{
|
||||
type = "dropdown_menu",
|
||||
visible = false,
|
||||
ontop = true,
|
||||
placement = placement_fn,
|
||||
widget = wibox.container.background, -- A dummy widget to make awful.popup not scream
|
||||
input_passthrough = true,
|
||||
bg = "#00000000"
|
||||
})
|
||||
local task_preview_box = awful.popup({
|
||||
type = "dropdown_menu",
|
||||
visible = false,
|
||||
ontop = true,
|
||||
placement = placement_fn,
|
||||
widget = wibox.container.background, -- A dummy widget to make awful.popup not scream
|
||||
input_passthrough = true,
|
||||
bg = "#00000000",
|
||||
})
|
||||
|
||||
awesome.connect_signal("bling::task_preview::visibility", function(s, v, c)
|
||||
if v then
|
||||
-- Update task preview contents
|
||||
task_preview_box.widget = draw_widget(c, opts.structure,
|
||||
screen_radius, widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width, margin,
|
||||
widget_width, widget_height)
|
||||
task_preview_box.widget = draw_widget(
|
||||
c,
|
||||
opts.structure,
|
||||
screen_radius,
|
||||
widget_bg,
|
||||
widget_border_color,
|
||||
widget_border_width,
|
||||
margin,
|
||||
widget_width,
|
||||
widget_height
|
||||
)
|
||||
end
|
||||
|
||||
if not placement_fn then
|
||||
|
@ -149,4 +164,4 @@ local enable = function(opts)
|
|||
end)
|
||||
end
|
||||
|
||||
return {enable = enable}
|
||||
return { enable = enable }
|
||||
|
|
Loading…
Reference in New Issue