qtile: [Bug/X11] Issue with border for some GTK apps

Issue description

I have identified two applications, namely celluloid and Nautilus, for which the border parameters defined in qtile are not applied. Instead thick white borders are seen (cf. screenshot, left screen -> nautilus, right screen-top right window -> celluloid). Deactivating picom doesn’t help. This is observable at least for two layouts (max and columns). I haven’t tested others.

Version

0.23.0

Backend

X11 (default)

Config

Large config
import os
import subprocess
import asyncio
import psutil

from libqtile import bar, layout, hook, qtile
from libqtile.log_utils import logger
from libqtile.config import Click, Drag, Group, Key, KeyChord, Match, Screen, Rule, DropDown
from libqtile.lazy import lazy
#from libqtile.widget import Spacer

from qtile_extras import widget
from qtile_extras.widget.decorations import RectDecoration, PowerLineDecoration, BorderDecoration
from qtile_extras.widget import modify

from popups.power_menu import show_power_menu
from widgets.padgroupbox import padGroupBox


# Parsing : remove all text.
def txt_remove(text):
    return ""

# Send a window within a group to group displayed on left or right screen. Three monitors configuration, monitor 0 is the central monitor -> Screens: [1,0,2] 
def window_to_previous_screen(qtile, switch_group=False, switch_screen=False):
    i = qtile.screens.index(qtile.current_screen)
    if i == 0:
        group = qtile.screens[i + 1].group.name
        qtile.current_window.togroup(group, switch_group=switch_group)
        if switch_screen == True:
            qtile.to_screen(i + 1)
    if i == 2:
        group = qtile.screens[i - 2].group.name
        qtile.current_window.togroup(group, switch_group=switch_group)
        if switch_screen == True:
            qtile.to_screen(i - 2)

def window_to_next_screen(qtile, switch_group=False, switch_screen=False):
    i = qtile.screens.index(qtile.current_screen)
    if i == 1:
        group = qtile.screens[i - 1].group.name
        qtile.current_window.togroup(group, switch_group=switch_group)
        if switch_screen == True:
            qtile.to_screen(i - 1)
    if i == 0:
        group = qtile.screens[i + 2].group.name
        qtile.current_window.togroup(group, switch_group=switch_group)
        if switch_screen == True:
            qtile.to_screen(i + 2)

# Key bindings for group stick to screen
def go_to_group(name: str) -> callable:
    def _inner(qtile) -> None:
        if len(qtile.screens) == 1:
            qtile.groups_map[name].toscreen()
            return
        if name in "123":
            qtile.focus_screen(0)
            qtile.groups_map[name].toscreen()
        elif name in "456":
            qtile.focus_screen(1)
            qtile.groups_map[name].toscreen()
        else:
            qtile.focus_screen(2)
            qtile.groups_map[name].toscreen()
    return _inner

def _scroll_screen(direction: int) -> callable:
    """
    Scroll to the next/prev group of the subset allocated to a specific screen. This
    will rotate between e.g. 1->2->3->1 when the first screen is focused.
    """
    def _inner(qtile: qtile):
        if len(qtile.screens) == 1:
            current = qtile.groups.index(qtile.current_group)
            destination = (current + direction) % 9
            qtile.groups[destination].toscreen()
            return
        current = qtile.groups.index(qtile.current_group)
        if current < 3:
            destination = (current + direction) % 3
        elif current < 6:
            destination = ((current - 3 + direction) % 3) + 3
        else:
            destination = ((current - 6 + direction) % 3) + 6
        qtile.groups[destination].toscreen()
    return _inner

# Theme name : Catppuccin Mocha 
# https://github.com/catppuccin/catppuccin#-palettes
def init_colors():
    return [["#cdd6f4", "#cdd6f4"], # color 0 Text (Blue) 
            ["#1e1e2e", "#1e1e2e"], # color 1 Base #1e1e2e
            ["#9399b2", "#9399b2"], # color 2 Overlay 2 
            ["#f5c2e7", "#f5c2e7"], # color 3 Pink 
            ["00000000", "00000000"], # color 4 Transparent
            ["#f3f4f5", "#f3f4f5"], # color 5 White
            ["#45475a", "#45475a"], # color 6 Surface 0
            ["11111bbf"], # color 7  Crust 75% transparency # Base 85% transparency 1e1e2ed9
            ["#f3f4f500", "#f3f4f500"], # color 8 White 66 % tranparency for highlight
            ["#11111b", "#11111b"], # color 9 Crust
            ["#fab387", "#fab387"], # color 10 Peach
            ["#f9e2af", "#f9e2af"], # color 11 Yellow
            ["#a6e3a1", "#a6e3a1"], # color 12 Green
            ["#94e2d5", "#94e2d5"], # color 13 Teal (Blue/Green)
            ["#eba0ac", "#eba0ac"], # color 14 Maroon (Reddish/pink)
            ["#f38ba8", "#f38ba8"], # color 15 Red
            ["#89dceb", "#89dceb"], # color 16 Sky (Blue)
            ["#585b70", "#585b70"], # color 17 Surface 2 (grey)
            ["#74c7ec", "#74c7ec"], # color 18 Sapphire
            ["#89b4fa", "#89b4fa"], # color 19 Blue
            ["#b4befe", "#b4befe"], # color 20 Lavender
           ] 
