local awful = require('awful') local gears = require('gears') local ruled = require("ruled") local beautiful = require('beautiful') local client_keys = require('configuration.client.keys') local client_buttons = require('configuration.client.buttons') ruled.client.connect_signal( "request::rules", function() -- All clients will match this rule. ruled.client.append_rule { id = "global", rule = { }, properties = { focus = awful.client.focus.filter, raise = true, floating = false, maximized = false, above = false, below = false, ontop = false, sticky = false, maximized_horizontal = false, maximized_vertical = false, round_corners = true, keys = client_keys, buttons = client_buttons, screen = awful.screen.preferred, placement = awful.placement.no_overlap + awful.placement.no_offscreen } } -- Dialogs ruled.client.append_rule { id = "dialog", rule_any = { type = { "dialog" }, class = { "Wicd-client.py", "calendar.google.com" } }, properties = { titlebars_enabled = true, floating = true, above = true, draw_backdrop = true, skip_decoration = true, shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, beautiful.client_radius) end, placement = awful.placement.centered } } -- Modals ruled.client.append_rule { id = "dialog", rule_any = { type = { "modal" } }, properties = { titlebars_enabled = true, floating = true, above = true, draw_backdrop = true, skip_decoration = true, shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, beautiful.client_radius) end, placement = awful.placement.centered } } -- Utilities ruled.client.append_rule { id = "utility", rule_any = { type = { "utility" } }, properties = { titlebars_enabled = false, floating = true, hide_titlebars = true, draw_backdrop = false, skip_decoration = true, placement = awful.placement.centered } } -- Splash ruled.client.append_rule { id = "splash", rule_any = { type = { "splash" } }, properties = { titlebars_enabled = false, floating = true, above = true, hide_titlebars = true, draw_backdrop = false, skip_decoration = true, shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, beautiful.client_radius) end, placement = awful.placement.centered } } -- terminal emulators ruled.client.append_rule { id = "terminals", rule_any = { class = { "URxvt", "XTerm", "UXTerm", "kitty", "K3rmit" } }, except_any = { instance = { "QuakeTerminal" } }, properties = { tag = '1', switchtotag = true, draw_backdrop = false, size_hints_honor = false } } -- Browsers ruled.client.append_rule { id = "web_browsers", rule_any = { class = { "firefox", "Tor Browser", "discord", "Chromium", "Google-chrome" } }, properties = { tag = '2' } } -- text editors ruled.client.append_rule { id = "text_editors", rule_any = { class = { "Geany", "Atom", "Subl3", "code-oss" }, name = { "LibreOffice", "libreoffice" } }, properties = { tag = '3' } } -- File managers ruled.client.append_rule { id = "file_managers", rule_any = { class = { "dolphin", "ark", "Nemo", "File-roller" } }, properties = { tag = '4', switchtotag = true } } -- Multimedia ruled.client.append_rule { id = "multimedia", rule_any = { class = { "vlc", "Spotify" } }, properties = { tag = '5', switchtotag = true, draw_backdrop = false } } -- Gaming ruled.client.append_rule { id = "gaming", rule_any = { class = { "Wine", "dolphin-emu", "Steam", "Citra", "SuperTuxKart" }, name = { "Steam" } }, properties = { tag = '6', skip_decoration = true, draw_backdrop = false, switchtotag = true, floating = true, hide_titlebars = true, placement = awful.placement.centered } } -- Graphics Editing ruled.client.append_rule { id = "graphics_editors", rule_any = { class = { "Gimp-2.10", "Inkscape", "Flowblade" } }, properties = { tag = '7' } } -- Sandboxes and VMs ruled.client.append_rule { id = "sandbox", rule_any = { class = { "VirtualBox Manage", "VirtualBox Machine" } }, properties = { tag = '8' } } -- IDEs and Tools ruled.client.append_rule { id = "ide", rule_any = { class = { "Oomox", "Unity", "UnityHub", "jetbrains-studio" } }, properties = { tag = '9', skip_decoration = true } } -- Image viewers with splash-like behaviour ruled.client.append_rule { id = "splash_like", rule_any = { class = { "feh", "Pqiv", "Sxiv" }, name = {"Discord Updater"} }, properties = { skip_decoration = true, hide_titlebars = true, floating = true, ontop = true, placement = awful.placement.centered } } -- Splash-like but with titlebars enabled ruled.client.append_rule { id = "instances", rule_any = { instance = { "file_progress", "Popup", "nm-connection-editor", }, class = { "scrcpy" , "Mugshot", "Pulseeffects" } }, properties = { skip_decoration = true, round_corners = true, ontop = true, floating = true, draw_backdrop = false, focus = awful.client.focus.filter, raise = true, keys = client_keys, buttons = client_buttons, placement = awful.placement.centered } } -- Fullsreen ruled.client.append_rule { id = "fullscreen", rule_any = { class = { "SuperTuxKart" } }, properties = { skip_decoration = true, round_corners = false, ontop = true, floating = false, fullscreen = true, draw_backdrop = false, raise = true, keys = client_keys, buttons = client_buttons, placement = awful.placement.centered } } end ) -- Normally we'd do this with a rule, but other apps like spotify and supertuxkart doesn't set its class or name -- until after it starts up, so we need to catch that signal. -- If the application is fullscreen in its settings, make sure to set `c.fullscreen = false` first -- before moving to the desired tag or else the tag where the program spawn will cause panels to hide. -- After moving the program to specified tag you can set `c.fullscreen = true` now -- See what I did in `SuperTuxKart` client.connect_signal( "property::class", function(c) if c.class == "Spotify" then -- Check if Spotify is already open local spotify = function (c) return ruled.client.match(c, { class = "Spotify" }) end local spotify_count = 0 for c in awful.client.iterate(spotify) do spotify_count = spotify_count + 1 end -- If Spotify is already open, don't open a new instance if spotify_count > 1 then c:kill() -- Switch to previous instance for c in awful.client.iterate(spotify) do c:jump_to(false) end else -- Move the Spotify instance to "5" tag on this screen local t = awful.tag.find_by_name(awful.screen.focused(), "5") c:move_to_tag(t) end elseif c.class == "SuperTuxKart" then -- Disable fullscreen first c.fullscreen = false -- Check if SuperTuxKart is already open local stk = function (c) return ruled.client.match(c, { class = "SuperTuxKart" }) end local stk_count = 0 for c in awful.client.iterate(stk) do stk_count = stk_count + 1 end -- If SuperTuxKart is already open, don't open a new instance if stk_count > 1 then c:kill() -- Switch to previous instance for c in awful.client.iterate(stk) do c:jump_to(false) end else -- Move the instance to specified tag tag on this screen local t = awful.tag.find_by_name(awful.screen.focused(), "6") c:move_to_tag(t) t:view_only() -- Enable fullscreeen again c.fullscreen = true end end end )