Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memory leak when monitor sleeps? #4821

Open
2 tasks done
pawamoy opened this issue May 19, 2024 · 78 comments
Open
2 tasks done

Memory leak when monitor sleeps? #4821

pawamoy opened this issue May 19, 2024 · 78 comments

Comments

@pawamoy
Copy link
Contributor

pawamoy commented May 19, 2024

Issue description

I'm experiencing memory leaks with Qtile when my monitors go to sleep. More specifically, Qtile seems to allocate a lot of things (pixmaps) within Xorg.

Please see #3866. Copy/pasting some "evidence" here:

For some reason it looks like the stuff allocated by qtile increases a lot when I xset dpms force off. That fits with what I experienced since I have this new GPU: if I afk too long, then the system becomes unresponsive (no wake up), or if it at least wakes up, input devices do nothing. I have to force poweroff. Now I know that this is because the memory is saturated. Need to know why allocations increase (or stuff is not released) when monitors shut off.

I was running this and forced monitor off:

% while :; do sleep 5; xrestop -m 1 -b | grep qtile -A16 | grep total | cut -d~ -f2 | numfmt --to=iec; done
...
8.2M
8.2M
35M
35M
62M
62M
70M
70M
...

(it shows total bytes taken by qtile in xrestop every 5 seconds)


I have not been able to obtain traces as @tych0 suggested, and I can't find anything suspicious in drawer.py either.

Any kind soul to help here 🙏? This is very consistent: memory fills up every time my monitors go off.


Not sure why qtile --version says 0.25.1.dev0+g005da458.d20240413 instead of 0.25.2:

% yay -S qtile
Sync Explicit (1): qtile-0.25.0-2
[sudo] password for pawamoy: 
warning: qtile-0.25.0-2 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Packages (1) qtile-0.25.0-2

Total Installed Size:  5.81 MiB
Net Upgrade Size:      0.00 MiB

:: Proceed with installation? [Y/n] 
(1/1) checking keys in keyring                                                                                                                  [----------------------------------------------------------------------------------------] 100%
(1/1) checking package integrity                                                                                                                [----------------------------------------------------------------------------------------] 100%
(1/1) loading package files                                                                                                                     [----------------------------------------------------------------------------------------] 100%
(1/1) checking for file conflicts                                                                                                               [----------------------------------------------------------------------------------------] 100%
(1/1) checking available disk space                                                                                                             [----------------------------------------------------------------------------------------] 100%
:: Processing package changes...
(1/1) reinstalling qtile                                                                                                                        [----------------------------------------------------------------------------------------] 100%
:: Running post-transaction hooks...
(1/2) Reloading device manager configuration...
(2/2) Arming ConditionNeedsUpdate...
% type qtile
qtile is /usr/bin/qtile
% qtile --version
0.25.1.dev0+g005da458.d20240413

Version

0.25.1.dev0+g005da458.d20240413

Backend

X11 (default)

Config

Click to show config
import os
import platform

from libqtile import qtile
from libqtile.config import Key, Screen, Group, Drag, Click, Match
from libqtile.lazy import lazy
from libqtile.backend.x11.xkeysyms import keysyms
from libqtile import layout, bar, widget, hook
from libqtile.log_utils import logger

from Xlib import display as xdisplay


class KeysHolder:
    def __init__(self):
        for key in keysyms.keys():
            self_key = key.upper()
            if key[0] in range(0, 9):
                self_key = "K" + self_key
            setattr(self, self_key, key)
        self.ALT = self.MOD1 = "mod1"
        self.HYPER = self.MOD3 = "mod3"
        self.SUPER = self.MOD4 = "mod4"
        self.SHIFT = "shift"
        self.CONTROL = "control"
        self.EXCLAMATION = self.EXCLAM
        self.DOUBLE_QUOTE = self.QUOTEDBL


class MouseButtons:
    LEFT = BUTTON1 = "Button1"
    MIDDLE = BUTTON2 = "Button2"
    RIGHT = BUTTON3 = "Button3"
    WHEEL_UP = BUTTON4 = "Button4"
    WHEEL_DOWN = BUTTON5 = "Button5"
    WHEEL_LEFT = BUTTON6 = "Button6"
    WHEEL_RIGHT = BUTTON7 = "Button7"
    PREVIOUS = BUTTON8 = "Button8"
    NEXT = BUTTON9 = "Button9"


# ------------------------------------------------------------------------------
# LAZY FUNCTIONS ---------------------------------------------------------------
# ------------------------------------------------------------------------------
@lazy.function
def float_to_front(qtile):
    for group in qtile.groups:
        for window in group.windows:
            if window.floating:
                window.cmd_bring_to_front()


def cycle_workspaces(direction, move_window):
    def _inner(qtile):
        logger.info("cycling workspaces!")
        current = qtile.groups.index(qtile.current_group)
        destination = (current + direction) % len(groups)
        if move_window:
            qtile.current_window.togroup(qtile.groups[destination].name)
        qtile.groups[destination].toscreen()

    return _inner


next_workspace = lazy.function(cycle_workspaces(direction=1, move_window=False))
previous_workspace = lazy.function(cycle_workspaces(direction=-1, move_window=False))
to_next_workspace = lazy.function(cycle_workspaces(direction=1, move_window=True))
to_previous_workspace = lazy.function(cycle_workspaces(direction=-1, move_window=True))


def resize(qtile, direction):
    layout = qtile.current_layout
    child = layout.current
    parent = child.parent

    while parent:
        if child in parent.children:
            layout_all = False

            if (direction == "left" and parent.split_horizontal) or (direction == "up" and not parent.split_horizontal):
                parent.split_ratio = max(5, parent.split_ratio - layout.grow_amount)
                layout_all = True
            elif (direction == "right" and parent.split_horizontal) or (
                direction == "down" and not parent.split_horizontal
            ):
                parent.split_ratio = min(95, parent.split_ratio + layout.grow_amount)
                layout_all = True

            if layout_all:
                layout.group.layout_all()
                break

        child = parent
        parent = child.parent


@lazy.function
def resize_left(qtile):
    resize(qtile, "left")


@lazy.function
def resize_right(qtile):
    resize(qtile, "right")


@lazy.function
def resize_up(qtile):
    resize(qtile, "up")


@lazy.function
def resize_down(qtile):
    resize(qtile, "down")


# TODO: lazy function to cycle through groups, not currently
# displayed on any other screen, and to bring them into the current
# screen.


# ------------------------------------------------------------------------------
# HOOKS FUNCTIONS --------------------------------------------------------------
# ------------------------------------------------------------------------------
@hook.subscribe.client_new
def floating_windows(window):
    wm_class = window.window.get_wm_class()
    w_name = window.window.get_name()
    if (
        (
            (wm_class == ("jetbrains-pycharm-ce", "jetbrains-pycharm-ce") and w_name in (" ", "win0"))
            or (wm_class == ("java-lang-Thread", "java-lang-Thread") and w_name == "win0")
        )
        or (
            wm_class == ("Steam", "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", ())
            )
        )
        or (wm_class == ("Places", "firefox") and w_name == "Library")
    ):
        window.floating = True


# ------------------------------------------------------------------------------
# EXTRA FUNCTIONS --------------------------------------------------------------
# ------------------------------------------------------------------------------
def get_ip_location(data):
    return data.get("query", "-")


# ------------------------------------------------------------------------------
# KEYBINDINGS ------------------------------------------------------------------
# ------------------------------------------------------------------------------
k = KeysHolder()
m = MouseButtons()

keys = [
    # Change focus between windows in current stack pane
    Key([k.HYPER], "k", lazy.layout.left()),
    Key([k.HYPER], "o", lazy.layout.up()),
    Key([k.HYPER], "l", lazy.layout.down()),
    Key([k.HYPER], "m", lazy.layout.right()),
    Key([k.HYPER], k.LEFT, lazy.layout.left()),
    Key([k.HYPER], k.UP, lazy.layout.up()),
    Key([k.HYPER], k.DOWN, lazy.layout.down()),
    Key([k.HYPER], k.RIGHT, lazy.layout.right()),
    # Move windows up or down in current stack
    Key([k.HYPER, k.SHIFT], "k", lazy.layout.shuffle_left()),
    Key([k.HYPER, k.SHIFT], "o", lazy.layout.shuffle_up()),
    Key([k.HYPER, k.SHIFT], "l", lazy.layout.shuffle_down()),
    Key([k.HYPER, k.SHIFT], "m", lazy.layout.shuffle_right()),
    Key([k.HYPER, k.SHIFT], k.LEFT, lazy.layout.shuffle_left()),
    Key([k.HYPER, k.SHIFT], k.UP, lazy.layout.shuffle_up()),
    Key([k.HYPER, k.SHIFT], k.DOWN, lazy.layout.shuffle_down()),
    Key([k.HYPER, k.SHIFT], k.RIGHT, lazy.layout.shuffle_right()),
    # Flip windows?
    Key([k.HYPER, k.CONTROL], "k", lazy.layout.flip_left()),
    Key([k.HYPER, k.CONTROL], "o", lazy.layout.flip_up()),
    Key([k.HYPER, k.CONTROL], "l", lazy.layout.flip_down()),
    Key([k.HYPER, k.CONTROL], "m", lazy.layout.flip_right()),
    Key([k.HYPER, k.CONTROL], k.LEFT, lazy.layout.flip_left()),
    Key([k.HYPER, k.CONTROL], k.UP, lazy.layout.flip_up()),
    Key([k.HYPER, k.CONTROL], k.DOWN, lazy.layout.flip_down()),
    Key([k.HYPER, k.CONTROL], k.RIGHT, lazy.layout.flip_right()),
    # Resize windows
    Key([k.HYPER, k.ALT], "k", resize_left),
    Key([k.HYPER, k.ALT], "o", resize_up),
    Key([k.HYPER, k.ALT], "l", resize_down),
    Key([k.HYPER, k.ALT], "m", resize_right),
    Key([k.HYPER, k.ALT], k.LEFT, resize_left),
    Key([k.HYPER, k.ALT], k.UP, resize_up),
    Key([k.HYPER, k.ALT], k.DOWN, resize_down),
    Key([k.HYPER, k.ALT], k.RIGHT, resize_right),
    # Grow windows
    Key([k.HYPER, k.SHIFT, k.ALT], "k", lazy.layout.grow_left()),
    Key([k.HYPER, k.SHIFT, k.ALT], "o", lazy.layout.grow_up()),
    Key([k.HYPER, k.SHIFT, k.ALT], "l", lazy.layout.grow_down()),
    Key([k.HYPER, k.SHIFT, k.ALT], "m", lazy.layout.grow_right()),
    Key([k.HYPER, k.SHIFT, k.ALT], k.LEFT, lazy.layout.grow_left()),
    Key([k.HYPER, k.SHIFT, k.ALT], k.UP, lazy.layout.grow_up()),
    Key([k.HYPER, k.SHIFT, k.ALT], k.DOWN, lazy.layout.grow_down()),
    Key([k.HYPER, k.SHIFT, k.ALT], k.RIGHT, lazy.layout.grow_right()),
    # Cycle through current layout (and therefore screen and group)'s windows
    Key([k.ALT], k.TAB, lazy.layout.next()),
    Key([k.ALT, k.SHIFT], k.TAB, lazy.layout.previous()),
    # Cycle through layouts
    Key([k.SUPER], k.TAB, lazy.next_layout()),
    Key([k.SUPER, k.SHIFT], k.TAB, lazy.previous_layout()),
    # Cycle focus through screens
    Key([k.HYPER], k.TAB, lazy.next_screen()),
    Key([k.HYPER, k.SHIFT], k.TAB, lazy.previous_screen()),
    # Cycle through groups
    Key([k.CONTROL, k.ALT], k.RIGHT, next_workspace),
    Key([k.CONTROL, k.ALT], k.LEFT, previous_workspace),
    Key([k.CONTROL, k.ALT, k.SHIFT], k.RIGHT, to_next_workspace),
    Key([k.CONTROL, k.ALT, k.SHIFT], k.LEFT, to_previous_workspace),
    # Windows
    Key([k.HYPER, k.SHIFT], k.SPACE, lazy.layout.rotate()),
    Key([k.HYPER, k.SHIFT], k.RETURN, lazy.layout.toggle_split()),
    Key([k.HYPER], "w", lazy.window.kill()),
    Key([k.HYPER], "f", lazy.window.toggle_floating()),
    Key([k.HYPER], "x", lazy.window.toggle_fullscreen()),
    Key([k.HYPER], "d", lazy.window.toggle_maximize()),
    Key([k.HYPER], "b", float_to_front),
    # Launchers
    Key([k.HYPER], k.RETURN, lazy.spawn("terminator")),
    Key([k.SUPER], k.RETURN, lazy.spawn("terminator")),  # For safety
    Key([k.HYPER], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
    Key([k.HYPER], "c", lazy.spawn("terminator -x vim {}".format(__file__))),
    Key([k.SUPER], "x", lazy.spawn("xterm -hold +ls -e xmodmap")),
    Key([k.ALT], "F2", lazy.spawn("gmrun")),
    Key([], k.PRINT, lazy.spawn("xfce4-screenshooter")),
    Key([k.SHIFT], k.PRINT, lazy.spawn("xfce4-screenshooter -r")),
    # QTile
    Key([k.HYPER, k.CONTROL], "r", lazy.restart()),
    Key([k.SUPER, k.CONTROL], "r", lazy.restart()),  # For safety
    Key([k.HYPER, k.CONTROL], "q", lazy.shutdown()),
    # Special keys
    Key([], k.SCROLL_LOCK, lazy.spawn("toggle-kb-led")),
    # Multimedia keys
    Key([], k.XF86AUDIORAISEVOLUME, lazy.spawn("amixer -c 0 -q set Master 2dB+")),
    Key([], k.XF86AUDIOLOWERVOLUME, lazy.spawn("amixer -c 0 -q set Master 2dB-")),
    Key([k.HYPER], k.XF86AUDIORAISEVOLUME, lazy.spawn("mpc volume +5")),
    Key([k.HYPER], k.XF86AUDIOLOWERVOLUME, lazy.spawn("mpc volume -5")),
    Key([], k.XF86AUDIONEXT, lazy.spawn("mpc next")),
    Key([], k.XF86AUDIOPREV, lazy.spawn("mpc prev")),
    Key([], k.XF86AUDIOPLAY, lazy.spawn("mpc toggle")),
    Key([], k.XF86AUDIOSTOP, lazy.spawn("mpc stop")),
    Key([], k.XF86MONBRIGHTNESSUP, lazy.spawn("brightnessctl set +2%")),
    Key([], k.XF86MONBRIGHTNESSDOWN, lazy.spawn("brightnessctl set -2%")),
]

mouse = [
    Drag(
        [k.ALT],
        m.LEFT,
        lazy.window.set_position_floating(),
        start=lazy.window.get_position(),
    ),
    Drag(
        [k.HYPER, k.ALT],
        m.LEFT,
        lazy.window.set_position(),
        start=lazy.window.get_position(),
    ),
    Drag([k.ALT], m.RIGHT, lazy.window.set_size_floating(), start=lazy.window.get_size()),
    Click([k.HYPER], m.LEFT, lazy.window.bring_to_front()),
    Click([k.HYPER], m.MIDDLE, lazy.window.kill()),
]


# ------------------------------------------------------------------------------
# GROUPS -----------------------------------------------------------------------
# ------------------------------------------------------------------------------
groups_def = [("1", k.COMMA), ("2", k.SEMICOLON), ("3", k.COLON), ("4", k.EXCLAMATION)]
groups = [Group(name) for name, char in groups_def]

for name, char in groups_def:
    keys.extend(
        [
            # bring group to current screen
            Key([k.HYPER, k.CONTROL], char, lazy.group[name].toscreen()),
            # move focused window to group and switch to group
            Key([k.HYPER, k.SHIFT], char, lazy.window.togroup(name)),
        ]
    )


# ------------------------------------------------------------------------------
# LAYOUTS ----------------------------------------------------------------------
# ------------------------------------------------------------------------------
layouts = [
    layout.Max(only_focused=True),
    layout.Bsp(
        border_normal="#000000",
        border_focus="#ffffff",
        border_width=1,
        fair=False,
        lower_right=False,
        margin=20,
        grow_amount=1,
    ),
]

floating_layout = layout.Floating(
    border_normal="#000000",
    border_focus="#ffffff",
    float_rules=[
        *layout.Floating.default_float_rules,
        Match(wm_class="confirm"),
        Match(wm_class="dialog"),
        Match(wm_class="download"),
        Match(wm_class="error"),
        Match(wm_class="feh"),
        Match(wm_class="file_progress"),
        Match(wm_class="notification"),
        Match(wm_class="splash"),
        Match(wm_class="toolbar"),
        Match(wm_class="Pinentry-gtk-2"),
        Match(wm_class="gcr-prompter"),  # tomb pinentry
        Match(wm_class="ssh-askpass"),  # ssh-askpass
        Match(wm_class="confirmreset"),  # gitk
        Match(wm_class="makebranch"),  # gitk
        Match(wm_class="maketag"),  # gitk
        Match(title="branchdialog"),  # gitk
        Match(title="pinentry"),  # GPG key password entry
        Match(title="Terminator Preferences"),
    ],
)


# ------------------------------------------------------------------------------
# SCREENS AND BARS -------------------------------------------------------------
# ------------------------------------------------------------------------------
widget_defaults = dict(font="NotoSansMonoBlack", fontsize=12, padding=3)

bar_size = 24
bar_opacity = 0.6

net_interface = "enp3s0"
graph_config = dict(width=50, type="linefill", samples=20, line_width=2, interace=net_interface)

hostname = platform.node()


def get_num_monitors():
    num_monitors = 0
    try:
        display = xdisplay.Display()
        screen = display.screen()
        resources = screen.root.xrandr_get_screen_resources()

        for output in resources.outputs:
            monitor = display.xrandr_get_output_info(output, resources.config_timestamp)
            preferred = False
            if hasattr(monitor, "preferred"):
                preferred = monitor.preferred
            elif hasattr(monitor, "num_preferred"):
                preferred = monitor.num_preferred
            if preferred:
                num_monitors += 1
    except Exception as e:
        # always setup at least one monitor
        return 1
    else:
        return num_monitors or 1


num_monitors = get_num_monitors()

laptop_battery = []
if hostname == "laptop":
    laptop_battery.append(widget.Battery(discharge_char="↓", charge_char="↑", format="{percent:2.0%}{char}"))

text_color = "#99c0de"
light_color = "#404552"
dark_color = "#2f343f"

separator_config = {"padding": 5, "linewidth": 0}
light_sep = lambda: widget.Sep(**separator_config, background=light_color)
dark_sep = lambda: widget.Sep(**separator_config, background=dark_color)

triangle_config = {"padding": 0, "fontsize": 28}
light_triangle_left = lambda: widget.TextBox(**triangle_config, text="", foreground=light_color, background=dark_color)
light_triangle_right = lambda: widget.TextBox(
    **triangle_config, text="", foreground=light_color, background=dark_color
)
dark_triangle_left = lambda: widget.TextBox(**triangle_config, text="", foreground=dark_color, background=light_color)
dark_triangle_right = lambda: widget.TextBox(**triangle_config, text="", foreground=dark_color, background=light_color)

screens = [
    Screen(
        top=bar.Bar(
            [
                dark_sep(),
                widget.TextBox(
                    text="¤",
                    margin=3,
                    fontsize=28,
                    background=dark_color,
                ),
                dark_sep(),
                widget.GroupBox(
                    highlight_method="line",
                    this_screen_border="#5294e2",
                    this_current_screen_border="#5294e2",
                    active="#ffffff",
                    inactive="#848e96",
                    background=dark_color,
                ),
                dark_triangle_right(),
                widget.Prompt(),
                widget.WindowName(foreground=text_color),
                widget.Chord(
                    chords_colors={
                        "launch": ("#ff0000", "#ffffff"),
                    },
                    name_transform=lambda name: name.upper(),
                ),
                *laptop_battery,
                widget.Systray(padding=8, icon_size=16),
                light_sep(),
                dark_triangle_left(),
                widget.CurrentLayoutIcon(
                    scale=0.6,
                    foreground=text_color,
                    background=dark_color,
                ),
                widget.Clock(
                    format="%Y-%m-%d %a %H:%M",
                    foreground=text_color,
                    background=dark_color,
                ),
                dark_sep(),
                light_triangle_left(),
                widget.TextBox(
                    text=" ",
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn(os.path.expanduser("~/.config/rofi/powermenu.sh"))
                    },
                    foreground="#e39378",
                ),
            ],
            size=bar_size,
            background=light_color,
        ),
        bottom=bar.Bar(
            [
                widget.Spacer(),
                widget.TextBox(text="devboard", mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("terminator -x zsh -c devboard")}),
                widget.TextBox(text=" ", mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("pavucontrol")}),
                widget.Volume(mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("pavucontrol")}, foreground=text_color),
                dark_triangle_left(),
                widget.Net(
                    interface=net_interface,
                    update_interval=2,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                widget.NetGraph(
                    start_pos="bottom",
                    bandwidth_type="down",
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                widget.NetGraph(
                    start_pos="bottom",
                    bandwidth_type="up",
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                dark_sep(),
                light_triangle_left(),
                widget.GenPollUrl(
                    url="http://ip-api.com/json/",
                    parse=get_ip_location,
                    foreground=text_color,
                    update_interval=3600 * 4,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("bash -c 'notify-send ifconfig \"$(ifconfig enp3s0)\"'"),
                    },
                ),
                dark_triangle_left(),
                dark_sep(),
                widget.CPU(
                    format="{load_percent}%",
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -x bash -ilc 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.ThermalSensor(
                    tag_sensor="Core 0",
                    show_tag=True,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.CPUGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.Memory(
                    format="{MemUsed:.0f}{mm}/{MemTotal:.0f}{mm} ({MemPercent:.0f}%)",
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_MEM'"),
                    },
                ),
                widget.MemoryGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=PERCENT_MEM'"),
                    },
                ),
                widget.DF(
                    format="{uf}{m}/{s}{m} ({r:.0f}%)",
                    visible_on_warn=False,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=IO_RATE'"),
                    },
                ),
                widget.HDDBusyGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=IO_RATE'"),
                    },
                ),
                dark_sep(),
            ],
            size=bar_size,
            background=light_color,
        ),
    )
]

