282 lines
7.9 KiB
Lua
282 lines
7.9 KiB
Lua
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local beautiful = require("beautiful")
|
|
local wibox = require("wibox")
|
|
|
|
local dpi = beautiful.xresources.apply_dpi
|
|
|
|
awful.titlebar.enable_tooltip = false
|
|
awful.titlebar.fallback_name = 'Client\'s name'
|
|
|
|
|
|
local titlebar_size = beautiful.titlebar_size
|
|
|
|
|
|
-- ▄▄▄▄▄▄▄ ▀ ▄ ▀▀█ █
|
|
-- █ ▄▄▄ ▄▄█▄▄ █ ▄▄▄ █▄▄▄ ▄▄▄ ▄ ▄▄
|
|
-- █ █ █ █ █▀ █ █▀ ▀█ ▀ █ █▀ ▀
|
|
-- █ █ █ █ █▀▀▀▀ █ █ ▄▀▀▀█ █
|
|
-- █ ▄▄█▄▄ ▀▄▄ ▀▄▄ ▀█▄▄▀ ██▄█▀ ▀▄▄▀█ █
|
|
|
|
|
|
|
|
function double_click_event_handler(double_click_event)
|
|
if double_click_timer then
|
|
double_click_timer:stop()
|
|
double_click_timer = nil
|
|
|
|
double_click_event()
|
|
|
|
return
|
|
end
|
|
|
|
double_click_timer = gears.timer.start_new(0.20, function()
|
|
double_click_timer = nil
|
|
return false
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
client.connect_signal("request::titlebars", function(c)
|
|
|
|
-- Buttons for moving/resizing functionality
|
|
local buttons = gears.table.join(
|
|
awful.button(
|
|
{},
|
|
1,
|
|
function()
|
|
double_click_event_handler(function()
|
|
if c.floating then
|
|
c.floating = false
|
|
return
|
|
end
|
|
|
|
c.maximized = not c.maximized
|
|
c:raise()
|
|
return
|
|
end)
|
|
|
|
c:activate {context = "titlebar", action = "mouse_move"}
|
|
end
|
|
),
|
|
awful.button(
|
|
{},
|
|
3,
|
|
function()
|
|
c:activate {context = "titlebar", action = "mouse_resize"}
|
|
end
|
|
)
|
|
)
|
|
|
|
|
|
local decorate_titlebar = function(c, pos, bg, size)
|
|
|
|
c.titlebar_position = pos
|
|
|
|
if pos == 'left' or pos == 'right' then
|
|
|
|
-- Creates left or right titlebars
|
|
awful.titlebar(c, {position = pos, bg = bg, size = size or titlebar_size}) : setup {
|
|
{
|
|
{
|
|
awful.titlebar.widget.closebutton(c),
|
|
awful.titlebar.widget.maximizedbutton(c),
|
|
awful.titlebar.widget.minimizebutton (c),
|
|
spacing = dpi(7),
|
|
layout = wibox.layout.fixed.vertical
|
|
},
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
{
|
|
buttons = buttons,
|
|
layout = wibox.layout.flex.vertical
|
|
},
|
|
{
|
|
awful.titlebar.widget.floatingbutton (c),
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
layout = wibox.layout.align.vertical
|
|
|
|
}
|
|
|
|
elseif pos == 'top' or pos == 'bottom' then
|
|
|
|
-- Creates top or bottom titlebars
|
|
awful.titlebar(c, {position = pos, bg = bg, size = size or titlebar_size}) : setup {
|
|
{
|
|
{
|
|
awful.titlebar.widget.closebutton(c),
|
|
awful.titlebar.widget.maximizedbutton(c),
|
|
awful.titlebar.widget.minimizebutton (c),
|
|
spacing = dpi(7),
|
|
layout = wibox.layout.fixed.horizontal
|
|
},
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
{
|
|
buttons = buttons,
|
|
layout = wibox.layout.flex.horizontal
|
|
},
|
|
{
|
|
awful.titlebar.widget.floatingbutton (c),
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
layout = wibox.layout.align.horizontal
|
|
}
|
|
|
|
else
|
|
|
|
-- Create a left titlebar (default in this setup)
|
|
awful.titlebar(c, {position = 'left', size = titlebar_size}) : setup {
|
|
{
|
|
{
|
|
awful.titlebar.widget.closebutton(c),
|
|
awful.titlebar.widget.maximizedbutton(c),
|
|
awful.titlebar.widget.minimizebutton (c),
|
|
spacing = dpi(7),
|
|
layout = wibox.layout.fixed.vertical
|
|
},
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
{
|
|
buttons = buttons,
|
|
layout = wibox.layout.flex.vertical
|
|
},
|
|
{
|
|
awful.titlebar.widget.floatingbutton (c),
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin
|
|
},
|
|
layout = wibox.layout.align.vertical
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- ▄▄▄ ▄ ▀
|
|
-- ▄▀ ▀ ▄ ▄ ▄▄▄ ▄▄█▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄
|
|
-- █ █ █ █ ▀ █ █▀ ▀█ █ █ █ █ ▄▀ █▀ █
|
|
-- █ █ █ ▀▀▀▄ █ █ █ █ █ █ █ ▄▀ █▀▀▀▀
|
|
-- ▀▄▄▄▀ ▀▄▄▀█ ▀▄▄▄▀ ▀▄▄ ▀█▄█▀ █ █ █ ▄▄█▄▄ █▄▄▄▄ ▀█▄▄▀
|
|
|
|
-- Generate a custom titlabar for each class, roles, type, etc., etc.
|
|
-- The titlebar's position can now be set differently
|
|
|
|
if c.class == 'dolphin' or c.class == 'firefox' or c.class == 'pavucontrol-qt' or
|
|
c.instance == 'transmission-qt' or c.class == 'ark' or c.class == 'polkit-kde-authentication-agent-1' or
|
|
c.class == 'partitionmanager' or c.class == 'discord' or c.class == 'kdesu' then
|
|
|
|
if c.type == 'dialog' or c.type == 'modal' then
|
|
decorate_titlebar(c, 'top', beautiful.background, titlebar_size)
|
|
else
|
|
decorate_titlebar(c, 'left', beautiful.background, titlebar_size)
|
|
end
|
|
|
|
elseif c.role == "GtkFileChooserDialog" or c.type == 'dialog' or c.type == 'modal' then
|
|
|
|
-- Let's use the gtk theme's bg_color as titlebar's bg then add some transparency
|
|
-- Let's set the titlebar's position to top
|
|
-- Isn't it neat? lol
|
|
decorate_titlebar(c, 'top', beautiful.gtk.get_theme_variables().bg_color:sub(1,7) .. '66', titlebar_size)
|
|
|
|
elseif c.class == "kitty" then
|
|
|
|
decorate_titlebar(c, 'left', '#000000AA', titlebar_size)
|
|
|
|
elseif c.class == 'XTerm' or c.class == 'UXTerm' then
|
|
|
|
-- Let's use the xresources' background color as the titlebar color for xterm
|
|
-- awesome is the shit boi!
|
|
decorate_titlebar(c, 'top', beautiful.xresources.get_current_theme().background, titlebar_size)
|
|
|
|
elseif c.class == 'Nemo' then
|
|
|
|
decorate_titlebar(c, 'left', beautiful.xresources.get_current_theme().background, titlebar_size)
|
|
|
|
else
|
|
|
|
-- Default titlebar
|
|
decorate_titlebar(c, 'left', beautiful.background, titlebar_size)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
-- ▄▄▄▄ ▀ ▀▀█
|
|
-- █▀ ▀ ▄▄▄ ▄▄▄▄ ▄ ▄▄ ▄▄▄ █ ▄▄▄
|
|
-- ▀█▄▄▄ █ █▀ ▀█ █▀ █ ▀ █ █ █ ▀
|
|
-- ▀█ █ █ █ █ █ ▄▀▀▀█ █ ▀▀▀▄
|
|
-- ▀▄▄▄█▀ ▄▄█▄▄ ▀█▄▀█ █ █ ▀▄▄▀█ ▀▄▄ ▀▄▄▄▀
|
|
-- ▄ █
|
|
-- ▀▀
|
|
|
|
|
|
client.connect_signal(
|
|
"manage",
|
|
function(c)
|
|
|
|
if not c.max and not c.hide_titlebars then
|
|
awful.titlebar.show(c, c.titlebar_position or 'left')
|
|
else
|
|
awful.titlebar.hide(c, c.titlebar_position or 'left')
|
|
end
|
|
|
|
end
|
|
)
|
|
|
|
-- Catch the signal when a client's layout is changed
|
|
screen.connect_signal(
|
|
"arrange",
|
|
function(s)
|
|
for _, c in pairs(s.clients) do
|
|
|
|
if (#s.tiled_clients > 1 or c.floating) and c.first_tag.layout.name ~= 'max' then
|
|
|
|
if not c.hide_titlebars then
|
|
awful.titlebar.show(c, c.titlebar_position or 'left')
|
|
else
|
|
awful.titlebar.hide(c, c.titlebar_position or 'left')
|
|
end
|
|
|
|
if c.maximized or not c.round_corners or c.fullscreen then
|
|
c.shape = function(cr, w, h)
|
|
gears.shape.rectangle(cr, w, h)
|
|
end
|
|
else
|
|
c.shape = function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, beautiful.client_radius)
|
|
end
|
|
end
|
|
|
|
elseif (#s.tiled_clients == 1 or c.first_tag.layout.name == 'max') and not c.fullscreen then
|
|
|
|
awful.titlebar.hide(c, c.titlebar_position or 'left')
|
|
|
|
c.shape = function(cr, w, h)
|
|
gears.shape.rectangle(cr, w, h)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
)
|
|
|
|
|
|
client.connect_signal("property::maximized", function(c)
|
|
c.shape = gears.shape.rectangle
|
|
|
|
if not c.maximized then
|
|
c.shape = function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, beautiful.client_radius)
|
|
end
|
|
end
|
|
end) |