hyprland-community/pyprland

[BUG] Scratchpads do not appear in expected locations

Closed this issue · 8 comments

Pyprland version
2.0.9-1-g310b15f

Describe the bug
Scratchpads spawn in unexpected positions, depending on the animation set. With fromRight and fromLeft, scratchpad spawns in same spot. No animation set is centered properly.

To Reproduce
Steps to reproduce the behavior:

  1. Use provided pyprland.toml and bind a key to the volume scratchpad
  2. Use any valid parameter from the wiki for the scratchpads.volume.animation field.
  3. Activate bind.
  4. See misaligned window. Screenshots provided at bottom of issue.

Expected behavior
Window is centered and "hugs" the specified wall of the monitor for each animation set. null produces a perfectly centered window.

Configuration (provide following files/samples when relevant):

  • pyprland.toml
[pyprland]
plugins = ["scratchpads"]

[scratchpads.volume]
animation = "fromRight"
command = "pavucontrol"
class = "pavucontrol"
size = "40% 80%"
unfocus = "hide"
lazy = true
  • hyprland.conf
#
# Please note not all available settings / options are set here.
# For a full list, see the wiki
#

#autogenerated = 1 # remove this line to remove the warning

# See https://wiki.hyprland.org/Configuring/Monitors/
monitor= eDP-1, 2256x1504@59.99900, 0x0, 1.00

# See https://wiki.hyprland.org/Configuring/Keywords/ for more

# Execute your favorite apps at launch
# exec-once = waybar & hyprpaper & firefox

# Add networkmanager applet to tray in waybar
exec-once = nm-applet --indicator

# Set keyboard layout
exec-once = .local/bin/garuda-locale.sh

# Set monitor values. For own values, please comment with #
exec-once = .local/bin/mon.sh

# Source a file (multi-file configs)
# source = ~/.config/hypr/myColors.conf

# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
input {
kb_layout = us
    kb_variant =
    kb_model =
    kb_options = compose:ralt
    kb_rules =
    numlock_by_default= true
    follow_mouse = 1

touchpad {
    natural_scroll = true
    tap-to-click = true
    disable_while_typing = true
}


    sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}

general {
    # See https://wiki.hyprland.org/Configuring/Variables/ for more

    gaps_in = 5
    gaps_out = 10
    border_size = 2
    col.active_border = rgba(de7dc4ee) rgba(8f00ffee) 45deg
    col.inactive_border = rgba(595959aa)

    layout = dwindle
}

decoration {
    # See https://wiki.hyprland.org/Configuring/Variables/ for more

    rounding = 10
    blur {
       enabled = true
       size = 5
       passes = 1
    }

    drop_shadow = true
    shadow_range = 4
    shadow_render_power = 3
    col.shadow = rgba(1a1a1aee)
}

animations {
    enabled = true

    # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more

    bezier = myBezier, 0.05, 0.9, 0.1, 1.05

    animation = windows, 1, 7, myBezier
    animation = windowsOut, 1, 7, default, popin 80%
    animation = border, 1, 10, default
    animation = fade, 1, 7, default
    animation = workspaces, 1, 6, default
}

dwindle {
    # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
    pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
    preserve_split = true # you probably want this
}

master {
    # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
    new_is_master = true
}

gestures {
    # See https://wiki.hyprland.org/Configuring/Variables/ for more
    workspace_swipe = on
}
misc {
	disable_hyprland_logo = true
}
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
device {
	name = epic-mouse-v1
    sensitivity = -0.5
}

# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more

# See https://wiki.hyprland.org/Configuring/Keywords/ for more
$mainMod = SUPER

# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = $mainMod SHIFT, R, exec, hyprctl reload
bind = $mainMod, 36, exec, footclient
bind = $mainMod, T, exec, footclient
bind = $mainMod, Q, killactive,
bind = $mainMod SHIFT, E, exec, nwgbar
bind = $mainMod, N, exec, thunar
bind = $mainMod SHIFT, 65, togglefloating,
bind = $mainMod, D, exec, wofi --show drun --allow-images
bind = $mainMod SHIFT, D, exec, nwg-drawer
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle

