local awful = require("awful") awful.rules = require("awful.rules") local localconf = require("localconf") local beautiful = require("beautiful") local naughty = require("naughty") local binder = require("separable.binder") local log = require("talkative") -- create a notification when given client becomes urgent local function popup_urgent(client, message) client:connect_signal("property::urgent", function(c) if c.urgent and not c.focus then naughty.notify({ text = message }) end end) end local function keyboard_layer(num) return function(client) client:connect_signal("focus", function(c) awful.util.spawn("kontroll-launch set-layer --index " .. num) naughty.notify({ text = "kontroll: switching to layer " .. num }) end) client:connect_signal("unfocus", function(c) awful.util.spawn("kontroll-launch set-layer --index 0") naughty.notify({ text = "kontroll: switching to base layer" }) end) end end if not localconf.screen then localconf.screen = {} end local screen_main = math.min(localconf.screen.main or 1, screen.count()) local screen_chat = math.min(localconf.screen.chat or screen.count(), screen.count()) local screen_mail = math.min(localconf.screen.mail or screen.count(), screen.count()) print("Screens: main: " .. screen_main .. ", chat: " .. screen_chat .. ", mail: " .. screen_mail) awful.rules.rules = { -- All clients will match this rule. { rule = {}, properties = { border_width = beautiful.border_width, border_color = beautiful.border_normal, focus = awful.client.focus.filter, raise = true, minimized = false, size_hints_honor = false, keys = binder.client.keys(), buttons = binder.client.buttons(), screen = awful.screen.preferred, placement = awful.placement.no_overlap + awful.placement.no_offscreen, }, -- log name and class of new windows for debugging purposes callback = function(c) log("-----------\nnew client\n") if c["name"] ~= nil then log("name: " .. c["name"]) end if c["class"] ~= nil then log("class: " .. c["class"]) end if c["type"] ~= nil then log("type: " .. c["type"]) end if c["instance"] ~= nil then log("instance: " .. c["instance"]) end end, }, { rule = { class = "qutebrowser" }, properties = { tag = "2" } }, { rule = { class = "Passprompt" }, properties = { ontop = true, focus = true } }, { rule = { class = "Dragon" }, properties = { ontop = true, sticky = true } }, { rule = { class = "Sm" }, properties = { floating = true, size_hints_honor = true, fullscreen = true } }, { rule_any = { class = { "pinentry", "Passprompt", "copyq" } }, properties = { floating = true, size_hints_honor = true }, }, { rule_any = { class = { "Pidgin" }, instance = { "Weechat" }, name = { "Weechat" } }, properties = { screen = screen_chat, tag = "3", opacity = 0.8 }, callback = function(c) popup_urgent(c, "new chat message") end, }, { rule = { role = "buddy_list" }, callback = awful.client.setmaster }, { rule_any = { class = { "factorio" } }, callback = keyboard_layer(3) }, { rule = { class = "steam", name = "Friends" }, properties = { screen = screen_chat, tag = "3" }, callback = awful.client.setmaster, }, { rule = { class = "steam", name = "Chat" }, properties = { screen = screen_chat, tag = "3" }, callback = awful.client.setslave, }, { rule = { class = "steam", name = "Steam" }, properties = { tag = "F1" } }, { rule_any = { class = { "Rocket.Chat", "rocketchat" }, instance = { "rocket.chat" } }, properties = { screen = screen_chat, tag = "5" }, }, { rule_any = { class = { "Element", "SchildiChat" }, instance = { "element", "schildichat" } }, properties = { screen = screen_chat, tag = "1" }, }, { rule = { class = "TelegramDesktop" }, except = { name = "Media viewer" }, properties = { screen = screen_chat, tag = "3" }, }, { rule = { class = "Telegram", name = "Media viewer" }, properties = { size_hints_honor = true, floating = true, fullscreen = true }, }, { rule = { class = "TelegramDesktop", name = "Media viewer" }, properties = { size_hints_honor = true, floating = true, fullscreen = true }, }, { rule_any = { role = { "conversation" }, instance = { "Weechat" } }, callback = awful.client.setslave }, { rule = { class = "Irssi" }, properties = { tag = "3" }, callback = awful.client.setslave }, { rule_any = { instance = { "Gmutt" }, name = { "Gmutt" } }, properties = { tag = "4", screen = screen_mail } }, { rule_any = { class = { "Gmpc", "Spotify" } }, properties = { tag = "6" } }, { rule = { class = "Pdfpc" }, properties = { size_hints_honor = true, floating = true, fullscreen = true } }, { rule = { class = "zoom", instance = "zoom", name = "zoom" }, properties = { size_hints_honor = true, floating = false, border_width = 0 }, }, { rule_any = { class = { "URxvt", "Alacritty", "GVim", "kitty", "handy" } }, properties = { opacity = 0.9 } }, { rule = { name = "Awesomelog" }, properties = { tag = "F4" } }, { rule = { class = "Dragon" }, properties = { sticky = true, ontop = true } }, { rule = { class = "adobe dng converter.exe" }, properties = { floating = true, size_hints_honor = true } }, { rule = { class = "pentablet", type = "normal" }, properties = { floating = true, size_hints_honor = true } }, { rule = { class = "pentablet", type = "utility" }, properties = { floating = true, size_hints_honor = true, focusable = false }, }, { rule = { class = "Onboard" }, properties = { sticky = true, ontop = true, focusable = false } }, { rule = { class = "zenity" }, properties = { ontop = true, floating = true, placement = awful.placement.centered }, }, }