394 lines
7.0 KiB
Lua
394 lines
7.0 KiB
Lua
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,
|
|
keys = client_keys,
|
|
buttons = client_buttons,
|
|
screen = awful.screen.preferred,
|
|
placement = awful.placement.no_overlap + awful.placement.no_offscreen
|
|
}
|
|
}
|
|
|
|
ruled.client.append_rule {
|
|
id = 'round_clients',
|
|
rule_any = {
|
|
type = {
|
|
'normal',
|
|
'dialog'
|
|
}
|
|
},
|
|
except_any = {
|
|
name = {'Discord Updater'}
|
|
},
|
|
properties = {
|
|
round_corners = true,
|
|
shape = beautiful.client_shape_rounded
|
|
}
|
|
}
|
|
|
|
-- Titlebar rules
|
|
ruled.client.append_rule {
|
|
id = 'titlebars',
|
|
rule_any = {
|
|
type = {
|
|
'normal',
|
|
'dialog',
|
|
'modal',
|
|
'utility'
|
|
}
|
|
},
|
|
properties = {
|
|
titlebars_enabled = true
|
|
}
|
|
}
|
|
|
|
-- 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,
|
|
skip_decoration = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Modals
|
|
ruled.client.append_rule {
|
|
id = 'modal',
|
|
rule_any = {
|
|
type = {'modal'}
|
|
},
|
|
properties = {
|
|
titlebars_enabled = true,
|
|
floating = true,
|
|
above = true,
|
|
skip_decoration = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Utilities
|
|
ruled.client.append_rule {
|
|
id = 'utility',
|
|
rule_any = {
|
|
type = {'utility'}
|
|
},
|
|
properties = {
|
|
titlebars_enabled = false,
|
|
floating = true,
|
|
skip_decoration = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Splash
|
|
ruled.client.append_rule {
|
|
id = 'splash',
|
|
rule_any = {
|
|
type = {'splash'},
|
|
name = {'Discord Updater'}
|
|
},
|
|
properties = {
|
|
titlebars_enabled = false,
|
|
round_corners = false,
|
|
floating = true,
|
|
above = true,
|
|
skip_decoration = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Terminal emulators
|
|
ruled.client.append_rule {
|
|
id = 'terminals',
|
|
rule_any = {
|
|
class = {
|
|
'URxvt',
|
|
'XTerm',
|
|
'UXTerm',
|
|
'kitty',
|
|
'K3rmit'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '1',
|
|
switch_to_tags = true,
|
|
size_hints_honor = false,
|
|
titlebars_enabled = true
|
|
}
|
|
}
|
|
|
|
-- Browsers and chats
|
|
ruled.client.append_rule {
|
|
id = 'internet',
|
|
rule_any = {
|
|
class = {
|
|
'firefox',
|
|
'Tor Browser',
|
|
'discord',
|
|
'Chromium',
|
|
'Google-chrome',
|
|
'TelegramDesktop'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '2'
|
|
}
|
|
}
|
|
|
|
-- Text editors and word processing
|
|
ruled.client.append_rule {
|
|
id = 'text',
|
|
rule_any = {
|
|
class = {
|
|
'Geany',
|
|
'Atom',
|
|
'Subl3',
|
|
'code-oss'
|
|
},
|
|
name = {
|
|
'LibreOffice',
|
|
'libreoffice'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '3'
|
|
}
|
|
}
|
|
|
|
-- File managers
|
|
ruled.client.append_rule {
|
|
id = 'files',
|
|
rule_any = {
|
|
class = {
|
|
'dolphin',
|
|
'ark',
|
|
'Nemo',
|
|
'File-roller'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '4',
|
|
switch_to_tags = true
|
|
}
|
|
}
|
|
|
|
-- Multimedia
|
|
ruled.client.append_rule {
|
|
id = 'multimedia',
|
|
rule_any = {
|
|
class = {
|
|
'vlc',
|
|
'Spotify'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '5',
|
|
switch_to_tags = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Gaming
|
|
ruled.client.append_rule {
|
|
id = 'gaming',
|
|
rule_any = {
|
|
class = {
|
|
'Wine',
|
|
'dolphin-emu',
|
|
'Steam',
|
|
'Citra',
|
|
'supertuxkart'
|
|
},
|
|
name = {'Steam'}
|
|
},
|
|
properties = {
|
|
tag = '6',
|
|
skip_decoration = true,
|
|
switch_to_tags = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Multimedia Editing
|
|
ruled.client.append_rule {
|
|
id = 'graphics',
|
|
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',
|
|
'Gnome-boxes',
|
|
'Virt-manager'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '8'
|
|
}
|
|
}
|
|
|
|
-- IDEs and Tools
|
|
ruled.client.append_rule {
|
|
id = 'development',
|
|
rule_any = {
|
|
class = {
|
|
'Oomox',
|
|
'Unity',
|
|
'UnityHub',
|
|
'jetbrains-studio',
|
|
'Ettercap',
|
|
'scrcpy'
|
|
}
|
|
},
|
|
properties = {
|
|
tag = '9',
|
|
skip_decoration = true
|
|
}
|
|
}
|
|
|
|
-- Image viewers
|
|
ruled.client.append_rule {
|
|
id = 'image_viewers',
|
|
rule_any = {
|
|
class = {
|
|
'feh',
|
|
'Pqiv',
|
|
'Sxiv'
|
|
},
|
|
},
|
|
properties = {
|
|
titlebars_enabled = true,
|
|
skip_decoration = true,
|
|
floating = true,
|
|
ontop = true,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
|
|
-- Floating
|
|
ruled.client.append_rule {
|
|
id = 'floating',
|
|
rule_any = {
|
|
instance = {
|
|
'file_progress',
|
|
'Popup',
|
|
'nm-connection-editor',
|
|
},
|
|
class = {
|
|
'scrcpy',
|
|
'Mugshot',
|
|
'Pulseeffects'
|
|
},
|
|
role = {
|
|
'AlarmWindow',
|
|
'ConfigManager',
|
|
'pop-up'
|
|
}
|
|
},
|
|
properties = {
|
|
titlebars_enabled = true,
|
|
skip_decoration = true,
|
|
ontop = true,
|
|
floating = true,
|
|
focus = awful.client.focus.filter,
|
|
raise = true,
|
|
keys = client_keys,
|
|
buttons = client_buttons,
|
|
placement = awful.placement.centered
|
|
}
|
|
}
|
|
end
|
|
)
|
|
|
|
-- Normally we'd do this with a rule, but some program like spotify doesn't set its class or name
|
|
-- until after it starts up, so we need to catch that signal.
|
|
client.connect_signal(
|
|
'property::class',
|
|
function(c)
|
|
if c.class == 'Spotify' then
|
|
local window_mode = false
|
|
|
|
-- Check if fullscreen or window mode
|
|
if c.fullscreen then
|
|
window_mode = false
|
|
c.fullscreen = false
|
|
else
|
|
window_mode = true
|
|
end
|
|
|
|
-- Check if Spotify is already open
|
|
local app = function (c)
|
|
return ruled.client.match(c, {class = 'Spotify'})
|
|
end
|
|
|
|
local app_count = 0
|
|
for c in awful.client.iterate(app) do
|
|
app_count = app_count + 1
|
|
end
|
|
|
|
-- If Spotify is already open, don't open a new instance
|
|
if app_count > 1 then
|
|
c:kill()
|
|
-- Switch to previous instance
|
|
for c in awful.client.iterate(app) do
|
|
c:jump_to(false)
|
|
end
|
|
else
|
|
-- Move the instance to specified tag on this screen
|
|
local t = awful.tag.find_by_name(awful.screen.focused(), '5')
|
|
c:move_to_tag(t)
|
|
t:view_only()
|
|
|
|
-- Fullscreen mode if not window mode
|
|
if not window_mode then
|
|
c.fullscreen = true
|
|
else
|
|
c.floating = true
|
|
awful.placement.centered(c, {honor_workarea = true})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
)
|