colors = init_colors()

@lazy.function
def minimize_all(qtile):
    for win in qtile.current_group.windows:
        if hasattr(win, "toggle_minimize"):
            win.toggle_minimize()


mod = "mod4" # Super Key
mod1 = "mod1" # Alt Key

keys = [
	# Launch Applications
    Key([mod],"e", lazy.spawn("nemo"), desc="Nemo"),
    Key([mod],"w", lazy.spawn(os.path.expanduser('~/.config/qtile/rofi/bin/launcher')), desc="Rofi (Start Menu)"),
    Key([mod],"x", lazy.spawn("geany"), desc="Geany (Text editor)"),
    Key([mod],"a", lazy.spawn("chromium"), desc="Chromium"),
    Key([mod],"s", lazy.function(show_power_menu), desc="Power Menu"),
    Key([mod], "Return", lazy.spawn("gnome-terminal -e \"bash -c neofetch\";bash"), desc="Terminal"),
    Key([],"Print", lazy.spawn("gnome-screenshot --interactive"), desc="Screenshot"),
    Key([mod], "u",lazy.spawn("nordvpn c Netherlands"), desc="Connect NordVPN"),
    Key([mod], "i",lazy.spawn("nordvpn d"), desc="Disconnect PureVPN"),

	# Qtile commands
    Key([mod, mod1], "r", lazy.restart(), desc="Restart Qtile"),
    Key([mod, "control"], "r", lazy.reload_config(), desc="Reload Qtile config"),
    Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown Qtile and logout"),
    
    #Toggle between different group and layouts as defined below
    Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
    Key([mod], "quoteleft", lazy.function(_scroll_screen(1)), desc="Screen groups forward"),
    
    # Switch between windows
    Key([mod, mod1], "Left", lazy.layout.left(), desc="Move focus to left"),
    Key([mod, mod1], "Right", lazy.layout.right(), desc="Move focus to right"),
    Key([mod, mod1], "Down", lazy.layout.down(), desc="Move focus down"),
    Key([mod, mod1], "Up", lazy.layout.up(), desc="Move focus up"),
    Key([mod], "space", lazy.layout.next(), desc="Move focus to next window"),
    Key([mod1], "Tab", lazy.layout.next(), desc="Move focus to next window"),
    
    # Move windows between left/right columns or move up/down in current stack.
    Key([mod, "control"], "Left", lazy.layout.shuffle_left(), desc="Move window to the left"),
    Key([mod, "control"], "Right", lazy.layout.shuffle_right(), desc="Move window to the right"),
    Key([mod, "control"], "Down", lazy.layout.shuffle_down(), desc="Move window down"),
    Key([mod, "control"], "Up", lazy.layout.shuffle_up(), desc="Move window up"),
    
    # Grow windows.
    Key([mod, "shift"], "Left", lazy.layout.grow_left(), desc="Grow window to the left"),
    Key([mod, "shift"], "Right", lazy.layout.grow_right(), desc="Grow window to the right"),
    Key([mod, "shift"], "Down", lazy.layout.grow_down(), desc="Grow window down"),
    Key([mod, "shift"], "Up", lazy.layout.grow_up(), desc="Grow window up"),
    Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
    #Key([mod], "d", lazy.function(go_to_group("8")), lazy.screen.toggle_group(group_name="8", warp=True)),
    #Key([mod], "d", lazy.spawn("killall dunst"), lazy.spawn("notify-send \"this is a sfaskjhfasjhfkajhsfkajhsfkajhsfkjaksfjaksjgfkajgsflasf kjagslkjfgaklsjgfkajsgfkjasgfkjhagskjlfgakjlsgflkaj fasfasfasfasfasfasfasfasftitle\"")),
    # Toggle between split and unsplit sides of stack.
    # Split = all windows displayed
    # Unsplit = 1 window displayed, like Max layout, but still with
    # multiple stack panes
    #Key(
    #    [mod, "shift"],
    #    "Return",
    #    lazy.layout.toggle_split(),
    #    desc="Toggle between split and unsplit sides of stack",
    #),
    
    # Manipulate windows on and between screens
    Key([mod], "Right", lazy.function(window_to_next_screen, switch_screen=True),desc="Move window to right screen"),
    Key([mod], "Left", lazy.function(window_to_previous_screen, switch_screen=True), desc="Move window to left screen"),
    Key([mod],"c", minimize_all(), desc="Toggle minimization of all window"),
    Key([mod],"f", lazy.window.toggle_fullscreen(), desc="Make window fullscreen"),
    Key([mod], "q", lazy.window.kill(), desc="Kill focused window"),
]