# Mainmod + Function keys
bind = $mainMod, F1, exec, firedragon
bind = $mainMod, F2, exec, claws-mail
bind = $mainMod, F3, exec, thunar
bind = $mainMod, F4, exec, geany
bind = $mainMod, F5, exec, github-desktop
bind = $mainMod, F6, exec, gparted
bind = $mainMod, F7, exec, inkscape
bind = $mainMod, F8, exec, blender
bind = $mainMod, F9, exec, meld
bind = $mainMod, F10, exec, joplin-desktop
bind = $mainMod, F11, exec, snapper-tools
bind = $mainMod, F12, exec, galculator

# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d

# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10

# Move to workspace with focused container with ALT + SHIFT + [0-9]
bind = ALT SHIFT, 1, movetoworkspace, 1
bind = ALT SHIFT, 2, movetoworkspace, 2
bind = ALT SHIFT, 3, movetoworkspace, 3
bind = ALT SHIFT, 4, movetoworkspace, 4
bind = ALT SHIFT, 5, movetoworkspace, 5
bind = ALT SHIFT, 6, movetoworkspace, 6
bind = ALT SHIFT, 7, movetoworkspace, 7
bind = ALT SHIFT, 8, movetoworkspace, 8
bind = ALT SHIFT, 9, movetoworkspace, 9
bind = ALT SHIFT, 0, movetoworkspace, 10

# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1
bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2
bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3
bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4
bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5
bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6
bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7
bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8
bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9
bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10

# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1

# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

#background
exec-once = wpaperd

#status bar
exec-once = waybar
layerrule = blur , waybar
layerrule = ignorezero , waybar

# set volume (laptops only and may or may not work on PCs)
bind = ,122, exec, pactl set-sink-volume @DEFAULT_SINK@ -5%
bind = ,123, exec, pactl set-sink-volume @DEFAULT_SINK@ +5%
bind = ,121, exec, pactl set-sink-volume @DEFAULT_SINK@ 0%
# other bindings
bind = $mainMod, O, exec, firedragon
bind = $mainMod, F, fullscreen
bind = $mainMod SHIFT, F, fakefullscreen
bind = ,232,exec,brightnessctl -c backlight set 5%-
bind = ,233,exec,brightnessctl -c backlight set +5%
bind = $mainMod SHIFT,C, exec, killall -9 wpaperd && wpaperd

# Screenshots:

# https://github.com/hyprwm/contrib/blob/main/grimblast/grimblast.1.scd
# Print: All outputs
# SHIFT+Print: Select area
# $mainMod+Print: Current window
# $mainMod+Shfit+Print: Current output

bind = ,Print, exec, grimblast save screen && notify-send Screenshot captured
bind = SHIFT, Print, exec, grimblast save area && notify-send Selected\ area captured
bind = $mainMod, Print, exec, grimblast save active && notify-send Active\ window captured
bind = $mainMod SHIFT, Print, exec, grimblast output active && notify-send Output captured

# for resizing window
# will switch to a submap called resize
bind=$mainMod,R,submap,resize

# will start a submap called "resize"
submap=resize

# sets repeatable binds for resizing the active window
binde=,right,resizeactive,10 0
binde=,left,resizeactive,-10 0
binde=,up,resizeactive,0 -10
binde=,down,resizeactive,0 10

# use reset to go back to the global submap
bind=,escape,submap,reset

# will reset the submap, meaning end the current one and return to the global one
submap=reset

# to move window
bind = $mainMod SHIFT,up, movewindow, u
bind = $mainMod SHIFT,down, movewindow, d
bind = $mainMod SHIFT,left, movewindow, l
bind = $mainMod SHIFT,right, movewindow, r

# other blurings
blurls = wofi
blurls = thunar
blurls = gedit
blurls = gtk-layer-shell # for nwg-drawer
blurls = catfish
# window rules
windowrule = opacity 0.85 override 0.85 override,^(thunar)$
windowrule = opacity 0.85 override 0.85 override,^(gedit)$
windowrule = opacity 0.85 override 0.85 override,^(catfish)$
#window rules with evaluation
windowrulev2 = opacity 0.85 0.85,floating:1

exec-once = mako
exec-once =/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
exec-once = foot --server
# experimental(might work might won't)

#pre executions (under development)
exec-once=exec xrdb -load ~/.Xresources
exec-once=copyq
exec-once=wl-paste -t text --watch clipman store
exec-once=wl-clipboard-history -t

