AwesomeFiles/config/awesome/configuration/window.lua
2022-03-06 20:04:04 +07:00

171 lines
5.2 KiB
Lua

local awful = require("awful")
local gears = require("gears")
local gfs = gears.filesystem
local wibox = require("wibox")
local beautiful = require("beautiful")
local dpi = require("beautiful.xresources").apply_dpi
local helpers = require("helpers")
-- Bling Module
local bling = require("module.bling")
-- Layout Machi
local machi = require("module.layout-machi")
beautiful.layout_machi = machi.get_icon()
-- This is to slave windows' positions in floating layout
require("module.savefloats")
-- Better mouse resizing on tiled
require("module.better-resize")
client.connect_signal("request::manage", function(c)
if not c.icon then
local i = gears.surface(gfs.get_configuration_dir() ..
"theme/assets/icons/awesome.png")
c.icon = i._native
end
-- Set the windows at the slave,
if awesome.startup and not c.size_hints.user_position and
not c.size_hints.program_position then
-- Prevent clients from being unreachable after screen count changes.
awful.placement.no_offscreen(c)
end
end)
-- Enable sloppy focus, so that focus follows mouse.
client.connect_signal("mouse::enter", function(c)
c:emit_signal("request::activate", "mouse_enter", {raise = false})
end)
client.connect_signal("focus",
function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus",
function(c) c.border_color = beautiful.border_normal end)
-- Custom Layouts -------------------------------------------------------------
local mstab = bling.layout.mstab
local centered = bling.layout.centered
local horizontal = bling.layout.horizontal
local equal = bling.layout.equalarea
local deck = bling.layout.deck
machi.editor.nested_layouts = {
["0"] = deck,
["1"] = awful.layout.suit.spiral,
["2"] = awful.layout.suit.fair,
["3"] = awful.layout.suit.fair.horizontal
}
-- Set the layouts
tag.connect_signal("request::default_layouts", function()
awful.layout.append_default_layouts({
awful.layout.suit.tile, awful.layout.suit.floating, centered, mstab,
horizontal, machi.default_layout, equal, deck
})
end)
-- Layout List Widget ---------------------------------------------------------
-- List
local ll = awful.widget.layoutlist {
source = awful.widget.layoutlist.source.default_layouts, -- DOC_HIDE
spacing = dpi(24),
base_layout = wibox.widget {
spacing = dpi(24),
forced_num_cols = 4,
layout = wibox.layout.grid.vertical
},
widget_template = {
{
{
id = "icon_role",
forced_height = dpi(68),
forced_width = dpi(68),
widget = wibox.widget.imagebox
},
margins = dpi(24),
widget = wibox.container.margin
},
id = "background_role",
forced_width = dpi(68),
forced_height = dpi(68),
widget = wibox.container.background
}
}
-- Popup
local layout_popup = awful.popup {
widget = wibox.widget {
{ll, margins = dpi(24), widget = wibox.container.margin},
bg = beautiful.xbackground,
shape = helpers.rrect(beautiful.border_radius),
border_color = beautiful.widget_border_color,
border_width = beautiful.widget_border_width,
widget = wibox.container.background
},
placement = awful.placement.centered,
ontop = true,
visible = false,
bg = beautiful.xbackground .. "00"
}
-- Key Bindings for Widget ----------------------------------------------------
function gears.table.iterate_value(t, value, step_size, filter, start_at)
local k = gears.table.hasitem(t, value, true, start_at)
if not k then return end
step_size = step_size or 1
local new_key = gears.math.cycle(#t, k + step_size)
if filter and not filter(t[new_key]) then
for i = 1, #t do
local k2 = gears.math.cycle(#t, new_key + i)
if filter(t[k2]) then return t[k2], k2 end
end
return
end
return t[new_key], new_key
end
awful.keygrabber {
start_callback = function() layout_popup.visible = true end,
stop_callback = function() layout_popup.visible = false end,
export_keybindings = true,
stop_event = "release",
stop_key = {"Escape", "Super_L", "Super_R", "Mod4"},
keybindings = {
{
{modkey, "Shift"}, " ", function()
awful.layout.set(gears.table.iterate_value(ll.layouts,
ll.current_layout, -1),
nil)
end
}, {
{modkey}, " ", function()
awful.layout.set(gears.table.iterate_value(ll.layouts,
ll.current_layout, 1),
nil)
end
}
}
}
-- Hide all windows when a splash is shown
awesome.connect_signal("widgets::splash::visibility", function(vis)
local t = screen.primary.selected_tag
if vis then
for idx, c in ipairs(t:clients()) do c.hidden = true end
else
for idx, c in ipairs(t:clients()) do c.hidden = false end
end
end)
-- EOF ------------------------------------------------------------------------