groups = [
    #Group("1", label="  綠⏾         ﲮﲭﲮ⏻"),
    Group("1", label="", matches=[Match(wm_class=["league of legends.exe"])]),
    Group("2", label=""),
    Group("3", label="⭘"), 
    Group("4", label="", matches=[Match(wm_class=["leagueclientux.exe"])]), 
    Group("5", label="", matches=[Match(wm_class=["discord"])],layout = "max"),
    Group("6", label="", matches=[Match(wm_class=["spotify"])],layout = "max"),
    Group("7", label="", matches=[Match(wm_class=["deluge"])],layout = "columns"),
    Group("8", label="", matches=[Match(wm_class=["evolution","thunderbird"])],layout = "max"),
    Group("9", label="", matches=[Match(wm_class=["steamwebhelper", "steam"])],layout = "max"),
]

for i in groups:
    keys.append(Key([mod], i.name, lazy.function(go_to_group(i.name)), desc="Switch to group {}".format(i.name)))
for i in groups:
    keys.append(Key([mod, "control"], i.name, lazy.window.togroup(i.name, switch_group=True), lazy.function(go_to_group(i.name)), desc="Switch to & move focused window to group {}".format(i.name)))

# General Decoration setting
decor_general = {
    "decorations": [
        RectDecoration(
            #colour="#a6e3a1",
            use_widget_background=True,
            line_width= 1,
            line_colour=colors[17],
            radius=[15, 15, 15, 15],
            filled=True,
            margin_y=20,
            padding_y=6,
            padding_x=0,
            group=True,
            clip=True,
        ),
    ],
}

# Decoration setting for no grouping Rect.Decoraction
decor_nogroup = {
    "decorations": [
        RectDecoration(
            #colour=colors[7],
            use_widget_background=True,
            line_width= 1,
            line_colour=colors[17],
            radius=[15, 15, 15, 15],
            filled=True,
            padding_y=6,
            padding_x=0,
            group=False,
        ), 
    ],
}

# Decoration setting for no grouping side screen Rect.Decoraction
decor_side = {
    "decorations": [
        RectDecoration(
            colour=colors[7],
            line_width=1,
            line_colour=colors[17],
            radius=[15, 15, 15, 15],
            filled=True,
            padding_y=7,
            padding_x=0,
            group=False,
        ),
    ],
}

box_main = {
            "font": 'Symbols Nerd Font Mono',
            #"font": 'monospace',
            "fontsize": 35,
            "spacing": 5,
            "margin_y": 2,
            "margin_x": 15,
            "padding_x": 5,
            "background": colors[7],
            "disable_drag": True,
            "active": colors[3],
            "inactive": colors[2],
            "highlight_method":'line',
            "this_current_screen_border": colors[3],
            "other_current_screen_border": colors[4],
            "this_screen_border": colors[3],
            "highlight_color": colors[4],
            "borderwidth": 2,
            }