if num_monitors > 1:
    for m in range(num_monitors - 1):
        screens.append(
            Screen(
                top=bar.Bar(
                    [
                        dark_sep(),
                        widget.TextBox(
                            text="¤",
                            margin=3,
                            fontsize=28,
                            background=dark_color,
                        ),
                        dark_sep(),
                        widget.GroupBox(
                            highlight_method="line",
                            this_screen_border="#5294e2",
                            this_current_screen_border="#5294e2",
                            active="#ffffff",
                            inactive="#848e96",
                            background=dark_color,
                        ),
                        dark_triangle_right(),
                        widget.WindowName(foreground=text_color),
                    ],
                    size=bar_size,
                    background=light_color,
                )
            )
        )


# ------------------------------------------------------------------------------
# WINDOWN MANAGER NAME ---------------------------------------------------------
# ------------------------------------------------------------------------------
wmname = "qtile"

Logs

Last 100 log lines:

% tail -n100 ~/.local/share/qtile/qtile.log
  File "/usr/lib/python3.12/site-packages/libqtile/core/manager.py", line 962, in f
    self.core.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/core.py", line 898, in flush
    self.conn.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/xcbq.py", line 613, in flush
    return self.conn.flush()
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 577, in wrapper
    self.invalid()
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 567, in invalid
    raise ConnectionException(err)
xcffib.ConnectionException: xcb connection errors because of socket, pipe and other stream errors.
2024-05-19 23:39:22,912 ERROR libqtile loop.py:_handle_exception():L62 Exception in event loop:
Traceback (most recent call last):
  File "/usr/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.12/site-packages/libqtile/core/manager.py", line 962, in f
    self.core.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/core.py", line 898, in flush
    self.conn.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/xcbq.py", line 613, in flush
    return self.conn.flush()
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 577, in wrapper
    self.invalid()
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 567, in invalid
    raise ConnectionException(err)
xcffib.ConnectionException: xcb connection errors because of socket, pipe and other stream errors.
2024-05-19 23:39:22,912 ERROR libqtile loop.py:_handle_exception():L62 Exception in event loop:
Traceback (most recent call last):
  File "/usr/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.12/site-packages/libqtile/core/manager.py", line 962, in f
    self.core.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/core.py", line 898, in flush
    self.conn.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/xcbq.py", line 613, in flush
    return self.conn.flush()
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 577, in wrapper
    self.invalid()
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 567, in invalid
    raise ConnectionException(err)
xcffib.ConnectionException: xcb connection errors because of socket, pipe and other stream errors.
2024-05-19 23:39:22,914 ERROR libqtile loop.py:_handle_exception():L62 Exception in event loop:
Traceback (most recent call last):
  File "/usr/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.12/site-packages/libqtile/core/manager.py", line 962, in f
    self.core.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/core.py", line 898, in flush
    self.conn.flush()
  File "/usr/lib/python3.12/site-packages/libqtile/backend/x11/xcbq.py", line 613, in flush
    return self.conn.flush()
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 577, in wrapper
    self.invalid()
  File "/usr/lib/python3.12/site-packages/xcffib/__init__.py", line 567, in invalid
    raise ConnectionException(err)