#video play paues bindings
bind=,172,exec,playerctl play-pause
bind=,171,exec,playerctl next
bind=,173,exec,playerctl previous

# Use gtk-settings
exec-once = apply-gsettings

# Let systemd have hyprland's instance sig
exec-once = dbus-update-activation-environment --systemd HYPRLAND_INSTANCE_SIGNATURE

# Start screen shading.
exec = hyprshade auto

# Pyprland time.
exec-once = pypr

bind = $mainMod,V,exec,pypr toggle volume

Additional context
Secondary monitor is plugged in for the following screenshots, but behavior still occurs while monitor is unplugged.

fromRight behavior:
2024-03-28T16:59:51,206645908-07:00

fromLeft behavior:
2024-03-28T16:59:19,086896407-07:00
edit: Posted wrong screenshot initially, correct screenshot is now present.

fromTop behavior:
2024-03-28T17:00:22,406356433-07:00

fromBottom behavior:
2024-03-28T17:01:02,102958294-07:00

null behavior:
2024-03-28T16:58:24,396134346-07:00

Hm, this is unexpected, I use this type of configuration daily...

  • which Hyprland version are you using (eg hyprctl version) ?
  • can you provide the pypr logs to understand why the computation isn't correct ?

It looks a bit like the computations are done on a "tiny" monitor instead of the correct size... but I don't see a possible root cause yet.

Edit: also provide the output of hyprctl -j clients and hyprctl -j monitors please

Output for hyprctl version is:

Hyprland, built from branch main at commit fcd9d77b642c0cd45cae61cf10ed1924f2e7945b dirty (layout: improve initial size prediction for floating).
Date: Fri Mar 29 01:43:50 2024
Tag: v0.37.1-81-gfcd9d77b

flags: (if any)

Here's pypr.log, there's a bit of fiddling at the start of it but it should get the point across. Edit: This is with the fromRight config, FYI. I can provide logs for other animation sets if you think it'll help.