screens = [
    Screen(
        top=bar.Bar(
            [
                widget.Spacer(length=15),   
                widget.Image(
                       filename="~/.config/qtile/assets/arch_linux_icon_blue_pink.svg",
                       background = colors[4],
                       margin_y = 8, 
                       mouse_callbacks={"Button1": lazy.spawn(os.path.expanduser('~/.config/qtile/rofi/bin/launcher_icon'))},
                       #**decor_nogroup
                ),
                widget.Spacer(length=12),  
                widget.CurrentLayoutIcon(
                       scale = 0.66, 
                       custom_icon_paths = ["~/.config/qtile/assets/layout"],
                       #use_mask = True, 
                       #foreground=colors[3],
                       ), 
           #     widget.LaunchBar(progs=[
           #             ('org.gnome.Terminal', 'gnome-terminal + "neofetch"', 'Launch terminal'),
           #             ('nemo', 'nemo', 'Launch File Manager'),
           #             ('chromium', 'chromium', 'Launch Chromium'),
                        #('discord', 'discord', 'Launch Discord'),
                        #('spotify', 'spotify', 'Launch Spotify'),
                        #('deluge', 'deluge', 'Launch deluge'),
                        #('thunderbird', 'thunderbird', 'Launch thunderbird'),
                        #('steam', 'steam', 'Launch Steam'),
           #                           ], 
           #             padding = 15, padding_y = -2, icon_size=40,**decor_nogroup
           #     ),
                widget.Spacer(length=12),
                modify(padGroupBox,
                    visible_groups=['1', '2', '3'],
                    padding_y= 9, 
                    **box_main, 
                    **decor_nogroup
                    ),
                widget.Spacer(length=5),
                widget.Prompt(),
                widget.Chord(
                    chords_colors={
                    "launch": ("#ff0000", "#ffffff"),
                    },
                    name_transform=lambda name: name.upper(),
                    font="monospace",
                    fontsize = 36,
                ),  
                widget.Spacer(length=5),
                widget.TaskList(
                       highlight_method="block",
                       border=colors[4],
                       borderwidth=0,
                       background = colors[4],
                       icon_size = 40,
                       padding_x = 1,
                       padding_y = 9,
                       margin_x= 5,
                       margin_y= 4,
                       spacing = 5,
                       parse_text=txt_remove,
                       fontsize = 20,
                       txt_floating="🗗",
                       txt_maximized="🗖",
                       txt_minimized="🗕",
                       theme_path="/usr/share/icons/Papirus-Dark",
                       theme_mode="preferred",
                ),
                widget.Spacer(),
                widget.WindowName(fontsize=24, padding=00, empty_group_string="", foreground=colors[5]),
                widget.Spacer(),
                widget.CheckUpdates(
                       font="Symbols Nerd Font Mono",
                       fontsize = 26,
                       padding=0,  
                       custom_command = "checkupdates",
                       update_interval = 3600,
                       display_format = "   {updates} ",
                       #mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c paru\";bash")},
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -- sh -c 'paru; checkupdates; bash'")},
                       #no_update_string="    0 ",
                       no_update_string="",
                       colour_have_updates = colors[18],
                       colour_no_updates=colors[18],
                       background = colors[7],
                       **decor_general
                ),
                widget.Spacer(length=10),
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/gpu.svg",
                       background = colors[7],
                       colour= colors[13],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -- sh -c 'nvtop'")},  
                       mask=True,
                       padding = 10, 
                       margin_y = 18, 
                       adjust_y=0,
                       adjust_x=5,
                       **decor_general
                ),
                widget.NvidiaSensors(
                    font="Symbols Nerd Font Mono",
                    #font="monospace",
                    #format='  {temp}°C', 
                    format='{temp}°C', 
                    fontsize=26,
                    padding=0, 
                    foreground=colors[13], 
                    background=colors[7],
                    update_interval=5, 
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -- sh -c 'nvtop'")}, 
                    **decor_general
                    ),
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/cpu.svg",
                       background = colors[7],
                       colour= colors[12],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                       mask=True,
                       margin_y = 18,
                       padding = 5, 
                       adjust_x= 5,
                       adjust_y=2, 
                       **decor_general
                ),
                widget.CPU(
                    #font="Symbols Nerd Font Mono",
                    #font="FontAwesome",
                    font="monospace",
                    #format="{load_percent:3.0f}%", 
                    format="{load_percent:2.0f}%", 
                    fontsize=26,
                    padding=5,  
                    foreground=colors[12],
                    background=colors[7],
                    update_interval=10,
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                    **decor_general),
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/memory.svg",
                       background = colors[7],
                       colour= colors[11],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                       mask=True,
                       padding=5,
                       margin_y = 18, 
                       adjust_x=2, 
                       adjust_y=2, 
                       **decor_general
                ),
                widget.Memory(
                    font="Symbols Nerd Font Mono",
                    #font="monospace",
                    format="{MemUsed:2.0f}{mm}", 
                    #format=" {MemUsed:2.0f}{mm} ", 
                    measure_mem='G', 
                    fontsize=26,
                    padding=0,  
                    foreground=colors[11], 
                    background=colors[7], 
                    update_interval=5,
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                    **decor_general),
                widget.Spacer(length=12,background = colors[7],**decor_general),
                widget.Spacer(length=10),
                widget.AnalogueClock(
                    margin=18,
                    padding=10,
                    hour_size= 2,
                    hour_length=0.55,
                    minute_size= 2,
                    minute_length=0.55,
                    background=colors[7], 
                    hour_colour=colors[10],
                    minute_colour=colors[10],
                    face_border_colour=colors[10],
                    face_shape='circle',
                    face_border_width=3,
                    update_interval=1,
                    adjust_y=2,
                    adjust_x=2,
                    **decor_general, 
                ),
                #widget.Spacer(length=10),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 0,
                       foreground = colors[10],
                       background=colors[7],
                       fontsize = 26,
                       #format="  %H:%M",
                       format="%H:%M",
                       **decor_general, 
                ),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 10,
                       foreground = colors[14],
                       background=colors[7],
                       fontsize = 26,
                       format="  %a-%d",
                       **decor_general,
                ),
                widget.Spacer(length=10),
                widget.ALSAWidget(
                       mouse_callbacks={"Button3": lazy.spawn("pavucontrol")},
                       mode='both',
                       #theme_path="/usr/share/icons/Papirus-Dark",
                       #theme_path="/usr/share/icons/kora",
                       theme_path="/home/crystal/.config/qtile/assets/bar_icons",
                       icon_size=28,
                       fontsize=20,
                       padding=10,
                       bar_width=60,
                       bar_colour_high=colors[10],
                       bar_colour_loud=colors[15],
                       bar_colour_normal=colors[13],
                       bar_colour_mute=colors[7],
                       foreground=colors[5],
                       background=colors[7],
                       update_interval=5,
                       hide_interval=2,
                       **decor_general,
                       ),
                widget.StatusNotifier(
                       icon_size=36,
                       icon_theme="/usr/share/icons/Papirus-Dark",
                       padding = 5,
                       hide_after=5,
                       menu_width=370,
                       show_menu_icons=True,
                       background=colors[7],
                       highlight_colour=colors[3],
                       menu_background=colors[9],
                       menu_foreground=colors[0],
                       menu_foreground_disabled=colors[2],
                       menu_icon_size=16,
                       menu_fontsize=16,
                       menu_foreground_highlighted=colors[9],
                       highlight_radius=7.5,
                       separator_colour=colors[15],
                       menu_border=colors[17],
                       menu_border_width=1,
                       menu_offset_x=2,
                       menu_offset_y=6,
                       **decor_general,
                ),
                widget.TextBox(
                       font="Symbols Nerd Font Mono",
                       text="", 
                       fontsize=24, 
                       foreground=colors[15],
                       background=colors[7],
                       padding=-7,
                       **decor_general,
                ),   
                widget.TextBox(
                       mouse_callbacks={"Button1": lazy.function(show_power_menu), "Button3": lazy.function(show_power_menu)},
                       font="Symbols Nerd Font Mono",
                       text="", 
                       fontsize=26, 
                       foreground=colors[5],
                       background=colors[7],
                       padding=12,
                       **decor_general,
                ),

             #   widget.Spacer(length=1), 
             #   widget.Systray(
             #          background=colors[4],
             #          icon_size = 40,
              #         padding = 10,
             #   ),
           ],
        64, background=colors[4], margin = [2,4,0,0], opacity=1,
        border_width=[0, 0, 0, 0],  # Draw top and bottom borders
        border_color=["#45475a", "#45475a", "#45475a", "#45475a"]  # Borders are magenta
        ), 
                       #wallpaper="~/.config/qtile/assets/wallpaper/wallhaven-j37lop.png",
                       #wallpaper_mode="fill",
    ),
   
       
       
       Screen(
        top=bar.Bar(
            [
                widget.CurrentLayoutIcon(
                       scale = 0.66, 
                       custom_icon_paths = ["~/.config/qtile/assets/layout"],
                       #use_mask = True, 
                       #foreground=colors[3],
                       ), 
                widget.Spacer(10),
                modify(padGroupBox,
                    visible_groups=['4', '5', '6'],
                    padding_y= 11, 
                    **box_main, 
                    **decor_nogroup
                    ), 
                widget.TaskList(
                       highlight_method="block",
                       border=colors[8],
                       borderwidth=0,
                       background = colors[4],
                       icon_size = 50,
                       fontsize= 28,
                       rounded = True,
                       padding_x = 1,
                       padding_y = 8,
                       margin_x= 5,
                       margin_y= 4,
                       spacing = 5,
                       parse_text=txt_remove,
                       txt_floating="🗗",
                       txt_maximized="🗖",
                       txt_minimized="🗕",
                       theme_path="/usr/share/icons/Papirus-Dark",
                       theme_mode="preferred",
                ),
                widget.Spacer(), 
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/gpu.svg",
                       background = colors[7],
                       colour= colors[13],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -- sh -c 'watch -n2 nvidia-smi\'")},  
                       mask=True,
                       padding = 10, 
                       margin_y = 18, 
                       adjust_y=0,
                       adjust_x=5,
                       **decor_general
                ),
                widget.NvidiaSensors(
                    font="Symbols Nerd Font Mono",
                    #font="monospace",
                    #format='  {temp}°C', 
                    format='{temp}°C', 
                    fontsize=26,
                    padding=0, 
                    foreground=colors[13], 
                    background=colors[7],
                    update_interval=5, 
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -- sh -c 'watch -n2 nvidia-smi\'")}, 
                    **decor_general
                    ),
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/cpu.svg",
                       background = colors[7],
                       colour= colors[12],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                       mask=True,
                       margin_y = 18,
                       padding = 5, 
                       adjust_x= 5,
                       adjust_y=2, 
                       **decor_general
                ),
                widget.CPU(
                    #font="Symbols Nerd Font Mono",
                    #font="FontAwesome",
                    font="monospace",
                    #format="{load_percent:3.0f}%", 
                    format="{load_percent:2.0f}%", 
                    fontsize=26,
                    padding=5,  
                    foreground=colors[12],
                    background=colors[7],
                    update_interval=10,
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                    **decor_general),
                widget.Image(
                       filename="~/.config/qtile/assets/bar_icons/memory.svg",
                       background = colors[7],
                       colour= colors[11],
                       mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                       mask=True,
                       padding=5,
                       margin_y = 18, 
                       adjust_x=2, 
                       adjust_y=2, 
                       **decor_general
                ),
                widget.Memory(
                    font="Symbols Nerd Font Mono",
                    #font="monospace",
                    format="{MemUsed:2.0f}{mm}", 
                    #format=" {MemUsed:2.0f}{mm} ", 
                    measure_mem='G', 
                    fontsize=26,
                    padding=0,  
                    foreground=colors[11], 
                    background=colors[7], 
                    update_interval=5,
                    mouse_callbacks ={"Button1": lazy.spawn("gnome-terminal -e \"bash -c btop\"")},  
                    **decor_general),
                widget.Spacer(length=12,background = colors[7],**decor_general),
                widget.Spacer(length=10),
                widget.AnalogueClock(
                    margin=18,
                    padding=10,
                    hour_size= 2,
                    hour_length=0.55,
                    minute_size= 2,
                    minute_length=0.55,
                    background=colors[7], 
                    hour_colour=colors[10],
                    minute_colour=colors[10],
                    face_border_colour=colors[10],
                    face_shape='circle',
                    face_border_width=3,
                    update_interval=1,
                    adjust_y=2,
                    adjust_x=2,
                    **decor_general, 
                ),
                #widget.Spacer(length=10),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 0,
                       foreground = colors[10],
                       background=colors[7],
                       fontsize = 26,
                       #format="  %H:%M",
                       format="%H:%M",
                       **decor_general, 
                ),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 10,
                       foreground = colors[14],
                       background=colors[7],
                       fontsize = 26,
                       format="  %a-%d",
                       **decor_general,
                ),
           ],
        70, background=colors[4], margin = [0,3,0,10],
        border_width=[0, 0, 0, 0],  # Draw top and bottom borders
        border_color=["#45475a", "#45475a", "#45475a", "#45475a"]  # Borders are magenta
        ),                       
                       #wallpaper="~/.config/qtile/assets/wallpaper/wallhaven-6k3oox.jpg",
                       #wallpaper="~/.config/qtile/assets/wallpaper2/wallhaven-y8kzjk.jpg",
                       #wallpaper_mode="fill",
        ),
         
    Screen(
        top=bar.Bar(
            [
                widget.CurrentLayoutIcon(
                       scale = 0.66, 
                       custom_icon_paths = ["~/.config/qtile/assets/layout"],
                       #use_mask = True, 
                       #foreground=colors[3],
                       ), 
                widget.Spacer(10),
                modify(
                    padGroupBox,
                    visible_groups=['7', '8', '9'],
                    padding_y= 11, 
                    **box_main, 
                    **decor_nogroup
                    ),  
                widget.TaskList(
                       highlight_method="block",
                       border=colors[8],
                       borderwidth=0,
                       background = colors[4],
                       icon_size = 50,
                       fontsize= 28,
                       rounded = True,
                       padding_x = 1,
                       padding_y = 8,
                       margin_x= 5,
                       margin_y= 4,
                       spacing = 5,
                       parse_text=txt_remove,
                       txt_floating="🗗",
                       txt_maximized="🗖",
                       txt_minimized="🗕",
                       theme_path="/usr/share/icons/Papirus-Dark",
                       theme_mode="preferred",
                ),
                widget.Spacer(),
                # ~ modify(
                       # ~ FormatNet,
                       # ~ font="Symbols Nerd Font Mono",
                       # ~ padding=0,
                       # ~ foreground = colors[16],
                       # ~ background=colors[7],
                       # ~ fontsize = 26,
                       # ~ prefix ='M',
                       # ~ interface='eno2',
                       # ~ use_bits=False,
                       # ~ format=" {up:4.1f}{up_suffix:<2} {down:4.1f}{down_suffix:<2}",
                       # ~ #format=" {up} {down}",
                       # ~ update_interval=5,
                       # ~ **decor_general,
                widget.Net(
                       font="Symbols Nerd Font Mono",
                       padding=0,
                       foreground = colors[16],
                       background=colors[7],
                       fontsize = 26,
                       prefix ='M',
                       interface='eno2',
                       use_bits=False,
                       format=" {up:4.1f}{up_suffix:<2} {down:4.1f}{down_suffix:<2}",
                       update_interval=5,
                       **decor_general,
                       ),
                widget.NetGraph(
                       graph_color = colors[16],
                       background = colors[7],
                       border_width=2,
                       interface='eno2',
                       bandwidth_type= "down",
                       frequency=1,
                       margin_x=15,
                       margin_y=15,
                       samples=40,
                       **decor_general,
                       ),
                widget.Spacer(length=10),
                widget.AnalogueClock(
                    margin=18,
                    padding=10,
                    hour_size= 2,
                    hour_length=0.55,
                    minute_size= 2,
                    minute_length=0.55,
                    background=colors[7], 
                    hour_colour=colors[10],
                    minute_colour=colors[10],
                    face_border_colour=colors[10],
                    face_shape='circle',
                    face_border_width=3,
                    update_interval=1,
                    adjust_y=2,
                    adjust_x=2,
                    **decor_general, 
                ),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 0,
                       foreground = colors[10],
                       background=colors[7],
                       fontsize = 26,
                       #format="  %H:%M",
                       format="%H:%M",
                       **decor_general, 
                ),
                widget.Clock( 
                       font="Symbols Nerd Font Mono",
                       padding = 10,
                       foreground = colors[14],
                       background=colors[7],
                       fontsize = 26,
                       format="  %a-%d",
                       **decor_general,
                ),
 
           ],
        70, background=colors[4], margin = [0,3,0,10],
        border_width=[0, 0, 0, 0],  # Draw top and bottom borders
        border_color=["#45475a", "#45475a", "#45475a", "#45475a"]  # Borders are magenta
        ),
                       #wallpaper="~/.config/qtile/assets/wallpaper/wallhaven-6k3oox.jpg",
                       #wallpaper="~/.config/qtile/assets/wallpaper2/wallhaven-pkxqpm.jpg",
                       #wallpaper_mode="stretch",
    ),   
    

]

