Auto: format source code

This commit is contained in:
github-actions[bot] 2021-08-27 18:01:22 +00:00
parent 489f2a3490
commit 3fc80c7dfd
36 changed files with 1121 additions and 712 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -3,5 +3,5 @@ return {
color = require(... .. ".color"),
filesystem = require(... .. ".filesystem"),
shape = require(... .. ".shape"),
time = require(... .. ".time")
time = require(... .. ".time"),
}

View File

@ -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

View File

@ -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

View File

@ -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"),
}

View File

@ -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,
}

View File

@ -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

View File

@ -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,
}

View File

@ -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

View File

@ -24,7 +24,7 @@ local layout = {
vertical = vertical.layout,
horizontal = horizontal.layout,
equalarea = equalarea.layout,
deck = deck.layout
deck = deck.layout,
}
return layout

View File

@ -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 }

View File

@ -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

View File

@ -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 }

View File

@ -4,5 +4,5 @@ return {
wallpaper = require(... .. ".wallpaper"),
flash_focus = require(... .. ".flash_focus"),
tabbed = require(... .. ".tabbed"),
scratchpad = require(... .. ".scratchpad")
scratchpad = require(... .. ".scratchpad"),
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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,
}

View File

@ -1 +1 @@
return {playerctl = require(... .. ".playerctl")}
return { playerctl = require(... .. ".playerctl") }

View File

@ -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 }

View File

@ -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 }

View File

@ -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 }

View File

@ -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

View File

@ -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"),
}

View File

@ -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,
}

View File

@ -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,
}

View File

@ -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,
}

View File

@ -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,
}

View File

@ -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

View File

@ -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"
),
}

View File

@ -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

View File

@ -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 }

View File

@ -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 }