2024-03-29 10:18:09,608 [INFO] ipc :: Logger "ipc" initialized :: common.py:78
2024-03-29 10:18:09,609 [INFO] startup :: Logger "startup" initialized :: common.py:78
2024-03-29 10:18:09,609 [DEBUG] ipc :: notify 3 10000 rgb(ff1010)  Trying to run pypr more than once ? :: ipc.py:114
2024-03-29 10:18:09,610 [CRITICAL] startup :: /tmp/hypr/fcd9d77b642c0cd45cae61cf10ed1924f2e7945b_1711732507/.pyprland.sock exists,
is pypr already running ?
If that's not the case, delete this file and run again. :: command.py:409
2024-03-29 10:18:28,573 [INFO] ipc :: Logger "ipc" initialized :: common.py:78
2024-03-29 10:18:28,573 [INFO] startup :: Logger "startup" initialized :: common.py:78
2024-03-29 10:18:28,573 [INFO] pypr :: Logger "pypr" initialized :: common.py:78
2024-03-29 10:18:28,574 [INFO] pypr :: Loading /home/violettica/.config/hypr/pyprland.toml :: command.py:66
2024-03-29 10:18:28,574 [INFO] pyprland :: Logger "pyprland" initialized :: common.py:78
2024-03-29 10:18:28,574 [DEBUG] ipc :: activeworkspace :: ipc.py:75
2024-03-29 10:18:28,575 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-29 10:18:28,577 [INFO] pyprland :: configured :: command.py:119
2024-03-29 10:18:28,586 [INFO] scratchpads :: Logger "scratchpads" initialized :: common.py:78
2024-03-29 10:18:28,586 [INFO] scratchpads :: configured :: command.py:119
2024-03-29 10:18:28,587 [DEBUG] pypr :: ================================[ initialized ]================================= :: command.py:317
2024-03-29 10:18:31,391 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-29 10:18:31,392 [DEBUG] scratchpads :: volume is visible = False :: scratchpads.py:738
2024-03-29 10:18:31,392 [INFO] scratchpads :: Showing volume :: scratchpads.py:789
2024-03-29 10:18:31,394 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-29 10:18:31,396 [DEBUG] ipc :: keyword ['windowrule float,^(pavucontrol)$', 'windowrule move 200% 150,^(pavucontrol)$', 'windowrule size 902 1203,^(pavucontrol)$'] :: ipc.py:114
2024-03-29 10:18:31,397 [INFO] scratchpads :: volume is not running, starting... :: scratchpads.py:559
2024-03-29 10:18:31,398 [INFO] scratchpads :: scratch volume (pavucontrol) has pid 10797 :: scratchpads.py:578
2024-03-29 10:18:31,398 [INFO] scratchpads :: starting volume :: scratchpads.py:532
2024-03-29 10:18:31,398 [INFO] scratchpads :: ==> Wait for volume spawning :: scratchpads.py:482
2024-03-29 10:18:31,501 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:31,904 [ERROR] scratchpads :: ⚠ Failed spawning volume as proc 10797 :: scratchpads.py:534
2024-03-29 10:18:31,905 [ERROR] scratchpads :: "pavucontrol": The command terminated sucessfully, is it already running? :: scratchpads.py:544
2024-03-29 10:18:31,905 [DEBUG] ipc :: notify 0 5000 rgb(ff1010)  The command terminated sucessfully, is it already running? :: ipc.py:114
2024-03-29 10:18:31,907 [DEBUG] ipc :: notify 0 5000 rgb(ff1010)  Failed to show scratch "volume" :: ipc.py:114
2024-03-29 10:18:31,919 [ERROR] scratchpads :: Failed to show volume, aborting. :: scratchpads.py:792
2024-03-29 10:18:39,967 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:39,967 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:40,028 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:40,028 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:43,388 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-29 10:18:43,388 [DEBUG] scratchpads :: volume is visible = False :: scratchpads.py:738
2024-03-29 10:18:43,388 [INFO] scratchpads :: Showing volume :: scratchpads.py:789
2024-03-29 10:18:43,389 [INFO] scratchpads :: volume is not running, starting... :: scratchpads.py:559
2024-03-29 10:18:43,390 [INFO] scratchpads :: scratch volume (pavucontrol) has pid 10874 :: scratchpads.py:578
2024-03-29 10:18:43,390 [INFO] scratchpads :: starting volume :: scratchpads.py:532
2024-03-29 10:18:43,390 [INFO] scratchpads :: ==> Wait for volume spawning :: scratchpads.py:482
2024-03-29 10:18:43,492 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:43,612 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('63267594f820',)�[0m :: command.py:154
2024-03-29 10:18:43,896 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:43,897 [INFO] scratchpads :: => volume client (proc:10874, addr:0x63267594f820) detected on time :: scratchpads.py:495
2024-03-29 10:18:43,897 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:43,903 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:43,903 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:43,905 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:43,906 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-29 10:18:43,906 [DEBUG] ipc :: dispatch ['moveworkspacetomonitor special:scratch_volume eDP-1', 'movetoworkspacesilent 1,address:0x63267594f820', 'alterzorder top,address:0x63267594f820'] :: ipc.py:114
2024-03-29 10:18:43,908 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:43,909 [DEBUG] ipc :: dispatch resizewindowpixel exact 902 1203,address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:43,910 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:43,911 [DEBUG] ipc :: dispatch movewindowpixel exact 993 150,address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:43,917 [DEBUG] ipc :: dispatch focuswindow address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:43,918 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('63267594f820',)�[0m :: command.py:154
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('63267594f820',)�[0m :: command.py:154
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: �[30;1mevent_openwindow('63267594f820,1,pavucontrol,Volume Control',)�[0m :: command.py:154
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-29 10:18:44,119 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('63267594f820',)�[0m :: command.py:154
2024-03-29 10:18:46,777 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-29 10:18:46,777 [DEBUG] scratchpads :: volume is visible = True :: scratchpads.py:738
2024-03-29 10:18:46,778 [INFO] scratchpads :: Hiding volume :: scratchpads.py:916
2024-03-29 10:18:46,778 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-29 10:18:46,779 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-29 10:18:46,784 [DEBUG] ipc :: dispatch movewindowpixel 1263 0,address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:46,985 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x63267594f820 :: ipc.py:114
2024-03-29 10:18:46,989 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:46,989 [DEBUG] ipc :: dispatch focuswindow address:0x632675a17e30 :: ipc.py:114
2024-03-29 10:18:46,995 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:46,996 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:46,996 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:57,171 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:57,171 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:57,331 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:18:57,331 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:19:01,828 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:19:01,829 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17e30',)�[0m :: command.py:154
2024-03-29 10:19:01,860 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:01,860 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:07,890 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:07,891 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:13,755 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:13,755 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:19:14,292 [DEBUG] pyprland :: �[30;1mevent_workspace('2',)�[0m :: command.py:154
2024-03-29 10:19:14,292 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:19:14,293 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:19:48,944 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:19:48,944 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:19:48,944 [DEBUG] scratchpads :: �[30;1mevent_openwindow('632675a17b70,2,firedragon,File Upload',)�[0m :: command.py:154
2024-03-29 10:19:57,649 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:19:57,649 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:19:57,935 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:19:57,935 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:20:00,545 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:00,545 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:23,653 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:20:23,653 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('632675a17b70',)�[0m :: command.py:154
2024-03-29 10:20:23,653 [DEBUG] scratchpads :: �[30;1mevent_openwindow('632675a17b70,2,firedragon,File Upload',)�[0m :: command.py:154
2024-03-29 10:20:27,159 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:27,160 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:36,697 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:36,698 [DEBUG] pyprland :: �[30;1mevent_workspace('1',)�[0m :: command.py:154
2024-03-29 10:20:36,698 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:43,611 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:43,611 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:43,671 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:43,671 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:20:49,003 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:49,003 [DEBUG] pyprland :: �[30;1mevent_workspace('2',)�[0m :: command.py:154
2024-03-29 10:20:49,003 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:50,098 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:50,098 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:53,860 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:20:53,861 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:21:01,114 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:21:01,114 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:21:01,183 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:21:01,183 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326752bd310',)�[0m :: command.py:154
2024-03-29 10:21:06,528 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:06,529 [DEBUG] pyprland :: �[30;1mevent_workspace('1',)�[0m :: command.py:154
2024-03-29 10:21:06,529 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:12,753 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:12,753 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:12,836 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:12,836 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:22,404 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154
2024-03-29 10:21:22,404 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('6326753ceff0',)�[0m :: command.py:154

Output for hypr -j clients:

[{
    "address": "0x6326753ceff0",
    "mapped": true,
    "hidden": false,
    "at": [12, 52],
    "size": [2232, 1440],
    "workspace": {
        "id": 1,
        "name": "1"
    },
    "floating": false,
    "monitor": 0,
    "class": "footclient",
    "title": "hyprctl -j clients | ~",
    "initialClass": "footclient",
    "initialTitle": "foot",
    "pid": 2000,
    "xwayland": false,
    "pinned": false,
    "fullscreen": false,
    "fullscreenMode": 0,
    "fakeFullscreen": false,
    "grouped": [],
    "swallowing": "0x0",
    "focusHistoryID": 0
},{
    "address": "0x6326752bd310",
    "mapped": true,
    "hidden": false,
    "at": [12, 52],
    "size": [2232, 1440],
    "workspace": {
        "id": 2,
        "name": "2"
    },
    "floating": false,
    "monitor": 0,
    "class": "firedragon",
    "title": "[BUG] Scratchpads do not appear in expected locations · Issue #69 · hyprland-community/pyprland — FireDragon",
    "initialClass": "firedragon",
    "initialTitle": "FireDragon",
    "pid": 2738,
    "xwayland": false,
    "pinned": false,
    "fullscreen": false,
    "fullscreenMode": 0,
    "fakeFullscreen": false,
    "grouped": [],
    "swallowing": "0x0",
    "focusHistoryID": 1
},{
    "address": "0x63267594f820",
    "mapped": true,
    "hidden": false,
    "at": [1413, 150],
    "size": [1203, 1203],
    "workspace": {
        "id": -98,
        "name": "special:scratch_volume"
    },
    "floating": true,
    "monitor": 0,
    "class": "pavucontrol",
    "title": "Volume Control",
    "initialClass": "pavucontrol",
    "initialTitle": "Volume Control",
    "pid": 10874,
    "xwayland": false,
    "pinned": false,
    "fullscreen": false,
    "fullscreenMode": 0,
    "fakeFullscreen": false,
    "grouped": [],
    "swallowing": "0x0",
    "focusHistoryID": 2
}]

Finally, hyprctl -j monitors. Secondary monitor is unplugged.

[{
    "id": 0,
    "name": "eDP-1",
    "description": "BOE 0x095F",
    "make": "BOE",
    "model": "0x095F",
    "serial": "",
    "width": 2256,
    "height": 1504,
    "refreshRate": 59.99900,
    "x": 0,
    "y": 0,
    "activeWorkspace": {
        "id": 1,
        "name": "1"
    },
    "specialWorkspace": {
        "id": 0,
        "name": ""
    },
    "reserved": [0, 40, 0, 0],
    "scale": 1.00,
    "transform": 0,
    "focused": true,
    "dpmsStatus": true,
    "vrr": false,
    "activelyTearing": false,
    "currentFormat": "XRGB8888",
    "availableModes": ["2256x1504@60.00Hz","2256x1504@48.00Hz"]
}]

Hope this helps.

Unfortunately this run isn't valid.
You had a "stale" pavucontrol started.
Check the errors about pavucontrol failing to start at the beginning... didn't it show in the notifications ?
Can you dump the logs again after ensuring you don't have any issue in the runtime (ideal would be a fresh start).

Tip: you can use pypr exit to cleanly exit and usually exit the scratchpad commands cleanly.

Thanks for the tip, here's some cleaner logs.

2024-03-30 19:14:32,117 [INFO] ipc :: Logger "ipc" initialized :: common.py:78
2024-03-30 19:14:32,118 [INFO] startup :: Logger "startup" initialized :: common.py:78
2024-03-30 19:14:32,118 [INFO] pypr :: Logger "pypr" initialized :: common.py:78
2024-03-30 19:14:32,118 [INFO] pypr :: Loading /home/violettica/.config/hypr/pyprland.toml :: command.py:66
2024-03-30 19:14:32,119 [INFO] pyprland :: Logger "pyprland" initialized :: common.py:78
2024-03-30 19:14:32,119 [DEBUG] ipc :: activeworkspace :: ipc.py:75
2024-03-30 19:14:32,120 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-30 19:14:32,120 [INFO] pyprland :: configured :: command.py:119
2024-03-30 19:14:32,129 [INFO] scratchpads :: Logger "scratchpads" initialized :: common.py:78
2024-03-30 19:14:32,130 [INFO] scratchpads :: configured :: command.py:119
2024-03-30 19:14:32,130 [DEBUG] pypr :: ================================[ initialized ]================================= :: command.py:317
2024-03-30 19:14:36,377 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-30 19:14:36,377 [DEBUG] scratchpads :: volume is visible = False :: scratchpads.py:738
2024-03-30 19:14:36,377 [INFO] scratchpads :: Showing volume :: scratchpads.py:789
2024-03-30 19:14:36,396 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-30 19:14:36,396 [DEBUG] ipc :: keyword ['windowrule float,^(pavucontrol)$', 'windowrule move 200% 150,^(pavucontrol)$', 'windowrule size 902 1203,^(pavucontrol)$'] :: ipc.py:114
2024-03-30 19:14:36,397 [INFO] scratchpads :: volume is not running, starting... :: scratchpads.py:559
2024-03-30 19:14:36,398 [INFO] scratchpads :: scratch volume (pavucontrol) has pid 88700 :: scratchpads.py:578
2024-03-30 19:14:36,398 [INFO] scratchpads :: starting volume :: scratchpads.py:532
2024-03-30 19:14:36,398 [INFO] scratchpads :: ==> Wait for volume spawning :: scratchpads.py:482
2024-03-30 19:14:36,501 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:36,628 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dac2c4570',)�[0m :: command.py:154
2024-03-30 19:14:36,904 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:36,906 [INFO] scratchpads :: => volume client (proc:88700, addr:0x5d2dac2c4570) detected on time :: scratchpads.py:495
2024-03-30 19:14:36,906 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:36,906 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:36,907 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:36,909 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-30 19:14:36,909 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:36,910 [DEBUG] ipc :: dispatch ['moveworkspacetomonitor special:scratch_volume eDP-1', 'movetoworkspacesilent 1,address:0x5d2dac2c4570', 'alterzorder top,address:0x5d2dac2c4570'] :: ipc.py:114
2024-03-30 19:14:36,912 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:36,913 [DEBUG] ipc :: dispatch resizewindowpixel exact 902 1203,address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:36,914 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:36,915 [DEBUG] ipc :: dispatch movewindowpixel exact 993 150,address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:36,915 [DEBUG] ipc :: dispatch focuswindow address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:36,916 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dac2c4570',)�[0m :: command.py:154
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dac2c4570',)�[0m :: command.py:154
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: �[30;1mevent_openwindow('5d2dac2c4570,1,pavucontrol,Volume Control',)�[0m :: command.py:154
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:37,118 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-30 19:14:37,119 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dac2c4570',)�[0m :: command.py:154
2024-03-30 19:14:39,149 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-30 19:14:39,149 [DEBUG] scratchpads :: volume is visible = True :: scratchpads.py:738
2024-03-30 19:14:39,151 [INFO] scratchpads :: Hiding volume :: scratchpads.py:916
2024-03-30 19:14:39,151 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-30 19:14:39,151 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-30 19:14:39,152 [DEBUG] ipc :: dispatch movewindowpixel 1263 0,address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:39,353 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x5d2dac2c4570 :: ipc.py:114
2024-03-30 19:14:39,356 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:39,356 [DEBUG] ipc :: dispatch focuswindow address: :: ipc.py:114
2024-03-30 19:14:39,356 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:43,959 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:43,959 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5d2dabc4fb90',)�[0m :: command.py:154
2024-03-30 19:14:44,153 [CRITICAL] pypr :: cancelled :: command.py:323

OK, thank you,
here the relevant part is:

dispatch resizewindowpixel exact 902 1203,address:0x5d2dac2c4570
dispatch movewindowpixel exact 993 150,address:0x5d2dac2c4570

I see the size seems correct according to your screen size

>>> 0.4*2256
902.4000000000001
>>> 0.8*1504
1203.2

So it's only about the position, "top" and "bottop" look correct regarding the "up/down" margin. Seems to be something only affecting the X coordinates computation.

Nothing obvious pops to me, I'll review the code checking for some mistakes regarding the position.

About that, if you use the "position" attribute, is it working as expected ? or is it also affected ?

Thanks @fdev31, seems "position" works as expected. Curiously enough, when I removed the "position" attribute after testing the scratchpad started working correctly with its default position. After a pypr exit to restart the program in debug mode, I went ahead and grabbed the logs for when the scratchpad is behaving.

2024-03-31 12:48:19,304 [INFO] ipc :: Logger "ipc" initialized :: common.py:78
2024-03-31 12:48:19,304 [INFO] startup :: Logger "startup" initialized :: common.py:78
2024-03-31 12:48:19,304 [INFO] pypr :: Logger "pypr" initialized :: common.py:78
2024-03-31 12:48:19,305 [INFO] pypr :: Loading /home/violettica/.config/hypr/pyprland.toml :: command.py:66
2024-03-31 12:48:19,305 [INFO] pyprland :: Logger "pyprland" initialized :: common.py:78
2024-03-31 12:48:19,305 [DEBUG] ipc :: activeworkspace :: ipc.py:75
2024-03-31 12:48:19,307 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-31 12:48:19,309 [INFO] pyprland :: configured :: command.py:119
2024-03-31 12:48:19,319 [INFO] scratchpads :: Logger "scratchpads" initialized :: common.py:78
2024-03-31 12:48:19,319 [INFO] scratchpads :: configured :: command.py:119
2024-03-31 12:48:19,319 [DEBUG] pypr :: ================================[ initialized ]================================= :: command.py:317
2024-03-31 12:48:21,807 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-31 12:48:21,807 [DEBUG] scratchpads :: volume is visible = False :: scratchpads.py:738
2024-03-31 12:48:21,807 [INFO] scratchpads :: Showing volume :: scratchpads.py:789
2024-03-31 12:48:21,809 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-31 12:48:21,811 [DEBUG] ipc :: keyword ['windowrule float,^(pavucontrol)$', 'windowrule move 200% 150,^(pavucontrol)$', 'windowrule size 902 1203,^(pavucontrol)$'] :: ipc.py:114
2024-03-31 12:48:21,813 [INFO] scratchpads :: volume is not running, starting... :: scratchpads.py:559
2024-03-31 12:48:21,814 [INFO] scratchpads :: scratch volume (pavucontrol) has pid 21392 :: scratchpads.py:578
2024-03-31 12:48:21,814 [INFO] scratchpads :: starting volume :: scratchpads.py:532
2024-03-31 12:48:21,814 [INFO] scratchpads :: ==> Wait for volume spawning :: scratchpads.py:482
2024-03-31 12:48:21,916 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:22,046 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960bc9e80',)�[0m :: command.py:154
2024-03-31 12:48:22,321 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:22,322 [INFO] scratchpads :: => volume client (proc:21392, addr:0x578960bc9e80) detected on time :: scratchpads.py:495
2024-03-31 12:48:22,322 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:22,323 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:22,324 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:22,326 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:22,327 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-31 12:48:22,327 [DEBUG] ipc :: dispatch ['moveworkspacetomonitor special:scratch_volume eDP-1', 'movetoworkspacesilent 3,address:0x578960bc9e80', 'alterzorder top,address:0x578960bc9e80'] :: ipc.py:114
2024-03-31 12:48:22,328 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:22,330 [DEBUG] ipc :: dispatch resizewindowpixel exact 902 1203,address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:22,331 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:22,334 [DEBUG] ipc :: dispatch movewindowpixel exact 1294 150,address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:22,335 [DEBUG] ipc :: dispatch focuswindow address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:22,336 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960bc9e80',)�[0m :: command.py:154
2024-03-31 12:48:22,537 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960bc9e80',)�[0m :: command.py:154
2024-03-31 12:48:22,537 [DEBUG] scratchpads :: �[30;1mevent_openwindow('578960bc9e80,3,pavucontrol,Volume Control',)�[0m :: command.py:154
2024-03-31 12:48:22,538 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:22,538 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-31 12:48:22,538 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:22,538 [DEBUG] scratchpads :: (SKIPPED) hide volume because another client is active :: scratchpads.py:637
2024-03-31 12:48:22,538 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960bc9e80',)�[0m :: command.py:154
2024-03-31 12:48:23,677 [DEBUG] scratchpads :: �[33;1mrun_toggle('volume',)�[0m :: command.py:154
2024-03-31 12:48:23,677 [DEBUG] scratchpads :: volume is visible = True :: scratchpads.py:738
2024-03-31 12:48:23,678 [INFO] scratchpads :: Hiding volume :: scratchpads.py:916
2024-03-31 12:48:23,679 [DEBUG] ipc :: clients :: ipc.py:75
2024-03-31 12:48:23,686 [DEBUG] ipc :: monitors :: ipc.py:75
2024-03-31 12:48:23,692 [DEBUG] ipc :: dispatch movewindowpixel 962 0,address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:23,893 [DEBUG] ipc :: dispatch movetoworkspacesilent special:scratch_volume,address:0x578960bc9e80 :: ipc.py:114
2024-03-31 12:48:23,897 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('5789615193a0',)�[0m :: command.py:154
2024-03-31 12:48:23,897 [DEBUG] ipc :: dispatch focuswindow address: :: ipc.py:114
2024-03-31 12:48:23,904 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('5789615193a0',)�[0m :: command.py:154
2024-03-31 12:48:32,258 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:32,258 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:37,823 [DEBUG] pyprland :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:37,823 [DEBUG] scratchpads :: �[30;1mevent_activewindowv2('578960be7830',)�[0m :: command.py:154
2024-03-31 12:48:37,919 [CRITICAL] pypr :: cancelled :: command.py:323

Going to go restart my system and see if it starts misbehaving again.

Edit: I have restarted my system and the scratchpad does not misbehave anymore. While I am grateful that the scratchpad works now, I'm also terribly confused as to why it was misbehaving in the first place.

Output of hyprctl version is:

Hyprland, built from branch main at commit e1e41e54480282d9bec9957d3c578eb87bc1f2f2 dirty (reenderer: Add 1 border damage to fix number rounding issues (5343)).
Date: Sun Mar 31 15:59:22 2024
Tag: v0.37.1-93-ge1e41e54

flags: (if any)

If it doesn't happen again without complex operations (eg: reloading the config, restarting pypr without ensuring everything has been closed, etc...) you may chose to close this bug.
In case you see some anomaly that can be explained keep it open to provide more details on the same ticket.
Note: I screwed up a bit the pypr version command & associated git tags, it's still usable but doesn't display a nice version on releases... hope it doesn't confuse things.
Thank you.

Yeah, I'm not seeing anything new. I'll post an update here if I find anything new, but for now it seems the issue stopped as mysteriously as it started.