xcffib.ConnectionException: xcb connection errors because of socket, pipe and other stream errors.
2024-05-19 23:39:22,917 ERROR libqtile base.py:on_done():L856 Failed to reschedule timer for net.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 850, in on_done
    self.update(result)
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 754, in update
    old_width = self.layout.width
                ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/backend/base/drawer.py", line 421, in width
    return self.layout.get_pixel_size()[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/pangocffi.py", line 137, in get_pixel_size
    pango.pango_layout_get_pixel_size(self._pointer, width, height)
TypeError: initializer for ctype 'PangoLayout *' must be a cdata pointer, not NoneType
2024-05-19 23:39:22,917 ERROR libqtile base.py:on_done():L856 Failed to reschedule timer for memory.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 850, in on_done
    self.update(result)
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 754, in update
    old_width = self.layout.width
                ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/backend/base/drawer.py", line 421, in width
    return self.layout.get_pixel_size()[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/pangocffi.py", line 137, in get_pixel_size
    pango.pango_layout_get_pixel_size(self._pointer, width, height)
TypeError: initializer for ctype 'PangoLayout *' must be a cdata pointer, not NoneType
2024-05-19 23:39:22,918 ERROR libqtile base.py:on_done():L856 Failed to reschedule timer for cpu.
Traceback (most recent call last):
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 850, in on_done
    self.update(result)
  File "/usr/lib/python3.12/site-packages/libqtile/widget/base.py", line 754, in update
    old_width = self.layout.width
                ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/backend/base/drawer.py", line 421, in width
    return self.layout.get_pixel_size()[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/site-packages/libqtile/pangocffi.py", line 137, in get_pixel_size
    pango.pango_layout_get_pixel_size(self._pointer, width, height)
TypeError: initializer for ctype 'PangoLayout *' must be a cdata pointer, not NoneType
2024-05-19 23:39:22,920 WARNING libqtile lifecycle.py:_atexit():L37 Qtile will now terminate

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.
@pawamoy
Copy link
Contributor Author

pawamoy commented May 19, 2024

Re-reading the discussion, I realize I did not try to isolate the issue by disabling widgets. Let me do that and report back.

@pawamoy
Copy link
Contributor Author

pawamoy commented May 19, 2024

I disabled all widgets and the issue persists. I actually don't have to force off my monitors: I can simply deactivate one of them in arandr, and every 10 seconds the memory taken by Qtile increases by the initial amount:

  • initial: 253K
  • 10s: 613K
  • 20s: 973K
  • 30s: 1.4M
  • 40s: 1.7M
  • etc.

Is it because of screens then 🤔? I have two screens, one deactivated 🤔

The config file is only executed once on startup, right?

@pawamoy
Copy link
Contributor Author

pawamoy commented May 19, 2024

OK I commented out almost everything in my config file. Now it's just two keys (to restart Qtile), one screen with an empty top bar, and the BSP layout.

The memory starts leaking as soon as one monitor is deactivated (through arandr), and stops leaking as soon as the monitor is reactivated (through arandr again).

So it looks like the issue lies somewhere low in the stack 🤔

Happy to try and provide logs if you can guide me 😄

@pawamoy
Copy link
Contributor Author

pawamoy commented May 19, 2024

A bit more weirdness 😂 And it's kinda getting us closer to my initial intuition on the GPU change: the memory only starts leaking if my right monitor is deactivated (lets hope its position on my desk is irrelevant though 🤣). Both are the same device (iiyama something), however one is plugged to my graphic card with an HDMI cable/port, while the other one, which is causing the memory leak when turned off, is plugged with a display-port (GPU) to HDMI (monitor) cable (I bought these monitors many years ago, and they don't have display ports, "only" HDMI, DVI and VGA, while my GPU has only one HDMI port and 3 display ports).

Sure enough, if I actually unplug the HDMI/display-port monitor, the memory stops leaking.

@pawamoy
Copy link
Contributor Author

pawamoy commented May 19, 2024

Just to be specific: the leak happens when the monitor is "sleeping" rather than turned off. Turning it off by pressing the power button of the monitor does not cause a leak.

@jwijenbergh
Copy link
Contributor

Hmmm would you be able to test other X11 WMs? E.g. i3

@pawamoy
Copy link
Contributor Author

pawamoy commented May 20, 2024

Sure, that's a good idea :) At this point it indeed looks like we're going lower in the stack than Qtile itself ^^

@pawamoy
Copy link
Contributor Author

pawamoy commented May 21, 2024

So I tried with Openbox 🙂 There's no memory leaks, but I witnessed something that matches my previous observation that the memory leaks every 10 seconds: in Openbox, with the problematic monitor disabled through arandr, every 10 seconds Openbox would pop up a dialog with screen configuration (mirror, only left/right, extend), as if it just detected that the monitor was plugged in.

So it looks like my monitor (or rather, the way it's plugged to the GPU) "announces" itself every 10 seconds when it is not already active. In other WM it causes a pop-up, and in Qtile, a memory leak. Hopefully that gives Qtile maintainers a helpful hint at where to look in the code to avoid allocating more pixmaps when a monitor merely announces itself up? Not sure if that makes sense.

In the coming days I'll try to buy another cable, or a display-port-to-HDMI adapter, and see if the issue persists. I really do not want to buy a new monitor to fix that...

By the way, I have also tried to entirely disable sleeping and monitors going to sleep on my ArchLinux system, but failed to do so. I'll explore again what the internet says.

@elParaguayo
Copy link
Member

Interesting. If there's some sort of notification then it's possible we're trying to reconfigure screens.

Can you add a hooked function in your config to see if we're getting screen change events?

e.g.

from libqtile import hook
from libqtile.log_utils import logger

@hook.subscribe.screen_change
def screen_change(event):
    logger.warning("Screen change event received.")

Let's see if this is fired repeatedly.

@tych0
Copy link
Member

tych0 commented May 21, 2024

I wonder, are we leaking widgets here:

qtile/libqtile/bar.py

Lines 451 to 454 in d9f4c08

for name, w in self.qtile.widgets_map.copy().items():
if w in self.widgets:
w.finalize()
del self.qtile.widgets_map[name]
?

Maybe the copy means that .finalize() is not explicitly called?

@elParaguayo
Copy link
Member

If that's the case, wouldn't we see memory leaks every time we reloaded configs?

@pawamoy
Copy link
Contributor Author

pawamoy commented May 21, 2024

@tych0 note that I witnessed the leaks with zero widgets in my single top bar.

@elParaguayo here are the logs:

2024-05-21 18:03:58,619 WARNING libqtile lifecycle.py:_atexit():L33 Restarting Qtile with os.execv(...)
2024-05-21 18:05:25,865 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:25,866 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:25,866 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:36,324 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:37,047 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:46,341 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:47,170 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:56,686 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:05:57,514 WARNING libqtile config.py:screen_change():L16 Screen change event received.

First line = Qtile restarted to activate the hook you suggested. I waited a bit (one minute and a half), tail -fing the logs, then disabled the problematic monitor and sure enough, double event triggered every 10 seconds. The monitor probably wakes up and goes back to sleep rapidly or something.

@jwijenbergh
Copy link
Contributor

could you also start qtile in debug mode and try to find the relevant logs when this happens? to do that pass -l=DEBUG to qtile start

@tych0
Copy link
Member

tych0 commented May 21, 2024

note that I witnessed the leaks with zero widgets in my single top bar.

huh; looking at libqtile.config.Screen, the only other thing I see that might do an allocation is wallpaper painting. Did you have that enabled by chance?

@pawamoy
Copy link
Contributor Author

pawamoy commented May 21, 2024

@jwijenbergh sure, let me do that.

@tych0 I do set a wallpaper, though through pywal, in .xprofile, not through Qtile directly, if that's a thing 🤔

@pawamoy
Copy link
Contributor Author

pawamoy commented May 21, 2024

@jwijenbergh

2024-05-21 18:46:03,582 DEBUG libqtile core.py:handle_event():L312 X11 event: ScreenChangeNotify (targets: [<bound method Core.handle_ScreenChangeNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,582 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:46:03,583 INFO libqtile manager.py:reconfigure_screens():L422 Reconfiguring screens.
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,615 DEBUG libqtile window.py:handle_PropertyNotify():L2228 Unknown window property: _NET_FRAME_EXTENTS
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,615 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,620 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,632 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Icon.handle_PropertyNotify of <libqtile.widget.systray.Icon object at 0x7a9ac420ad50>>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:03,632 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:04,305 DEBUG libqtile core.py:handle_event():L312 X11 event: ScreenChangeNotify (targets: [<bound method Core.handle_ScreenChangeNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,305 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:46:04,306 INFO libqtile manager.py:reconfigure_screens():L422 Reconfiguring screens.
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,318 DEBUG libqtile window.py:handle_PropertyNotify():L2228 Unknown window property: _NET_FRAME_EXTENTS
2024-05-21 18:46:04,318 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:04,319 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,319 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,319 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,327 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Icon.handle_PropertyNotify of <libqtile.widget.systray.Icon object at 0x7a9ac420ad50>>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:04,327 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:13,601 DEBUG libqtile core.py:handle_event():L312 X11 event: ScreenChangeNotify (targets: [<bound method Core.handle_ScreenChangeNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,601 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:46:13,602 INFO libqtile manager.py:reconfigure_screens():L422 Reconfiguring screens.
2024-05-21 18:46:13,619 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,619 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:13,619 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,619 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:13,620 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,620 DEBUG libqtile window.py:handle_PropertyNotify():L2228 Unknown window property: _NET_FRAME_EXTENTS
2024-05-21 18:46:13,620 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:13,620 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,620 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,620 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,634 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Icon.handle_PropertyNotify of <libqtile.widget.systray.Icon object at 0x7a9ac420ad50>>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:13,634 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:14,437 DEBUG libqtile core.py:handle_event():L312 X11 event: ScreenChangeNotify (targets: [<bound method Core.handle_ScreenChangeNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,438 WARNING libqtile config.py:screen_change():L16 Screen change event received.
2024-05-21 18:46:14,438 INFO libqtile manager.py:reconfigure_screens():L422 Reconfiguring screens.
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,450 DEBUG libqtile window.py:handle_PropertyNotify():L2228 Unknown window property: _NET_FRAME_EXTENTS
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,450 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,451 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,461 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Icon.handle_PropertyNotify of <libqtile.widget.systray.Icon object at 0x7a9ac420ad50>>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])
2024-05-21 18:46:14,462 DEBUG libqtile core.py:handle_event():L312 X11 event: ConfigureNotify (targets: [])
2024-05-21 18:46:16,766 DEBUG libqtile core.py:handle_event():L312 X11 event: PropertyNotify (targets: [<bound method Window.handle_PropertyNotify of Window(name='/bin/zsh', wid=8388611)>, <bound method Core.handle_PropertyNotify of <libqtile.backend.x11.core.Core object at 0x7a9ac6e927e0>>])

Let me know if this is enough, logs are still being written in DEBUG, I can paste more.

@tych0
Copy link
Member

tych0 commented May 21, 2024

Yeah, it is a thing via Screen(wallpaper="/path/to/image"), but if you're not using it, it must be something else. I'm just reading code in Screen() and trying to see any unfreed allocations it might perform...

@tych0
Copy link
Member

tych0 commented May 21, 2024

i think it is definitely true that at least the x11 wallpaper painting code leaks resources when screens are reconfigured, though.

@tych0
Copy link
Member

tych0 commented May 21, 2024

Any chance #4825 helps?

@pawamoy
Copy link
Contributor Author

pawamoy commented May 22, 2024

Nope :/

EDIT: to explain, I applied the changes directly in /usr/lib/python3.12/site-packages/libqtile, and both logged out / logged back in, and rebooted, and I still see the leaks :/

@pawamoy
Copy link
Contributor Author

pawamoy commented May 22, 2024

Just randomly throwing out things to look for:

  • cached properties, or similar objects that are known to cause leaks because of cyclic references that can't be garbage collected
  • global variables (whether in modules or classes)
  • 🤷‍♂️ ???

@pawamoy
Copy link
Contributor Author

pawamoy commented May 22, 2024

I added this to the screen change hook:

@hook.subscribe.screen_change
def screen_change(event):
    logger.warning("Screen change event received.")
    logger.warning(str(gc.get_stats()))
    logger.warning(str(gc.get_count()))
    logger.warning(str(gc.garbage))
Click to show
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L18 [{'collections': 168, 'collected': 2979, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L19 (592, 3, 4)
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L18 [{'collections': 168, 'collected': 2979, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L19 (600, 3, 4)
2024-05-22 12:00:23,313 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:23,460 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:23,461 WARNING libqtile config.py:screen_change():L18 [{'collections': 168, 'collected': 2979, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:23,461 WARNING libqtile config.py:screen_change():L19 (606, 3, 4)
2024-05-22 12:00:23,461 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:33,801 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:33,801 WARNING libqtile config.py:screen_change():L18 [{'collections': 172, 'collected': 4652, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:33,801 WARNING libqtile config.py:screen_change():L19 (229, 7, 4)
2024-05-22 12:00:33,802 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:34,523 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:34,523 WARNING libqtile config.py:screen_change():L18 [{'collections': 173, 'collected': 5079, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:34,523 WARNING libqtile config.py:screen_change():L19 (97, 8, 4)
2024-05-22 12:00:34,524 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:43,815 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:43,815 WARNING libqtile config.py:screen_change():L18 [{'collections': 174, 'collected': 5492, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:43,815 WARNING libqtile config.py:screen_change():L19 (386, 9, 4)
2024-05-22 12:00:43,816 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:44,644 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:44,644 WARNING libqtile config.py:screen_change():L18 [{'collections': 175, 'collected': 5919, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:44,644 WARNING libqtile config.py:screen_change():L19 (248, 10, 4)
2024-05-22 12:00:44,644 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:54,088 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:54,089 WARNING libqtile config.py:screen_change():L18 [{'collections': 176, 'collected': 6367, 'uncollectable': 0}, {'collections': 15, 'collected': 2192, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:54,089 WARNING libqtile config.py:screen_change():L19 (513, 11, 4)
2024-05-22 12:00:54,089 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:00:54,921 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:00:54,921 WARNING libqtile config.py:screen_change():L18 [{'collections': 176, 'collected': 6367, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:00:54,921 WARNING libqtile config.py:screen_change():L19 (363, 0, 5)
2024-05-22 12:00:54,921 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:04,393 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:04,393 WARNING libqtile config.py:screen_change():L18 [{'collections': 177, 'collected': 6920, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:04,394 WARNING libqtile config.py:screen_change():L19 (558, 1, 5)
2024-05-22 12:01:04,394 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:05,221 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:05,221 WARNING libqtile config.py:screen_change():L18 [{'collections': 178, 'collected': 7424, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:05,221 WARNING libqtile config.py:screen_change():L19 (369, 2, 5)
2024-05-22 12:01:05,221 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:14,682 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:14,683 WARNING libqtile config.py:screen_change():L18 [{'collections': 179, 'collected': 7977, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:14,683 WARNING libqtile config.py:screen_change():L19 (535, 3, 5)
2024-05-22 12:01:14,683 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:15,503 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:15,503 WARNING libqtile config.py:screen_change():L18 [{'collections': 180, 'collected': 8481, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:15,503 WARNING libqtile config.py:screen_change():L19 (346, 4, 5)
2024-05-22 12:01:15,503 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:24,964 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:24,964 WARNING libqtile config.py:screen_change():L18 [{'collections': 181, 'collected': 9034, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:24,965 WARNING libqtile config.py:screen_change():L19 (505, 5, 5)
2024-05-22 12:01:24,965 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:25,790 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:25,790 WARNING libqtile config.py:screen_change():L18 [{'collections': 182, 'collected': 9538, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:25,791 WARNING libqtile config.py:screen_change():L19 (316, 6, 5)
2024-05-22 12:01:25,791 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:35,250 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:35,250 WARNING libqtile config.py:screen_change():L18 [{'collections': 183, 'collected': 10091, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:35,251 WARNING libqtile config.py:screen_change():L19 (504, 7, 5)
2024-05-22 12:01:35,251 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:36,074 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:36,074 WARNING libqtile config.py:screen_change():L18 [{'collections': 184, 'collected': 10595, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:36,074 WARNING libqtile config.py:screen_change():L19 (286, 8, 5)
2024-05-22 12:01:36,074 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:45,537 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:45,537 WARNING libqtile config.py:screen_change():L18 [{'collections': 185, 'collected': 11092, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:45,537 WARNING libqtile config.py:screen_change():L19 (499, 9, 5)
2024-05-22 12:01:45,537 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:46,363 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:46,363 WARNING libqtile config.py:screen_change():L18 [{'collections': 186, 'collected': 11624, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:46,363 WARNING libqtile config.py:screen_change():L19 (323, 10, 5)
2024-05-22 12:01:46,363 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:55,820 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:55,820 WARNING libqtile config.py:screen_change():L18 [{'collections': 187, 'collected': 12107, 'uncollectable': 0}, {'collections': 16, 'collected': 5454, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:55,821 WARNING libqtile config.py:screen_change():L19 (575, 11, 5)
2024-05-22 12:01:55,821 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:01:56,654 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:01:56,654 WARNING libqtile config.py:screen_change():L18 [{'collections': 187, 'collected': 12107, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:01:56,654 WARNING libqtile config.py:screen_change():L19 (438, 0, 6)
2024-05-22 12:01:56,654 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:06,107 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:06,108 WARNING libqtile config.py:screen_change():L18 [{'collections': 188, 'collected': 12660, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:06,108 WARNING libqtile config.py:screen_change():L19 (601, 1, 6)
2024-05-22 12:02:06,108 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:06,938 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:06,938 WARNING libqtile config.py:screen_change():L18 [{'collections': 189, 'collected': 13164, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:06,938 WARNING libqtile config.py:screen_change():L19 (432, 2, 6)
2024-05-22 12:02:06,938 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:16,385 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:16,386 WARNING libqtile config.py:screen_change():L18 [{'collections': 190, 'collected': 13710, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:16,386 WARNING libqtile config.py:screen_change():L19 (600, 3, 6)
2024-05-22 12:02:16,386 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:17,228 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:17,228 WARNING libqtile config.py:screen_change():L18 [{'collections': 191, 'collected': 14214, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:17,228 WARNING libqtile config.py:screen_change():L19 (396, 4, 6)
2024-05-22 12:02:17,228 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:26,675 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:26,675 WARNING libqtile config.py:screen_change():L18 [{'collections': 192, 'collected': 14746, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:26,676 WARNING libqtile config.py:screen_change():L19 (613, 5, 6)
2024-05-22 12:02:26,676 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:27,499 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:27,499 WARNING libqtile config.py:screen_change():L18 [{'collections': 193, 'collected': 15271, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:27,499 WARNING libqtile config.py:screen_change():L19 (407, 6, 6)
2024-05-22 12:02:27,499 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:36,980 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:36,980 WARNING libqtile config.py:screen_change():L18 [{'collections': 194, 'collected': 15817, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:36,980 WARNING libqtile config.py:screen_change():L19 (583, 7, 6)
2024-05-22 12:02:36,980 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:37,803 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:37,804 WARNING libqtile config.py:screen_change():L18 [{'collections': 195, 'collected': 16328, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:37,804 WARNING libqtile config.py:screen_change():L19 (387, 8, 6)
2024-05-22 12:02:37,804 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:47,255 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:47,255 WARNING libqtile config.py:screen_change():L18 [{'collections': 196, 'collected': 16874, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:47,256 WARNING libqtile config.py:screen_change():L19 (564, 9, 6)
2024-05-22 12:02:47,256 WARNING libqtile config.py:screen_change():L20 []
2024-05-22 12:02:48,083 WARNING libqtile config.py:screen_change():L17 Screen change event received.
2024-05-22 12:02:48,083 WARNING libqtile config.py:screen_change():L18 [{'collections': 197, 'collected': 17385, 'uncollectable': 0}, {'collections': 17, 'collected': 8912, 'uncollectable': 0}, {'collections': 1, 'collected': 0, 'uncollectable': 0}]
2024-05-22 12:02:48,083 WARNING libqtile config.py:screen_change():L19 (364, 10, 6)
2024-05-22 12:02:48,083 WARNING libqtile config.py:screen_change():L20 []

It's not very conclusive.

@tych0
Copy link
Member

tych0 commented May 22, 2024

I suspect that python's gc won't show much interesting, because the python objects are probably getting collected correctly, and we're just forgetting to do some x11 API call to free some x11 resource.

Can you try without a bar and see if it still happens? I have read all this code several times and it looks okay to me, but the bar allocations are somewhat complicated, so it wouldn't surprise me if there's something lurking there.

@tych0
Copy link
Member

tych0 commented May 22, 2024

Oh, maybe this? tych0@96d4b60

@pawamoy
Copy link
Contributor Author

pawamoy commented May 22, 2024

Still no luck :(

Will now try without a bar :)

@pawamoy
Copy link
Contributor Author

pawamoy commented May 22, 2024

🎉 🎉 🎉 🎉 🎉 🎉 🎉 No bar, no leak!

The leak seems proportional to the the number of bars and widgets within them. With a single empty bar, ~300K leak with each screen reconfiguration. With my complete bars, it's more like 8M.

@tych0
Copy link
Member

tych0 commented May 23, 2024

That one has a bug, so if it didn't crash, I think the patch wasn't applied correctly. I'm pretty hopeful this will fix the issue: 32ce136

Can you try that one instead?

@pawamoy
Copy link
Contributor Author

pawamoy commented May 23, 2024

Unfortunately, no, it still leaks with a single empty bar 😕

@tych0
Copy link
Member

tych0 commented May 23, 2024

Ok. Can you add some logging to confirm that it is applied correctly? I'm quite perplexed at this point. The above patch does fix a real leak... but maybe we have more? does the amount of memory leaked go down with that patch?

@tych0
Copy link
Member

tych0 commented May 29, 2024

Can you get an xtrace of the xrandr output? I'd like to see exactly the wire format if possible.

@pawamoy
Copy link
Contributor Author

pawamoy commented May 29, 2024

Hmmm, as said previously, xtrace /use/bin/xrandr -q doesn't output anything except a table header (column names). Not sure if I'm missing system libs or something.

@tych0
Copy link
Member

tych0 commented May 29, 2024

I guess you're on arch? they renamed it to x11trace: #4810 (comment)

@pawamoy
Copy link
Contributor Author

pawamoy commented May 29, 2024

No display name to create specified, trying :9
Got connection from unknown(local)
000:<: am lsb-first want 11:0 authorising with 'MIT-MAGIC-COOKIE-1' of length 16
000:>: Success, version is 11:0 vendor='The X.Org Foundation' release=12101013 resource-id=0x01800000 resource-mask=0x001fffff motion-buffer-size=256 max-request-len=65535 image-byte-order=LSBFirst(0x00) bitmap-bit-order=LeastSignificant(0x00) scanline-unit=32 scanline-pad=32 min-keycode=0x08 max-keycode=0x00 pixmap-formats={depth=1 bits/pixel=1 scanline-pad=32},{depth=4 bits/pixel=8 scanline-pad=32},{depth=8 bits/pixel=8 scanline-pad=32},{depth=15 bits/pixel=16 scanline-pad=32},{depth=16 bits/pixel=16 scanline-pad=32},{depth=24 bits/pixel=32 scanline-pad=32},{depth=32 bits/pixel=32 scanline-pad=32}; roots={root=0x000001d9 default-colormap=0x00000020 white-pixel=0x00ffffff black-pixel=0x00000000 input-mask=KeyPress,KeyRelease,ButtonPress,EnterWindow,LeaveWindow,Exposure,StructureNotify,SubstructureNotify,SubstructureRedirect,PropertyChange width[pixel]=1920 height[pixel]=1080 width[mm]=535 height[mm]=301 min-installed-maps=1 max-installed-maps=1 root=0x00000021 backing-stores=WhenMapped(0x01) save-unders=false(0x00) root-depth=24 allowed depths={depth=24 visuals={id=0x00000021 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000022 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000024 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000025 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000026 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000027 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000028 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000029 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002f class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000030 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000031 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000032 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000033 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000034 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000035 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000036 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000037 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000038 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000039 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003f class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000040 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000041 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000042 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000043 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000044 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000045 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000046 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000047 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000048 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000049 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000050 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000051 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000052 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000053 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000054 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000055 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000056 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000057 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000058 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000059 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005a class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005b class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005c class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005d class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005e class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000060 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000061 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000062 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000063 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000064 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000065 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000066 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000067 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000068 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000069 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006a class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006b class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006c class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006d class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006e class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000070 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000071 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000072 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000073 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000074 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000075 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000076 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000077 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000078 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000079 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff};},{depth=1 visuals=;},{depth=4 visuals=;},{depth=8 visuals=;},{depth=15 visuals=;},{depth=16 visuals=;},{depth=32 visuals={id=0x00000023 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000080 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000081 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000082 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000083 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000084 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000085 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000086 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000087 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000088 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000089 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000090 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000091 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000092 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000093 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000094 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000095 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000096 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000097 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000098 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000099 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a0 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a1 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a2 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a3 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a4 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff};};};
000:<:0001: 20: Request(98): QueryExtension name='BIG-REQUESTS'
000:>:0001:32: Reply to QueryExtension: present=true(0x01) major-opcode=133 first-event=0 first-error=0
000:<:0002:  4: BIG-REQUESTS-Request(133,0): Enable 
000:>:0002:32: Reply to Enable: maximum-request-length=4194303
000:<:0003: 20: Request(55): CreateGC cid=0x01800000 drawable=0x000001d9 values={background=0x00ffffff}
000:<:0004: 24: Request(20): GetProperty delete=false(0x00) window=0x000001d9 property=0x17("RESOURCE_MANAGER") type=0x1f("STRING") long-offset=0x00000000 long-length=0x05f5e100
000:>:0004:2228: Reply to GetProperty: type=0x1f("STRING") bytes-after=0x00000000 data='*.background:\t#1c2023\n*.color0:\t#1c2023\n*.color1:\t#bf616a\n*.color10:\t#a3be8c\n*.color11:\t#ebcb8b\n*.color12:\t#8fa1b3\n*.color13:\t#b48ead\n*.color14:\t#96b5b4\n*.color15:\t#c0c5ce\n*.color2:\t#a3be8c\n*.color3:\t#ebcb8b\n*.color4:\t#8fa1b3\n*.color5:\t#b48ead\n*.color6:\t#96b5b4\n*.color7:\t#E1E1E1\n*.color8:\t#919ba0\n*.color9:\t#bf616a\n*.cursorColor:\t#778899\n*.foreground:\t#E1E1E1\nURxvt*background:\t[95]#1C2023\nURxvt*buffered:\tfalse\nURxvt*depth:\t32\nURxvt*externalBorder:\t0\nURxvt*internalBorder:\t0\nURxvt*iso14755:\tfalse\nURxvt*letterSpace:\t-1\nURxvt*saveline:\t15000\nURxvt*scrollBar:\tfalse\nURxvt*scrollBar_right:\tfalse\nURxvt*termName:\trxvt-256color\nURxvt.copyCommand:\txclip -i -selection clipboard\nURxvt.font:\txft:monospace:size=11\nURxvt.geometry:\t90x34\nURxvt.keysym.m-c:\tperl:clipboard:copy\nURxvt.keysym.m-v:\tperl:clipboard:paste\nURxvt.pasteCommand:\txclip -o -selection clipboard\nURxvt.perl-ext-common:\tdefault,clipboard,url-select,keyboard-select\nURxvt.tabbed.tab-bg:\t4\nURxvt.tabbed.tab-fg:\t15\nURxvt.tabbed.tabbar-bg:\t16\nURxvt.tabbed.tabbar-fg:\t4\nURxvt.underlineURLs:\ttrue\nURxvt.urlButton:\t1\nURxvt.urlLauncher:\texo-open\nUXTerm*VT100.geometry:\t90x34\nUXTerm*cursorColor:\twhite\nUXTerm*dynamicColors:\ttrue\nUXTerm*eightBitInput:\ttrue\nUXTerm*faceSize:\t11\nUXTerm*font:\tmonospace\nUXTerm*jumpScroll:\ttrue\nUXTerm*multiScroll:\ttrue\nUXTerm*rightScrollBar:\tfalse\nUXTerm*saveLines:\t10000\nUXTerm*scrollBar:\tfalse\nUXTerm*scrollKey:\ttrue\nUXTerm*scrollTtyOutput:\tfalse\nUXTerm*termName:\txterm-256color\nUXTerm*toolBar:\tfalse\nUXTerm*utf8:\t2\nrofi.color-active:\targb:00000000, #49bbfb, argb:00000000, argb:00000000, #e29a49\nrofi.color-enabled:\ttrue\nrofi.color-normal:\t#1c2023, #919ba0, #1c2023, #a4a4a4, #1c2023\nrofi.color-urgent:\targb:00000000, #f43753, argb:00000000, argb:00000000, #e29a49\nrofi.color-window:\t#1c2023, #919ba0, #1c2023\nrofi.font:\tmonospace 12\nrofi.hide-scrollbar:\ttrue\nrofi.kb-cancel:\tEscape,Alt+F1\nrofi.line-padding:\t2\nrofi.padding:\t20\nrofi.separator-style:\tsolid\nxterm*charClass:\t33:48,35:48,37:48,43:48,45-47:48,64:48,95:48,126:48\nxterm*eightBitInput:\tfalse\nxterm*faceName:\tmonospace:size=11\nxterm*font:\tmonospace\nxterm*loginShell:\ttrue\nxterm*saveLines:\t2000\nxterm*termName:\txterm-256color\nxterm*vt100*geometry:\t90x34\n'
000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
000:>:0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=135 first-event=85 first-error=137
000:<:0006:  8: XKEYBOARD-Request(135,0): UseExtension major=1 minor=0
000:>:0006:32: Reply to UseExtension: major=1 minor=0
000:<:0007: 16: Request(98): QueryExtension name='RANDR'
000:>:0007:32: Reply to QueryExtension: present=true(0x01) major-opcode=140 first-event=89 first-error=147
000:<:0008: 32: Request(98): QueryExtension name='Generic Event Extension'
000:>:0008:32: Reply to QueryExtension: present=true(0x01) major-opcode=128 first-event=0 first-error=0
000:<:0009:  8: Generic Event Extension-Request(128,0): QueryVersion major version=1 minor version=0
000:>:0009:32: Reply to QueryVersion: major version=1 minor version=0
000:<:000a: 12: RANDR-Request(140,0): QueryVersion major-version=1 minor-version=6
000:>:000a:32: Reply to QueryVersion: major-version=1 minor-version=6
000:<:000b:  8: RANDR-Request(140,6): GetScreenSizeRange window=0x000001d9
000:>:000b:32: Reply to GetScreenSizeRange: minWidth=8 minHeight=8 maxWidth=32767 maxHeight=32767
000:<:000c:  8: RANDR-Request(140,8): GetScreenResources window=0x000001d9
000:>:000c:796: Reply to GetScreenResources: timestamp=0x02d2e94b config-timestamp=0x02d364d2 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4; modeinfos={id=0x000001c0 width[pixels]=1920 height[pixels]=1080 dot_clock=148500000 h_sync_start=2008 h_sync_end=2052 h_total=2200 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c1 width[pixels]=1920 height[pixels]=1080 dot_clock=148350000 h_sync_start=2008 h_sync_end=2052 h_total=2200 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c2 width[pixels]=1920 height[pixels]=1080 dot_clock=148500000 h_sync_start=2448 h_sync_end=2492 h_total=2640 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c3 width[pixels]=1680 height[pixels]=1050 dot_clock=146250000 h_sync_start=1784 h_sync_end=1960 h_total=2240 h_skew=0 v_sync_start=1053 v_sync_end=1059 v_total=1089 name_length=9 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001c4 width[pixels]=1600 height[pixels]=1200 dot_clock=162000000 h_sync_start=1664 h_sync_end=1856 h_total=2160 h_skew=0 v_sync_start=1201 v_sync_end=1204 v_total=1250 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c5 width[pixels]=1440 height[pixels]=900 dot_clock=106500000 h_sync_start=1520 h_sync_end=1672 h_total=1904 h_skew=0 v_sync_start=903 v_sync_end=909 v_total=934 name_length=8 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001c6 width[pixels]=1280 height[pixels]=1024 dot_clock=108000000 h_sync_start=1328 h_sync_end=1440 h_total=1688 h_skew=0 v_sync_start=1025 v_sync_end=1028 v_total=1066 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c7 width[pixels]=1280 height[pixels]=960 dot_clock=108000000 h_sync_start=1376 h_sync_end=1488 h_total=1800 h_skew=0 v_sync_start=961 v_sync_end=964 v_total=1000 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c8 width[pixels]=1280 height[pixels]=720 dot_clock=74180000 h_sync_start=1390 h_sync_end=1430 h_total=1650 h_skew=0 v_sync_start=725 v_sync_end=730 v_total=750 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c9 width[pixels]=1280 height[pixels]=720 dot_clock=74250000 h_sync_start=1720 h_sync_end=1760 h_total=1980 h_skew=0 v_sync_start=725 v_sync_end=730 v_total=750 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001ca width[pixels]=1152 height[pixels]=720 dot_clock=67320000 h_sync_start=1208 h_sync_end=1328 h_total=1504 h_skew=0 v_sync_start=721 v_sync_end=724 v_total=746 name_length=8 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001cb width[pixels]=1024 height[pixels]=768 dot_clock=65000000 h_sync_start=1048 h_sync_end=1184 h_total=1344 h_skew=0 v_sync_start=771 v_sync_end=777 v_total=806 name_length=8 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001cc width[pixels]=800 height[pixels]=600 dot_clock=40000000 h_sync_start=840 h_sync_end=968 h_total=1056 h_skew=0 v_sync_start=601 v_sync_end=605 v_total=628 name_length=7 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001cd width[pixels]=800 height[pixels]=600 dot_clock=36000000 h_sync_start=824 h_sync_end=896 h_total=1024 h_skew=0 v_sync_start=601 v_sync_end=603 v_total=625 name_length=7 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001ce width[pixels]=720 height[pixels]=576 dot_clock=27000000 h_sync_start=732 h_sync_end=796 h_total=864 h_skew=0 v_sync_start=581 v_sync_end=586 v_total=625 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001cf width[pixels]=720 height[pixels]=480 dot_clock=27000000 h_sync_start=736 h_sync_end=798 h_total=858 h_skew=0 v_sync_start=489 v_sync_end=495 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001d0 width[pixels]=640 height[pixels]=480 dot_clock=25175000 h_sync_start=656 h_sync_end=752 h_total=800 h_skew=0 v_sync_start=490 v_sync_end=492 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001d1 width[pixels]=640 height[pixels]=480 dot_clock=25170000 h_sync_start=656 h_sync_end=752 h_total=800 h_skew=0 v_sync_start=490 v_sync_end=492 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative}; mode names='1920x10801920x10801920x10801680x10501600x12001440x9001280x10241280x9601280x7201280x7201152x7201024x768800x600800x600720x576720x480640x480640x480'
000:<:000d: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001b8 config-timestamp=0x02d364d2
000:>:000d:64: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=1920 height=1080 mode=0x000001c0 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=0x000001d2; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:000e:  8: RANDR-Request(140,28): GetPanning crtc=0x000001b8
000:>:000e:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:000f:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001b8
000:>:000f:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0010: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001b9 config-timestamp=0x02d364d2
000:>:0010:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0011:  8: RANDR-Request(140,28): GetPanning crtc=0x000001b9
000:>:0011:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0012:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001b9
000:>:0012:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0013: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001ba config-timestamp=0x02d364d2
000:>:0013:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0014:  8: RANDR-Request(140,28): GetPanning crtc=0x000001ba
000:>:0014:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0015:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001ba
000:>:0015:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0016: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001bb config-timestamp=0x02d364d2
000:>:0016:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0017:  8: RANDR-Request(140,28): GetPanning crtc=0x000001bb
000:>:0017:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0018:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001bb
000:>:0018:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0019: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bc config-timestamp=0x02d364d2
000:>:0019:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-0'
000:<:001a:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001a:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001b: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bd config-timestamp=0x02d364d2
000:>:001b:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-1'
000:<:001c:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001c:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001d: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001be config-timestamp=0x02d364d2
000:>:001d:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-2'
000:<:001e:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001e:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001f: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bf config-timestamp=0x02d364d2
000:>:001f:128: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=530 height[mm]=300 connection=Connected(0x00) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=0x000001c0,0x000001c1,0x000001c2,0x000001c3,0x000001c4,0x000001c5,0x000001c6,0x000001c7,0x000001c8,0x000001c9,0x000001ca,0x000001cb,0x000001cc,0x000001cd,0x000001ce,0x000001cf,0x000001d0,0x000001d1; preferred modes=1 clones=; name='DP-3'
000:<:0020:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0020:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0021: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d2 config-timestamp=0x02d364d2
000:>:0021:132: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x000001b8 width[mm]=531 height[mm]=299 connection=Connected(0x00) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=0x000001c0,0x000001c1,0x000001c2,0x000001c3,0x000001c4,0x000001c5,0x000001c6,0x000001c7,0x000001c8,0x000001c9,0x000001ca,0x000001cb,0x000001cc,0x000001cd,0x000001ce,0x000001cf,0x000001d0,0x000001d1; preferred modes=1 clones=; name='HDMI-0'
000:<:0022:  8: RANDR-Request(140,22): GetCrtcGammaSize crtc=0x000001b8
000:>:0022:32: Reply to GetCrtcGammaSize: size=0x0400
000:<:0023:  8: RANDR-Request(140,23): GetCrtcGamma crtc=0x000001b8
000:>:0023:6176: Reply to GetCrtcGamma: red=0x0000,0x0000,0x0000,0x0000,0x0000; green=; blue=;
000:<:0024:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0024:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0025: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d3 config-timestamp=0x02d364d2
000:>:0025:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=; modes=; preferred modes=0 clones=; name=''
000:<:0026:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0026:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0027: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d4 config-timestamp=0x02d364d2
000:>:0027:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-5'
000:<:0028:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0028:32: Reply to GetOutputPrimary: output=0x000001bc
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
DP-0 disconnected primary (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +  59.94    50.00  
   1680x1050     59.95  
   1600x1200     60.00  
   1440x900      59.89  
   1280x1024     60.02  
   1280x960      60.00  
   1280x720      59.94    50.00  
   1152x720      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   720x576       50.00  
   720x480       59.94  
   640x480       59.94    59.93  
HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     60.00*+  59.94    50.00  
   1680x1050     59.95  
   1600x1200     60.00  
   1440x900      59.89  
   1280x1024     60.02  
   1280x960      60.00  
   1280x720      59.94    50.00  
   1152x720      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   720x576       50.00  
   720x480       59.94  
   640x480       59.94    59.93  
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 disconnected (normal left inverted right x axis y axis)

@pawamoy
Copy link
Contributor Author

pawamoy commented May 29, 2024

When monitor is disconnected:

000:<: am lsb-first want 11:0 authorising with 'MIT-MAGIC-COOKIE-1' of length 16
000:>: Success, version is 11:0 vendor='The X.Org Foundation' release=12101013 resource-id=0x01800000 resource-mask=0x001fffff motion-buffer-size=256 max-request-len=65535 image-byte-order=LSBFirst(0x00) bitmap-bit-order=LeastSignificant(0x00) scanline-unit=32 scanline-pad=32 min-keycode=0x08 max-keycode=0x00 pixmap-formats={depth=1 bits/pixel=1 scanline-pad=32},{depth=4 bits/pixel=8 scanline-pad=32},{depth=8 bits/pixel=8 scanline-pad=32},{depth=15 bits/pixel=16 scanline-pad=32},{depth=16 bits/pixel=16 scanline-pad=32},{depth=24 bits/pixel=32 scanline-pad=32},{depth=32 bits/pixel=32 scanline-pad=32}; roots={root=0x000001d9 default-colormap=0x00000020 white-pixel=0x00ffffff black-pixel=0x00000000 input-mask=KeyPress,KeyRelease,ButtonPress,EnterWindow,LeaveWindow,Exposure,StructureNotify,SubstructureNotify,SubstructureRedirect,PropertyChange width[pixel]=1920 height[pixel]=1080 width[mm]=535 height[mm]=301 min-installed-maps=1 max-installed-maps=1 root=0x00000021 backing-stores=WhenMapped(0x01) save-unders=false(0x00) root-depth=24 allowed depths={depth=24 visuals={id=0x00000021 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000022 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000024 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000025 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000026 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000027 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000028 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000029 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000002f class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000030 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000031 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000032 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000033 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000034 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000035 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000036 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000037 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000038 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000039 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000003f class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000040 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000041 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000042 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000043 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000044 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000045 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000046 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000047 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000048 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000049 class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004a class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004b class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004c class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004d class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004e class=TrueColor(0x04) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000004f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000050 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000051 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000052 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000053 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000054 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000055 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000056 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000057 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000058 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000059 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005a class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005b class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005c class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005d class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005e class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000005f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000060 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000061 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000062 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000063 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000064 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000065 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000066 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000067 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000068 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000069 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006a class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006b class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006c class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006d class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006e class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000006f class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000070 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000071 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000072 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000073 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000074 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000075 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000076 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000077 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000078 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000079 class=DirectColor(0x05) bits/rgb-value=11 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff};},{depth=1 visuals=;},{depth=4 visuals=;},{depth=8 visuals=;},{depth=15 visuals=;},{depth=16 visuals=;},{depth=32 visuals={id=0x00000023 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000007f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000080 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000081 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000082 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000083 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000084 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000085 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000086 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000087 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000088 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000089 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000008f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000090 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000091 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000092 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000093 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000094 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000095 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000096 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000097 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000098 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x00000099 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009a class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009b class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009c class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009d class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009e class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x0000009f class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a0 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a1 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a2 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a3 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff},{id=0x000000a4 class=TrueColor(0x04) bits/rgb-value=8 colormap-entries=256 red-mask=0x00ff0000 green-mask=0x0000ff00 blue-mask=0x000000ff};};};
000:<:0001: 20: Request(98): QueryExtension name='BIG-REQUESTS'
000:>:0001:32: Reply to QueryExtension: present=true(0x01) major-opcode=133 first-event=0 first-error=0
000:<:0002:  4: BIG-REQUESTS-Request(133,0): Enable 
000:>:0002:32: Reply to Enable: maximum-request-length=4194303
000:<:0003: 20: Request(55): CreateGC cid=0x01800000 drawable=0x000001d9 values={background=0x00ffffff}
000:<:0004: 24: Request(20): GetProperty delete=false(0x00) window=0x000001d9 property=0x17("RESOURCE_MANAGER") type=0x1f("STRING") long-offset=0x00000000 long-length=0x05f5e100
000:>:0004:2228: Reply to GetProperty: type=0x1f("STRING") bytes-after=0x00000000 data='*.background:\t#1c2023\n*.color0:\t#1c2023\n*.color1:\t#bf616a\n*.color10:\t#a3be8c\n*.color11:\t#ebcb8b\n*.color12:\t#8fa1b3\n*.color13:\t#b48ead\n*.color14:\t#96b5b4\n*.color15:\t#c0c5ce\n*.color2:\t#a3be8c\n*.color3:\t#ebcb8b\n*.color4:\t#8fa1b3\n*.color5:\t#b48ead\n*.color6:\t#96b5b4\n*.color7:\t#E1E1E1\n*.color8:\t#919ba0\n*.color9:\t#bf616a\n*.cursorColor:\t#778899\n*.foreground:\t#E1E1E1\nURxvt*background:\t[95]#1C2023\nURxvt*buffered:\tfalse\nURxvt*depth:\t32\nURxvt*externalBorder:\t0\nURxvt*internalBorder:\t0\nURxvt*iso14755:\tfalse\nURxvt*letterSpace:\t-1\nURxvt*saveline:\t15000\nURxvt*scrollBar:\tfalse\nURxvt*scrollBar_right:\tfalse\nURxvt*termName:\trxvt-256color\nURxvt.copyCommand:\txclip -i -selection clipboard\nURxvt.font:\txft:monospace:size=11\nURxvt.geometry:\t90x34\nURxvt.keysym.m-c:\tperl:clipboard:copy\nURxvt.keysym.m-v:\tperl:clipboard:paste\nURxvt.pasteCommand:\txclip -o -selection clipboard\nURxvt.perl-ext-common:\tdefault,clipboard,url-select,keyboard-select\nURxvt.tabbed.tab-bg:\t4\nURxvt.tabbed.tab-fg:\t15\nURxvt.tabbed.tabbar-bg:\t16\nURxvt.tabbed.tabbar-fg:\t4\nURxvt.underlineURLs:\ttrue\nURxvt.urlButton:\t1\nURxvt.urlLauncher:\texo-open\nUXTerm*VT100.geometry:\t90x34\nUXTerm*cursorColor:\twhite\nUXTerm*dynamicColors:\ttrue\nUXTerm*eightBitInput:\ttrue\nUXTerm*faceSize:\t11\nUXTerm*font:\tmonospace\nUXTerm*jumpScroll:\ttrue\nUXTerm*multiScroll:\ttrue\nUXTerm*rightScrollBar:\tfalse\nUXTerm*saveLines:\t10000\nUXTerm*scrollBar:\tfalse\nUXTerm*scrollKey:\ttrue\nUXTerm*scrollTtyOutput:\tfalse\nUXTerm*termName:\txterm-256color\nUXTerm*toolBar:\tfalse\nUXTerm*utf8:\t2\nrofi.color-active:\targb:00000000, #49bbfb, argb:00000000, argb:00000000, #e29a49\nrofi.color-enabled:\ttrue\nrofi.color-normal:\t#1c2023, #919ba0, #1c2023, #a4a4a4, #1c2023\nrofi.color-urgent:\targb:00000000, #f43753, argb:00000000, argb:00000000, #e29a49\nrofi.color-window:\t#1c2023, #919ba0, #1c2023\nrofi.font:\tmonospace 12\nrofi.hide-scrollbar:\ttrue\nrofi.kb-cancel:\tEscape,Alt+F1\nrofi.line-padding:\t2\nrofi.padding:\t20\nrofi.separator-style:\tsolid\nxterm*charClass:\t33:48,35:48,37:48,43:48,45-47:48,64:48,95:48,126:48\nxterm*eightBitInput:\tfalse\nxterm*faceName:\tmonospace:size=11\nxterm*font:\tmonospace\nxterm*loginShell:\ttrue\nxterm*saveLines:\t2000\nxterm*termName:\txterm-256color\nxterm*vt100*geometry:\t90x34\n'
000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
000:>:0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=135 first-event=85 first-error=137
000:<:0006:  8: XKEYBOARD-Request(135,0): UseExtension major=1 minor=0
000:>:0006:32: Reply to UseExtension: major=1 minor=0
000:<:0007: 16: Request(98): QueryExtension name='RANDR'
000:>:0007:32: Reply to QueryExtension: present=true(0x01) major-opcode=140 first-event=89 first-error=147
000:<:0008: 32: Request(98): QueryExtension name='Generic Event Extension'
000:>:0008:32: Reply to QueryExtension: present=true(0x01) major-opcode=128 first-event=0 first-error=0
000:<:0009:  8: Generic Event Extension-Request(128,0): QueryVersion major version=1 minor version=0
000:>:0009:32: Reply to QueryVersion: major version=1 minor version=0
000:<:000a: 12: RANDR-Request(140,0): QueryVersion major-version=1 minor-version=6
000:>:000a:32: Reply to QueryVersion: major-version=1 minor-version=6
000:<:000b:  8: RANDR-Request(140,6): GetScreenSizeRange window=0x000001d9
000:>:000b:32: Reply to GetScreenSizeRange: minWidth=8 minHeight=8 maxWidth=32767 maxHeight=32767
000:<:000c:  8: RANDR-Request(140,8): GetScreenResources window=0x000001d9
000:>:000c:796: Reply to GetScreenResources: timestamp=0x02d2e94b config-timestamp=0x02d74c53 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4; modeinfos={id=0x000001c0 width[pixels]=1920 height[pixels]=1080 dot_clock=148500000 h_sync_start=2008 h_sync_end=2052 h_total=2200 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c1 width[pixels]=1920 height[pixels]=1080 dot_clock=148350000 h_sync_start=2008 h_sync_end=2052 h_total=2200 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c2 width[pixels]=1920 height[pixels]=1080 dot_clock=148500000 h_sync_start=2448 h_sync_end=2492 h_total=2640 h_skew=0 v_sync_start=1084 v_sync_end=1089 v_total=1125 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c3 width[pixels]=1680 height[pixels]=1050 dot_clock=146250000 h_sync_start=1784 h_sync_end=1960 h_total=2240 h_skew=0 v_sync_start=1053 v_sync_end=1059 v_total=1089 name_length=9 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001c4 width[pixels]=1600 height[pixels]=1200 dot_clock=162000000 h_sync_start=1664 h_sync_end=1856 h_total=2160 h_skew=0 v_sync_start=1201 v_sync_end=1204 v_total=1250 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c5 width[pixels]=1440 height[pixels]=900 dot_clock=106500000 h_sync_start=1520 h_sync_end=1672 h_total=1904 h_skew=0 v_sync_start=903 v_sync_end=909 v_total=934 name_length=8 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001c6 width[pixels]=1280 height[pixels]=1024 dot_clock=108000000 h_sync_start=1328 h_sync_end=1440 h_total=1688 h_skew=0 v_sync_start=1025 v_sync_end=1028 v_total=1066 name_length=9 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c7 width[pixels]=1280 height[pixels]=960 dot_clock=108000000 h_sync_start=1376 h_sync_end=1488 h_total=1800 h_skew=0 v_sync_start=961 v_sync_end=964 v_total=1000 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c8 width[pixels]=1280 height[pixels]=720 dot_clock=74180000 h_sync_start=1390 h_sync_end=1430 h_total=1650 h_skew=0 v_sync_start=725 v_sync_end=730 v_total=750 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001c9 width[pixels]=1280 height[pixels]=720 dot_clock=74250000 h_sync_start=1720 h_sync_end=1760 h_total=1980 h_skew=0 v_sync_start=725 v_sync_end=730 v_total=750 name_length=8 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001ca width[pixels]=1152 height[pixels]=720 dot_clock=67320000 h_sync_start=1208 h_sync_end=1328 h_total=1504 h_skew=0 v_sync_start=721 v_sync_end=724 v_total=746 name_length=8 mode_flags=HSyncNegative,VSyncPositive},{id=0x000001cb width[pixels]=1024 height[pixels]=768 dot_clock=65000000 h_sync_start=1048 h_sync_end=1184 h_total=1344 h_skew=0 v_sync_start=771 v_sync_end=777 v_total=806 name_length=8 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001cc width[pixels]=800 height[pixels]=600 dot_clock=40000000 h_sync_start=840 h_sync_end=968 h_total=1056 h_skew=0 v_sync_start=601 v_sync_end=605 v_total=628 name_length=7 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001cd width[pixels]=800 height[pixels]=600 dot_clock=36000000 h_sync_start=824 h_sync_end=896 h_total=1024 h_skew=0 v_sync_start=601 v_sync_end=603 v_total=625 name_length=7 mode_flags=HSyncPositive,VSyncPositive},{id=0x000001ce width[pixels]=720 height[pixels]=576 dot_clock=27000000 h_sync_start=732 h_sync_end=796 h_total=864 h_skew=0 v_sync_start=581 v_sync_end=586 v_total=625 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001cf width[pixels]=720 height[pixels]=480 dot_clock=27000000 h_sync_start=736 h_sync_end=798 h_total=858 h_skew=0 v_sync_start=489 v_sync_end=495 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001d0 width[pixels]=640 height[pixels]=480 dot_clock=25175000 h_sync_start=656 h_sync_end=752 h_total=800 h_skew=0 v_sync_start=490 v_sync_end=492 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative},{id=0x000001d1 width[pixels]=640 height[pixels]=480 dot_clock=25170000 h_sync_start=656 h_sync_end=752 h_total=800 h_skew=0 v_sync_start=490 v_sync_end=492 v_total=525 name_length=7 mode_flags=HSyncNegative,VSyncNegative}; mode names='1920x10801920x10801920x10801680x10501600x12001440x9001280x10241280x9601280x7201280x7201152x7201024x768800x600800x600720x576720x480640x480640x480'
000:<:000d: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001b8 config-timestamp=0x02d74c53
000:>:000d:64: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=1920 height=1080 mode=0x000001c0 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=0x000001d2; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:000e:  8: RANDR-Request(140,28): GetPanning crtc=0x000001b8
000:>:000e:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:000f:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001b8
000:>:000f:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0010: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001b9 config-timestamp=0x02d74c53
000:>:0010:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0011:  8: RANDR-Request(140,28): GetPanning crtc=0x000001b9
000:>:0011:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0012:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001b9
000:>:0012:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0013: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001ba config-timestamp=0x02d74c53
000:>:0013:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0014:  8: RANDR-Request(140,28): GetPanning crtc=0x000001ba
000:>:0014:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0015:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001ba
000:>:0015:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0016: 12: RANDR-Request(140,20): GetCrtcInfo crtc=0x000001bb config-timestamp=0x02d74c53
000:>:0016:60: Reply to GetCrtcInfo: status=Success(0x00) timestamp=0x02d2e94b x=0 y=0 width=0 height=0 mode=0x00000000 current rr=Rotate_0 possible rr=Rotate_0,Rotate_90,Rotate_180,Rotate_270,Reflect_X,Reflect_Y outputs=; possible outputs=0x000001bc,0x000001bd,0x000001be,0x000001bf,0x000001d2,0x000001d3,0x000001d4;
000:<:0017:  8: RANDR-Request(140,28): GetPanning crtc=0x000001bb
000:>:0017:36: Reply to GetPanning: status=Success(0x00) timestamp=0x02d2e94b left=0 top=0 width=0 height=0 track_left=0 track_top=0 track_width=0 track_height=0 border_left=0 border_top=0 border_right=0 border_bottom=0
000:<:0018:  8: RANDR-Request(140,27): GetCrtcTransform crtc=0x000001bb
000:>:0018:96: Reply to GetCrtcTransform: pending transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; has transforms=true(0x01) current transform={matrix=1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000;}; pending filter name='' pending filter params=; current filter name='' current filter params=;
000:<:0019: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bc config-timestamp=0x02d74c53
000:>:0019:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-0'
000:<:001a:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001a:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001b: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bd config-timestamp=0x02d74c53
000:>:001b:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-1'
000:<:001c:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001c:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001d: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001be config-timestamp=0x02d74c53
000:>:001d:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-2'
000:<:001e:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:001e:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:001f: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001bf config-timestamp=0x02d74c53
000:>:001f:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-3'
000:<:0020:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0020:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0021: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d2 config-timestamp=0x02d74c53
000:>:0021:132: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x000001b8 width[mm]=531 height[mm]=299 connection=Connected(0x00) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=0x000001c0,0x000001c1,0x000001c2,0x000001c3,0x000001c4,0x000001c5,0x000001c6,0x000001c7,0x000001c8,0x000001c9,0x000001ca,0x000001cb,0x000001cc,0x000001cd,0x000001ce,0x000001cf,0x000001d0,0x000001d1; preferred modes=1 clones=; name='HDMI-0'
000:<:0022:  8: RANDR-Request(140,22): GetCrtcGammaSize crtc=0x000001b8
000:>:0022:32: Reply to GetCrtcGammaSize: size=0x0400
000:<:0023:  8: RANDR-Request(140,23): GetCrtcGamma crtc=0x000001b8
000:>:0023:6176: Reply to GetCrtcGamma: red=0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001d,0x003f,0x0064,0x008a,0x00b1,0x00d8,0x0101,0x012a,0x0154,0x017e,0x01a9,0x01d4,0x0200,0x022c,0x0258,0x0285,0x02b2,0x02df,0x030c,0x033a,0x0368,0x0396,0x03c5,0x03f4,0x0423,0x0452,0x0481,0x04b1,0x04e1,0x0511,0x0541,0x0572,0x05a2,0x05d3,0x0604,0x0635,0x0666,0x0697,0x06c8,0x06fa,0x072b,0x075d,0x078f,0x07c1,0x07f3,0x0826,0x0858,0x088b,0x08bd,0x08f0,0x0923,0x0956,0x0989,0x09bd,0x09f0,0x0a23,0x0a57,0x0a8a,0x0abe,0x0af2,0x0b26,0x0b5a,0x0b8e,0x0bc3,0x0bf7,0x0c2c,0x0c60,0x0c95,0x0cca,0x0cfe,0x0d33,0x0d68,0x0d9d,0x0dd2,0x0e07,0x0e3c,0x0e72,0x0ea7,0x0edd,0x0f12,0x0f48,0x0f7d,0x0fb3,0x0fe9,0x101f,0x1055,0x108b,0x10c1,0x10f7,0x112d,0x1164,0x119a,0x11d1,0x1207,0x123e,0x1275,0x12ac,0x12e3,0x1319,0x1350,0x1387,0x13be,0x13f5,0x142c,0x1464,0x149b,0x14d2,0x150a,0x1541,0x1578,0x15b0,0x15e8,0x161f,0x1657,0x168f,0x16c6,0x16fe,0x1736,0x176e,0x17a6,0x17de,0x1816,0x184f,0x1887,0x18bf,0x18f7,0x1930,0x1969,0x19a1,0x19da,0x1a13,0x1a4b,0x1a84,0x1abd,0x1af5,0x1b2e,0x1b67,0x1ba0,0x1bd9,0x1c12,0x1c4b,0x1c84,0x1cbd,0x1cf6,0x1d2f,0x1d69,0x1da2,0x1ddb,0x1e15,0x1e4e,0x1e88,0x1ec1,0x1efb,0x1f34,0x1f6e,0x1fa8,0x1fe1,0x201b,0x2055,0x2090,0x20c9,0x2103,0x213d,0x2177,0x21b1,0x21eb,0x2226,0x2260,0x229a,0x22d4,0x230e,0x2349,0x2383,0x23bd,0x23f8,0x2432,0x246d,0x24a7,0x24e2,0x251d,0x2557,0x2592,0x25cd,0x2607,0x2642,0x267d,0x26b8,0x26f3,0x272e,0x2769,0x27a4,0x27df,0x281b,0x2856,0x2891,0x28cc,0x2907,0x2942,0x297e,0x29b9,0x29f4,0x2a30,0x2a6b,0x2aa6,0x2ae2,0x2b1d,0x2b59,0x2b94,0x2bd0,0x2c0c,0x2c47,0x2c83,0x2cbf,0x2cfa,0x2d36,0x2d72,0x2dae,0x2dea,0x2e26,0x2e62,0x2e9e,0x2eda,0x2f16,0x2f53,0x2f8f,0x2fcb,0x3007,0x3043,0x307f,0x30bb,0x30f8,0x3134,0x3170,0x31ad,0x31e9,0x3225,0x3262,0x329e,0x32db,0x3317,0x3354,0x3390,0x33cd,0x340a,0x3446,0x3483,0x34c0,0x34fc,0x3539,0x3576,0x35b3,0x35f0,0x362c,0x3669,0x36a6,0x36e4,0x3721,0x375e,0x379b,0x37d8,0x3815,0x3852,0x3890,0x38cd,0x390a,0x3947,0x3984,0x39c2,0x39ff,0x3a3c,0x3a7a,0x3ab7,0x3af4,0x3b32,0x3b6f,0x3bad,0x3bea,0x3c28,0x3c65,0x3ca3,0x3ce0,0x3d1e,0x3d5c,0x3d99,0x3dd7,0x3e15,0x3e52,0x3e91,0x3ecf,0x3f0d,0x3f4a,0x3f88,0x3fc6,0x4004,0x4042,0x4080,0x40be,0x40fc,0x413a,0x4178,0x41b6,0x41f4,0x4232,0x4270,0x42ae,0x42ed,0x432b,0x4369,0x43a7,0x43e6,0x4424,0x4462,0x44a0,0x44df,0x451d,0x455c,0x459a,0x45d8,0x4617,0x4656,0x4695,0x46d3,0x4712,0x4750,0x478f,0x47ce,0x480c,0x484b,0x488a,0x48c8,0x4907,0x4946,0x4985,0x49c3,0x4a02,0x4a41,0x4a80,0x4abf,0x4afe,0x4b3c,0x4b7b,0x4bba,0x4bf9,0x4c38,0x4c77,0x4cb6,0x4cf5,0x4d34,0x4d74,0x4db3,0x4df2,0x4e32,0x4e71,0x4eb0,0x4eef,0x4f2f,0x4f6e,0x4fad,0x4fed,0x502c,0x506b,0x50aa,0x50ea,0x5129,0x5169,0x51a8,0x51e8,0x5227,0x5266,0x52a6,0x52e5,0x5325,0x5365,0x53a4,0x53e4,0x5423,0x5463,0x54a3,0x54e2,0x5522,0x5562,0x55a1,0x55e1,0x5622,0x5662,0x56a2,0x56e1,0x5721,0x5761,0x57a1,0x57e1,0x5821,0x5861,0x58a1,0x58e1,0x5921,0x5961,0x59a1,0x59e1,0x5a21,0x5a61,0x5aa1,0x5ae1,0x5b21,0x5b61,0x5ba1,0x5be1,0x5c22,0x5c62,0x5ca2,0x5ce2,0x5d23,0x5d63,0x5da3,0x5de4,0x5e25,0x5e65,0x5ea6,0x5ee6,0x5f26,0x5f67,0x5fa7,0x5fe8,0x6028,0x6069,0x60a9,0x60ea,0x612a,0x616b,0x61ab,0x61ec,0x622c,0x626d,0x62ae,0x62ee,0x632f,0x6370,0x63b0,0x63f1,0x6432,0x6473,0x64b3,0x64f4,0x6535,0x6576,0x65b7,0x65f8,0x6639,0x667a,0x66bb,0x66fc,0x673d,0x677e,0x67bf,0x6800,0x6841,0x6882,0x68c3,0x6904,0x6945,0x6986,0x69c7,0x6a08,0x6a49,0x6a8b,0x6acc,0x6b0d,0x6b4e,0x6b8f,0x6bd0,0x6c12,0x6c53,0x6c94,0x6cd5,0x6d17,0x6d58,0x6d99,0x6ddb,0x6e1c,0x6e5e,0x6ea0,0x6ee1,0x6f23,0x6f64,0x6fa6,0x6fe7,0x7028,0x706a,0x70ab,0x70ed,0x712e,0x7170,0x71b2,0x71f3,0x7235,0x7276,0x72b8,0x72fa,0x733b,0x737d,0x73bf,0x7400,0x7442,0x7484,0x74c5,0x7507,0x7549,0x758b,0x75cd,0x760e,0x7650,0x76b4,0x76f6,0x7738,0x777a,0x77bb,0x77fd,0x783f,0x7881,0x78c3,0x7905,0x7947,0x7989,0x79cb,0x7a0d,0x7a4f,0x7a91,0x7ad3,0x7b15,0x7b58,0x7b9a,0x7bdc,0x7c1e,0x7c60,0x7ca2,0x7ce4,0x7d27,0x7d69,0x7dab,0x7ded,0x7e30,0x7e72,0x7eb4,0x7ef7,0x7f3a,0x7f7c,0x7fbe,0x8001,0x8043,0x8085,0x80c8,0x810a,0x814d,0x818f,0x81d1,0x8214,0x8256,0x8299,0x82db,0x831e,0x8360,0x83a3,0x83e5,0x8428,0x846b,0x84ad,0x84f0,0x8532,0x8575,0x85b8,0x85fa,0x863d,0x8680,0x86c2,0x8705,0x8749,0x878b,0x87ce,0x8811,0x8854,0x8896,0x88d9,0x891c,0x895f,0x89a2,0x89e4,0x8a27,0x8a6a,0x8aad,0x8af0,0x8b33,0x8b76,0x8bb9,0x8bfc,0x8c3f,0x8c82,0x8cc5,0x8d08,0x8d4b,0x8d8e,0x8dd1,0x8e14,0x8e57,0x8e9a,0x8edd,0x8f20,0x8f63,0x8fa7,0x8fea,0x902d,0x9071,0x90b4,0x90f7,0x913a,0x917d,0x91c0,0x9204,0x9247,0x928a,0x92cd,0x9311,0x9354,0x9397,0x93db,0x941e,0x9461,0x94a5,0x94e8,0x952b,0x956f,0x95b2,0x95f6,0x9639,0x967c,0x96c0,0x9703,0x9747,0x978a,0x97ce,0x9812,0x9856,0x9899,0x98dd,0x9920,0x9964,0x99a7,0x99eb,0x9a2f,0x9a72,0x9ab6,0x9af9,0x9b3d,0x9b81,0x9bc4,0x9c08,0x9c4c,0x9c8f,0x9cd3,0x9d17,0x9d5b,0x9d9e,0x9de2,0x9e26,0x9e6a,0x9ead,0x9ef1,0x9f35,0x9f79,0x9fbd,0xa000,0xa044,0xa089,0xa0cd,0xa111,0xa155,0xa199,0xa1dd,0xa221,0xa265,0xa2a9,0xa2ed,0xa330,0xa374,0xa3b8,0xa3fc,0xa440,0xa485,0xa4c9,0xa50d,0xa551,0xa595,0xa5d9,0xa61d,0xa661,0xa6a5,0xa6e9,0xa72d,0xa772,0xa7b6,0xa7fa,0xa83e,0xa882,0xa8c6,0xa90c,0xa950,0xa994,0xa9d8,0xaa1d,0xaa61,0xaaa5,0xaaea,0xab2e,0xab72,0xabb7,0xabfb,0xac3f,0xac84,0xacc8,0xad0c,0xad51,0xad95,0xadd9,0xae1e,0xae62,0xaea7,0xaeeb,0xaf30,0xaf74,0xafb9,0xaffd,0xb042,0xb086,0xb0cb,0xb10f,0xb154,0xb199,0xb1de,0xb222,0xb267,0xb2ac,0xb2f0,0xb335,0xb379,0xb3be,0xb403,0xb447,0xb48c,0xb4d1,0xb515,0xb55a,0xb59f,0xb5e4,0xb628,0xb66d,0xb6b2,0xb6f7,0xb73b,0xb780,0xb7c5,0xb80a,0xb84e,0xb893,0xb8d8,0xb91d,0xb962,0xb9a7,0xb9ec,0xba31,0xba76,0xbabb,0xbb00,0xbb45,0xbb8a,0xbbcf,0xbc14,0xbc59,0xbc9e,0xbce3,0xbd28,0xbd6d,0xbdb2,0xbdf7,0xbe3c,0xbe81,0xbec6,0xbf0b,0xbf50,0xbf95,0xbfda,0xc01f,0xc064,0xc0aa,0xc0ef,0xc134,0xc179,0xc1be,0xc203,0xc248,0xc28e,0xc2d4,0xc319,0xc35e,0xc3a3,0xc3e9,0xc42e,0xc473,0xc4b8,0xc4fe,0xc543,0xc588,0xc5ce,0xc613,0xc658,0xc69e,0xc6e3,0xc728,0xc76e,0xc7b3,0xc7f8,0xc83e,0xc883,0xc8c8,0xc90e,0xc953,0xc999,0xc9de,0xca24,0xca69,0xcaaf,0xcaf4,0xcb39,0xcb80,0xcbc6,0xcc0b,0xcc51,0xcc96,0xccdc,0xcd21,0xcd67,0xcdac,0xcdf2,0xce37,0xce7d,0xcec3,0xcf08,0xcf4e,0xcf94,0xcfd9,0xd01f,0xd065,0xd0aa,0xd0f0,0xd136,0xd17b,0xd1c1,0xd207,0xd24c,0xd292,0xd2d8,0xd31e,0xd363,0xd3a9,0xd3ef,0xd436,0xd47c,0xd4c1,0xd507,0xd54d,0xd593,0xd5d9,0xd61f,0xd664,0xd6aa,0xd6f0,0xd736,0xd77c,0xd7c2,0xd808,0xd84e,0xd894,0xd8d9,0xd91f,0xd965,0xd9ab,0xd9f1,0xda37,0xda7d,0xdac3,0xdb09,0xdb4f,0xdb95,0xdbdb,0xdc21,0xdc67,0xdcae,0xdcf5,0xdd3b,0xdd81,0xddc7,0xde0d,0xde53,0xde99,0xdedf,0xdf26,0xdf6c,0xdfb2,0xdff8,0xe03e,0xe084,0xe0cb,0xe111,0xe157,0xe19d,0xe1e3,0xe22a,0xe270,0xe2b6,0xe2fc,0xe343,0xe389,0xe3cf,0xe415,0xe45c,0xe4a2,0xe4e8,0xe52f,0xe575,0xe5bc,0xe603,0xe649,0xe690,0xe6d6,0xe71c,0xe763,0xe7a9,0xe7f0,0xe836,0xe87c,0xe8c3,0xe909,0xe950,0xe996,0xe9dd,0xea23,0xea6a,0xeab0,0xeaf7,0xeb3d,0xeb84,0xebca,0xec11,0xec57,0xec9e,0xece4,0xed2b,0xed71,0xedb8,0xedff,0xee45,0xee8d,0xeed4,0xef1a,0xef61,0xefa7,0xefee,0xf035,0xf07b,0xf0c2,0xf109,0xf14f,0xf196,0xf1dd,0xf224,0xf26a,0xf2b1,0xf2f8,0xf33e,0xf385,0xf3cc,0xf413,0xf45a,0xf4a0,0xf4e7,0xf52e,0xf575,0xf5bc,0xf602,0xf649,0xf690,0xf6d7,0xf71e,0xf766,0xf7ad,0xf7f3,0xf83a,0xf881,0xf8c8,0xf90f,0xf956,0xf99d,0xf9e4,0xfa2b,0xfa72,0xfab9,0xfb00,0xfb47,0xfb8e,0xfbd5,0xfc1c,0xfc63,0xfcaa,0xfcf1,0xfd38,0xfd7f,0xfdc6,0xfe0d,0xfe54,0xfe9b; green=0xfee2,0xff29,0xff70,0xffb7,0xfffe,0x0000,0x0018,0x0033,0x0051,0x0070,0x008f,0x00b0,0x00d0,0x00f2,0x0114,0x0136,0x0159,0x017c,0x019f,0x01c3,0x01e7,0x020b,0x022f,0x0254,0x0279,0x029e,0x02c4,0x02e9,0x030f,0x0335,0x035b,0x0381,0x03a8,0x03ce,0x03f5,0x041c,0x0443,0x046b,0x0492,0x04ba,0x04e1,0x0509,0x0531,0x0559,0x0581,0x05a9,0x05d1,0x05fa,0x0622,0x064b,0x0674,0x069c,0x06c5,0x06ee,0x0717,0x0741,0x076a,0x0793,0x07bd,0x07e6,0x0810,0x083a,0x0864,0x088d,0x08b7,0x08e2,0x090c,0x0936,0x0960,0x098b,0x09b6,0x09e0,0x0a0b,0x0a35,0x0a60,0x0a8b,0x0ab6,0x0ae1,0x0b0c,0x0b37,0x0b62,0x0b8d,0x0bb8,0x0be4,0x0c0f,0x0c3a,0x0c66,0x0c92,0x0cbd,0x0ce9,0x0d15,0x0d40,0x0d6c,0x0d98,0x0dc4,0x0df0,0x0e1c,0x0e48,0x0e74,0x0ea1,0x0ecd,0x0efa,0x0f26,0x0f53,0x0f7f,0x0fac,0x0fd8,0x1005,0x1032,0x105e,0x108b,0x10b8,0x10e5,0x1112,0x113f,0x116c,0x1199,0x11c6,0x11f3,0x1220,0x124e,0x127b,0x12a8,0x12d5,0x1303,0x1330,0x135e,0x138b,0x13b9,0x13e7,0x1414,0x1442,0x1470,0x149e,0x14cc,0x14fa,0x1528,0x1556,0x1584,0x15b2,0x15e0,0x160e,0x163c,0x166a,0x1698,0x16c7,0x16f5,0x1723,0x1751,0x1780,0x17ae,0x17dd,0x180b,0x183a,0x1868,0x1897,0x18c6,0x18f4,0x1923,0x1952,0x1980,0x19af,0x19de,0x1a0d,0x1a3c,0x1a6b,0x1a9a,0x1ac9,0x1af8,0x1b28,0x1b57,0x1b86,0x1bb5,0x1be4,0x1c13,0x1c43,0x1c72,0x1ca1,0x1cd0,0x1d00,0x1d2f,0x1d5f,0x1d8e,0x1dbe,0x1ded,0x1e1d,0x1e4c,0x1e7c,0x1eac,0x1edb,0x1f0b,0x1f3b,0x1f6a,0x1f9a,0x1fca,0x1ffa,0x202a,0x205a,0x208a,0x20ba,0x20ea,0x211a,0x214a,0x217a,0x21aa,0x21db,0x220b,0x223b,0x226b,0x229b,0x22cb,0x22fc,0x232c,0x235c,0x238d,0x23bd,0x23ee,0x241e,0x244e,0x247f,0x24af,0x24e0,0x2510,0x2541,0x2572,0x25a2,0x25d3,0x2604,0x2634,0x2666,0x2697,0x26c7,0x26f8,0x2729,0x275a,0x278b,0x27bc,0x27ec,0x281d,0x284e,0x287f,0x28b0,0x28e1,0x2912,0x2944,0x2975,0x29a6,0x29d7,0x2a08,0x2a39,0x2a6a,0x2a9c,0x2acd,0x2afe,0x2b30,0x2b61,0x2b92,0x2bc4,0x2bf5,0x2c26,0x2c58,0x2c8a,0x2cbc,0x2ced,0x2d1f,0x2d50,0x2d82,0x2db3,0x2de5,0x2e16,0x2e48,0x2e7a,0x2eab,0x2edd,0x2f0f,0x2f41,0x2f72,0x2fa4,0x2fd6,0x3008,0x303a,0x306c,0x309d,0x30cf,0x3101,0x3133,0x3165,0x3197,0x31c9,0x31fb,0x322d,0x325f,0x3291,0x32c4,0x32f6,0x3329,0x335b,0x338d,0x33bf,0x33f1,0x3424,0x3456,0x3488,0x34ba,0x34ed,0x351f,0x3551,0x3584,0x35b6,0x35e9,0x361b,0x364e,0x3680,0x36b2,0x36e5,0x3718,0x374a,0x377d,0x37af,0x37e2,0x3814,0x3847,0x387a,0x38ac,0x38df,0x3912,0x3945,0x3978,0x39ab,0x39dd,0x3a10,0x3a43,0x3a76,0x3aa9,0x3adc,0x3b0e,0x3b41,0x3b74,0x3ba7,0x3bda,0x3c0d,0x3c40,0x3c73,0x3ca6,0x3cd9,0x3d0c,0x3d3f,0x3d72,0x3da5,0x3dd8,0x3e0c,0x3e3f,0x3e72,0x3ea5,0x3ed8,0x3f0b,0x3f3f,0x3f73,0x3fa6,0x3fd9,0x400d,0x4040,0x4073,0x40a6,0x40da,0x410d,0x4141,0x4174,0x41a7,0x41db,0x420e,0x4242,0x4275,0x42a9,0x42dc,0x4310,0x4343,0x4377,0x43aa,0x43de,0x4412,0x4445,0x4479,0x44ac,0x44e0,0x4514,0x4548,0x457b,0x45af,0x45e3,0x4617,0x464b,0x467f,0x46b3,0x46e6,0x471a,0x474e,0x4782,0x47b6,0x47ea,0x481e,0x4852,0x4885,0x48b9,0x48ed,0x4921,0x4955,0x4989,0x49bd,0x49f1,0x4a25,0x4a59,0x4a8e,0x4ac2,0x4af6,0x4b2a,0x4b5e,0x4b92,0x4bc6,0x4bfa,0x4c2f,0x4c64,0x4c98,0x4ccc,0x4d00,0x4d35,0x4d69,0x4d9d,0x4dd1,0x4e06,0x4e3a,0x4e6e,0x4ea3,0x4ed7,0x4f0c,0x4f40,0x4f74,0x4fa9,0x4fdd,0x5012,0x5046,0x507b,0x50af,0x50e4,0x5118,0x514d,0x5181,0x51b6,0x51ea,0x521f,0x5253,0x5288,0x52bd,0x52f2,0x5327,0x535b,0x5390,0x53c5,0x53f9,0x542e,0x5463,0x5498,0x54cc,0x5501,0x5536,0x556b,0x55a0,0x55d4,0x5609,0x563e,0x5673,0x56a8,0x56dd,0x5711,0x5746,0x577b,0x57b0,0x57e5,0x581a,0x584f,0x5884,0x58b9,0x58ee,0x5923,0x5958,0x598e,0x59c3,0x59f8,0x5a2d,0x5a62,0x5a97,0x5acc,0x5b02,0x5b37,0x5b6c,0x5ba1,0x5bd6,0x5c0b,0x5c41,0x5c76,0x5cab,0x5ce0,0x5d15,0x5d4b,0x5d80,0x5db5,0x5deb,0x5e20,0x5e55,0x5e8a,0x5ec0,0x5ef5,0x5f2b,0x5f60,0x5f95,0x5fcb,0x6000,0x6051,0x6087,0x60bc,0x60f1,0x6127,0x615c,0x6192,0x61c7,0x61fd,0x6232,0x6268,0x629e,0x62d3,0x6309,0x633e,0x6374,0x63a9,0x63df,0x6415,0x644a,0x6480,0x64b6,0x64eb,0x6521,0x6557,0x658c,0x65c2,0x65f8,0x662e,0x6663,0x6699,0x66cf,0x6706,0x673b,0x6771,0x67a7,0x67dd,0x6813,0x6849,0x687e,0x68b4,0x68ea,0x6920,0x6956,0x698c,0x69c2,0x69f8,0x6a2e,0x6a64,0x6a9a,0x6ad0,0x6b06,0x6b3c,0x6b72,0x6ba8,0x6bde,0x6c14,0x6c4a,0x6c80,0x6cb6,0x6cec,0x6d22,0x6d58,0x6d8e,0x6dc5,0x6dfb,0x6e32,0x6e68,0x6e9e,0x6ed4,0x6f0a,0x6f40,0x6f77,0x6fad,0x6fe3,0x7019,0x7050,0x7086,0x70bc,0x70f2,0x7129,0x715f,0x7195,0x71cc,0x7202,0x7238,0x726f,0x72a5,0x72dc,0x7312,0x7348,0x737f,0x73b5,0x73ec,0x7422,0x7458,0x7490,0x74c6,0x74fd,0x7533,0x756a,0x75a0,0x75d7,0x760d,0x7644,0x767a,0x76b1,0x76e7,0x771e,0x7755,0x778b,0x77c2,0x77f8,0x782f,0x7866,0x789c,0x78d3,0x790a,0x7940,0x7977,0x79ae,0x79e4,0x7a1b,0x7a52,0x7a88,0x7abf,0x7af6,0x7b2d,0x7b64,0x7b9b,0x7bd2,0x7c09,0x7c40,0x7c76,0x7cad,0x7ce4,0x7d1b,0x7d52,0x7d89,0x7dbf,0x7df6,0x7e2d,0x7e64,0x7e9b,0x7ed2,0x7f09,0x7f40,0x7f77,0x7fae,0x7fe5,0x801c,0x8053,0x808a,0x80c1,0x80f8,0x812f,0x8166,0x819d,0x81d4,0x820b,0x8243,0x827a,0x82b1,0x82e8,0x831f,0x8356,0x838d,0x83c4,0x83fc,0x8433,0x846a,0x84a1,0x84d8,0x850f,0x8547,0x857e,0x85b5,0x85ec,0x8623,0x865b,0x8692,0x86c9,0x8700,0x8738,0x876f,0x87a6,0x87de,0x8815,0x884c,0x8884,0x88bb,0x88f2,0x892a,0x8962,0x8999,0x89d1,0x8a08,0x8a3f,0x8a77,0x8aae,0x8ae6,0x8b1d,0x8b54,0x8b8c,0x8bc3,0x8bfb,0x8c32,0x8c6a,0x8ca1,0x8cd9,0x8d10,0x8d48,0x8d7f,0x8db7,0x8dee,0x8e26,0x8e5d,0x8e95,0x8ecd,0x8f04,0x8f3c,0x8f73,0x8fab,0x8fe3,0x901b,0x9053,0x908a,0x90c2,0x90fa,0x9131,0x9169,0x91a1,0x91d8,0x9210,0x9248,0x927f,0x92b7,0x92ef,0x9327,0x935e,0x9396,0x93ce,0x9406,0x943d,0x9475,0x94ad,0x94e5,0x951d,0x9555,0x958c,0x95c4,0x95fc,0x9634,0x966c,0x96a4,0x96dc,0x9714,0x974c,0x9784,0x97bc,0x97f4,0x982c,0x9864,0x989c,0x98d4,0x990c,0x9944,0x997c,0x99b4,0x99ec,0x9a24,0x9a5c,0x9a94,0x9acc,0x9b04,0x9b3c,0x9b74,0x9bac,0x9be4,0x9c1c,0x9c54,0x9c8c,0x9cc4,0x9cfc,0x9d34,0x9d6d,0x9da5,0x9ddd,0x9e16,0x9e4e,0x9e86,0x9ebe,0x9ef6,0x9f2f,0x9f67,0x9f9f,0x9fd7,0xa00f,0xa048,0xa080,0xa0b8,0xa0f0,0xa129,0xa161,0xa199,0xa1d1,0xa20a,0xa242,0xa27a,0xa2b3,0xa2eb,0xa323,0xa35c,0xa394,0xa3cc,0xa405,0xa43d,0xa475,0xa4ae,0xa4e6,0xa51f,0xa558,0xa590,0xa5c9,0xa601,0xa639,0xa672,0xa6aa,0xa6e3,0xa71b,0xa754,0xa78c,0xa7c5,0xa7fd,0xa836,0xa86e,0xa8a7,0xa8df,0xa918,0xa950,0xa989,0xa9c1,0xa9fa,0xaa32,0xaa6b,0xaaa3,0xaadc,0xab15,0xab4d,0xab86,0xabbe,0xabf7,0xac31,0xac69,0xaca2,0xacda,0xad13,0xad4c,0xad84,0xadbd,0xadf6,0xae2e,0xae67,0xaea0,0xaed9,0xaf11,0xaf4a,0xaf83,0xafbb,0xaff4,0xb02d,0xb066,0xb09f,0xb0d7,0xb110,0xb149,0xb182,0xb1ba,0xb1f3,0xb22c,0xb265,0xb29e,0xb2d7,0xb30f,0xb349,0xb382,0xb3bb,0xb3f4,0xb42d,0xb466,0xb49e,0xb4d7,0xb510,0xb549,0xb582,0xb5bb,0xb5f4,0xb62d,0xb666,0xb69f,0xb6d8,0xb711,0xb74a,0xb783,0xb7bc,0xb7f5,0xb82e,0xb867,0xb8a0,0xb8d9,0xb912,0xb94b,0xb984,0xb9bd,0xb9f6,0xba2f,0xba69,0xbaa2,0xbadb,0xbb14,0xbb4d,0xbb87,0xbbc0,0xbbf9,0xbc32,0xbc6b,0xbca4,0xbcdd,0xbd17,0xbd50,0xbd89,0xbdc2,0xbdfb,0xbe34,0xbe6e,0xbea7,0xbee0,0xbf19,0xbf52,0xbf8c,0xbfc5,0xbffe,0xc037,0xc071,0xc0aa,0xc0e3,0xc11d,0xc156,0xc190,0xc1c9,0xc203,0xc23c,0xc275,0xc2af,0xc2e8,0xc321,0xc35b,0xc394,0xc3cd,0xc407,0xc440,0xc479,0xc4b3,0xc4ec,0xc526,0xc55f,0xc598,0xc5d2,0xc60b,0xc645,0xc67e,0xc6b7,0xc6f1,0xc72a,0xc764,0xc79d,0xc7d7,0xc810,0xc84a,0xc883,0xc8be,0xc8f7,0xc931,0xc96a,0xc9a4,0xc9dd,0xca17,0xca50,0xca8a,0xcac3,0xcafd,0xcb37,0xcb70,0xcbaa,0xcbe3,0xcc1d,0xcc57,0xcc90,0xccca,0xcd03,0xcd3d,0xcd77,0xcdb0,0xcdea,0xce24,0xce5d,0xce97; blue=0xced1,0xcf0a,0xcf44,0xcf7e,0xcfb7,0x0000,0x0012,0x0027,0x003e,0x0055,0x006d,0x0085,0x009f,0x00b8,0x00d2,0x00ec,0x0106,0x0121,0x013c,0x0157,0x0172,0x018e,0x01aa,0x01c6,0x01e2,0x01fe,0x021b,0x0237,0x0254,0x0271,0x028e,0x02ab,0x02c8,0x02e6,0x0303,0x0321,0x033e,0x035d,0x037b,0x0399,0x03b7,0x03d5,0x03f3,0x0412,0x0430,0x044f,0x046e,0x048c,0x04ab,0x04ca,0x04e9,0x0508,0x0527,0x0547,0x0566,0x0585,0x05a5,0x05c4,0x05e4,0x0603,0x0623,0x0643,0x0663,0x0683,0x06a3,0x06c3,0x06e3,0x0703,0x0723,0x0744,0x0764,0x0784,0x07a5,0x07c5,0x07e6,0x0806,0x0827,0x0848,0x0868,0x0889,0x08aa,0x08cb,0x08ec,0x090d,0x092e,0x094f,0x0970,0x0991,0x09b2,0x09d4,0x09f5,0x0a16,0x0a38,0x0a59,0x0a7b,0x0a9c,0x0abe,0x0adf,0x0b01,0x0b22,0x0b44,0x0b66,0x0b88,0x0baa,0x0bcc,0x0bee,0x0c10,0x0c32,0x0c54,0x0c76,0x0c98,0x0cba,0x0cdc,0x0cfe,0x0d21,0x0d43,0x0d65,0x0d87,0x0daa,0x0dcc,0x0def,0x0e11,0x0e34,0x0e56,0x0e79,0x0e9b,0x0ebe,0x0ee1,0x0f03,0x0f26,0x0f49,0x0f6c,0x0f8e,0x0fb2,0x0fd5,0x0ff8,0x101b,0x103e,0x1061,0x1084,0x10a7,0x10ca,0x10ed,0x1110,0x1133,0x1156,0x117a,0x119d,0x11c0,0x11e3,0x1207,0x122a,0x124d,0x1271,0x1294,0x12b8,0x12db,0x12ff,0x1322,0x1346,0x136a,0x138d,0x13b1,0x13d5,0x13f8,0x141c,0x1440,0x1464,0x1488,0x14ac,0x14cf,0x14f3,0x1517,0x153b,0x155f,0x1583,0x15a7,0x15cb,0x15ef,0x1613,0x1637,0x165b,0x1680,0x16a4,0x16c8,0x16ec,0x1710,0x1735,0x1759,0x177d,0x17a1,0x17c6,0x17ea,0x180e,0x1833,0x1857,0x187c,0x18a1,0x18c5,0x18ea,0x190e,0x1933,0x1957,0x197c,0x19a1,0x19c5,0x19ea,0x1a0e,0x1a33,0x1a58,0x1a7d,0x1aa1,0x1ac6,0x1aeb,0x1b10,0x1b35,0x1b59,0x1b7e,0x1ba3,0x1bc8,0x1bed,0x1c12,0x1c37,0x1c5c,0x1c81,0x1ca6,0x1ccb,0x1cf0,0x1d15,0x1d3b,0x1d60,0x1d85,0x1daa,0x1dcf,0x1df4,0x1e1a,0x1e3f,0x1e64,0x1e89,0x1eaf,0x1ed4,0x1ef9,0x1f1f,0x1f44,0x1f69,0x1f8f,0x1fb4,0x1fd9,0x1fff,0x2024,0x204a,0x206f,0x2095,0x20ba,0x20e0,0x2105,0x212b,0x2150,0x2176,0x219c,0x21c1,0x21e8,0x220d,0x2233,0x2259,0x227e,0x22a4,0x22ca,0x22f0,0x2315,0x233b,0x2361,0x2387,0x23ad,0x23d2,0x23f8,0x241e,0x2444,0x246a,0x2490,0x24b6,0x24dc,0x2502,0x2528,0x254e,0x2574,0x259a,0x25c0,0x25e6,0x260c,0x2632,0x2658,0x267e,0x26a5,0x26cb,0x26f2,0x2718,0x273e,0x2764,0x278a,0x27b1,0x27d7,0x27fd,0x2823,0x284a,0x2870,0x2896,0x28bd,0x28e3,0x2909,0x2930,0x2956,0x297d,0x29a3,0x29ca,0x29f0,0x2a16,0x2a3d,0x2a63,0x2a8a,0x2ab1,0x2ad7,0x2afe,0x2b24,0x2b4b,0x2b72,0x2b99,0x2bbf,0x2be6,0x2c0c,0x2c33,0x2c5a,0x2c80,0x2ca7,0x2cce,0x2cf5,0x2d1b,0x2d42,0x2d69,0x2d90,0x2db6,0x2ddd,0x2e04,0x2e2b,0x2e52,0x2e79,0x2e9f,0x2ec6,0x2eed,0x2f14,0x2f3b,0x2f62,0x2f89,0x2fb0,0x2fd7,0x2ffe,0x3025,0x304c,0x3073,0x309a,0x30c2,0x30e9,0x3110,0x3137,0x315e,0x3185,0x31ac,0x31d3,0x31fa,0x3221,0x3249,0x3270,0x3297,0x32be,0x32e5,0x330d,0x3334,0x335b,0x3382,0x33aa,0x33d1,0x33f8,0x341f,0x3447,0x346e,0x3495,0x34bd,0x34e4,0x350c,0x3534,0x355b,0x3582,0x35aa,0x35d1,0x35f9,0x3620,0x3648,0x366f,0x3697,0x36be,0x36e6,0x370d,0x3735,0x375c,0x3784,0x37ab,0x37d3,0x37fa,0x3822,0x384a,0x3871,0x3899,0x38c1,0x38e8,0x3910,0x3937,0x395f,0x3987,0x39af,0x39d6,0x39fe,0x3a26,0x3a4e,0x3a76,0x3a9e,0x3ac5,0x3aed,0x3b15,0x3b3d,0x3b65,0x3b8c,0x3bb4,0x3bdc,0x3c04,0x3c2c,0x3c54,0x3c7c,0x3ca4,0x3ccc,0x3cf3,0x3d1b,0x3d43,0x3d6b,0x3d93,0x3dbb,0x3de3,0x3e0b,0x3e33,0x3e5b,0x3e83,0x3eab,0x3ed3,0x3efb,0x3f24,0x3f4c,0x3f74,0x3f9c,0x3fc4,0x3fed,0x4015,0x403d,0x4065,0x408d,0x40b5,0x40dd,0x4106,0x412e,0x4156,0x417e,0x41a6,0x41cf,0x41f7,0x421f,0x4247,0x4270,0x4298,0x42c0,0x42e9,0x4311,0x4339,0x4362,0x438a,0x43b2,0x43db,0x4403,0x442c,0x4454,0x447d,0x44a5,0x44ce,0x44f6,0x451e,0x4547,0x456f,0x4598,0x45c0,0x45e9,0x4611,0x463a,0x4662,0x468b,0x46b3,0x46dc,0x4704,0x472d,0x4755,0x477e,0x47a7,0x47cf,0x47f8,0x4820,0x4849,0x4872,0x489a,0x48c3,0x48eb,0x4914,0x4952,0x497a,0x49a3,0x49cc,0x49f5,0x4a1d,0x4a46,0x4a6f,0x4a97,0x4ac0,0x4ae9,0x4b12,0x4b3b,0x4b63,0x4b8c,0x4bb5,0x4bde,0x4c07,0x4c2f,0x4c58,0x4c81,0x4caa,0x4cd3,0x4cfc,0x4d24,0x4d4d,0x4d76,0x4d9f,0x4dc8,0x4df1,0x4e1a,0x4e43,0x4e6c,0x4e95,0x4ebe,0x4ee7,0x4f10,0x4f39,0x4f62,0x4f8b,0x4fb4,0x4fdd,0x5006,0x502f,0x5058,0x5081,0x50ab,0x50d4,0x50fd,0x5126,0x514f,0x5178,0x51a1,0x51ca,0x51f3,0x521c,0x5246,0x526f,0x5298,0x52c1,0x52ea,0x5313,0x533d,0x5366,0x5390,0x53b9,0x53e2,0x540b,0x5435,0x545e,0x5487,0x54b0,0x54da,0x5503,0x552c,0x5555,0x557f,0x55a8,0x55d1,0x55fb,0x5624,0x564d,0x5677,0x56a0,0x56c9,0x56f3,0x571c,0x5746,0x576f,0x5798,0x57c2,0x57eb,0x5815,0x583e,0x5867,0x5891,0x58bb,0x58e4,0x590e,0x5937,0x5961,0x598a,0x59b4,0x59dd,0x5a07,0x5a30,0x5a5a,0x5a84,0x5aad,0x5ad7,0x5b00,0x5b2a,0x5b53,0x5b7d,0x5ba6,0x5bd0,0x5bfa,0x5c23,0x5c4d,0x5c77,0x5ca0,0x5cca,0x5cf3,0x5d1d,0x5d47,0x5d70,0x5d9a,0x5dc4,0x5dee,0x5e18,0x5e42,0x5e6b,0x5e95,0x5ebf,0x5ee8,0x5f12,0x5f3c,0x5f66,0x5f8f,0x5fb9,0x5fe3,0x600d,0x6037,0x6060,0x608a,0x60b4,0x60de,0x6108,0x6131,0x615b,0x6185,0x61af,0x61d9,0x6203,0x622d,0x6257,0x6280,0x62aa,0x62d4,0x62fe,0x6329,0x6353,0x637d,0x63a6,0x63d0,0x63fa,0x6424,0x644e,0x6478,0x64a2,0x64cc,0x64f6,0x6520,0x654a,0x6574,0x659e,0x65c8,0x65f2,0x661c,0x6646,0x6670,0x669b,0x66c5,0x66ef,0x6719,0x6743,0x676d,0x6797,0x67c1,0x67eb,0x6815,0x6840,0x686a,0x6894,0x68bf,0x68e9,0x6913,0x693d,0x6967,0x6991,0x69bc,0x69e6,0x6a10,0x6a3a,0x6a64,0x6a8f,0x6ab9,0x6ae3,0x6b0d,0x6b38,0x6b62,0x6b8c,0x6bb6,0x6be1,0x6c0b,0x6c35,0x6c60,0x6c8a,0x6cb4,0x6cde,0x6d09,0x6d33,0x6d5d,0x6d88,0x6db3,0x6ddd,0x6e07,0x6e32,0x6e5c,0x6e87,0x6eb1,0x6edb,0x6f06,0x6f30,0x6f5b,0x6f85,0x6faf,0x6fda,0x7004,0x702f,0x7059,0x7084,0x70ae,0x70d8,0x7103,0x712d,0x7158,0x7182,0x71ad,0x71d7,0x7202,0x722c,0x7257,0x7281,0x72ac,0x72d7,0x7302,0x732c,0x7357,0x7381,0x73ac,0x73d7,0x7401,0x742c,0x7456,0x7481,0x74ac,0x74d6,0x7501,0x752b,0x7556,0x7581,0x75ab,0x75d6,0x7601,0x762b,0x7656,0x7681,0x76ab,0x76d6,0x7701,0x772b,0x7756,0x7781,0x77ab,0x77d6,0x7801,0x782c,0x7857,0x7882,0x78ad,0x78d7,0x7902,0x792d,0x7958,0x7982,0x79ad,0x79d8,0x7a03,0x7a2e,0x7a58,0x7a83,0x7aae,0x7ad9,0x7b04,0x7b2e,0x7b59,0x7b84,0x7baf,0x7bda,0x7c05,0x7c30,0x7c5b,0x7c85,0x7cb0,0x7cdb,0x7d06,0x7d31,0x7d5c,0x7d87,0x7db2,0x7ddd,0x7e08,0x7e33,0x7e5e,0x7e89,0x7eb4,0x7edf,0x7f0a,0x7f35,0x7f60,0x7f8b,0x7fb6,0x7fe1,0x800c,0x8037,0x8062,0x808d,0x80b8,0x80e3,0x810e,0x8139,0x8164,0x818f,0x81ba,0x81e5,0x8210,0x823c,0x8267,0x8292,0x82bd,0x82e8,0x8314,0x833f,0x836a,0x8395,0x83c0,0x83eb,0x8416,0x8442,0x846d,0x8498,0x84c3,0x84ee,0x8519,0x8545,0x8570,0x859b,0x85c6,0x85f1,0x861c,0x8648,0x8673,0x869e,0x86c9,0x86f5,0x8720,0x874b,0x8776,0x87a2,0x87cd,0x87f8,0x8823,0x884f,0x887b,0x88a6,0x88d1,0x88fc,0x8928,0x8953,0x897e,0x89aa,0x89d5,0x8a00,0x8a2c,0x8a57,0x8a82,0x8aae,0x8ad9,0x8b04,0x8b30,0x8b5b,0x8b87,0x8bb2,0x8bdd,0x8c09,0x8c34,0x8c5f,0x8c8b,0x8cb6,0x8ce2,0x8d0d,0x8d39,0x8d64,0x8d8f,0x8dbb,0x8de7,0x8e12,0x8e3e,0x8e69,0x8e95,0x8ec0,0x8eec,0x8f17,0x8f43,0x8f6e,0x8f9a,0x8fc5,0x8ff1,0x901c,0x9048,0x9073,0x909f,0x90ca,0x90f6,0x9121,0x914d,0x9179,0x91a4,0x91d0,0x91fb,0x9227,0x9252,0x927e,0x92aa,0x92d5,0x9301,0x932c,0x9359,0x9384,0x93b0,0x93dc,0x9407,0x9433,0x945f,0x948a,0x94b6,0x94e1,0x950d,0x9539,0x9564,0x9590,0x95bc,0x95e8,0x9613,0x963f,0x966b,0x9696,0x96c2,0x96ee,0x9719,0x9745,0x9771,0x979d,0x97c8,0x97f4,0x9820,0x984c,0x9877,0x98a3,0x98d0,0x98fb,0x9927,0x9953,0x997f,0x99ab,0x99d6,0x9a02,0x9a2e,0x9a5a,0x9a86,0x9ab1,0x9add,0x9b09,0x9b35,0x9b61,0x9b8d,0x9bb9,0x9be4,0x9c10,0x9c3c,0x9c68,0x9c94,0x9cc0,0x9cec,0x9d18,0x9d43;
000:<:0024:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0024:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0025: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d3 config-timestamp=0x02d74c53
000:>:0025:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-4'
000:<:0026:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0026:32: Reply to GetOutputPrimary: output=0x000001bc
000:<:0027: 12: RANDR-Request(140,9): GetOutputInfo output=0x000001d4 config-timestamp=0x02d74c53
000:>:0027:56: Reply to GetOutputInfo: timestamp=0x02d2e94b current connected crtc=0x00000000 width[mm]=0 height[mm]=0 connection=Disconnected(0x01) subpixel-order=0x0400 crtcs=0x000001b8,0x000001b9,0x000001ba,0x000001bb; modes=; preferred modes=0 clones=; name='DP-5'
000:<:0028:  8: RANDR-Request(140,31): GetOutputPrimary window=0x000001d9
000:>:0028:32: Reply to GetOutputPrimary: output=0x000001bc
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
DP-0 disconnected primary (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     60.00*+  59.94    50.00  
   1680x1050     59.95  
   1600x1200     60.00  
   1440x900      59.89  
   1280x1024     60.02  
   1280x960      60.00  
   1280x720      59.94    50.00  
   1152x720      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   720x576       50.00  
   720x480       59.94  
   640x480       59.94    59.93  
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 disconnected (normal left inverted right x axis y axis)

@tych0 tych0 mentioned this issue May 30, 2024
@tych0
Copy link
Member

tych0 commented May 30, 2024

Thanks, can you try the two patches above as well? feels like we have to be getting close to fixing all of the leaks... right? right? :)

@tych0
Copy link
Member

tych0 commented Jun 6, 2024

ping @pawamoy, have you had a chance to test the above patches yet? are things still leaking?

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 6, 2024

Ah sorry, I wasn't home for a few days and forgot about that, thanks for the reminder, let me check.

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 6, 2024

@tych0 it would awesome if you could merge all the patches related to this issue in a single branch of yours, so that I can easily copy/paste files to my locally installed Qtile (or even install from your branch) instead of writing the changes by hand 🙂 Just the latest patch doesn't fix the leak, but maybe the combination of all of them will.

@tych0
Copy link
Member

tych0 commented Jun 6, 2024

All of them should be on master, but I think you are right that there is a bug in one of them. Can you send a patch to fix that?

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 7, 2024

Do you mean the master branch of your fork, or the master branch here?

@tych0
Copy link
Member

tych0 commented Jun 7, 2024

The master branch here has everything that I'm aware of right now that would cause a leak.

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 12, 2024

I have installed from master branch with /usr/bin/python -m pip install git+https://github.com/qtile/qtile@master --break-system-packages --no-deps. Unfortunately I still experience leaks. I have to say it's much better than initially, and I mentioned it before: after a reboot, the first time I disable my monitor, the pixmaps won't leak. I can enable/disable the monitor many times, pixmaps stand still. But if I restart Qtile (with lazy.restart()), then it stars leaking again. Also, my monitor going naturally to sleep (after some time) doesn't trigger the leak anymore. It only leaks when I forcefully disable it. So to be honest, if you want to stop the hunt here, I'm completely OK 🙂 If you want to continue, I'm all for it too, and will continue helping the best I can!

Thank you so much for your help on this!

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 12, 2024

Actually now that I'm on Qtile master, it leaked again while I was afk 😅 Damn. Maybe it's because I restarted Qtile before. Will see if it happens again without restarting Qtile.

@tych0
Copy link
Member

tych0 commented Jun 12, 2024

Nah, let's keep this open. I'll keep looking. Thank you for continuing to test!

@tych0
Copy link
Member

tych0 commented Jun 15, 2024

Do you know offhand if your config results in Mirror widgets being created? It looks like we have some leaks there as well, which I can send a patch for shortly.

I am also looking for a way to see if we can automatically detect these leaks. I would love to get a big stack trace in CI when we do leak an object without finalizing, so we don't have to do this scavenger hunt in the future :)

tych0 added a commit to tych0/qtile that referenced this issue Jun 15, 2024
We call _create_last_surface() on every draw() call. If last_surface
previously existed, we will leak its backing resources since we do not
finish() it. Let's finish() it.

Found as part of qtile#4821.

Signed-off-by: Tycho Andersen <tycho@tycho.pizza>
@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 15, 2024

Do you know offhand if your config results in Mirror widgets being created?

Looking at the code, it looks like only WidgetBox will ever create Mirror instances? I don't use this widget.

@elParaguayo
Copy link
Member

Not quite. If you use the same instance of a widget in multiple bars then a mirror will be created. WidgetBox just replicates this process as widgets aren't immediately added to the bar.

tych0 added a commit that referenced this issue Jun 15, 2024
We call _create_last_surface() on every draw() call. If last_surface
previously existed, we will leak its backing resources since we do not
finish() it. Let's finish() it.

Found as part of #4821.

Signed-off-by: Tycho Andersen <tycho@tycho.pizza>
@tych0
Copy link
Member

tych0 commented Jun 15, 2024

Yeah, that's the one I was wondering about. I saw you have multiple bars, so it seems like it is potentially possible?

Anyway, that one is in git master now, so maybe worth another go to see if that was it?

@tych0
Copy link
Member

tych0 commented Jun 15, 2024

So, this will not catch all of the flavors of bugs I have fixed, but it would have caught some, and is pretty simple:

~ cat tester.py
class Finalizeable:
    def __init__(self):
        self.finalized = False

    def finalize(self):
        self.finalized = True

    def __del__(self):
        if not self.finalized:
            raise Exception("not finalized")


foo = Finalizeable()
foo.finalize()
foo = Finalizeable()
print("expecting exception...")
foo = Finalizeable()
foo.finalize()
~ python3 tester.py
expecting exception...
Exception ignored in: <function Finalizeable.__del__ at 0x7e8d4b21e020>
Traceback (most recent call last):
  File "/home/tycho/tester.py", line 10, in __del__
    raise Exception("not finalized")
Exception: not finalized

note that it's not guaranteed to work, since __del__ is not guaranteed to be called, but I think it would be if we e.g. leaked widgets as we were before 7c3fbef.

@tych0
Copy link
Member

tych0 commented Jun 15, 2024

I think it would have caught stuff like a7f5d1c too?

@elParaguayo
Copy link
Member

Nice. Are all our Configurables "finalizeable"? If so, could we just add to that class?

@tych0
Copy link
Member

tych0 commented Jun 15, 2024

possibly, but things that aren't Configurable are Finalizable (e.g. drawer), so it's not a strict superset.

it looks like we also do not finalize libqtile/images.py:class Img at all, although IIUC that will only leak memory in the qtile process, not an x11 pixmap.

@pawamoy
Copy link
Contributor Author

pawamoy commented Jun 15, 2024

Not quite. If you use the same instance of a widget in multiple bars then a mirror will be created. WidgetBox just replicates this process as widgets aren't immediately added to the bar.

Thanks for the explanation. I vividly remember going out of my way to actually avoid reusing the same widget instances, because that caused issues (which ones exactly I don't remember though).

Looking again at my config, I believe all widgets are unique in my bars. Even Sep and TextBox are never reused.

Click to see my bars config
num_monitors = get_num_monitors()

laptop_battery = []
if hostname == "laptop":
    laptop_battery.append(widget.Battery(discharge_char="↓", charge_char="↑", format="{percent:2.0%}{char}"))

text_color = "#99c0de"
light_color = "#404552"
dark_color = "#2f343f"

separator_config = {"padding": 5, "linewidth": 0}
light_sep = lambda: widget.Sep(**separator_config, background=light_color)
dark_sep = lambda: widget.Sep(**separator_config, background=dark_color)

triangle_config = {"padding": 0, "fontsize": 28}
light_triangle_left = lambda: widget.TextBox(**triangle_config, text="", foreground=light_color, background=dark_color)
light_triangle_right = lambda: widget.TextBox(
    **triangle_config, text="", foreground=light_color, background=dark_color
)
dark_triangle_left = lambda: widget.TextBox(**triangle_config, text="", foreground=dark_color, background=light_color)
dark_triangle_right = lambda: widget.TextBox(**triangle_config, text="", foreground=dark_color, background=light_color)

screens = [
    Screen(
        top=bar.Bar(
            [
                dark_sep(),
                widget.TextBox(
                    text="¤",
                    margin=3,
                    fontsize=28,
                    background=dark_color,
                ),
                dark_sep(),
                widget.GroupBox(
                    highlight_method="line",
                    this_screen_border="#5294e2",
                    this_current_screen_border="#5294e2",
                    active="#ffffff",
                    inactive="#848e96",
                    background=dark_color,
                ),
                dark_triangle_right(),
                widget.Prompt(),
                widget.WindowName(foreground=text_color),
                widget.Chord(
                    chords_colors={
                        "launch": ("#ff0000", "#ffffff"),
                    },
                    name_transform=lambda name: name.upper(),
                ),
                *laptop_battery,
                widget.Systray(padding=8, icon_size=16),
                light_sep(),
                dark_triangle_left(),
                widget.CurrentLayoutIcon(
                    scale=0.6,
                    foreground=text_color,
                    background=dark_color,
                ),
                widget.Clock(
                    format="%Y-%m-%d %a %H:%M",
                    foreground=text_color,
                    background=dark_color,
                ),
                dark_sep(),
                light_triangle_left(),
                widget.TextBox(
                    text=" ",
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn(os.path.expanduser("~/.config/rofi/powermenu.sh"))
                    },
                    foreground="#e39378",
                ),
            ],
            size=bar_size,
            background=light_color,
        ),
        bottom=bar.Bar(
            [
                widget.Spacer(),
                widget.TextBox(text="devboard", mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("terminator -x zsh -c devboard")}),
                widget.TextBox(text=" ", mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("pavucontrol")}),
                widget.Volume(mouse_callbacks={"Button1": lambda: qtile.cmd_spawn("pavucontrol")}, foreground=text_color),
                dark_triangle_left(),
                widget.Net(
                    interface=net_interface,
                    update_interval=2,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                widget.NetGraph(
                    start_pos="bottom",
                    bandwidth_type="down",
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                widget.NetGraph(
                    start_pos="bottom",
                    bandwidth_type="up",
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'sudo nethogs'"),
                    },
                ),
                dark_sep(),
                light_triangle_left(),
                widget.GenPollUrl(
                    url="http://ip-api.com/json/",
                    parse=get_ip_location,
                    foreground=text_color,
                    update_interval=3600 * 4,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("bash -c 'notify-send ifconfig \"$(ifconfig enp3s0)\"'"),
                    },
                ),
                dark_triangle_left(),
                dark_sep(),
                widget.CPU(
                    format="{load_percent}%",
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -x bash -ilc 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.ThermalSensor(
                    tag_sensor="Core 0",
                    show_tag=True,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.CPUGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_CPU'"),
                    },
                ),
                widget.Memory(
                    format="{MemUsed:.0f}{mm}/{MemTotal:.0f}{mm} ({MemPercent:.0f}%)",
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.cmd_spawn("terminator -e 'htop --sort-key=PERCENT_MEM'"),
                    },
                ),
                widget.MemoryGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=PERCENT_MEM'"),
                    },
                ),
                widget.DF(
                    format="{uf}{m}/{s}{m} ({r:.0f}%)",
                    visible_on_warn=False,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=IO_RATE'"),
                    },
                ),
                widget.HDDBusyGraph(
                    **graph_config,
                    foreground=text_color,
                    background=dark_color,
                    mouse_callbacks={
                        "Button1": lambda: qtile.spawn("terminator -e 'htop --sort-key=IO_RATE'"),
                    },
                ),
                dark_sep(),
            ],
            size=bar_size,
            background=light_color,
        ),
    )
]

if num_monitors > 1:
    for m in range(num_monitors - 1):
        screens.append(
            Screen(
                top=bar.Bar(
                    [
                        dark_sep(),
                        widget.TextBox(
                            text="¤",
                            margin=3,
                            fontsize=28,
                            background=dark_color,
                        ),
                        dark_sep(),
                        widget.GroupBox(
                            highlight_method="line",
                            this_screen_border="#5294e2",
                            this_current_screen_border="#5294e2",
                            active="#ffffff",
                            inactive="#848e96",
                            background=dark_color,
                        ),
                        dark_triangle_right(),
                        widget.WindowName(foreground=text_color),
                    ],
                    size=bar_size,
                    background=light_color,
                )
            )
        )

fjpavon pushed a commit to fjpavon/qtile that referenced this issue Jun 20, 2024
We call _create_last_surface() on every draw() call. If last_surface
previously existed, we will leak its backing resources since we do not
finish() it. Let's finish() it.

Found as part of qtile#4821.

Signed-off-by: Tycho Andersen <tycho@tycho.pizza>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants