You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
9.2 KiB
258 lines
9.2 KiB
-- This file is part of Reno desktop.
|
|
--
|
|
-- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
--
|
|
-- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>.
|
|
local gears = require("gears")
|
|
local awmtk2 = require("awmtk2")
|
|
local wibox = require("wibox")
|
|
local awful = require("awful")
|
|
local beautiful = require("beautiful")
|
|
local builder = require("builder")
|
|
local json = require("dkjson")
|
|
|
|
local function read_file(fname)
|
|
local fhandler = io.open(fname,"r")
|
|
if fhandler then
|
|
local data = fhandler:read("*a")
|
|
fhandler:close()
|
|
return data
|
|
end
|
|
end
|
|
|
|
-- {{{ Placeholder Icons
|
|
client.connect_signal("request::titlebars",function(c)
|
|
if (not c.icon) and beautiful.icon_default then
|
|
c.icon = beautiful.icon_default._native
|
|
end
|
|
end)
|
|
-- }}}
|
|
|
|
do -- {{{ Global widgets
|
|
local config_file = io.open(root_path.."/themes/"..global.theme.."/config/global.json","r")
|
|
local config
|
|
if config_file then
|
|
config = config_file:read("*a")
|
|
config_file:close()
|
|
else
|
|
config = "[]"
|
|
end
|
|
for k,v in pairs(json.decode(config) or {}) do
|
|
require(k)(v)
|
|
end
|
|
end -- }}}
|
|
|
|
do --{{{ Screen
|
|
local wibar_config = {}
|
|
local style = awmtk2.create_style("wibar",awmtk2.generic.composite_widget,{})
|
|
for _,v in pairs({"wibar_top","wibar_bottom","wibar_left","wibar_right"}) do
|
|
style[v] = awmtk2.create_delta(v, {},
|
|
(beautiful.widgets and beautiful.widgets.wibar) or {},
|
|
style.wibar)
|
|
wibar_config[v] = read_file(root_path.."/themes/"..global.theme.."/config/"..v..".json")
|
|
end
|
|
local templates = awmtk2.create_template_lib("wibar",awmtk2.templates,{})
|
|
local t = awmtk2.build_templates(templates,style)
|
|
|
|
awful.screen.connect_for_each_screen(function(s)
|
|
for _,v in pairs({"wibar_top","wibar_bottom","wibar_left","wibar_right"}) do
|
|
local contents = { widget = wibox.container.background }
|
|
if wibar_config[v] then
|
|
contents = builder(wibar_config[v],{
|
|
client = c,
|
|
style = style[v],
|
|
buttons = buttons,
|
|
screen = s
|
|
})
|
|
s[v] = awful.wibar({
|
|
-- There really isn't a better way to do this. I wish there was.
|
|
position = v:gsub("wibar_",""),
|
|
screen = s,
|
|
visible = true,
|
|
stretch = style[v].stretch,
|
|
ontop = style[v].ontop,
|
|
width = style[v].width,
|
|
height = style[v].height,
|
|
border_width = style[v].border_width,
|
|
border_color = style[v].border_color,
|
|
opacity = style[v].opacity or 1,
|
|
shape = style[v].shape,
|
|
bg = style[v].bg_normal,
|
|
bgimage = style[v].bgimage_normal,
|
|
fg = style[v].fg,
|
|
input_passthrough = style[v].input_passthrough
|
|
})
|
|
s[v]:setup(t.wibar(contents))
|
|
end
|
|
end
|
|
end)
|
|
end -- }}}
|
|
|
|
do -- {{{ Titlebars
|
|
local titlebar_config = {}
|
|
local style = awmtk2.create_style("titlebar",awmtk2.generic.composite_widget,{})
|
|
for _,v in pairs({"titlebar_top","titlebar_left","titlebar_right","titlebar_bottom"}) do
|
|
-- Create styles for each titlebar
|
|
style[v] = awmtk2.create_delta(v, {},
|
|
(beautiful.widgets and beautiful.widgets.titlebar) or {},
|
|
style.titlebar)
|
|
-- Load in json layouts for titlebars
|
|
titlebar_config[v] = read_file(root_path.."/themes/"..global.theme.."/config/"..v..".json")
|
|
end
|
|
local templates = awmtk2.create_template_lib("titlebar",awmtk2.templates,{})
|
|
local t = awmtk2.build_templates(templates,style)
|
|
-- Add titlebars to normal windows
|
|
table.insert(awful.rules.rules,
|
|
{ rule_any = {type = { "normal", "dialog" }
|
|
}, properties = { titlebars_enabled = true }
|
|
}
|
|
)
|
|
|
|
local window_shape_hide = function(cr, width, height)
|
|
return gears.shape.partially_rounded_rect(cr,width,height,
|
|
false,false,false,false,0)
|
|
end
|
|
|
|
local window_shape = beautiful.window_shape or function(cr, width, height)
|
|
return gears.shape.partially_rounded_rect(cr,width,height,
|
|
true,true,false,false,beautiful.window_rounding)
|
|
end
|
|
|
|
client.connect_signal("manage", function(c)
|
|
c.shape = window_shape
|
|
end)
|
|
|
|
local titlebars_on = true
|
|
awesome.connect_signal("titlebar::toggle",function()
|
|
titlebars_on = not titlebars_on
|
|
for _,c in ipairs(client.get()) do
|
|
if titlebars_on then
|
|
for _, pos in ipairs({"top","bottom","left","right"}) do
|
|
awful.titlebar.show(c,pos)
|
|
end
|
|
c.shape = window_shape
|
|
c:emit_signal("titlebar::perform_action",function(titlebar)
|
|
titlebar.widget.visible = true
|
|
end)
|
|
else
|
|
for _, pos in ipairs({"top","bottom","left","right"}) do
|
|
awful.titlebar.hide(c,pos)
|
|
end
|
|
c.shape = window_shape_hide
|
|
c:emit_signal("titlebar::perform_action",function(titlebar)
|
|
titlebar.widget.visible = false
|
|
end)
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Second manage call to create hidden titlebars
|
|
client.connect_signal("manage",function(c)
|
|
-- Drag and resize buttons
|
|
local buttons = gears.table.join(
|
|
awful.button({}, 1, function()
|
|
c:emit_signal("request::activate","titlebar",{raise=true})
|
|
awful.mouse.client.move(c)
|
|
end),
|
|
awful.button({}, 3, function()
|
|
c:emit_signal("request::activate","titlebar",{raise=true})
|
|
awful.mouse.client.resize(c)
|
|
end)
|
|
)
|
|
-- Building the titlebars
|
|
for k,v in pairs({"titlebar_top","titlebar_bottom","titlebar_left","titlebar_right"}) do
|
|
-- Build content of the titlebar
|
|
local contents = { widget = wibox.widget.textbox, text = "" }
|
|
if titlebar_config[v] then
|
|
contents = builder(titlebar_config[v],{
|
|
client = c,
|
|
screen = c.screen,
|
|
style = style[v],
|
|
buttons = buttons
|
|
})
|
|
end
|
|
-- Create the base
|
|
local titlebar = awful.titlebar(c,{
|
|
size = style[v].size or 0,
|
|
position = v:gsub("titlebar_",""),
|
|
bg_normal = style[v].bg_normal,
|
|
bg_focus = style[v].bg_focus,
|
|
bgimage_normal = style[v].bgimage_normal,
|
|
bgimage_focus = style[v].bgimage_focus,
|
|
fg_normal = style[v].fg_normal,
|
|
fg_focus = style[v].fg_focus,
|
|
font = style[v].font
|
|
})
|
|
-- Compile and build titlebar
|
|
titlebar:setup(t.titlebar({
|
|
contents,
|
|
widget = wibox.container.background
|
|
}))
|
|
-- Since new clients will be placed without titlebars, we need to apply placement rules again
|
|
awful.rules.rules[1].properties.placement(c)
|
|
-- Callbacks for focus/unfocus of titlebars
|
|
if style[v].onfocus then
|
|
c:connect_signal("focus",function()
|
|
style[v].onfocus(titlebar)
|
|
end)
|
|
end
|
|
if style[v].onunfocus then
|
|
c:connect_signal("unfocus",function()
|
|
style[v].onunfocus(titlebar)
|
|
end)
|
|
end
|
|
-- Activate focus callback if our client is focused
|
|
if (c == client.focus) and (style[v].onfocus) then
|
|
style[v].onfocus(titlebar)
|
|
end
|
|
-- Add a titlebar toggle signal
|
|
c:connect_signal("titlebar::toggle",function(c)
|
|
titlebar.widget.visible = not titlebar.widget.visible
|
|
if titlebar.widget.visible then
|
|
awful.titlebar.show(c,v:gsub("titlebar_",""))
|
|
c.shape = window_shape
|
|
else
|
|
awful.titlebar.hide(c,v:gsub("titlebar_",""))
|
|
c.shape = window_shape_hide
|
|
end
|
|
end)
|
|
c:connect_signal("titlebar::perform_action",function(c,f)
|
|
f(titlebar)
|
|
end)
|
|
-- Add rules for hiding titlebars on creation
|
|
if (not titlebars_on) or
|
|
(c.titlebars_enabled == false) or
|
|
(c.requests_no_titlebar == true) then
|
|
titlebar.widget.visible = false
|
|
c.shape = window_shape_hide
|
|
awful.titlebar.hide(c,v:gsub("titlebar_",""))
|
|
end
|
|
end
|
|
end)
|
|
end --}}}
|
|
|
|
-- Find a client to focus on when switching tags
|
|
for s in screen do
|
|
for _,t in pairs(awful.tag.gettags(s)) do
|
|
t:connect_signal("property::selected", function(t)
|
|
if not client.focus then
|
|
local c = t:clients()[1]
|
|
if c then
|
|
client.focus = c
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
-- Focus on the previous client once the newer client is closed
|
|
client.connect_signal("unmanage",function(c)
|
|
local focused_clients = screen.primary.clients
|
|
local prev
|
|
for _,v in pairs(focused_clients) do
|
|
if v == c then break end
|
|
prev = v
|
|
end
|
|
client.focus = prev
|
|
end)
|