# Layout configuration
layout_theme = {"margin": 4,
                "border_focus": colors[2],
                "border_normal": colors[6]
                }

layouts = [
    layout.Columns(border_width= 1, **layout_theme),
    # layout.Matrix(**layout_theme),
    #layout.RatioTile(**layout_theme),
    layout.Max(border_width= 0, **layout_theme),
    # Try more layouts by unleashing below layouts.
    # layout.Stack(num_stacks=2),
    # layout.Bsp(),
    # layout.MonadTall(),
    # layout.MonadWide(**layout_theme),
    # layout.Tile(),
    # layout.TreeTab(),
    # layout.VerticalTile(),
    # layout.Zoomy(),
]

# Drag floating layouts.
mouse = [
    Drag([mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()),
    Drag([mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()),
    Click([mod], "Button9", lazy.window.bring_to_front()),
    Click([mod], "Button2", lazy.window.toggle_floating()),
]

dgroups_key_binder = None
dgroups_app_rules = []  # type: list
follow_mouse_focus = True
bring_front_click = False
cursor_warp = False

floating_layout = layout.Floating(
    float_rules=[
        # Run the utility of `xprop` to see the wm class and name of an X client.
        *layout.Floating.default_float_rules,
        Match(wm_class="confirmreset"),  # gitk
        Match(wm_class="makebranch"),  # gitk
        Match(wm_class="maketag"),  # gitk
        Match(wm_class="ssh-askpass"),  # ssh-askpass
        Match(wm_class="gnome-disks"),  # gnome disk utility
        Match(wm_class="blueman-manager"),  # blueman-applet
        Match(wm_class="conky"),  # conky
        Match(wm_class="pavucontrol"),  # Pulseaudio mixer and sound sources
        Match(wm_class="virt-manager"), # Virtual Manager
        Match(title="branchdialog"),  # gitk
        Match(title="Calculator"), #calculator
        Match(title="pinentry"),  # GPG key password entry
        Match(wm_class="nm-connection-editor") # network-manager connection editor
		], 
    fullscreen_border_width = 0, border_width = 2, border_focus=colors[2], border_normal=colors[6]
)

auto_fullscreen = True
focus_on_window_activation = "smart" #or focus
reconfigure_screens = True

# If things like steam games want to auto-minimize themselves when losing
# focus, should we respect this or not?
auto_minimize = True

# When using the Wayland backend, this can be used to configure input devices.
wl_input_rules = None

# Window Manager Name 
wmname = "Qtile"

# If Spotify opens move it to proper group
@hook.subscribe.client_name_updated
def spotify(window):
    if window.name == "Spotify":
        window.togroup(group_name="6")
        
# Keep floating window always above
@hook.subscribe.group_window_add
def window_added(group, window):
    if window.floating:
        window.bring_to_front()
    else:
        for win in reversed(group.focus_history):
            if win.floating:
                win.bring_to_front()
                return
# Autostart
@hook.subscribe.startup_once
def autostart():
    home = os.path.expanduser('~/.config/qtile/settings/autostart.sh')
    subprocess.Popen([home])

# # Pass every Steam window that is not the main one in floating mode
@hook.subscribe.client_new
def float_steam(window):
    wm_class = window.window.get_wm_class()
    w_name = window.window.get_name()
    if (
        wm_class == ["steamwebhelper", "steam"]
        and (
            w_name != "Steam"
            # w_name == "Friends List"
            # or w_name == "Screenshot Uploader"
            # or w_name.startswith("Steam - News")
            or "PMaxSize" in window.window.get_wm_normal_hints().get("flags", ())
        )
    ):
        window.floating = True

# Activate group 6, 7, and 1 after startup
@hook.subscribe.startup_complete
def assign_groups_to_screens():
	if len(qtile.screens) != 1:
		try:
			qtile.groups_map["1"].toscreen(0)
			qtile.groups_map["4"].toscreen(1)
			qtile.groups_map["8"].toscreen(2, toggle=False)
		except IndexError:
			pass

"""
# Activate VPN after startup. nm-applet needs to be loaded before attempting to connect to VPN. This is the reason of asyncio.sleep()
@hook.subscribe.startup_complete
async def start_vpn():
    await asyncio.sleep(2)
    qtile.spawn("nmcli con up Nederland-PPTP")
    # ~ qtile.spawn("nmcli con down wg0")
    # ~ qtile.spawn("nmcli con up wg0")
"""

# Swallow application launched from gnome terminal
@hook.subscribe.client_new
def _swallow(window):
    pid = window.window.get_net_wm_pid()
    ppid = psutil.Process(pid).ppid()
    cpids = {c.window.get_net_wm_pid(): wid for wid, c in window.qtile.windows_map.items()}
    for i in range(5):
        if not ppid:
            return
        if ppid in cpids:
            parent = window.qtile.windows_map.get(cpids[ppid])
            if parent.window.get_wm_class()[0] != "gnome-terminal-server":
                return
            parent.minimized = True
            window.parent = parent
            return
        ppid = psutil.Process(ppid).ppid()

@hook.subscribe.client_killed
def _unswallow(window):
    if hasattr(window, 'parent'):
        window.parent.minimized = False

"""
# If Celluloid opens move it to main screen 0
@hook.subscribe.client_name_updated
async def celluloid(window):
    if window.name == "Celluloid":
        window.toscreen(0)
"""


# Handle applications launched by either Thunderbird / Deluge / Steam on screen 2 (with some specifics)
@hook.subscribe.client_managed
async def _screen2(window):
    wm_class = window.window.get_wm_class()
    w_name = window.window.get_name()
    #logger.warning(wm_class)
    #logger.warning(w_name)
    if wm_class == ["steam_app_8500", "steam_app_8500"]:
        if w_name == "Wine System Tray":
            window.kill()
        elif w_name == "EVE Launcher":
            window.togroup("9")
            window.set_size_floating(901,946)
            window.center()
            window.bring_to_front()
        elif w_name == "EVE":
            window.togroup("3")
            qtile.groups_map["3"].toscreen(0)
    elif w_name == "elite launcher":
            window.togroup("9")
            window.set_size_floating(901,946)
            window.center()
            window.bring_to_front()
    elif w_name =="EXAPUNKS":
        window.toscreen(0)
        window.toggle_floating()
        #window.disable_fullscreen()
        #window.togroup("3")
        #qtile.groups_map["3"].toscreen(0)
    elif ((window.group.screen.index == 2) 
        and (wm_class != ['Mail', 'thunderbird']) 
        and (wm_class != ["Thunderbird", "thunderbird"])
        and (wm_class != ['deluge', 'Deluge-gtk'])
        and (wm_class != ['deluge', 'Deluge'])  
        and (wm_class != ["steamwebhelper", "steam"])
        and (w_name != ("Save All Attachments"))
        and (w_name != ("Save Image"))
    ):
        window.toscreen(0)
        #window.togroup("3")
        #qtile.groups_map["3"].toscreen(0)
        #window.group.setlayout("max")

Logs

No response

Required

  • I have searched past issues to see if this bug has already been reported, and it hasn’t been.
  • I understand that people give their precious time for free, and thus I’ve done my very best to make this problem as easy as possible to investigate.

About this issue

  • Original URL
  • State: open
  • Created 9 months ago
  • Comments: 16 (6 by maintainers)

Most upvoted comments

Can you use that default config again, quit everything but Celluloid and a terminal, and copy the output of ps auxf here?